Add more visual feedback for button states (#8916)
authorHugues Ross <hugues.ross@gmail.com>
Sat, 12 Oct 2019 16:44:23 +0000 (12:44 -0400)
committerSmallJoker <SmallJoker@users.noreply.github.com>
Sat, 12 Oct 2019 16:44:23 +0000 (18:44 +0200)
- Add style properties for overriding the the hovered/pressed state
  - By default, hovered buttons are a lighter version of the base color
  - By default, pressed buttons are a darker version of the base color
- Add hovered bg image support for image buttons (style property)

doc/lua_api.txt
games/minimal/mods/test/formspec.lua
src/gui/StyleSpec.h
src/gui/guiButton.cpp
src/gui/guiButton.h
src/gui/guiConfirmRegistration.cpp
src/gui/guiFormSpecMenu.cpp
src/gui/guiKeyChangeMenu.cpp
src/gui/guiPasswordChange.cpp
src/gui/guiVolumeChange.cpp

index 907f47e739808f2b5207e8814bbae6f8fbbe863f..5640be73c37d329e5bbb84a60e61d8bc8bfbdd46 100644 (file)
@@ -2501,7 +2501,10 @@ Some types may inherit styles from parent types.
 * button, button_exit
     * alpha - boolean, whether to draw alpha in bgimg. Default true.
     * bgcolor - color, sets button tint.
+    * bgcolor_hovered - color when hovered. Defaults to a lighter bgcolor when not provided.
+    * bgcolor_pressed - color when pressed. Defaults to a darker bgcolor when not provided.
     * bgimg - standard image. Defaults to none.
+    * bgimg_hovered - image when hovered. Defaults to bgimg when not provided.
     * bgimg_pressed - image when pressed. Defaults to bgimg when not provided.
     * border - boolean, draw border. Set to false to hide the bevelled button pane. Default true.
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
index a4d120b41ca21e1cd77a7a5636c8e0ac37483711..6371e3d442437826b25852e1445f3144302e498d 100644 (file)
@@ -27,19 +27,23 @@ local clip_fs = [[
 \r
 \r
 local style_fs = [[\r
-       style[one_btn1;bgcolor=red;textcolor=yellow]\r
+       style[one_btn1;bgcolor=red;textcolor=yellow;bgcolor_hovered=orange;\r
+               bgcolor_pressed=purple]\r
        button[0,0;2.5,0.8;one_btn1;Button]\r
 \r
        style[one_btn2;border=false;textcolor=cyan]\r
        button[0,1.05;2.5,0.8;one_btn2;Text Button]\r
 \r
-       style[one_btn3;bgimg=bubble.png;bgimg_pressed=heart.png]\r
+       style[one_btn3;bgimg=bubble.png;bgimg_hovered=default_apple.png;\r
+               bgimg_pressed=heart.png]\r
        button[0,2.1;1,1;one_btn3;Bor]\r
 \r
-       style[one_btn4;bgimg=bubble.png;bgimg_pressed=heart.png;border=false]\r
+       style[one_btn4;bgimg=bubble.png;bgimg_hovered=default_apple.png;\r
+               bgimg_pressed=heart.png;border=false]\r
        button[1.25,2.1;1,1;one_btn4;Bub]\r
 \r
-       style[one_btn5;bgimg=bubble.png;bgimg_pressed=heart.png;border=false;alpha=false]\r
+       style[one_btn5;bgimg=bubble.png;bgimg_hovered=default_apple.png;\r
+               bgimg_pressed=heart.png;border=false;alpha=false]\r
        button[0,3.35;1,1;one_btn5;Alph]\r
 \r
        style[one_btn6;border=true]\r
index 29aae083647ee3dc12fe93f4535efb130cee8917..5784a552c70226fbed79dbc0c082907572505167 100644 (file)
@@ -29,9 +29,12 @@ public:
        {
                TEXTCOLOR,
                BGCOLOR,
+               BGCOLOR_HOVERED,
+               BGCOLOR_PRESSED,
                NOCLIP,
                BORDER,
                BGIMG,
+               BGIMG_HOVERED,
                BGIMG_PRESSED,
                ALPHA,
                NUM_PROPERTIES,
@@ -49,12 +52,18 @@ public:
                        return TEXTCOLOR;
                } else if (name == "bgcolor") {
                        return BGCOLOR;
+               } else if (name == "bgcolor_hovered") {
+                       return BGCOLOR_HOVERED;
+               } else if (name == "bgcolor_pressed") {
+                       return BGCOLOR_PRESSED;
                } else if (name == "noclip") {
                        return NOCLIP;
                } else if (name == "border") {
                        return BORDER;
                } else if (name == "bgimg") {
                        return BGIMG;
+               } else if (name == "bgimg_hovered") {
+                       return BGIMG_HOVERED;
                } else if (name == "bgimg_pressed") {
                        return BGIMG_PRESSED;
                } else if (name == "alpha") {
index 60d330f4ab61579ec5a8f5de05bc1063fdb8c4f7..6ed5d37729e04db23fb90e3482534bde5a410d56 100644 (file)
 using namespace irr;\r
 using namespace gui;\r
 \r
+// Multiply with a color to get the default corresponding hovered color\r
+#define COLOR_HOVERED_MOD 1.25f\r
+\r
+// Multiply with a color to get the default corresponding pressed color\r
+#define COLOR_PRESSED_MOD 0.85f\r
+\r
 //! constructor\r
 GUIButton::GUIButton(IGUIEnvironment* environment, IGUIElement* parent,\r
                        s32 id, core::rect<s32> rectangle, bool noclip)\r
@@ -34,6 +40,14 @@ GUIButton::GUIButton(IGUIEnvironment* environment, IGUIElement* parent,
        // PATCH\r
        for (size_t i = 0; i < 4; i++) {\r
                Colors[i] = Environment->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);\r
+               HoveredColors[i] = irr::video::SColor(Colors[i].getAlpha(),\r
+                       core::clamp<u32>(Colors[i].getRed() * COLOR_HOVERED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getGreen() * COLOR_HOVERED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getBlue() * COLOR_HOVERED_MOD, 0, 255));\r
+               PressedColors[i] = irr::video::SColor(Colors[i].getAlpha(),\r
+                       core::clamp<u32>(Colors[i].getRed() * COLOR_PRESSED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getGreen() * COLOR_PRESSED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getBlue() * COLOR_PRESSED_MOD, 0, 255));\r
        }\r
        // END PATCH\r
 }\r
@@ -247,13 +261,15 @@ void GUIButton::draw()
                if (!Pressed)\r
                {\r
                        // PATCH\r
-                       skin->drawColored3DButtonPaneStandard(this, AbsoluteRect, &AbsoluteClippingRect, Colors);\r
+                       skin->drawColored3DButtonPaneStandard(this, AbsoluteRect, &AbsoluteClippingRect,\r
+                               Environment->getHovered() == this ? HoveredColors : Colors);\r
                        // END PATCH\r
                }\r
                else\r
                {\r
                        // PATCH\r
-                       skin->drawColored3DButtonPanePressed(this, AbsoluteRect, &AbsoluteClippingRect, Colors);\r
+                       skin->drawColored3DButtonPanePressed(this,\r
+                                       AbsoluteRect, &AbsoluteClippingRect, PressedColors);\r
                        // END PATCH\r
                }\r
        }\r
@@ -389,10 +405,11 @@ EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed) const
        // find a compatible state that has images\r
        while ( state != EGBIS_IMAGE_UP && !ButtonImages[(u32)state].Texture )\r
        {\r
+               // PATCH\r
                switch ( state )\r
                {\r
                        case EGBIS_IMAGE_UP_FOCUSED:\r
-                               state = EGBIS_IMAGE_UP_MOUSEOVER;\r
+                               state = EGBIS_IMAGE_UP;\r
                                break;\r
                        case EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER:\r
                                state = EGBIS_IMAGE_UP_FOCUSED;\r
@@ -401,7 +418,7 @@ EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed) const
                                state = EGBIS_IMAGE_DOWN;\r
                                break;\r
                        case EGBIS_IMAGE_DOWN_FOCUSED:\r
-                               state = EGBIS_IMAGE_DOWN_MOUSEOVER;\r
+                               state = EGBIS_IMAGE_DOWN;\r
                                break;\r
                        case EGBIS_IMAGE_DOWN_FOCUSED_MOUSEOVER:\r
                                state = EGBIS_IMAGE_DOWN_FOCUSED;\r
@@ -415,6 +432,7 @@ EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed) const
                        default:\r
                                state = EGBIS_IMAGE_UP;\r
                }\r
+               // END PATCH\r
        }\r
 \r
        return state;\r
@@ -490,6 +508,40 @@ void GUIButton::setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image,
        ButtonImages[stateIdx].SourceRect = sourceRect;\r
 }\r
 \r
+// PATCH\r
+void GUIButton::setImage(video::ITexture* image)\r
+{\r
+       setImage(gui::EGBIS_IMAGE_UP, image);\r
+}\r
+\r
+void GUIButton::setImage(video::ITexture* image, const core::rect<s32>& pos)\r
+{\r
+       setImage(gui::EGBIS_IMAGE_UP, image, pos);\r
+}\r
+\r
+void GUIButton::setPressedImage(video::ITexture* image)\r
+{\r
+       setImage(gui::EGBIS_IMAGE_DOWN, image);\r
+}\r
+\r
+void GUIButton::setPressedImage(video::ITexture* image, const core::rect<s32>& pos)\r
+{\r
+       setImage(gui::EGBIS_IMAGE_DOWN, image, pos);\r
+}\r
+\r
+void GUIButton::setHoveredImage(video::ITexture* image)\r
+{\r
+       setImage(gui::EGBIS_IMAGE_UP_MOUSEOVER, image);\r
+       setImage(gui::EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER, image);\r
+}\r
+\r
+void GUIButton::setHoveredImage(video::ITexture* image, const core::rect<s32>& pos)\r
+{\r
+       setImage(gui::EGBIS_IMAGE_UP_MOUSEOVER, image, pos);\r
+       setImage(gui::EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER, image, pos);\r
+}\r
+// END PATCH\r
+\r
 //! Sets if the button should behave like a push button. Which means it\r
 //! can be in two states: Normal or Pressed. With a click on the button,\r
 //! the user can change the state of the button.\r
@@ -644,6 +696,30 @@ void GUIButton::setColor(video::SColor color)
        for (size_t i = 0; i < 4; i++) {\r
                video::SColor base = Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);\r
                Colors[i] = base.getInterpolated(color, d);\r
+               HoveredColors[i] = irr::video::SColor(Colors[i].getAlpha(),\r
+                       core::clamp<u32>(Colors[i].getRed() * COLOR_HOVERED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getGreen() * COLOR_HOVERED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getBlue() * COLOR_HOVERED_MOD, 0, 255));\r
+               PressedColors[i] = irr::video::SColor(Colors[i].getAlpha(),\r
+                       core::clamp<u32>(Colors[i].getRed() * COLOR_PRESSED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getGreen() * COLOR_PRESSED_MOD, 0, 255),\r
+                       core::clamp<u32>(Colors[i].getBlue() * COLOR_PRESSED_MOD, 0, 255));\r
+       }\r
+}\r
+void GUIButton::setHoveredColor(video::SColor color)\r
+{\r
+       float d = 0.65f;\r
+       for (size_t i = 0; i < 4; i++) {\r
+               video::SColor base = Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);\r
+               HoveredColors[i] = base.getInterpolated(color, d);\r
+       }\r
+}\r
+void GUIButton::setPressedColor(video::SColor color)\r
+{\r
+       float d = 0.65f;\r
+       for (size_t i = 0; i < 4; i++) {\r
+               video::SColor base = Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);\r
+               PressedColors[i] = base.getInterpolated(color, d);\r
        }\r
 }\r
 // END PATCH\r
index 63e29ccfcf7b72c6a61b73fea2a0d1b32e4041ee..3c353d240459b391edd49ad4bacf97d83862af0e 100644 (file)
@@ -102,34 +102,30 @@ public:
        //! Checks if an override color is enabled\r
        virtual bool isOverrideColorEnabled(void) const;\r
 \r
+       // PATCH\r
        //! Sets an image which should be displayed on the button when it is in the given state.\r
        virtual void setImage(gui::EGUI_BUTTON_IMAGE_STATE state,\r
-                       video::ITexture* image=0,\r
+                       video::ITexture* image=nullptr,\r
                        const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0));\r
 \r
        //! Sets an image which should be displayed on the button when it is in normal state.\r
-       virtual void setImage(video::ITexture* image=0) override\r
-       {\r
-               setImage(gui::EGBIS_IMAGE_UP, image);\r
-       }\r
+       virtual void setImage(video::ITexture* image=nullptr) override;\r
 \r
        //! Sets an image which should be displayed on the button when it is in normal state.\r
-       virtual void setImage(video::ITexture* image, const core::rect<s32>& pos) override\r
-       {\r
-               setImage(gui::EGBIS_IMAGE_UP, image, pos);\r
-       }\r
+       virtual void setImage(video::ITexture* image, const core::rect<s32>& pos) override;\r
 \r
        //! Sets an image which should be displayed on the button when it is in pressed state.\r
-       virtual void setPressedImage(video::ITexture* image=0) override\r
-       {\r
-               setImage(gui::EGBIS_IMAGE_DOWN, image);\r
-       }\r
+       virtual void setPressedImage(video::ITexture* image=nullptr) override;\r
 \r
        //! Sets an image which should be displayed on the button when it is in pressed state.\r
-       virtual void setPressedImage(video::ITexture* image, const core::rect<s32>& pos) override\r
-       {\r
-               setImage(gui::EGBIS_IMAGE_DOWN, image, pos);\r
-       }\r
+       virtual void setPressedImage(video::ITexture* image, const core::rect<s32>& pos) override;\r
+\r
+       //! Sets an image which should be displayed on the button when it is in hovered state.\r
+       virtual void setHoveredImage(video::ITexture* image=nullptr);\r
+       // END PATCH\r
+\r
+       //! Sets an image which should be displayed on the button when it is in hovered state.\r
+       virtual void setHoveredImage(video::ITexture* image, const core::rect<s32>& pos);\r
 \r
        //! Sets the sprite bank used by the button\r
        virtual void setSpriteBank(gui::IGUISpriteBank* bank=0) override;\r
@@ -215,6 +211,10 @@ public:
 \r
 \r
        void setColor(video::SColor color);\r
+       // PATCH\r
+       void setHoveredColor(video::SColor color);\r
+       void setPressedColor(video::SColor color);\r
+       // END PATCH\r
 \r
 \r
        //! Do not drop returned handle\r
@@ -307,4 +307,8 @@ private:
        bool ScaleImage;\r
 \r
        video::SColor Colors[4];\r
+       // PATCH\r
+       video::SColor HoveredColors[4];\r
+       video::SColor PressedColors[4];\r
+       // END PATCH\r
 };\r
index 6fe2a4fc4cdf4793935ec472dc55d42f5b97155e..49b81b01d55da391c49618c7f931ea17bb460b8c 100644 (file)
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "guiConfirmRegistration.h"
 #include "client/client.h"
+#include "guiButton.h"
 #include <IGUICheckBox.h>
 #include <IGUIButton.h>
 #include <IGUIStaticText.h>
@@ -128,14 +129,14 @@ void GUIConfirmRegistration::regenerateGui(v2u32 screensize)
                core::rect<s32> rect2(0, 0, 230 * s, 35 * s);
                rect2 = rect2 + v2s32(size.X / 2 - 220 * s, ypos);
                text = wgettext("Register and Join");
-               Environment->addButton(rect2, this, ID_confirm, text);
+               GUIButton::addButton(Environment, rect2, this, ID_confirm, text);
                delete[] text;
        }
        {
                core::rect<s32> rect2(0, 0, 120 * s, 35 * s);
                rect2 = rect2 + v2s32(size.X / 2 + 70 * s, ypos);
                text = wgettext("Cancel");
-               Environment->addButton(rect2, this, ID_cancel, text);
+               GUIButton::addButton(Environment, rect2, this, ID_cancel, text);
                delete[] text;
        }
        {
index aee7da8696c8e780d4a435ad05e18f3070ab80f8..ea6072cabf4ab1984c8fe63e9059754aafde8f62 100644 (file)
@@ -712,6 +712,13 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
                if (style.isNotDefault(StyleSpec::BGCOLOR)) {
                        e->setColor(style.getColor(StyleSpec::BGCOLOR));
                }
+               if (style.isNotDefault(StyleSpec::BGCOLOR_HOVERED)) {
+                       e->setHoveredColor(style.getColor(StyleSpec::BGCOLOR_HOVERED));
+               }
+               if (style.isNotDefault(StyleSpec::BGCOLOR_PRESSED)) {
+                       e->setPressedColor(style.getColor(StyleSpec::BGCOLOR_PRESSED));
+               }
+
                if (style.isNotDefault(StyleSpec::TEXTCOLOR)) {
                        e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR));
                }
@@ -720,11 +727,17 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
 
                if (style.isNotDefault(StyleSpec::BGIMG)) {
                        std::string image_name = style.get(StyleSpec::BGIMG, "");
+                       std::string hovered_image_name = style.get(StyleSpec::BGIMG_HOVERED, "");
                        std::string pressed_image_name = style.get(StyleSpec::BGIMG_PRESSED, "");
 
                        video::ITexture *texture = 0;
+                       video::ITexture *hovered_texture = 0;
                        video::ITexture *pressed_texture = 0;
                        texture = m_tsrc->getTexture(image_name);
+                       if (!hovered_image_name.empty())
+                               hovered_texture = m_tsrc->getTexture(hovered_image_name);
+                       else
+                               hovered_texture = texture;
                        if (!pressed_image_name.empty())
                                pressed_texture = m_tsrc->getTexture(pressed_image_name);
                        else
@@ -733,6 +746,8 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
                        e->setUseAlphaChannel(style.getBool(StyleSpec::ALPHA, true));
                        e->setImage(guiScalingImageButton(
                                        Environment->getVideoDriver(), texture, geom.X, geom.Y));
+                       e->setHoveredImage(guiScalingImageButton(
+                                       Environment->getVideoDriver(), hovered_texture, geom.X, geom.Y));
                        e->setPressedImage(guiScalingImageButton(
                                        Environment->getVideoDriver(), pressed_texture, geom.X, geom.Y));
                        e->setScaleImage(true);
@@ -1620,7 +1635,7 @@ void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &elem
                else
                        pressed_texture = texture;
 
-               gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, spec.flabel.c_str());
+               GUIButton *e = GUIButton::addButton(Environment, rect, this, spec.fid, spec.flabel.c_str());
 
                if (spec.fname == data->focused_fieldname) {
                        Environment->setFocus(e);
@@ -1818,7 +1833,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string &
                        258 + m_fields.size()
                );
 
-               gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, L"");
+               gui::IGUIButton *e = GUIButton::addButton(Environment, rect, this, spec.fid, L"");
 
                auto style = getStyleForElement("item_image_button", spec.fname, "image_button");
                e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false));
@@ -2697,7 +2712,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
                                        core::rect<s32>(size.X/2-70, pos.Y,
                                                        (size.X/2-70)+140, pos.Y + (m_btn_height*2));
                        const wchar_t *text = wgettext("Proceed");
