aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2018-03-10 00:24:57 +0100
committerAndrew Ward <rw@rubenwardy.com>2018-03-09 23:24:57 +0000
commit473d81f2e2ad4b8077c9cfe241032c67d6a795c3 (patch)
treef1af794b18bb65d3a2327e2f7dc4a25d65a5a749
parent12d1e4ff0486f86ae20051daa1135dc7db366023 (diff)
downloadminetest-473d81f2e2ad4b8077c9cfe241032c67d6a795c3.tar.gz
minetest-473d81f2e2ad4b8077c9cfe241032c67d6a795c3.tar.bz2
minetest-473d81f2e2ad4b8077c9cfe241032c67d6a795c3.zip
Formspecs: Unify textarea and field parsing functions, fix wrong fallback text
* 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)
-rw-r--r--src/gui/guiFormSpecMenu.cpp162
-rw-r--r--src/gui/guiFormSpecMenu.h2
-rw-r--r--src/gui/intlGUIEditBox.cpp14
3 files changed, 75 insertions, 103 deletions
diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp
index 89cf19973..dfb167ce7 100644
--- a/src/gui/guiFormSpecMenu.cpp
+++ b/src/gui/guiFormSpecMenu.cpp
@@ -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
diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h
index 8b16f24cf..736dd8ddb 100644
--- a/src/gui/guiFormSpecMenu.h
+++ b/src/gui/guiFormSpecMenu.h
@@ -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);
diff --git a/src/gui/intlGUIEditBox.cpp b/src/gui/intlGUIEditBox.cpp
index 8b0f10721..8c661b9f3 100644
--- a/src/gui/intlGUIEditBox.cpp
+++ b/src/gui/intlGUIEditBox.cpp
@@ -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)