Make dropdowns show the string that was their argument.
authorEkdohibs <nathanael.courant@laposte.net>
Thu, 5 May 2016 16:50:02 +0000 (18:50 +0200)
committerEkdohibs <nathanael.courant@laposte.net>
Sat, 7 May 2016 06:33:21 +0000 (08:33 +0200)
This makes it work even if it contains escape sequences,
which didn't work before.

src/guiFormSpecMenu.cpp
src/guiFormSpecMenu.h

index 23cff3eb79a0c03b9a13312d6c0d3d2a0b29a9ae..ca374151f195d3bef5f239b59dbbf75aab5b4b20 100644 (file)
@@ -240,6 +240,15 @@ GUITable* GUIFormSpecMenu::getTable(const std::string &tablename)
        return 0;
 }
 
+std::vector<std::string>* GUIFormSpecMenu::getDropDownValues(const std::string &name)
+{
+       for (u32 i = 0; i < m_dropdowns.size(); ++i) {
+               if (name == m_dropdowns[i].first.fname)
+                       return &m_dropdowns[i].second;
+       }
+       return NULL;
+}
+
 static std::vector<std::string> split(const std::string &s, char delim)
 {
        std::vector<std::string> tokens;
@@ -894,6 +903,14 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element)
                        e->setSelected(stoi(str_initial_selection.c_str())-1);
 
                m_fields.push_back(spec);
+
+               m_dropdowns.push_back(std::pair<FieldSpec,
+                       std::vector<std::string> >(spec, std::vector<std::string>()));
+               std::vector<std::string> &values = m_dropdowns.back().second;
+               for (unsigned int i = 0; i < items.size(); i++) {
+                       values.push_back(unescape_string(items[i]));
+               }
+
                return;
        }
        errorstream << "Invalid dropdown element(" << parts.size() << "): '"
@@ -2725,8 +2742,11 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no)
                                        }
                                        s32 selected = e->getSelected();
                                        if (selected >= 0) {
-                                               fields[name] =
-                                                       wide_to_utf8(e->getItem(selected));
+                                               std::vector<std::string> *dropdown_values =
+                                                       getDropDownValues(s.fname);
+                                               if (dropdown_values && selected < (s32)dropdown_values->size()) {
+                                                       fields[name] = (*dropdown_values)[selected];
+                                               }
                                        }
                                }
                                else if (s.ftype == f_TabHeader) {
index 8774d306f95d0b7bd787e5ed5962a4f351c19162..276807438657be6a10c47948d43737038401fe24 100644 (file)
@@ -357,6 +357,7 @@ public:
        bool pausesGame() { return doPause; }
 
        GUITable* getTable(const std::string &tablename);
+       std::vector<std::string>* getDropDownValues(const std::string &name);
 
 #ifdef __ANDROID__
        bool getAndroidUIInput();
@@ -395,6 +396,7 @@ protected:
        std::vector<std::pair<FieldSpec,gui::IGUICheckBox*> > m_checkboxes;
        std::map<std::string, TooltipSpec> m_tooltips;
        std::vector<std::pair<FieldSpec,gui::IGUIScrollBar*> > m_scrollbars;
+       std::vector<std::pair<FieldSpec, std::vector<std::string> > > m_dropdowns;
 
        ItemSpec *m_selected_item;
        f32 m_timer1;