]> git.lizzy.rs Git - minetest.git/blobdiff - src/guiFormSpecMenu.cpp
Warnings fix
[minetest.git] / src / guiFormSpecMenu.cpp
index 9947306193509a2fc030ee844e89a03e907001a2..a173c0d25573293305025c9a749b38645851b9ef 100644 (file)
@@ -171,6 +171,10 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
        m_use_gettext(false),
        m_lock(false)
 {
+       current_keys_pending.key_down = false;
+       current_keys_pending.key_up = false;
+       current_keys_pending.key_enter = false;
+
 }
 
 GUIFormSpecMenu::~GUIFormSpecMenu()
@@ -243,28 +247,25 @@ std::vector<std::string> split(const std::string &s, char delim, bool escape=fal
        else {
                std::string current = "";
                current += s.c_str()[0];
-               bool last_was_delim = false;
+               bool last_was_escape = false;
                for(unsigned int i=1; i < s.size(); i++) {
-                       if (last_was_delim) {
+                       if (last_was_escape) {
+                               current += '\\';
+                               current += s.c_str()[i];
+                               last_was_escape = false;
+                       }
+                       else {
                                if (s.c_str()[i] == delim) {
-                                       current += s.c_str()[i];
-                                       last_was_delim = false;
-                               }
-                               else {
                                        tokens.push_back(current);
-
                                        current = "";
-                                       current += s.c_str()[i];
-                                       last_was_delim = false;
+                                       last_was_escape = false;
                                }
-                       }
-                       else {
-                               if (s.c_str()[i] == delim) {
-                                       last_was_delim = true;
+                               else if (s.c_str()[i] == '\\'){
+                                       last_was_escape = true;
                                }
                                else {
-                                       last_was_delim = false;
                                        current += s.c_str()[i];
+                                       last_was_escape = false;
                                }
                        }
                }
@@ -610,7 +611,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
                std::vector<std::string> v_pos = split(parts[0],',');
                std::vector<std::string> v_geom = split(parts[1],',');
                std::string name = parts[2];
-               std::vector<std::string> items = split(parts[3],',');
+               std::vector<std::string> items = split(parts[3],',',true);
                std::string str_initial_selection = "";
                std::string str_transparent = "false";
 
@@ -659,32 +660,34 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
                for (unsigned int i=0; i < items.size(); i++) {
                        if (items[i].c_str()[0] == '#') {
                                if (items[i].c_str()[1] == '#') {
-                                       e->addItem(narrow_to_wide(items[i]).c_str() +1);
+                                       e->addItem(narrow_to_wide(unescape_string(items[i])).c_str() +1);
                                }
                                else {
-                                       std::wstring toadd = narrow_to_wide(items[i].c_str() + 7);
                                        std::string color = items[i].substr(1,6);
+                                       std::wstring toadd =
+                                               narrow_to_wide(unescape_string(items[i]).c_str() + 7);
+
 
                                        e->addItem(toadd.c_str());
 
                                        irr::video::SColor toset;
 
-                                       if (parseColor(color,toset))
+                                       if (parseColor(color, toset))
                                                e->setItemOverrideColor(i,toset);
                                }
                        }
                        else {
-                       e->addItem(narrow_to_wide(items[i]).c_str());
+                               e->addItem(narrow_to_wide(unescape_string(items[i])).c_str());
                        }
                }
 
-               if (str_initial_selection != "")
-                       e->setSelected(stoi(str_initial_selection.c_str())-1);
-
                if (data->listbox_selections.find(fname_w) != data->listbox_selections.end()) {
                        e->setSelected(data->listbox_selections[fname_w]);
                }
 
+               if (str_initial_selection != "")
+                       e->setSelected(stoi(str_initial_selection.c_str())-1);
+
                m_listboxes.push_back(std::pair<FieldSpec,gui::IGUIListBox*>(spec,e));
                m_fields.push_back(spec);
                return;
@@ -1007,7 +1010,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,std::vector<std::string>& p
 }
 
 void GUIFormSpecMenu::parseField(parserData* data,std::string element,std::string type) {
-       std::vector<std::string> parts = split(element,';');
+       std::vector<std::string> parts = split(element,';',true);
 
        if (parts.size() == 3) {
                parseSimpleField(data,parts);
@@ -1113,7 +1116,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) {
 void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,std::string type) {
        std::vector<std::string> parts = split(element,';');
 
-       if ((parts.size() == 5) || (parts.size() == 7)) {
+       if ((parts.size() == 5) || (parts.size() == 7) || (parts.size() == 8)) {
                std::vector<std::string> v_pos = split(parts[0],',');
                std::vector<std::string> v_geom = split(parts[1],',');
                std::string image_name = parts[2];
@@ -1133,13 +1136,19 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,std:
                bool noclip = false;
                bool drawborder = true;
 
-               if ((parts.size() == 7)) {
+               if ((parts.size() >= 7)) {
                        if (parts[5] == "true")
                                noclip = true;
 
                        if (parts[6] == "false")
                                drawborder = false;
                }
+               
+               std::string pressed_image_name = "";
+               
+               if ((parts.size() == 8)) {
+                       pressed_image_name = parts[7];
+               }
 
                core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y);
 
@@ -1148,9 +1157,16 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,std:
 
                label = unescape_string(label);
 
+               wchar_t* wlabel = 0;
+
+               if (m_use_gettext)
+                       wlabel = wgettext(label.c_str());
+               else
+                       wlabel = (wchar_t*) narrow_to_wide(label.c_str()).c_str();
+
                FieldSpec spec = FieldSpec(
                        narrow_to_wide(name.c_str()),
-                       narrow_to_wide(label.c_str()),
+                       wlabel,
                        narrow_to_wide(image_name.c_str()),
                        258+m_fields.size()
                );
@@ -1159,26 +1175,38 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,std:
                        spec.is_exit = true;
 
                video::ITexture *texture = 0;
+               video::ITexture *pressed_texture = 0;
                //if there's no gamedef specified try to get direct
                //TODO check for possible texture leak
-               if (m_gamedef != 0)
+               if (m_gamedef != 0) {
                        texture = m_gamedef->tsrc()->getTexture(image_name);
-               else {
+                       if ((parts.size() == 8)) {
+                               pressed_texture = m_gamedef->tsrc()->getTexture(pressed_image_name);
+                       }
+               } else {
                        if (fs::PathExists(image_name)) {
                                texture = Environment->getVideoDriver()->getTexture(image_name.c_str());
                                m_Textures.push_back(texture);
                        }
+                       if (fs::PathExists(pressed_image_name)) {
+                               pressed_texture = Environment->getVideoDriver()->getTexture(pressed_image_name.c_str());
+                               m_Textures.push_back(pressed_texture);
+                       }
                }
+               if (parts.size() < 8)
+                       pressed_texture = texture;
 
                gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, spec.flabel.c_str());
                e->setUseAlphaChannel(true);
                e->setImage(texture);
-               e->setPressedImage(texture);
+               e->setPressedImage(pressed_texture);
                e->setScaleImage(true);
                e->setNotClipped(noclip);
                e->setDrawBorder(drawborder);
 
                m_fields.push_back(spec);
+               if (m_use_gettext)
+                       delete[] wlabel;
                return;
        }
 
@@ -1335,7 +1363,7 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element) {
 
                irr::video::SColor color;
 
-               if (parseColor(color_str,color)) {
+               if (parseColor(color_str, color)) {
                        BoxDrawSpec spec(pos,geom,color);
 
                        m_boxes.push_back(spec);
@@ -1349,14 +1377,26 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element) {
 }
 
 void GUIFormSpecMenu::parseElement(parserData* data,std::string element) {
+
        //some prechecks
        if (element == "")
                return;
 
        std::vector<std::string> parts = split(element,'[', true);
 
-       if (parts.size() != 2)
+       // ugly workaround to keep compatibility
+       if (parts.size() > 2) {
+               if (trim(parts[0]) == "image") {
+                       for (unsigned int i=2;i< parts.size(); i++) {
+                               parts[1] += "[" + parts[i];
+                       }
+               }
+               else { return; }
+       }
+
+       if (parts.size() < 2) {
                return;
+       }
 
        std::string type = trim(parts[0]);
        std::string description = trim(parts[1]);
@@ -2010,6 +2050,26 @@ void GUIFormSpecMenu::acceptInput(int eventtype)
        {
                std::map<std::string, std::string> fields;
 
+               if (current_keys_pending.key_down) {
+                       fields["key_down"] = "true";
+                       current_keys_pending.key_down = false;
+               }
+
+               if (current_keys_pending.key_up) {
+                       fields["key_up"] = "true";
+                       current_keys_pending.key_up = false;
+               }
+
+               if (current_keys_pending.key_enter) {
+                       fields["key_enter"] = "true";
+                       current_keys_pending.key_enter = false;
+               }
+
+               if (current_keys_pending.key_escape) {
+                       fields["key_escape"] = "true";
+                       current_keys_pending.key_escape = false;
+               }
+
                for(u32 i=0; i<m_fields.size(); i++)
                {
                        const FieldSpec &s = m_fields[i];
@@ -2101,16 +2161,38 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                                m_text_dst->gotText(narrow_to_wide("MenuQuit"));
                        return true;
                }
-               if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
-               {
+               if (event.KeyInput.PressedDown &&
+                       (event.KeyInput.Key==KEY_RETURN ||
+                        event.KeyInput.Key==KEY_UP ||
+                        event.KeyInput.Key==KEY_DOWN)
+                       ) {
+
+
+                       switch (event.KeyInput.Key) {
+                               case KEY_RETURN:
+                                       if (m_allowclose) {
+                                               acceptInput();
+                                               quitMenu();
+                                       }
+                                       else
+                                               current_keys_pending.key_enter = true;
+                                       break;
+                               case KEY_UP:
+                                       current_keys_pending.key_up = true;
+                                       break;
+                               case KEY_DOWN:
+                                       current_keys_pending.key_down = true;
+                                       break;
+                               break;
+                               default:
+                                       //can't happen at all!
+                                       assert("reached a source line that can't ever been reached" == 0);
+                                       break;
+                       }
                        acceptInput();
-
-                       if (m_allowclose)
-                               quitMenu();
-                       else
-                               m_text_dst->gotText(narrow_to_wide("KeyEnter"));
                        return true;
                }
+
        }
        if(event.EventType==EET_MOUSE_INPUT_EVENT
                        && event.MouseInput.Event != EMIE_MOUSE_MOVED)
@@ -2477,11 +2559,15 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                {
                        if(event.GUIEvent.Caller->getID() > 257)
                        {
-                               acceptInput();
-                               if (m_allowclose)
+
+                               if (m_allowclose) {
+                                       acceptInput();
                                        quitMenu();
-                               else
-                                       m_text_dst->gotText(narrow_to_wide("EditBoxEnter"));
+                               }
+                               else {
+                                       current_keys_pending.key_enter = true;
+                                       acceptInput();
+                               }
                                // quitMenu deallocates menu
                                return true;
                        }
@@ -2519,15 +2605,15 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
 bool GUIFormSpecMenu::parseColor(std::string color, irr::video::SColor& outcolor) {
        outcolor = irr::video::SColor(0,0,0,0);
 
-       if(!string_allowed(color, "0123456789abcdefABCDEF"))
+       if (!string_allowed(color, "0123456789abcdefABCDEF"))
                return false;
 
        u32 color_value;
        std::istringstream iss(color);
        iss >> std::hex >> color_value;
+       
        outcolor = irr::video::SColor(color_value);
 
        outcolor.setAlpha(255);
        return true;
 }
-