-                       Environment->addButton(mydata.rect, this, 257, text);
+                       GUIButton::addButton(Environment, mydata.rect, this, 257, text);
                        delete[] text;
                }
 
index ca331a7d4e733837190c3755165a4a3622231f6c..1d4f351cc9d71e4cc33120cd8671bd1bf7425ea0 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "guiKeyChangeMenu.h"
 #include "debug.h"
+#include "guiButton.h"
 #include "serialization.h"
 #include <string>
 #include <IGUICheckBox.h>
@@ -157,7 +158,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
                        core::rect<s32> rect(0, 0, 100 * s, 30 * s);
                        rect += topleft + v2s32(offset.X + 150 * s, offset.Y - 5 * s);
                        const wchar_t *text = wgettext(k->key.name());
-                       k->button = Environment->addButton(rect, this, k->id, text);
+                       k->button = GUIButton::addButton(Environment, rect, this, k->id, text);
                        delete[] text;
                }
                if ((i + 1) % KMaxButtonPerColumns == 0) {
@@ -217,16 +218,14 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
                core::rect<s32> rect(0, 0, 100 * s, 30 * s);
                rect += topleft + v2s32(size.X / 2 - 105 * s, size.Y - 40 * s);
                const wchar_t *text =  wgettext("Save");
-               Environment->addButton(rect, this, GUI_ID_BACK_BUTTON,
-                                text);
+               GUIButton::addButton(Environment, rect, this, GUI_ID_BACK_BUTTON, text);
                delete[] text;
        }
        {
                core::rect<s32> rect(0, 0, 100 * s, 30 * s);
                rect += topleft + v2s32(size.X / 2 + 5 * s, size.Y - 40 * s);
                const wchar_t *text = wgettext("Cancel");
-               Environment->addButton(rect, this, GUI_ID_ABORT_BUTTON,
-                               text);
+               GUIButton::addButton(Environment, rect, this, GUI_ID_ABORT_BUTTON, text);
                delete[] text;
        }
 }
index 469c38dbeda3f683534add57615bc5e141e2f3fc..af91ce84c44950cb0cd96c884e608f849873976d 100644 (file)
@@ -18,6 +18,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include "guiPasswordChange.h"
 #include "client/client.h"
+#include "guiButton.h"
 #include <IGUICheckBox.h>
 #include <IGUIEditBox.h>
 #include <IGUIButton.h>
@@ -145,14 +146,14 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize)
                core::rect<s32> rect(0, 0, 100 * s, 30 * s);
                rect = rect + v2s32(size.X / 4 + 56 * s, ypos);
                text = wgettext("Change");
-               Environment->addButton(rect, this, ID_change, text);
+               GUIButton::addButton(Environment, rect, this, ID_change, text);
                delete[] text;
        }
        {
                core::rect<s32> rect(0, 0, 100 * s, 30 * s);
                rect = rect + v2s32(size.X / 4 + 185 * s, ypos);
                text = wgettext("Cancel");
-               Environment->addButton(rect, this, ID_cancel, text);
+               GUIButton::addButton(Environment, rect, this, ID_cancel, text);
                delete[] text;
        }
 
index 45d2ee13994ce2ba9fb3388e39f9a46f6af8a7fd..9428cde83cffcb05544cd26a0cdde7ab86bbbafd 100644 (file)
@@ -19,6 +19,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include "guiVolumeChange.h"
 #include "debug.h"
+#include "guiButton.h"
 #include "serialization.h"
 #include <string>
 #include <IGUICheckBox.h>
@@ -103,8 +104,7 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize)
                core::rect<s32> rect(0, 0, 80 * s, 30 * s);
                rect = rect + v2s32(size.X / 2 - 80 * s / 2, size.Y / 2 + 55 * s);
                const wchar_t *text = wgettext("Exit");
-               Environment->addButton(rect, this, ID_soundExitButton,
-                       text);
+               GUIButton::addButton(Environment, rect, this, ID_soundExitButton, text);
                delete[] text;
        }
        {