forked from Mirrorlandia_minetest/minetest
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)
This commit is contained in:
parent
12d1e4ff04
commit
473d81f2e2
@ -55,12 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "irrlicht_changes/static_text.h"
|
#include "irrlicht_changes/static_text.h"
|
||||||
#include "guiscalingfilter.h"
|
#include "guiscalingfilter.h"
|
||||||
#include "guiEditBoxWithScrollbar.h"
|
#include "guiEditBoxWithScrollbar.h"
|
||||||
|
|
||||||
#if USE_FREETYPE && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9
|
|
||||||
#include "intlGUIEditBox.h"
|
#include "intlGUIEditBox.h"
|
||||||
#include "mainmenumanager.h"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MY_CHECKPOS(a,b) \
|
#define MY_CHECKPOS(a,b) \
|
||||||
if (v_pos.size() != 2) { \
|
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;
|
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,
|
void GUIFormSpecMenu::parseSimpleField(parserData* data,
|
||||||
std::vector<std::string> &parts)
|
std::vector<std::string> &parts)
|
||||||
{
|
{
|
||||||
@ -1040,46 +1100,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
|
|||||||
258+m_fields.size()
|
258+m_fields.size()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (name.empty()) {
|
createTextField(data, spec, rect, false);
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parts.size() >= 4) {
|
if (parts.size() >= 4) {
|
||||||
// TODO: remove after 2016-11-03
|
// TODO: remove after 2016-11-03
|
||||||
@ -1142,56 +1163,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector<std::string>&
|
|||||||
258+m_fields.size()
|
258+m_fields.size()
|
||||||
);
|
);
|
||||||
|
|
||||||
bool is_editable = !name.empty();
|
createTextField(data, spec, rect, type == "textarea");
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parts.size() >= 6) {
|
if (parts.size() >= 6) {
|
||||||
// TODO: remove after 2016-11-03
|
// TODO: remove after 2016-11-03
|
||||||
|
@ -484,6 +484,8 @@ private:
|
|||||||
void parseFieldCloseOnEnter(parserData *data, const std::string &element);
|
void parseFieldCloseOnEnter(parserData *data, const std::string &element);
|
||||||
void parsePwdField(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 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 parseSimpleField(parserData* data,std::vector<std::string> &parts);
|
||||||
void parseTextArea(parserData* data,std::vector<std::string>& parts,
|
void parseTextArea(parserData* data,std::vector<std::string>& parts,
|
||||||
const std::string &type);
|
const std::string &type);
|
||||||
|
@ -354,8 +354,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
|
|||||||
break;
|
break;
|
||||||
case KEY_KEY_X:
|
case KEY_KEY_X:
|
||||||
// cut to the clipboard
|
// cut to the clipboard
|
||||||
if (!PasswordBox && Operator && MarkBegin != MarkEnd)
|
if (!PasswordBox && Operator && MarkBegin != MarkEnd) {
|
||||||
{
|
|
||||||
const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
|
const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
|
||||||
const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
|
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();
|
sc = Text.subString(realmbgn, realmend - realmbgn).c_str();
|
||||||
Operator->copyToClipboard(sc.c_str());
|
Operator->copyToClipboard(sc.c_str());
|
||||||
|
|
||||||
if (IsEnabled)
|
if (IsEnabled && m_writable) {
|
||||||
{
|
|
||||||
// delete
|
// delete
|
||||||
core::stringw s;
|
core::stringw s;
|
||||||
s = Text.subString(0, realmbgn);
|
s = Text.subString(0, realmbgn);
|
||||||
@ -380,7 +378,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_KEY_V:
|
case KEY_KEY_V:
|
||||||
if ( !IsEnabled )
|
if (!IsEnabled || !m_writable)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// paste from the clipboard
|
// paste from the clipboard
|
||||||
@ -636,7 +634,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_BACK:
|
case KEY_BACK:
|
||||||
if ( !this->IsEnabled )
|
if (!this->IsEnabled || !m_writable)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!Text.empty()) {
|
if (!Text.empty()) {
|
||||||
@ -675,7 +673,7 @@ bool intlGUIEditBox::processKey(const SEvent& event)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_DELETE:
|
case KEY_DELETE:
|
||||||
if ( !this->IsEnabled )
|
if (!this->IsEnabled || !m_writable)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!Text.empty()) {
|
if (!Text.empty()) {
|
||||||
@ -1351,7 +1349,7 @@ s32 intlGUIEditBox::getLineFromPos(s32 pos)
|
|||||||
|
|
||||||
void intlGUIEditBox::inputChar(wchar_t c)
|
void intlGUIEditBox::inputChar(wchar_t c)
|
||||||
{
|
{
|
||||||
if (!IsEnabled)
|
if (!IsEnabled || !m_writable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (c != 0)
|
if (c != 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user