Formspec: recreate item_image_button pressed state for its image and label
authorRealBadAngel <maciej.kasatkin@o2.pl>
Tue, 9 Feb 2016 09:43:38 +0000 (10:43 +0100)
committerest31 <MTest31@outlook.com>
Sat, 13 Feb 2016 01:35:52 +0000 (02:35 +0100)
src/guiFormSpecMenu.cpp
src/guiFormSpecMenu.h

index 226cc6cf0e771f5714b36089cdc4917249a994e6..8a657a2ffa01f4a471cd07ecf46b9b5394f5c908 100644 (file)
@@ -1503,10 +1503,6 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
                        Environment->setFocus(e);
                }
 
-               e->setUseAlphaChannel(true);
-               e->setImage(guiScalingImageButton(Environment->getVideoDriver(), NULL, geom.X, geom.Y));
-               e->setPressedImage(guiScalingImageButton(Environment->getVideoDriver(), NULL, geom.X, geom.Y));
-               e->setScaleImage(true);
                spec.ftype = f_Button;
                rect+=data->basepos-padding;
                spec.rect=rect;
@@ -1514,13 +1510,8 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
                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, pos, geom));
-
-               StaticTextSpec label_spec(
-                       utf8_to_wide(label),
-                       rect
-               );
-               m_static_texts.push_back(label_spec);
+               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;
@@ -2442,6 +2433,11 @@ void GUIFormSpecMenu::drawMenu()
                core::rect<s32> imgrect(0, 0, spec.geom.X, spec.geom.Y);
                // Viewport rectangle on screen
                core::rect<s32> rect = imgrect + spec.pos;
+               if (spec.parent_button && spec.parent_button->isPressed()) {
+                       rect += core::dimension2d<s32>(
+                               skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),
+                               skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y));
+               }
                drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect,
                                m_gamedef, IT_ROT_NONE);
        }
@@ -2474,8 +2470,16 @@ void GUIFormSpecMenu::drawMenu()
        */
        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()) {
+                       // 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));
+               }
                video::SColor color(255, 255, 255, 255);
-               m_font->draw(spec.text.c_str(), spec.rect, color, true, true, &spec.rect);
+               m_font->draw(spec.text.c_str(), rect, color, true, true, &rect);
        }
 
        /*
index 9955048a351c4958f58048a810e852de6ee06f86..005b9136955b14d33c09993b720d9e297c7fe638 100644 (file)
@@ -139,36 +139,53 @@ class GUIFormSpecMenu : public GUIModalMenu
 
        struct ImageDrawSpec
        {
-               ImageDrawSpec()
+               ImageDrawSpec():
+                       parent_button(NULL)
                {
                }
                ImageDrawSpec(const std::string &a_name,
                                const std::string &a_item_name,
+                               gui::IGUIButton *a_parent_button,
                                const v2s32 &a_pos, const v2s32 &a_geom):
                        name(a_name),
-                       item_name (a_item_name),
+                       item_name(a_item_name),
+                       parent_button(a_parent_button),
                        pos(a_pos),
-                       geom(a_geom)
+                       geom(a_geom),
+                       scale(true)
                {
-                       scale = true;
                }
                ImageDrawSpec(const std::string &a_name,
+                               const std::string &a_item_name,
                                const v2s32 &a_pos, const v2s32 &a_geom):
                        name(a_name),
+                       item_name(a_item_name),
+                       parent_button(NULL),
                        pos(a_pos),
-                       geom(a_geom)
+                       geom(a_geom),
+                       scale(true)
+               {
+               }
+               ImageDrawSpec(const std::string &a_name,
+                               const v2s32 &a_pos, const v2s32 &a_geom):
+                       name(a_name),
+                       parent_button(NULL),
+                       pos(a_pos),
+                       geom(a_geom),
+                       scale(true)
                {
-                       scale = true;
                }
                ImageDrawSpec(const std::string &a_name,
                                const v2s32 &a_pos):
                        name(a_name),
-                       pos(a_pos)
+                       parent_button(NULL),
+                       pos(a_pos),
+                       scale(false)
                {
-                       scale = false;
                }
                std::string name;
                std::string item_name;
+               gui::IGUIButton *parent_button;
                v2s32 pos;
                v2s32 geom;
                bool scale;
@@ -229,17 +246,28 @@ class GUIFormSpecMenu : public GUIModalMenu
        };
 
        struct StaticTextSpec {
-               StaticTextSpec()
+               StaticTextSpec():
+                       parent_button(NULL)
                {
                }
                StaticTextSpec(const std::wstring &a_text,
                                const core::rect<s32> &a_rect):
                        text(a_text),
-                       rect(a_rect)
+                       rect(a_rect),
+                       parent_button(NULL)
+               {
+               }
+               StaticTextSpec(const std::wstring &a_text,
+                               const core::rect<s32> &a_rect,
+                               gui::IGUIButton *a_parent_button):
+                       text(a_text),
+                       rect(a_rect),
+                       parent_button(a_parent_button)
                {
                }
                std::wstring text;
                core::rect<s32> rect;
+               gui::IGUIButton *parent_button;
        };
 
 public: