Formspecs: Unify textarea and field parsing functions, fix wrong fallback text
authorSmallJoker <SmallJoker@users.noreply.github.com>
Fri, 9 Mar 2018 23:24:57 +0000 (00:24 +0100)
committerAndrew Ward <rw@rubenwardy.com>
Fri, 9 Mar 2018 23:24:57 +0000 (23:24 +0000)
* textarea[], field[]: Unify function, fix wrong fallback text
* Remove apparently superflous mainmenumanager.h incldue
* intlGUIEditBox.cpp: make read-only boxes really read-only
* Use elseif (trivial)

src/gui/guiFormSpecMenu.cpp
src/gui/guiFormSpecMenu.h
src/gui/intlGUIEditBox.cpp

index 89cf19973cc227009eca2ae8b6239553782693a2..dfb167ce7f518b905fe1d984b8438de25a1e7c2f 100644 (file)
@@ -55,12 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlicht_changes/static_text.h"
 #include "guiscalingfilter.h"
 #include "guiEditBoxWithScrollbar.h"
-
-#if USE_FREETYPE && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9
 #include "intlGUIEditBox.h"
-#include "mainmenumanager.h"
-
-#endif
 
 #define MY_CHECKPOS(a,b)                                                                                                       \
        if (v_pos.size() != 2) {                                                                                                \
@@ -1007,6 +1002,71 @@ void GUIFormSpecMenu::parsePwdField(parserData* data, const std::string &element
        errorstream<< "Invalid pwdfield element(" << parts.size() << "): '" << element << "'"  << std::endl;
 }
 
+void GUIFormSpecMenu::createTextField(parserData *data, FieldSpec &spec,
+       core::rect<s32> &rect, bool is_multiline)
+{
+       bool is_editable = !spec.fname.empty();
+       if (!is_editable && !is_multiline) {
+               // spec field id to 0, this stops submit searching for a value that isn't there
+               gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true,
+                       this, spec.fid);
+               return;
+       }
+
+       if (is_editable) {
+               spec.send = true;
+       } else if (is_multiline &&
+                       spec.fdefault.empty() && !spec.flabel.empty()) {
+               // Multiline textareas: swap default and label for backwards compat
+               spec.flabel.swap(spec.fdefault);
+       }
+
+       gui::IGUIEditBox *e = nullptr;
+       static constexpr bool use_intl_edit_box = USE_FREETYPE &&
+               IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9;
+
+       if (use_intl_edit_box && g_settings->getBool("freetype")) {
+               e = new gui::intlGUIEditBox(spec.fdefault.c_str(),
+                       true, Environment, this, spec.fid, rect, is_editable, is_multiline);
+               e->drop();
+       } else {
+               if (is_multiline)
+                       e = new GUIEditBoxWithScrollBar(spec.fdefault.c_str(), true,
+                               Environment, this, spec.fid, rect, is_editable, true);
+               else if (is_editable)
+                       e = Environment->addEditBox(spec.fdefault.c_str(), rect, true,
+                               this, spec.fid);
+       }
+
+       if (e) {
+               if (is_editable && spec.fname == data->focused_fieldname) 
+                       Environment->setFocus(e);
+
+               if (is_multiline) {
+                       e->setMultiLine(true);
+                       e->setWordWrap(true);
+                       e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_UPPERLEFT);
+               } else {
+                       irr::SEvent evt;
+                       evt.EventType            = EET_KEY_INPUT_EVENT;
+                       evt.KeyInput.Key         = KEY_END;
+                       evt.KeyInput.Char        = 0;
+                       evt.KeyInput.Control     = 0;
+                       evt.KeyInput.Shift       = 0;
+                       evt.KeyInput.PressedDown = true;
+                       e->OnEvent(evt);
+               }
+       }
+
+       if (!spec.flabel.empty()) {
+               int font_height = g_fontengine->getTextHeight();
+               rect.UpperLeftCorner.Y -= font_height;
+               rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
+               gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true,
+                       this, 0);
+       }
+}
+
 void GUIFormSpecMenu::parseSimpleField(parserData* data,
                std::vector<std::string> &parts)
 {
@@ -1040,46 +1100,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
                258+m_fields.size()
        );
 
-       if (name.empty()) {
-               // spec field id to 0, this stops submit searching for a value that isn't there
-               gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true, this,
-                       spec.fid);
-       } else {
-               spec.send = true;
-               gui::IGUIElement *e;
-#if USE_FREETYPE && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9
-               if (g_settings->getBool("freetype")) {
-                       e = (gui::IGUIElement *) new gui::intlGUIEditBox(spec.fdefault.c_str(),
-                               true, Environment, this, spec.fid, rect);
-                       e->drop();
-               } else {
-#else
-               {
-#endif
-                       e = Environment->addEditBox(spec.fdefault.c_str(), rect, true, this, spec.fid);
-               }
-               if (spec.fname == data->focused_fieldname) {
-                       Environment->setFocus(e);
-               }
-
-               irr::SEvent evt;
-               evt.EventType            = EET_KEY_INPUT_EVENT;
-               evt.KeyInput.Key         = KEY_END;
-               evt.KeyInput.Char        = 0;
-               evt.KeyInput.Control     = 0;
-               evt.KeyInput.Shift       = 0;
-               evt.KeyInput.PressedDown = true;
-               e->OnEvent(evt);
-
-               if (label.length() >= 1)
-               {
-                       int font_height = g_fontengine->getTextHeight();
-                       rect.UpperLeftCorner.Y -= font_height;
-                       rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
-                       gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true,
-                               this, 0);
-               }
-       }
+       createTextField(data, spec, rect, false);
 
        if (parts.size() >= 4) {
                // TODO: remove after 2016-11-03
@@ -1142,56 +1163,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector<std::string>&
                258+m_fields.size()
        );
 
-       bool is_editable = !name.empty();
-
-       if (is_editable)
-               spec.send = true;
-
-       gui::IGUIEditBox *e = nullptr;
-       const wchar_t *text = spec.fdefault.empty() ?
-               wlabel.c_str() : spec.fdefault.c_str();
-
-#if USE_FREETYPE && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9
-       if (g_settings->getBool("freetype")) {
-               e = (gui::IGUIEditBox *) new gui::intlGUIEditBox(text,
-                       true, Environment, this, spec.fid, rect, is_editable, true);
-               e->drop();
-       } else {
-#else
-       {
-#endif
-               e = new GUIEditBoxWithScrollBar(text, true,
-                       Environment, this, spec.fid, rect, is_editable, true);
-       }
-
-       if (is_editable && spec.fname == data->focused_fieldname)
-               Environment->setFocus(e);
-
-       if (e) {
-               if (type == "textarea")
-               {
-                       e->setMultiLine(true);
-                       e->setWordWrap(true);
-                       e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_UPPERLEFT);
-               } else {
-                       irr::SEvent evt;
-                       evt.EventType            = EET_KEY_INPUT_EVENT;
-                       evt.KeyInput.Key         = KEY_END;
-                       evt.KeyInput.Char        = 0;
-                       evt.KeyInput.Control     = 0;
-                       evt.KeyInput.Shift       = 0;
-                       evt.KeyInput.PressedDown = true;
-                       e->OnEvent(evt);
-               }
-       }
-
-       if (is_editable && !label.empty()) {
-               int font_height = g_fontengine->getTextHeight();
-               rect.UpperLeftCorner.Y -= font_height;
-               rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
-               gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true,
-                       this, 0);
-       }
+       createTextField(data, spec, rect, type == "textarea");
 
        if (parts.size() >= 6) {
                // TODO: remove after 2016-11-03
index 8b16f24cf52537702808987e27727d6232291798..736dd8ddb304227256fdaff51ea8ff5a54e65ec3 100644 (file)
@@ -484,6 +484,8 @@ private:
        void parseFieldCloseOnEnter(parserData *data, const std::string &element);
        void parsePwdField(parserData* data, const std::string &element);
        void parseField(parserData* data, const std::string &element, const std::string &type);
+       void createTextField(parserData *data, FieldSpec &spec,
+               core::rect<s32> &rect, bool is_multiline);
        void parseSimpleField(parserData* data,std::vector<std::string> &parts);
        void parseTextArea(parserData* data,std::vector<std::string>& parts,
                        const std::string &type);
index 8b0f10721551393654d602df818ec84b236fc510..8c661b9f3746b493f45d31a77e226a57596c87f1 100644 (file)
@@ -354,8 +354,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
                        break;
                case KEY_KEY_X:
                        // cut to the clipboard
-                       if (!PasswordBox && Operator && MarkBegin != MarkEnd)
-                       {
+                       if (!PasswordBox && Operator && MarkBegin != MarkEnd) {
                                const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
                                const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
 
@@ -364,8 +363,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
                                sc = Text.subString(realmbgn, realmend - realmbgn).c_str();
                                Operator->copyToClipboard(sc.c_str());
 
-                               if (IsEnabled)
-                               {
+                               if (IsEnabled && m_writable) {
                                        // delete
                                        core::stringw s;
                                        s = Text.subString(0, realmbgn);
@@ -380,7 +378,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
                        }
                        break;
                case KEY_KEY_V:
-                       if ( !IsEnabled )
+                       if (!IsEnabled || !m_writable)
                                break;
 
                        // paste from the clipboard
@@ -636,7 +634,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
                break;
 
        case KEY_BACK:
-               if ( !this->IsEnabled )
+               if (!this->IsEnabled || !m_writable)
                        break;
 
                if (!Text.empty()) {
@@ -675,7 +673,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
                }
                break;
        case KEY_DELETE:
-               if ( !this->IsEnabled )
+               if (!this->IsEnabled || !m_writable)
                        break;
 
                if (!Text.empty()) {
@@ -1351,7 +1349,7 @@ s32 intlGUIEditBox::getLineFromPos(s32 pos)
 
 void intlGUIEditBox::inputChar(wchar_t c)
 {
-       if (!IsEnabled)
+       if (!IsEnabled || !m_writable)
                return;
 
        if (c != 0)