diff options
author | Ekdohibs <nathanael.courant@laposte.net> | 2016-05-05 18:50:02 +0200 |
---|---|---|
committer | Ekdohibs <nathanael.courant@laposte.net> | 2016-05-07 08:33:21 +0200 |
commit | d5c3db9c4179e27a80c32ee95d6573ad0ec7137e (patch) | |
tree | ba75f7bbc30f2ec738e5d3cae3e7074ef794fa51 | |
parent | bb925479a56e7b961e3520024c20b74245640035 (diff) | |
download | minetest-d5c3db9c4179e27a80c32ee95d6573ad0ec7137e.tar.gz minetest-d5c3db9c4179e27a80c32ee95d6573ad0ec7137e.tar.bz2 minetest-d5c3db9c4179e27a80c32ee95d6573ad0ec7137e.zip |
Make dropdowns show the string that was their argument.
This makes it work even if it contains escape sequences,
which didn't work before.
-rw-r--r-- | src/guiFormSpecMenu.cpp | 24 | ||||
-rw-r--r-- | src/guiFormSpecMenu.h | 2 |
2 files changed, 24 insertions, 2 deletions
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 23cff3eb7..ca374151f 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -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) { diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 8774d306f..276807438 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -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; |