diff options
-rw-r--r-- | doc/lua_api.txt | 12 | ||||
-rw-r--r-- | src/guiFormSpecMenu.cpp | 26 |
2 files changed, 31 insertions, 7 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt index b0281bee7..9973a790b 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -933,16 +933,24 @@ button[<X>,<Y>;<W>,<H>;<name>;<label>] image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>] ^ x, y, w, h, and name work as per button -^ image is the filename of an image +^ texture name is the filename of an image ^ Position and size units are inventory slots image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>] ^ x, y, w, h, and name work as per button -^ image is the filename of an image +^ texture name is the filename of an image ^ Position and size units are inventory slots ^ noclip true meand imagebutton doesn't need to be within specified formsize ^ drawborder draw button bodrer or not +image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>] +^ x, y, w, h, and name work as per button +^ texture name is the filename of an image +^ Position and size units are inventory slots +^ noclip true meand imagebutton doesn't need to be within specified formsize +^ drawborder draw button bodrer or not +^ pressed texture name is the filename of an image on pressed state + item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>] ^ x, y, w, h, name and label work as per button ^ item name is the registered name of an item/node, diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index e950c088b..a173c0d25 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -1116,7 +1116,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element) { 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]; @@ -1136,13 +1136,19 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,std: 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); @@ -1169,21 +1175,31 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,std: 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); |