mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Refactor to centralize GUIButton styling/rendering code (#9090)
This commit is contained in:
parent
a462181e5f
commit
9284313d17
18 changed files with 522 additions and 145 deletions
|
@ -5,11 +5,15 @@
|
|||
#include "guiButton.h"
|
||||
|
||||
|
||||
#include "client/guiscalingfilter.h"
|
||||
#include "client/tile.h"
|
||||
#include "IGUISkin.h"
|
||||
#include "IGUIEnvironment.h"
|
||||
#include "IVideoDriver.h"
|
||||
#include "IGUIFont.h"
|
||||
#include "irrlicht_changes/static_text.h"
|
||||
#include "porting.h"
|
||||
#include "StyleSpec.h"
|
||||
|
||||
using namespace irr;
|
||||
using namespace gui;
|
||||
|
@ -49,6 +53,9 @@ GUIButton::GUIButton(IGUIEnvironment* environment, IGUIElement* parent,
|
|||
core::clamp<u32>(Colors[i].getGreen() * COLOR_PRESSED_MOD, 0, 255),
|
||||
core::clamp<u32>(Colors[i].getBlue() * COLOR_PRESSED_MOD, 0, 255));
|
||||
}
|
||||
|
||||
StaticText = gui::StaticText::add(Environment, Text.c_str(), core::rect<s32>(0,0,rectangle.getWidth(),rectangle.getHeight()), false, false, this, id);
|
||||
StaticText->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER);
|
||||
// END PATCH
|
||||
}
|
||||
|
||||
|
@ -262,7 +269,7 @@ void GUIButton::draw()
|
|||
{
|
||||
// PATCH
|
||||
skin->drawColored3DButtonPaneStandard(this, AbsoluteRect, &AbsoluteClippingRect,
|
||||
Environment->getHovered() == this ? HoveredColors : Colors);
|
||||
isHovered() ? HoveredColors : Colors);
|
||||
// END PATCH
|
||||
}
|
||||
else
|
||||
|
@ -318,7 +325,7 @@ void GUIButton::draw()
|
|||
drawSprite(state, FocusTime, pos);
|
||||
|
||||
// mouse over / off animation
|
||||
state = Environment->getHovered() == this ? EGBS_BUTTON_MOUSE_OVER : EGBS_BUTTON_MOUSE_OFF;
|
||||
state = isHovered() ? EGBS_BUTTON_MOUSE_OVER : EGBS_BUTTON_MOUSE_OFF;
|
||||
drawSprite(state, HoverTime, pos);
|
||||
}
|
||||
else
|
||||
|
@ -328,23 +335,6 @@ void GUIButton::draw()
|
|||
}
|
||||
}
|
||||
|
||||
if (Text.size())
|
||||
{
|
||||
IGUIFont* font = getActiveFont();
|
||||
|
||||
core::rect<s32> rect = AbsoluteRect;
|
||||
if (Pressed)
|
||||
{
|
||||
rect.UpperLeftCorner.X += skin->getSize(EGDS_BUTTON_PRESSED_TEXT_OFFSET_X);
|
||||
rect.UpperLeftCorner.Y += skin->getSize(EGDS_BUTTON_PRESSED_TEXT_OFFSET_Y);
|
||||
}
|
||||
|
||||
if (font)
|
||||
font->draw(Text.c_str(), rect,
|
||||
OverrideColorEnabled ? OverrideColor : skin->getColor(isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT),
|
||||
true, true, &AbsoluteClippingRect);
|
||||
}
|
||||
|
||||
IGUIElement::draw();
|
||||
}
|
||||
|
||||
|
@ -371,11 +361,18 @@ void GUIButton::drawSprite(EGUI_BUTTON_STATE state, u32 startTime, const core::p
|
|||
}
|
||||
|
||||
EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed) const
|
||||
{
|
||||
// PATCH
|
||||
return getImageState(pressed, ButtonImages);
|
||||
// END PATCH
|
||||
}
|
||||
|
||||
EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed, const ButtonImage* images) const
|
||||
{
|
||||
// figure state we should have
|
||||
EGUI_BUTTON_IMAGE_STATE state = EGBIS_IMAGE_DISABLED;
|
||||
bool focused = Environment->hasFocus((IGUIElement*)this);
|
||||
bool mouseOver = static_cast<const IGUIElement*>(Environment->getHovered()) == this; // (static cast for Borland)
|
||||
bool mouseOver = isHovered();
|
||||
if (isEnabled())
|
||||
{
|
||||
if ( pressed )
|
||||
|
@ -403,7 +400,7 @@ EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed) const
|
|||
}
|
||||
|
||||
// find a compatible state that has images
|
||||
while ( state != EGBIS_IMAGE_UP && !ButtonImages[(u32)state].Texture )
|
||||
while ( state != EGBIS_IMAGE_UP && !images[(u32)state].Texture )
|
||||
{
|
||||
// PATCH
|
||||
switch ( state )
|
||||
|
@ -451,6 +448,8 @@ void GUIButton::setOverrideFont(IGUIFont* font)
|
|||
|
||||
if (OverrideFont)
|
||||
OverrideFont->grab();
|
||||
|
||||
StaticText->setOverrideFont(font);
|
||||
}
|
||||
|
||||
//! Gets the override font (if any)
|
||||
|
@ -475,6 +474,8 @@ void GUIButton::setOverrideColor(video::SColor color)
|
|||
{
|
||||
OverrideColor = color;
|
||||
OverrideColorEnabled = true;
|
||||
|
||||
StaticText->setOverrideColor(color);
|
||||
}
|
||||
|
||||
video::SColor GUIButton::getOverrideColor() const
|
||||
|
@ -540,6 +541,14 @@ void GUIButton::setHoveredImage(video::ITexture* image, const core::rect<s32>& p
|
|||
setImage(gui::EGBIS_IMAGE_UP_MOUSEOVER, image, pos);
|
||||
setImage(gui::EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER, image, pos);
|
||||
}
|
||||
|
||||
//! Sets the text displayed by the button
|
||||
void GUIButton::setText(const wchar_t* text)
|
||||
{
|
||||
StaticText->setText(text);
|
||||
|
||||
IGUIButton::setText(text);
|
||||
}
|
||||
// END PATCH
|
||||
|
||||
//! Sets if the button should behave like a push button. Which means it
|
||||
|
@ -557,6 +566,14 @@ bool GUIButton::isPressed() const
|
|||
return Pressed;
|
||||
}
|
||||
|
||||
// PATCH
|
||||
//! Returns if this element (or one of its direct children) is hovered
|
||||
bool GUIButton::isHovered() const
|
||||
{
|
||||
IGUIElement *hovered = Environment->getHovered();
|
||||
return hovered == this || (hovered != nullptr && hovered->getParent() == this);
|
||||
}
|
||||
// END PATCH
|
||||
|
||||
//! Sets the pressed state of the button if this is a pushbutton
|
||||
void GUIButton::setPressed(bool pressed)
|
||||
|
@ -565,6 +582,24 @@ void GUIButton::setPressed(bool pressed)
|
|||
{
|
||||
ClickTime = porting::getTimeMs();
|
||||
Pressed = pressed;
|
||||
|
||||
GUISkin* skin = dynamic_cast<GUISkin*>(Environment->getSkin());
|
||||
|
||||
for(IGUIElement *child : getChildren())
|
||||
{
|
||||
core::rect<s32> originalRect = child->getRelativePosition();
|
||||
if (Pressed) {
|
||||
child->setRelativePosition(originalRect +
|
||||
core::dimension2d<s32>(
|
||||
skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),
|
||||
skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y)));
|
||||
} else {
|
||||
child->setRelativePosition(originalRect -
|
||||
core::dimension2d<s32>(
|
||||
skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),
|
||||
skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -722,4 +757,42 @@ void GUIButton::setPressedColor(video::SColor color)
|
|||
PressedColors[i] = base.getInterpolated(color, d);
|
||||
}
|
||||
}
|
||||
|
||||
//! Set element properties from a StyleSpec
|
||||
void GUIButton::setFromStyle(const StyleSpec& style, ISimpleTextureSource *tsrc)
|
||||
{
|
||||
if (style.isNotDefault(StyleSpec::BGCOLOR)) {
|
||||
setColor(style.getColor(StyleSpec::BGCOLOR));
|
||||
}
|
||||
if (style.isNotDefault(StyleSpec::BGCOLOR_HOVERED)) {
|
||||
setHoveredColor(style.getColor(StyleSpec::BGCOLOR_HOVERED));
|
||||
}
|
||||
if (style.isNotDefault(StyleSpec::BGCOLOR_PRESSED)) {
|
||||
setPressedColor(style.getColor(StyleSpec::BGCOLOR_PRESSED));
|
||||
}
|
||||
|
||||
if (style.isNotDefault(StyleSpec::TEXTCOLOR)) {
|
||||
setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR));
|
||||
}
|
||||
setNotClipped(style.getBool(StyleSpec::NOCLIP, isNotClipped()));
|
||||
setDrawBorder(style.getBool(StyleSpec::BORDER, DrawBorder));
|
||||
setUseAlphaChannel(style.getBool(StyleSpec::ALPHA, true));
|
||||
|
||||
if (style.isNotDefault(StyleSpec::BGIMG)) {
|
||||
video::ITexture *texture = style.getTexture(StyleSpec::BGIMG, tsrc);
|
||||
video::ITexture *hovered_texture = style.getTexture(StyleSpec::BGIMG_HOVERED, tsrc, texture);
|
||||
video::ITexture *pressed_texture = style.getTexture(StyleSpec::BGIMG_PRESSED, tsrc, texture);
|
||||
|
||||
const core::position2di buttonCenter(AbsoluteRect.getCenter());
|
||||
core::position2d<s32> geom(buttonCenter);
|
||||
|
||||
setImage(guiScalingImageButton(
|
||||
Environment->getVideoDriver(), texture, geom.X, geom.Y));
|
||||
setHoveredImage(guiScalingImageButton(
|
||||
Environment->getVideoDriver(), hovered_texture, geom.X, geom.Y));
|
||||
setPressedImage(guiScalingImageButton(
|
||||
Environment->getVideoDriver(), pressed_texture, geom.X, geom.Y));
|
||||
setScaleImage(true);
|
||||
}
|
||||
}
|
||||
// END PATCH
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue