]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Fix backwards compatibility issue introduced by close_on_enter
authorrubenwardy <rubenwardy@gmail.com>
Sun, 2 Oct 2016 23:30:33 +0000 (00:30 +0100)
committerNer'zhul <nerzhul@users.noreply.github.com>
Sat, 8 Oct 2016 16:58:28 +0000 (18:58 +0200)
doc/lua_api.txt
src/guiFormSpecMenu.cpp
src/guiFormSpecMenu.h

index 74469e535f421ba0cc90106c1dd7abd2717dd7b2..6bdcd4fe443fdffb5f408aac522e060234c9d536 100644 (file)
@@ -1542,7 +1542,7 @@ examples.
 * If `true` the background is clipped to formspec size
   (`x` and `y` are used as offset values, `w` and `h` are ignored)
 
-#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>;<close_on_enter>]`
+#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
 * Textual password style field; will be sent to server when a button is clicked
 * When enter is pressed in field, fields.key_enter_field will be sent with the name
   of this field.
@@ -1552,10 +1552,9 @@ examples.
 * Position and size units are inventory slots
 * `name` is the name of the field as returned in fields to `on_receive_fields`
 * `label`, if not blank, will be text printed on the top left above the field
-* `close_on_enter` (optional) is whether the form should accept and close when enter is
-  pressed in this field. Defaults to true.
+* See field_close_on_enter to stop enter closing the formspec
 
-#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>;<close_on_enter>]`
+#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
 * Textual field; will be sent to server when a button is clicked
 * When enter is pressed in field, fields.key_enter_field will be sent with the name
   of this field.
@@ -1569,18 +1568,21 @@ examples.
     * `default` may contain variable references such as `${text}'` which
       will fill the value from the metadata value `text`
     * **Note**: no extra text or more than a single variable is supported ATM.
-* `close_on_enter` (optional) is whether the form should accept and close when enter is
-  pressed in this field. Defaults to true.
+* See field_close_on_enter to stop enter closing the formspec
 
-#### `field[<name>;<label>;<default>;<close_on_enter>]`
+#### `field[<name>;<label>;<default>]`
 * As above, but without position/size units
 * When enter is pressed in field, fields.key_enter_field will be sent with the name
   of this field.
 * Special field for creating simple forms, such as sign text input
 * Must be used without a `size[]` element
 * A "Proceed" button will be added automatically
-* `close_on_enter` (optional) is whether the form should accept and close when enter is
-  pressed in this field. Defaults to true.
+* See field_close_on_enter to stop enter closing the formspec
+
+#### `field_close_on_enter[<name>;<close_on_enter>]`
+* <name> is the name of the field
+* if <close_on_enter> is false, pressing enter in the field will submit the form but not close it
+* defaults to true when not specified (ie: no tag for a field)
 
 #### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
 * Same as fields above, but with multi-line input
index 714e71a5a072301a827fc5a50f5220be39694082..73388114bd470365e4183da4ac5e1ba8201eea48 100644 (file)
@@ -914,6 +914,16 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element)
                                << element << "'"  << std::endl;
 }
 
+void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data,
+               const std::string &element)
+{
+       std::vector<std::string> parts = split(element,';');
+       if (parts.size() == 2 ||
+                       (parts.size() > 2 && m_formspec_version > FORMSPEC_API_VERSION)) {
+               field_close_on_enter[parts[0]] = is_yes(parts[1]);
+       }
+}
+
 void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
 {
        std::vector<std::string> parts = split(element,';');
@@ -977,8 +987,11 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
                evt.KeyInput.PressedDown = true;
                e->OnEvent(evt);
 
-               if (parts.size() >= 5 && !is_yes(parts[4])) {
-                       spec.close_on_enter = false;
+               if (parts.size() >= 5) {
+                       // TODO: remove after 2016-11-03
+                       warningstream << "pwdfield: use field_close_on_enter[name, enabled]" <<
+                                       " instead of the 5th param" << std::endl;
+                       field_close_on_enter[name] = is_yes(parts[4]);
                }
 
                m_fields.push_back(spec);
@@ -1062,8 +1075,11 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
                }
        }
 
-       if (parts.size() >= 4 && !is_yes(parts[3])) {
-               spec.close_on_enter = false;
+       if (parts.size() >= 4) {
+               // TODO: remove after 2016-11-03
+               warningstream << "field/simple: use field_close_on_enter[name, enabled]" <<
+                               " instead of the 4th param" << std::endl;
+               field_close_on_enter[name] = is_yes(parts[3]);
        }
 
        m_fields.push_back(spec);
@@ -1171,8 +1187,11 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
                }
        }
 
-       if (parts.size() >= 6 && !is_yes(parts[5])) {
-               spec.close_on_enter = false;
+       if (parts.size() >= 6) {
+               // TODO: remove after 2016-11-03
+               warningstream << "field/textarea: use field_close_on_enter[name, enabled]" <<
+                               " instead of the 6th param" << std::endl;
+               field_close_on_enter[name] = is_yes(parts[5]);
        }
 
        m_fields.push_back(spec);
@@ -1783,6 +1802,11 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
                return;
        }
 
+       if (type == "field_close_on_enter") {
+               parseFieldCloseOnEnter(data, description);
+               return;
+       }
+
        if (type == "pwdfield") {
                parsePwdField(data,description);
                return;
@@ -3689,7 +3713,11 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                                        if (s.ftype == f_Unknown &&
                                                        s.fid == event.GUIEvent.Caller->getID()) {
                                                current_field_enter_pending = s.fname;
-                                               close_on_enter = s.close_on_enter;
+                                               UNORDERED_MAP<std::string, bool>::const_iterator it =
+                                                       field_close_on_enter.find(s.fname);
+                                               if (it != field_close_on_enter.end())
+                                                       close_on_enter = (*it).second;
+
                                                break;
                                        }
                                }
index 153720975b3d528a745c6d42699b8e01f1cf22fe..95df11e6a1bfa17b93a28e914016168a2f35e2bd 100644 (file)
@@ -212,7 +212,6 @@ class GUIFormSpecMenu : public GUIModalMenu
                        flabel(label),
                        fid(id),
                        send(false),
-                       close_on_enter(false),
                        ftype(f_Unknown),
                        is_exit(false)
                {
@@ -224,7 +223,6 @@ class GUIFormSpecMenu : public GUIModalMenu
                std::wstring fdefault;
                int fid;
                bool send;
-               bool close_on_enter; // used by text fields
                FormspecFieldType ftype;
                bool is_exit;
                core::rect<s32> rect;
@@ -400,6 +398,7 @@ class GUIFormSpecMenu : public GUIModalMenu
        std::vector<ImageDrawSpec> m_images;
        std::vector<ImageDrawSpec> m_itemimages;
        std::vector<BoxDrawSpec> m_boxes;
+       UNORDERED_MAP<std::string, bool> field_close_on_enter;
        std::vector<FieldSpec> m_fields;
        std::vector<StaticTextSpec> m_static_texts;
        std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
@@ -490,6 +489,7 @@ class GUIFormSpecMenu : public GUIModalMenu
        void parseTable(parserData* data,std::string element);
        void parseTextList(parserData* data,std::string element);
        void parseDropDown(parserData* data,std::string element);
+       void parseFieldCloseOnEnter(parserData *data, const std::string &element);
        void parsePwdField(parserData* data,std::string element);
        void parseField(parserData* data,std::string element,std::string type);
        void parseSimpleField(parserData* data,std::vector<std::string> &parts);