Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

textarea[], field[]: Unify function, fix wrong fallback text #6787

Merged
merged 4 commits into from Mar 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
162 changes: 67 additions & 95 deletions src/gui/guiFormSpecMenu.cpp
Expand Up @@ -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) { \
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/gui/guiFormSpecMenu.h
Expand Up @@ -484,6 +484,8 @@ class GUIFormSpecMenu : public GUIModalMenu
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);
Expand Down
14 changes: 6 additions & 8 deletions src/gui/intlGUIEditBox.cpp
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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)
Expand Down