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()
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;
}
}
}
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";
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;
}
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);
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];
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);
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()
);
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;
}
irr::video::SColor color;
- if (parseColor(color_str,color)) {
+ if (parseColor(color_str, color)) {
BoxDrawSpec spec(pos,geom,color);
m_boxes.push_back(spec);
}
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]);
{
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];
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)
{
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;
}
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;
}
-