diff options
Diffstat (limited to 'src/guiFormSpecMenu.cpp')
-rw-r--r-- | src/guiFormSpecMenu.cpp | 262 |
1 files changed, 160 insertions, 102 deletions
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 62a84460f..2bf06c1d6 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "gamedef.h" #include "keycode.h" -#include "strfnd.h" +#include "util/strfnd.h" #include <IGUICheckBox.h> #include <IGUIEditBox.h> #include <IGUIButton.h> @@ -240,6 +240,15 @@ GUITable* GUIFormSpecMenu::getTable(const std::string &tablename) return 0; } +std::vector<std::string>* GUIFormSpecMenu::getDropDownValues(const std::string &name) +{ + for (u32 i = 0; i < m_dropdowns.size(); ++i) { + if (name == m_dropdowns[i].first.fname) + return &m_dropdowns[i].second; + } + return NULL; +} + static std::vector<std::string> split(const std::string &s, char delim) { std::vector<std::string> tokens; @@ -300,7 +309,7 @@ void GUIFormSpecMenu::parseSize(parserData* data,std::string element) void GUIFormSpecMenu::parseList(parserData* data,std::string element) { if (m_gamedef == 0) { - errorstream<<"WARNING: invalid use of 'list' with m_gamedef==0"<<std::endl; + warningstream<<"invalid use of 'list' with m_gamedef==0"<<std::endl; return; } @@ -345,7 +354,7 @@ void GUIFormSpecMenu::parseList(parserData* data,std::string element) } if(!data->explicit_size) - errorstream<<"WARNING: invalid use of list without a size[] element"<<std::endl; + warningstream<<"invalid use of list without a size[] element"<<std::endl; m_inventorylists.push_back(ListDrawSpec(loc, listname, pos, geom, start_i)); return; } @@ -413,7 +422,7 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element) if (selected == "true") fselected = true; - std::wstring wlabel = utf8_to_wide(label); + std::wstring wlabel = utf8_to_wide(unescape_string(label)); core::rect<s32> rect = core::rect<s32>( pos.X, pos.Y + ((imgsize.Y/2) - m_btn_height), @@ -450,7 +459,7 @@ void GUIFormSpecMenu::parseScrollBar(parserData* data, std::string element) if (parts.size() >= 5) { std::vector<std::string> v_pos = split(parts[0],','); std::vector<std::string> v_dim = split(parts[1],','); - std::string name = parts[2]; + std::string name = parts[3]; std::string value = parts[4]; MY_CHECKPOS("scrollbar",0); @@ -525,7 +534,7 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element) geom.Y = stof(v_geom[1]) * (float)imgsize.Y; if(!data->explicit_size) - errorstream<<"WARNING: invalid use of image without a size[] element"<<std::endl; + warningstream<<"invalid use of image without a size[] element"<<std::endl; m_images.push_back(ImageDrawSpec(name, pos, geom)); return; } @@ -541,7 +550,7 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element) pos.Y += stof(v_pos[1]) * (float) spacing.Y; if(!data->explicit_size) - errorstream<<"WARNING: invalid use of image without a size[] element"<<std::endl; + warningstream<<"invalid use of image without a size[] element"<<std::endl; m_images.push_back(ImageDrawSpec(name, pos)); return; } @@ -571,8 +580,8 @@ void GUIFormSpecMenu::parseItemImage(parserData* data,std::string element) geom.Y = stof(v_geom[1]) * (float)imgsize.Y; if(!data->explicit_size) - errorstream<<"WARNING: invalid use of item_image without a size[] element"<<std::endl; - m_itemimages.push_back(ImageDrawSpec(name, pos, geom)); + warningstream<<"invalid use of item_image without a size[] element"<<std::endl; + m_itemimages.push_back(ImageDrawSpec("", name, pos, geom)); return; } errorstream<< "Invalid ItemImage element(" << parts.size() << "): '" << element << "'" << std::endl; @@ -607,11 +616,9 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element, pos.X + geom.X, pos.Y + m_btn_height); if(!data->explicit_size) - errorstream<<"WARNING: invalid use of button without a size[] element"<<std::endl; - - label = unescape_string(label); + warningstream<<"invalid use of button without a size[] element"<<std::endl; - std::wstring wlabel = utf8_to_wide(label); + std::wstring wlabel = utf8_to_wide(unescape_string(label)); FieldSpec spec( name, @@ -666,7 +673,7 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element) } if(!data->explicit_size) - errorstream<<"WARNING: invalid use of background without a size[] element"<<std::endl; + warningstream<<"invalid use of background without a size[] element"<<std::endl; m_backgrounds.push_back(ImageDrawSpec(name, pos, geom)); return; } @@ -733,7 +740,6 @@ void GUIFormSpecMenu::parseTable(parserData* data,std::string element) geom.X = stof(v_geom[0]) * (float)spacing.X; geom.Y = stof(v_geom[1]) * (float)spacing.Y; - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); FieldSpec spec( @@ -746,7 +752,7 @@ void GUIFormSpecMenu::parseTable(parserData* data,std::string element) spec.ftype = f_Table; for (unsigned int i = 0; i < items.size(); ++i) { - items[i] = unescape_string(items[i]); + items[i] = unescape_enriched(unescape_string(items[i])); } //now really show table @@ -818,7 +824,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) spec.ftype = f_Table; for (unsigned int i = 0; i < items.size(); ++i) { - items[i] = unescape_string(items[i]); + items[i] = unescape_enriched(unescape_string(items[i])); } //now really show list @@ -889,13 +895,22 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element) } for (unsigned int i=0; i < items.size(); i++) { - e->addItem(utf8_to_wide(items[i]).c_str()); + e->addItem(unescape_enriched(unescape_string( + utf8_to_wide(items[i]))).c_str()); } if (str_initial_selection != "") e->setSelected(stoi(str_initial_selection.c_str())-1); m_fields.push_back(spec); + + m_dropdowns.push_back(std::pair<FieldSpec, + std::vector<std::string> >(spec, std::vector<std::string>())); + std::vector<std::string> &values = m_dropdowns.back().second; + for (unsigned int i = 0; i < items.size(); i++) { + values.push_back(unescape_string(items[i])); + } + return; } errorstream << "Invalid dropdown element(" << parts.size() << "): '" @@ -930,9 +945,7 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element) core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - label = unescape_string(label); - - std::wstring wlabel = utf8_to_wide(label); + std::wstring wlabel = utf8_to_wide(unescape_string(label)); FieldSpec spec( name, @@ -982,7 +995,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data, core::rect<s32> rect; if(data->explicit_size) - errorstream<<"WARNING: invalid use of unpositioned \"field\" in inventory"<<std::endl; + warningstream<<"invalid use of unpositioned \"field\" in inventory"<<std::endl; v2s32 pos = padding + AbsoluteRect.UpperLeftCorner; pos.Y = ((m_fields.size()+2)*60); @@ -995,15 +1008,13 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data, if(m_form_src) default_val = m_form_src->resolveText(default_val); - default_val = unescape_string(default_val); - label = unescape_string(label); - std::wstring wlabel = utf8_to_wide(label); + std::wstring wlabel = utf8_to_wide(unescape_string(label)); FieldSpec spec( name, wlabel, - utf8_to_wide(default_val), + utf8_to_wide(unescape_string(default_val)), 258+m_fields.size() ); @@ -1088,21 +1099,18 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); if(!data->explicit_size) - errorstream<<"WARNING: invalid use of positioned "<<type<<" without a size[] element"<<std::endl; + warningstream<<"invalid use of positioned "<<type<<" without a size[] element"<<std::endl; if(m_form_src) default_val = m_form_src->resolveText(default_val); - default_val = unescape_string(default_val); - label = unescape_string(label); - - std::wstring wlabel = utf8_to_wide(label); + std::wstring wlabel = utf8_to_wide(unescape_string(label)); FieldSpec spec( name, wlabel, - utf8_to_wide(default_val), + utf8_to_wide(unescape_string(default_val)), 258+m_fields.size() ); @@ -1195,9 +1203,8 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element) pos.Y += (stof(v_pos[1]) + 7.0/30.0) * (float)spacing.Y; if(!data->explicit_size) - errorstream<<"WARNING: invalid use of label without a size[] element"<<std::endl; + warningstream<<"invalid use of label without a size[] element"<<std::endl; - text = unescape_string(text); std::vector<std::string> lines = split(text, '\n'); for (unsigned int i = 0; i != lines.size(); i++) { @@ -1211,7 +1218,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element) // in the integer cases: 0.4 is not exactly // representable in binary floating point. s32 posy = pos.Y + ((float)i) * spacing.Y * 2.0 / 5.0; - std::wstring wlabel = utf8_to_wide(lines[i]); + std::wstring wlabel = utf8_to_wide(unescape_string(lines[i])); core::rect<s32> rect = core::rect<s32>( pos.X, posy - m_btn_height, pos.X + m_font->getDimension(wlabel.c_str()).Width, @@ -1243,7 +1250,8 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) ((parts.size() > 2) && (m_formspec_version > FORMSPEC_API_VERSION))) { std::vector<std::string> v_pos = split(parts[0],','); - std::wstring text = utf8_to_wide(unescape_string(parts[1])); + std::wstring text = unescape_enriched( + unescape_string(utf8_to_wide(parts[1]))); MY_CHECKPOS("vertlabel",1); @@ -1260,7 +1268,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) //actually text.length() would be correct but adding +1 avoids to break all mods if(!data->explicit_size) - errorstream<<"WARNING: invalid use of label without a size[] element"<<std::endl; + warningstream<<"invalid use of label without a size[] element"<<std::endl; std::wstring label = L""; @@ -1326,13 +1334,12 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element, core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); if(!data->explicit_size) - errorstream<<"WARNING: invalid use of image_button without a size[] element"<<std::endl; + warningstream<<"invalid use of image_button without a size[] element"<<std::endl; image_name = unescape_string(image_name); pressed_image_name = unescape_string(pressed_image_name); - label = unescape_string(label); - std::wstring wlabel = utf8_to_wide(label); + std::wstring wlabel = utf8_to_wide(unescape_string(label)); FieldSpec spec( name, @@ -1430,7 +1437,8 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data,std::string element) e->setNotClipped(true); for (unsigned int i = 0; i < buttons.size(); i++) { - e->addTab(utf8_to_wide(buttons[i]).c_str(), -1); + e->addTab(unescape_enriched(unescape_string( + utf8_to_wide(buttons[i]))).c_str(), -1); } if ((tab_index >= 0) && @@ -1449,9 +1457,8 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) { if (m_gamedef == 0) { - errorstream << - "WARNING: invalid use of item_image_button with m_gamedef==0" - << std::endl; + warningstream << "invalid use of item_image_button with m_gamedef==0" + << std::endl; return; } @@ -1466,6 +1473,9 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) std::string name = parts[3]; std::string label = parts[4]; + label = unescape_string(label); + item_name = unescape_string(item_name); + MY_CHECKPOS("itemimagebutton",0); MY_CHECKGEOM("itemimagebutton",1); @@ -1479,19 +1489,17 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); if(!data->explicit_size) - errorstream<<"WARNING: invalid use of item_image_button without a size[] element"<<std::endl; + warningstream<<"invalid use of item_image_button without a size[] element"<<std::endl; IItemDefManager *idef = m_gamedef->idef(); ItemStack item; item.deSerialize(item_name, idef); - video::ITexture *texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_gamedef); m_tooltips[name] = TooltipSpec(item.getDefinition(idef).description, m_default_tooltip_bgcolor, m_default_tooltip_color); - label = unescape_string(label); FieldSpec spec( name, utf8_to_wide(label), @@ -1499,20 +1507,21 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element) 258 + m_fields.size() ); - gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, spec.flabel.c_str()); + gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, L""); if (spec.fname == data->focused_fieldname) { Environment->setFocus(e); } - e->setUseAlphaChannel(true); - e->setImage(guiScalingImageButton(Environment->getVideoDriver(), texture, geom.X, geom.Y)); - e->setPressedImage(guiScalingImageButton(Environment->getVideoDriver(), texture, geom.X, geom.Y)); - e->setScaleImage(true); spec.ftype = f_Button; rect+=data->basepos-padding; spec.rect=rect; m_fields.push_back(spec); + pos = padding + AbsoluteRect.UpperLeftCorner; + pos.X += stof(v_pos[0]) * (float) spacing.X; + pos.Y += stof(v_pos[1]) * (float) spacing.Y; + m_itemimages.push_back(ImageDrawSpec("", item_name, e, pos, geom)); + m_static_texts.push_back(StaticTextSpec(utf8_to_wide(label), rect, e)); return; } errorstream<< "Invalid ItemImagebutton element(" << parts.size() << "): '" << element << "'" << std::endl; @@ -1880,6 +1889,8 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) m_fields.clear(); m_boxes.clear(); m_tooltips.clear(); + m_inventory_rings.clear(); + m_static_texts.clear(); // Set default values (fits old formspec values) m_bgcolor = video::SColor(140,0,0,0); @@ -2103,7 +2114,7 @@ bool GUIFormSpecMenu::getAndroidUIInput() } for(std::vector<FieldSpec>::iterator iter = m_fields.begin(); - iter != m_fields.end(); iter++) { + iter != m_fields.end(); ++iter) { if (iter->fname != fieldname) { continue; @@ -2151,13 +2162,14 @@ GUIFormSpecMenu::ItemSpec GUIFormSpecMenu::getItemAtPos(v2s32 p) const return ItemSpec(InventoryLocation(), "", -1); } -void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase) +void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase, + bool &item_hovered) { video::IVideoDriver* driver = Environment->getVideoDriver(); Inventory *inv = m_invmgr->getInventory(s.inventoryloc); if(!inv){ - infostream<<"GUIFormSpecMenu::drawList(): WARNING: " + warningstream<<"GUIFormSpecMenu::drawList(): " <<"The inventory location " <<"\""<<s.inventoryloc.dump()<<"\" doesn't exist" <<std::endl; @@ -2165,7 +2177,7 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase) } InventoryList *ilist = inv->getList(s.listname); if(!ilist){ - infostream<<"GUIFormSpecMenu::drawList(): WARNING: " + warningstream<<"GUIFormSpecMenu::drawList(): " <<"The inventory list \""<<s.listname<<"\" @ \"" <<s.inventoryloc.dump()<<"\" doesn't exist" <<std::endl; @@ -2192,13 +2204,16 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase) && m_selected_item->listname == s.listname && m_selected_item->i == item_i; bool hovering = rect.isPointInside(m_pointer); + ItemRotationKind rotation_kind = selected ? IT_ROT_SELECTED : + (hovering ? IT_ROT_HOVERED : IT_ROT_NONE); - if(phase == 0) - { - if(hovering) + if (phase == 0) { + if (hovering) { + item_hovered = true; driver->draw2DRectangle(m_slotbg_h, rect, &AbsoluteClippingRect); - else + } else { driver->draw2DRectangle(m_slotbg_n, rect, &AbsoluteClippingRect); + } } //Draw inv slot borders @@ -2232,22 +2247,25 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase) if(!item.empty()) { drawItemStack(driver, m_font, item, - rect, &AbsoluteClippingRect, m_gamedef); + rect, &AbsoluteClippingRect, m_gamedef, + rotation_kind); } // Draw tooltip - std::string tooltip_text = ""; - if (hovering && !m_selected_item) - tooltip_text = item.getDefinition(m_gamedef->idef()).description; - if (tooltip_text != "") { - std::vector<std::string> tt_rows = str_split(tooltip_text, '\n'); + std::wstring tooltip_text = L""; + if (hovering && !m_selected_item) { + tooltip_text = utf8_to_wide(item.getDefinition(m_gamedef->idef()).description); + tooltip_text = unescape_enriched(tooltip_text); + } + if (tooltip_text != L"") { + std::vector<std::wstring> tt_rows = str_split(tooltip_text, L'\n'); m_tooltip_element->setBackgroundColor(m_default_tooltip_bgcolor); m_tooltip_element->setOverrideColor(m_default_tooltip_color); m_tooltip_element->setVisible(true); this->bringToFront(m_tooltip_element); - m_tooltip_element->setText(utf8_to_wide(tooltip_text).c_str()); + m_tooltip_element->setText(tooltip_text.c_str()); s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; - s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5; + s32 tooltip_height = m_tooltip_element->getTextHeight() + 5; v2u32 screenSize = driver->getScreenSize(); int tooltip_offset_x = m_btn_height; int tooltip_offset_y = m_btn_height; @@ -2273,11 +2291,15 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase) void GUIFormSpecMenu::drawSelectedItem() { - if(!m_selected_item) - return; - video::IVideoDriver* driver = Environment->getVideoDriver(); + if (!m_selected_item) { + drawItemStack(driver, m_font, ItemStack(), + core::rect<s32>(v2s32(0, 0), v2s32(0, 0)), + NULL, m_gamedef, IT_ROT_DRAGGED); + return; + } + Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc); sanity_check(inv); InventoryList *list = inv->getList(m_selected_item->listname); @@ -2287,7 +2309,7 @@ void GUIFormSpecMenu::drawSelectedItem() core::rect<s32> imgrect(0,0,imgsize.X,imgsize.Y); core::rect<s32> rect = imgrect + (m_pointer - imgrect.getCenter()); - drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef); + drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, IT_ROT_DRAGGED); } void GUIFormSpecMenu::drawMenu() @@ -2369,6 +2391,12 @@ void GUIFormSpecMenu::drawMenu() driver->draw2DRectangle(todraw, rect, 0); } + + /* + Call base class + */ + gui::IGUIElement::draw(); + /* Draw images */ @@ -2413,18 +2441,22 @@ void GUIFormSpecMenu::drawMenu() const ImageDrawSpec &spec = m_itemimages[i]; IItemDefManager *idef = m_gamedef->idef(); ItemStack item; - item.deSerialize(spec.name, idef); - video::ITexture *texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_gamedef); - // Image size on screen + item.deSerialize(spec.item_name, idef); core::rect<s32> imgrect(0, 0, spec.geom.X, spec.geom.Y); - // Image rectangle on screen + // Viewport rectangle on screen core::rect<s32> rect = imgrect + spec.pos; - const video::SColor color(255,255,255,255); - const video::SColor colors[] = {color,color,color,color}; - draw2DImageFilterScaled(driver, texture, rect, - core::rect<s32>(core::position2d<s32>(0,0), - core::dimension2di(texture->getOriginalSize())), - NULL/*&AbsoluteClippingRect*/, colors, true); + if (spec.parent_button && spec.parent_button->isPressed()) { +#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) + rect += core::dimension2d<s32>( + 0.05 * (float)rect.getWidth(), 0.05 * (float)rect.getHeight()); +#else + rect += core::dimension2d<s32>( + skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X), + skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y)); +#endif + } + drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect, + m_gamedef, IT_ROT_NONE); } /* @@ -2432,17 +2464,18 @@ void GUIFormSpecMenu::drawMenu() Phase 0: Item slot rectangles Phase 1: Item images; prepare tooltip */ - int start_phase=0; - for(int phase=start_phase; phase<=1; phase++) - for(u32 i=0; i<m_inventorylists.size(); i++) - { - drawList(m_inventorylists[i], phase); + bool item_hovered = false; + int start_phase = 0; + for (int phase = start_phase; phase <= 1; phase++) { + for (u32 i = 0; i < m_inventorylists.size(); i++) { + drawList(m_inventorylists[i], phase, item_hovered); + } + } + if (!item_hovered) { + drawItemStack(driver, m_font, ItemStack(), + core::rect<s32>(v2s32(0, 0), v2s32(0, 0)), + NULL, m_gamedef, IT_ROT_HOVERED); } - - /* - Call base class - */ - gui::IGUIElement::draw(); /* TODO find way to show tooltips on touchscreen */ #ifndef HAVE_TOUCHSCREENGUI @@ -2450,6 +2483,28 @@ void GUIFormSpecMenu::drawMenu() #endif /* + Draw static text elements + */ + for (u32 i = 0; i < m_static_texts.size(); i++) { + const StaticTextSpec &spec = m_static_texts[i]; + core::rect<s32> rect = spec.rect; + if (spec.parent_button && spec.parent_button->isPressed()) { +#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) + rect += core::dimension2d<s32>( + 0.05 * (float)rect.getWidth(), 0.05 * (float)rect.getHeight()); +#else + // Use image offset instead of text's because its a bit smaller + // and fits better, also TEXT_OFFSET_X is always 0 + rect += core::dimension2d<s32>( + skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X), + skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y)); +#endif + } + video::SColor color(255, 255, 255, 255); + m_font->draw(spec.text.c_str(), rect, color, true, true, &rect); + } + + /* Draw fields/buttons tooltips */ gui::IGUIElement *hovered = @@ -2461,7 +2516,7 @@ void GUIFormSpecMenu::drawMenu() u32 delta = 0; if (id == -1) { m_old_tooltip_id = id; - m_old_tooltip = ""; + m_old_tooltip = L""; } else { if (id == m_old_tooltip_id) { delta = porting::getDeltaMs(m_hovered_time, getTimeMs()); @@ -2473,12 +2528,12 @@ void GUIFormSpecMenu::drawMenu() if (id != -1 && delta >= m_tooltip_show_delay) { for(std::vector<FieldSpec>::iterator iter = m_fields.begin(); - iter != m_fields.end(); iter++) { - if ( (iter->fid == id) && (m_tooltips[iter->fname].tooltip != "") ){ + iter != m_fields.end(); ++iter) { + if (iter->fid == id && m_tooltips[iter->fname].tooltip != L"") { if (m_old_tooltip != m_tooltips[iter->fname].tooltip) { m_old_tooltip = m_tooltips[iter->fname].tooltip; - m_tooltip_element->setText(utf8_to_wide(m_tooltips[iter->fname].tooltip).c_str()); - std::vector<std::string> tt_rows = str_split(m_tooltips[iter->fname].tooltip, '\n'); + m_tooltip_element->setText(m_tooltips[iter->fname].tooltip.c_str()); + std::vector<std::wstring> tt_rows = str_split(m_tooltips[iter->fname].tooltip, L'\n'); s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height; s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5; int tooltip_offset_x = m_btn_height; @@ -2690,8 +2745,11 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no) } s32 selected = e->getSelected(); if (selected >= 0) { - fields[name] = - wide_to_utf8(e->getItem(selected)); + std::vector<std::string> *dropdown_values = + getDropDownValues(s.fname); + if (dropdown_values && selected < (s32)dropdown_values->size()) { + fields[name] = (*dropdown_values)[selected]; + } } } else if (s.ftype == f_TabHeader) { @@ -2832,7 +2890,7 @@ bool GUIFormSpecMenu::preprocessEvent(const SEvent& event) core::position2d<s32>(x, y)); if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { m_old_tooltip_id = -1; - m_old_tooltip = ""; + m_old_tooltip = L""; } if (!isChild(hovered,this)) { if (DoubleClickDetection(event)) { @@ -3609,7 +3667,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) std::string GUIFormSpecMenu::getNameByID(s32 id) { for(std::vector<FieldSpec>::iterator iter = m_fields.begin(); - iter != m_fields.end(); iter++) { + iter != m_fields.end(); ++iter) { if (iter->fid == id) { return iter->fname; } @@ -3625,7 +3683,7 @@ std::string GUIFormSpecMenu::getNameByID(s32 id) std::wstring GUIFormSpecMenu::getLabelByID(s32 id) { for(std::vector<FieldSpec>::iterator iter = m_fields.begin(); - iter != m_fields.end(); iter++) { + iter != m_fields.end(); ++iter) { if (iter->fid == id) { return iter->flabel; } |