\r
// PATCH\r
video::ITexture* texture = ButtonImages[(u32)imageState].Texture;\r
+ video::SColor image_colors[] = { BgColor, BgColor, BgColor, BgColor };\r
if (BgMiddle.getArea() == 0) {\r
driver->draw2DImage(texture,\r
ScaleImage? AbsoluteRect : core::rect<s32>(pos, sourceRect.getSize()),\r
sourceRect, &AbsoluteClippingRect,\r
- 0, UseAlphaChannel);\r
+ image_colors, UseAlphaChannel);\r
} else {\r
core::rect<s32> middle = BgMiddle;\r
// `-x` is interpreted as `w - x`\r
middle.LowerRightCorner.Y += texture->getOriginalSize().Height;\r
draw2DImage9Slice(driver, texture,\r
ScaleImage ? AbsoluteRect : core::rect<s32>(pos, sourceRect.getSize()),\r
- middle, &AbsoluteClippingRect);\r
+ middle, &AbsoluteClippingRect, image_colors);\r
}\r
// END PATCH\r
}\r
return OverrideColor;\r
}\r
\r
+#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8\r
+video::SColor GUIButton::getActiveColor() const\r
+{\r
+ return video::SColor(0,0,0,0); // unused?\r
+}\r
+#endif\r
+\r
void GUIButton::enableOverrideColor(bool enable)\r
{\r
OverrideColorEnabled = enable;\r
{\r
ClickTime = porting::getTimeMs();\r
Pressed = pressed;\r
-\r
- GUISkin* skin = dynamic_cast<GUISkin*>(Environment->getSkin());\r
-\r
- for(IGUIElement *child : getChildren())\r
- {\r
- core::rect<s32> originalRect = child->getRelativePosition();\r
- if (Pressed) {\r
- child->setRelativePosition(originalRect +\r
- core::dimension2d<s32>(\r
- skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),\r
- skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y)));\r
- } else {\r
- child->setRelativePosition(originalRect -\r
- core::dimension2d<s32>(\r
- skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),\r
- skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y)));\r
- }\r
- }\r
-\r
setFromState();\r
}\r
}\r
\r
void GUIButton::setColor(video::SColor color)\r
{\r
+ BgColor = 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
bool pressed = (style.getState() & StyleSpec::STATE_PRESSED) != 0;\r
\r
if (style.isNotDefault(StyleSpec::BGCOLOR)) {\r
-\r
setColor(style.getColor(StyleSpec::BGCOLOR));\r
\r
// If we have a propagated hover/press color, we need to automatically\r
// lighten/darken it\r
if (!Styles[style.getState()].isNotDefault(StyleSpec::BGCOLOR)) {\r
- for (size_t i = 0; i < 4; i++) {\r
if (pressed) {\r
- Colors[i] = multiplyColorValue(Colors[i], COLOR_PRESSED_MOD);\r
+ BgColor = multiplyColorValue(BgColor, COLOR_PRESSED_MOD);\r
+\r
+ for (size_t i = 0; i < 4; i++)\r
+ Colors[i] = multiplyColorValue(Colors[i], COLOR_PRESSED_MOD);\r
} else if (hovered) {\r
- Colors[i] = multiplyColorValue(Colors[i], COLOR_HOVERED_MOD);\r
+ BgColor = multiplyColorValue(BgColor, COLOR_HOVERED_MOD);\r
+\r
+ for (size_t i = 0; i < 4; i++)\r
+ Colors[i] = multiplyColorValue(Colors[i], COLOR_HOVERED_MOD);\r
}\r
- }\r
}\r
\r
} else {\r
+ BgColor = video::SColor(255, 255, 255, 255);\r
for (size_t i = 0; i < 4; i++) {\r
video::SColor base =\r
Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);\r
setNotClipped(style.getBool(StyleSpec::NOCLIP, false));\r
setDrawBorder(style.getBool(StyleSpec::BORDER, true));\r
setUseAlphaChannel(style.getBool(StyleSpec::ALPHA, true));\r
+ setOverrideFont(style.getFont());\r
\r
- const core::position2di buttonCenter(AbsoluteRect.getCenter());\r
- core::position2d<s32> geom(buttonCenter);\r
if (style.isNotDefault(StyleSpec::BGIMG)) {\r
video::ITexture *texture = style.getTexture(StyleSpec::BGIMG,\r
getTextureSource());\r
setImage(guiScalingImageButton(\r
- Environment->getVideoDriver(), texture, geom.X, geom.Y));\r
+ Environment->getVideoDriver(), texture,\r
+ AbsoluteRect.getWidth(), AbsoluteRect.getHeight()));\r
setScaleImage(true);\r
} else {\r
setImage(nullptr);\r
}\r
+\r
BgMiddle = style.getRect(StyleSpec::BGIMG_MIDDLE, BgMiddle);\r
+\r
+ // Child padding and offset\r
+ Padding = style.getRect(StyleSpec::PADDING, core::rect<s32>());\r
+ Padding = core::rect<s32>(\r
+ Padding.UpperLeftCorner + BgMiddle.UpperLeftCorner,\r
+ Padding.LowerRightCorner + BgMiddle.LowerRightCorner);\r
+\r
+ GUISkin* skin = dynamic_cast<GUISkin*>(Environment->getSkin());\r
+ core::vector2d<s32> defaultPressOffset(\r
+ skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),\r
+ skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y));\r
+ ContentOffset = style.getVector2i(StyleSpec::CONTENT_OFFSET, isPressed()\r
+ ? defaultPressOffset\r
+ : core::vector2d<s32>(0));\r
+\r
+ core::rect<s32> childBounds(\r
+ Padding.UpperLeftCorner.X + ContentOffset.X,\r
+ Padding.UpperLeftCorner.Y + ContentOffset.Y,\r
+ AbsoluteRect.getWidth() + Padding.LowerRightCorner.X + ContentOffset.X,\r
+ AbsoluteRect.getHeight() + Padding.LowerRightCorner.Y + ContentOffset.Y);\r
+\r
+ for (IGUIElement *child : getChildren()) {\r
+ child->setRelativePosition(childBounds);\r
+ }\r
}\r
\r
//! Set the styles used for each state\r