* 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.
\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
{
TEXTCOLOR,
BGCOLOR,
+ BGCOLOR_HOVERED,
+ BGCOLOR_PRESSED,
NOCLIP,
BORDER,
BGIMG,
+ BGIMG_HOVERED,
BGIMG_PRESSED,
ALPHA,
NUM_PROPERTIES,
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") {
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
// 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
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
// 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
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
default:\r
state = EGBIS_IMAGE_UP;\r
}\r
+ // END PATCH\r
}\r
\r
return state;\r
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
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
//! 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
\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
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
#include "guiConfirmRegistration.h"
#include "client/client.h"
+#include "guiButton.h"
#include <IGUICheckBox.h>
#include <IGUIButton.h>
#include <IGUIStaticText.h>
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;
}
{
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));
}
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
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);
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);
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));
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;
}
#include "guiKeyChangeMenu.h"
#include "debug.h"
+#include "guiButton.h"
#include "serialization.h"
#include <string>
#include <IGUICheckBox.h>
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) {
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;
}
}
#include "guiPasswordChange.h"
#include "client/client.h"
+#include "guiButton.h"
#include <IGUICheckBox.h>
#include <IGUIEditBox.h>
#include <IGUIButton.h>
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;
}
#include "guiVolumeChange.h"
#include "debug.h"
+#include "guiButton.h"
#include "serialization.h"
#include <string>
#include <IGUICheckBox.h>
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;
}
{