123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #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"
- #include "util/numeric.h"
- using namespace irr;
- using namespace gui;
- // Multiply with a color to get the default corresponding hovered color
- #define COLOR_HOVERED_MOD 1.25f
- // Multiply with a color to get the default corresponding pressed color
- #define COLOR_PRESSED_MOD 0.85f
- //! constructor
- GUIButton::GUIButton(IGUIEnvironment* environment, IGUIElement* parent,
- s32 id, core::rect<s32> rectangle, ISimpleTextureSource *tsrc,
- bool noclip) :
- IGUIButton(environment, parent, id, rectangle),
- TSrc(tsrc)
- {
- setNotClipped(noclip);
- // This element can be tabbed.
- setTabStop(true);
- setTabOrder(-1);
- // PATCH
- for (size_t i = 0; i < 4; i++) {
- Colors[i] = Environment->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
- }
- 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
- }
- //! destructor
- GUIButton::~GUIButton()
- {
- if (OverrideFont)
- OverrideFont->drop();
- if (SpriteBank)
- SpriteBank->drop();
- }
- //! Sets if the images should be scaled to fit the button
- void GUIButton::setScaleImage(bool scaleImage)
- {
- ScaleImage = scaleImage;
- }
- //! Returns whether the button scale the used images
- bool GUIButton::isScalingImage() const
- {
- return ScaleImage;
- }
- //! Sets if the button should use the skin to draw its border
- void GUIButton::setDrawBorder(bool border)
- {
- DrawBorder = border;
- }
- void GUIButton::setSpriteBank(IGUISpriteBank* sprites)
- {
- if (sprites)
- sprites->grab();
- if (SpriteBank)
- SpriteBank->drop();
- SpriteBank = sprites;
- }
- void GUIButton::setSprite(EGUI_BUTTON_STATE state, s32 index, video::SColor color, bool loop, bool scale)
- {
- ButtonSprites[(u32)state].Index = index;
- ButtonSprites[(u32)state].Color = color;
- ButtonSprites[(u32)state].Loop = loop;
- ButtonSprites[(u32)state].Scale = scale;
- }
- //! Get the sprite-index for the given state or -1 when no sprite is set
- s32 GUIButton::getSpriteIndex(EGUI_BUTTON_STATE state) const
- {
- return ButtonSprites[(u32)state].Index;
- }
- //! Get the sprite color for the given state. Color is only used when a sprite is set.
- video::SColor GUIButton::getSpriteColor(EGUI_BUTTON_STATE state) const
- {
- return ButtonSprites[(u32)state].Color;
- }
- //! Returns if the sprite in the given state does loop
- bool GUIButton::getSpriteLoop(EGUI_BUTTON_STATE state) const
- {
- return ButtonSprites[(u32)state].Loop;
- }
- //! Returns if the sprite in the given state is scaled
- bool GUIButton::getSpriteScale(EGUI_BUTTON_STATE state) const
- {
- return ButtonSprites[(u32)state].Scale;
- }
- //! called if an event happened.
- bool GUIButton::OnEvent(const SEvent& event)
- {
- if (!isEnabled())
- return IGUIElement::OnEvent(event);
- switch(event.EventType)
- {
- case EET_KEY_INPUT_EVENT:
- if (event.KeyInput.PressedDown &&
- (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE))
- {
- if (!IsPushButton)
- setPressed(true);
- else
- setPressed(!Pressed);
- return true;
- }
- if (Pressed && !IsPushButton && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE)
- {
- setPressed(false);
- return true;
- }
- else
- if (!event.KeyInput.PressedDown && Pressed &&
- (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE))
- {
- if (!IsPushButton)
- setPressed(false);
- if (Parent)
- {
- ClickShiftState = event.KeyInput.Shift;
- ClickControlState = event.KeyInput.Control;
- SEvent newEvent;
- newEvent.EventType = EET_GUI_EVENT;
- newEvent.GUIEvent.Caller = this;
- newEvent.GUIEvent.Element = 0;
- newEvent.GUIEvent.EventType = EGET_BUTTON_CLICKED;
- Parent->OnEvent(newEvent);
- }
- return true;
- }
- break;
- case EET_GUI_EVENT:
- if (event.GUIEvent.Caller == this)
- {
- if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
- {
- if (!IsPushButton)
- setPressed(false);
- FocusTime = (u32)porting::getTimeMs();
- }
- else if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUSED)
- {
- FocusTime = (u32)porting::getTimeMs();
- }
- else if (event.GUIEvent.EventType == EGET_ELEMENT_HOVERED || event.GUIEvent.EventType == EGET_ELEMENT_LEFT)
- {
- HoverTime = (u32)porting::getTimeMs();
- }
- }
- break;
- case EET_MOUSE_INPUT_EVENT:
- if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
- {
- // Sometimes formspec elements can receive mouse events when the
- // mouse is outside of the formspec. Thus, we test the position here.
- if ( !IsPushButton && AbsoluteClippingRect.isPointInside(
- core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y ))) {
- Environment->setFocus(this);
- setPressed(true);
- }
- return true;
- }
- else
- if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
- {
- bool wasPressed = Pressed;
- if ( !AbsoluteClippingRect.isPointInside( core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y ) ) )
- {
- if (!IsPushButton)
- setPressed(false);
- return true;
- }
- if (!IsPushButton)
- setPressed(false);
- else
- {
- setPressed(!Pressed);
- }
- if ((!IsPushButton && wasPressed && Parent) ||
- (IsPushButton && wasPressed != Pressed))
- {
- ClickShiftState = event.MouseInput.Shift;
- ClickControlState = event.MouseInput.Control;
- SEvent newEvent;
- newEvent.EventType = EET_GUI_EVENT;
- newEvent.GUIEvent.Caller = this;
- newEvent.GUIEvent.Element = 0;
- newEvent.GUIEvent.EventType = EGET_BUTTON_CLICKED;
- Parent->OnEvent(newEvent);
- }
- return true;
- }
- break;
- default:
- break;
- }
- return Parent ? Parent->OnEvent(event) : false;
- }
- //! draws the element and its children
- void GUIButton::draw()
- {
- if (!IsVisible)
- return;
- // PATCH
- // Track hovered state, if it has changed then we need to update the style.
- bool hovered = isHovered();
- bool focused = isFocused();
- if (hovered != WasHovered || focused != WasFocused) {
- WasHovered = hovered;
- WasFocused = focused;
- setFromState();
- }
- GUISkin* skin = dynamic_cast<GUISkin*>(Environment->getSkin());
- video::IVideoDriver* driver = Environment->getVideoDriver();
- // END PATCH
- if (DrawBorder)
- {
- if (!Pressed)
- {
- // PATCH
- skin->drawColored3DButtonPaneStandard(this, AbsoluteRect,
- &AbsoluteClippingRect, Colors);
- // END PATCH
- }
- else
- {
- // PATCH
- skin->drawColored3DButtonPanePressed(this, AbsoluteRect,
- &AbsoluteClippingRect, Colors);
- // END PATCH
- }
- }
- const core::position2di buttonCenter(AbsoluteRect.getCenter());
- // PATCH
- // The image changes based on the state, so we use the default every time.
- EGUI_BUTTON_IMAGE_STATE imageState = EGBIS_IMAGE_UP;
- // END PATCH
- if ( ButtonImages[(u32)imageState].Texture )
- {
- core::position2d<s32> pos(buttonCenter);
- core::rect<s32> sourceRect(ButtonImages[(u32)imageState].SourceRect);
- if ( sourceRect.getWidth() == 0 && sourceRect.getHeight() == 0 )
- sourceRect = core::rect<s32>(core::position2di(0,0), ButtonImages[(u32)imageState].Texture->getOriginalSize());
- pos.X -= sourceRect.getWidth() / 2;
- pos.Y -= sourceRect.getHeight() / 2;
- if ( Pressed )
- {
- // Create a pressed-down effect by moving the image when it looks identical to the unpressed state image
- EGUI_BUTTON_IMAGE_STATE unpressedState = getImageState(false);
- if ( unpressedState == imageState || ButtonImages[(u32)imageState] == ButtonImages[(u32)unpressedState] )
- {
- pos.X += skin->getSize(EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X);
- pos.Y += skin->getSize(EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y);
- }
- }
- // PATCH
- video::ITexture* texture = ButtonImages[(u32)imageState].Texture;
- video::SColor image_colors[] = { BgColor, BgColor, BgColor, BgColor };
- if (BgMiddle.getArea() == 0) {
- driver->draw2DImage(texture,
- ScaleImage? AbsoluteRect : core::rect<s32>(pos, sourceRect.getSize()),
- sourceRect, &AbsoluteClippingRect,
- image_colors, UseAlphaChannel);
- } else {
- draw2DImage9Slice(driver, texture,
- ScaleImage ? AbsoluteRect : core::rect<s32>(pos, sourceRect.getSize()),
- sourceRect, BgMiddle, &AbsoluteClippingRect, image_colors);
- }
- // END PATCH
- }
- if (SpriteBank)
- {
- if (isEnabled())
- {
- core::position2di pos(buttonCenter);
- // pressed / unpressed animation
- EGUI_BUTTON_STATE state = Pressed ? EGBS_BUTTON_DOWN : EGBS_BUTTON_UP;
- drawSprite(state, ClickTime, pos);
- // focused / unfocused animation
- state = Environment->hasFocus(this) ? EGBS_BUTTON_FOCUSED : EGBS_BUTTON_NOT_FOCUSED;
- drawSprite(state, FocusTime, pos);
- // mouse over / off animation
- state = isHovered() ? EGBS_BUTTON_MOUSE_OVER : EGBS_BUTTON_MOUSE_OFF;
- drawSprite(state, HoverTime, pos);
- }
- else
- {
- // draw disabled
- // drawSprite(EGBS_BUTTON_DISABLED, 0, pos);
- }
- }
- IGUIElement::draw();
- }
- void GUIButton::drawSprite(EGUI_BUTTON_STATE state, u32 startTime, const core::position2di& center)
- {
- u32 stateIdx = (u32)state;
- if (ButtonSprites[stateIdx].Index != -1)
- {
- if ( ButtonSprites[stateIdx].Scale )
- {
- const video::SColor colors[] = {ButtonSprites[stateIdx].Color,ButtonSprites[stateIdx].Color,ButtonSprites[stateIdx].Color,ButtonSprites[stateIdx].Color};
- SpriteBank->draw2DSprite(ButtonSprites[stateIdx].Index, AbsoluteRect.UpperLeftCorner,
- &AbsoluteClippingRect, colors[0], // FIXME: remove [0]
- porting::getTimeMs()-startTime, ButtonSprites[stateIdx].Loop);
- }
- else
- {
- SpriteBank->draw2DSprite(ButtonSprites[stateIdx].Index, center,
- &AbsoluteClippingRect, ButtonSprites[stateIdx].Color, startTime, porting::getTimeMs(),
- ButtonSprites[stateIdx].Loop, true);
- }
- }
- }
- 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 = isFocused();
- bool mouseOver = isHovered();
- if (isEnabled())
- {
- if ( pressed )
- {
- if ( focused && mouseOver )
- state = EGBIS_IMAGE_DOWN_FOCUSED_MOUSEOVER;
- else if ( focused )
- state = EGBIS_IMAGE_DOWN_FOCUSED;
- else if ( mouseOver )
- state = EGBIS_IMAGE_DOWN_MOUSEOVER;
- else
- state = EGBIS_IMAGE_DOWN;
- }
- else // !pressed
- {
- if ( focused && mouseOver )
- state = EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER;
- else if ( focused )
- state = EGBIS_IMAGE_UP_FOCUSED;
- else if ( mouseOver )
- state = EGBIS_IMAGE_UP_MOUSEOVER;
- else
- state = EGBIS_IMAGE_UP;
- }
- }
- // find a compatible state that has images
- while ( state != EGBIS_IMAGE_UP && !images[(u32)state].Texture )
- {
- // PATCH
- switch ( state )
- {
- case EGBIS_IMAGE_UP_FOCUSED:
- state = EGBIS_IMAGE_UP;
- break;
- case EGBIS_IMAGE_UP_FOCUSED_MOUSEOVER:
- state = EGBIS_IMAGE_UP_FOCUSED;
- break;
- case EGBIS_IMAGE_DOWN_MOUSEOVER:
- state = EGBIS_IMAGE_DOWN;
- break;
- case EGBIS_IMAGE_DOWN_FOCUSED:
- state = EGBIS_IMAGE_DOWN;
- break;
- case EGBIS_IMAGE_DOWN_FOCUSED_MOUSEOVER:
- state = EGBIS_IMAGE_DOWN_FOCUSED;
- break;
- case EGBIS_IMAGE_DISABLED:
- if ( pressed )
- state = EGBIS_IMAGE_DOWN;
- else
- state = EGBIS_IMAGE_UP;
- break;
- default:
- state = EGBIS_IMAGE_UP;
- }
- // END PATCH
- }
- return state;
- }
- //! sets another skin independent font. if this is set to zero, the button uses the font of the skin.
- void GUIButton::setOverrideFont(IGUIFont* font)
- {
- if (OverrideFont == font)
- return;
- if (OverrideFont)
- OverrideFont->drop();
- OverrideFont = font;
- if (OverrideFont)
- OverrideFont->grab();
- StaticText->setOverrideFont(font);
- }
- //! Gets the override font (if any)
- IGUIFont * GUIButton::getOverrideFont() const
- {
- return OverrideFont;
- }
- //! Get the font which is used right now for drawing
- IGUIFont* GUIButton::getActiveFont() const
- {
- if ( OverrideFont )
- return OverrideFont;
- IGUISkin* skin = Environment->getSkin();
- if (skin)
- return skin->getFont(EGDF_BUTTON);
- return 0;
- }
- //! Sets another color for the text.
- void GUIButton::setOverrideColor(video::SColor color)
- {
- OverrideColor = color;
- OverrideColorEnabled = true;
- StaticText->setOverrideColor(color);
- }
- video::SColor GUIButton::getOverrideColor() const
- {
- return OverrideColor;
- }
- video::SColor GUIButton::getActiveColor() const
- {
- return video::SColor(0,0,0,0); // unused?
- }
- void GUIButton::enableOverrideColor(bool enable)
- {
- OverrideColorEnabled = enable;
- }
- bool GUIButton::isOverrideColorEnabled() const
- {
- return OverrideColorEnabled;
- }
- void GUIButton::setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image, const core::rect<s32>& sourceRect)
- {
- if ( state >= EGBIS_COUNT )
- return;
- if ( image )
- image->grab();
- u32 stateIdx = (u32)state;
- if ( ButtonImages[stateIdx].Texture )
- ButtonImages[stateIdx].Texture->drop();
- ButtonImages[stateIdx].Texture = image;
- ButtonImages[stateIdx].SourceRect = sourceRect;
- }
- // PATCH
- void GUIButton::setImage(video::ITexture* image)
- {
- setImage(gui::EGBIS_IMAGE_UP, image);
- }
- void GUIButton::setImage(video::ITexture* image, const core::rect<s32>& pos)
- {
- setImage(gui::EGBIS_IMAGE_UP, image, pos);
- }
- void GUIButton::setPressedImage(video::ITexture* image)
- {
- setImage(gui::EGBIS_IMAGE_DOWN, image);
- }
- void GUIButton::setPressedImage(video::ITexture* image, const core::rect<s32>& pos)
- {
- setImage(gui::EGBIS_IMAGE_DOWN, 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
- //! can be in two states: Normal or Pressed. With a click on the button,
- //! the user can change the state of the button.
- void GUIButton::setIsPushButton(bool isPushButton)
- {
- IsPushButton = isPushButton;
- }
- //! Returns if the button is currently pressed
- 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);
- }
- //! Returns if this element (or one of its direct children) is focused
- bool GUIButton::isFocused() const
- {
- return Environment->hasFocus((IGUIElement*)this, true);
- }
- // END PATCH
- //! Sets the pressed state of the button if this is a pushbutton
- void GUIButton::setPressed(bool pressed)
- {
- if (Pressed != pressed)
- {
- ClickTime = porting::getTimeMs();
- Pressed = pressed;
- setFromState();
- }
- }
- //! Returns whether the button is a push button
- bool GUIButton::isPushButton() const
- {
- return IsPushButton;
- }
- //! Sets if the alpha channel should be used for drawing images on the button (default is false)
- void GUIButton::setUseAlphaChannel(bool useAlphaChannel)
- {
- UseAlphaChannel = useAlphaChannel;
- }
- //! Returns if the alpha channel should be used for drawing images on the button
- bool GUIButton::isAlphaChannelUsed() const
- {
- return UseAlphaChannel;
- }
- bool GUIButton::isDrawingBorder() const
- {
- return DrawBorder;
- }
- // PATCH
- GUIButton* GUIButton::addButton(IGUIEnvironment *environment,
- const core::rect<s32>& rectangle, ISimpleTextureSource *tsrc,
- IGUIElement* parent, s32 id, const wchar_t* text,
- const wchar_t *tooltiptext)
- {
- GUIButton* button = new GUIButton(environment, parent ? parent : environment->getRootGUIElement(), id, rectangle, tsrc);
- if (text)
- button->setText(text);
- if ( tooltiptext )
- button->setToolTipText ( tooltiptext );
- button->drop();
- return button;
- }
- void GUIButton::setColor(video::SColor color)
- {
- BgColor = color;
- float d = 0.65f;
- for (size_t i = 0; i < 4; i++) {
- video::SColor base = Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);
- Colors[i] = base.getInterpolated(color, d);
- }
- }
- //! Set element properties from a StyleSpec corresponding to the button state
- void GUIButton::setFromState()
- {
- StyleSpec::State state = StyleSpec::STATE_DEFAULT;
- if (isPressed())
- state = static_cast<StyleSpec::State>(state | StyleSpec::STATE_PRESSED);
- if (isHovered())
- state = static_cast<StyleSpec::State>(state | StyleSpec::STATE_HOVERED);
- if (isFocused())
- state = static_cast<StyleSpec::State>(state | StyleSpec::STATE_FOCUSED);
- setFromStyle(StyleSpec::getStyleFromStatePropagation(Styles, state));
- }
- //! Set element properties from a StyleSpec
- void GUIButton::setFromStyle(const StyleSpec& style)
- {
- bool hovered = (style.getState() & StyleSpec::STATE_HOVERED) != 0;
- bool pressed = (style.getState() & StyleSpec::STATE_PRESSED) != 0;
- if (style.isNotDefault(StyleSpec::BGCOLOR)) {
- setColor(style.getColor(StyleSpec::BGCOLOR));
- // If we have a propagated hover/press color, we need to automatically
- // lighten/darken it
- if (!Styles[style.getState()].isNotDefault(StyleSpec::BGCOLOR)) {
- if (pressed) {
- BgColor = multiplyColorValue(BgColor, COLOR_PRESSED_MOD);
- for (size_t i = 0; i < 4; i++)
- Colors[i] = multiplyColorValue(Colors[i], COLOR_PRESSED_MOD);
- } else if (hovered) {
- BgColor = multiplyColorValue(BgColor, COLOR_HOVERED_MOD);
- for (size_t i = 0; i < 4; i++)
- Colors[i] = multiplyColorValue(Colors[i], COLOR_HOVERED_MOD);
- }
- }
- } else {
- BgColor = video::SColor(255, 255, 255, 255);
- for (size_t i = 0; i < 4; i++) {
- video::SColor base =
- Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);
- if (pressed) {
- Colors[i] = multiplyColorValue(base, COLOR_PRESSED_MOD);
- } else if (hovered) {
- Colors[i] = multiplyColorValue(base, COLOR_HOVERED_MOD);
- } else {
- Colors[i] = base;
- }
- }
- }
- if (style.isNotDefault(StyleSpec::TEXTCOLOR)) {
- setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR));
- } else {
- setOverrideColor(video::SColor(255,255,255,255));
- OverrideColorEnabled = false;
- }
- setNotClipped(style.getBool(StyleSpec::NOCLIP, false));
- setDrawBorder(style.getBool(StyleSpec::BORDER, true));
- setUseAlphaChannel(style.getBool(StyleSpec::ALPHA, true));
- setOverrideFont(style.getFont());
- if (style.isNotDefault(StyleSpec::BGIMG)) {
- video::ITexture *texture = style.getTexture(StyleSpec::BGIMG,
- getTextureSource());
- setImage(guiScalingImageButton(
- Environment->getVideoDriver(), texture,
- AbsoluteRect.getWidth(), AbsoluteRect.getHeight()));
- setScaleImage(true);
- } else {
- setImage(nullptr);
- }
- BgMiddle = style.getRect(StyleSpec::BGIMG_MIDDLE, BgMiddle);
- // Child padding and offset
- Padding = style.getRect(StyleSpec::PADDING, core::rect<s32>());
- Padding = core::rect<s32>(
- Padding.UpperLeftCorner + BgMiddle.UpperLeftCorner,
- Padding.LowerRightCorner + BgMiddle.LowerRightCorner);
- GUISkin* skin = dynamic_cast<GUISkin*>(Environment->getSkin());
- core::vector2d<s32> defaultPressOffset(
- skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),
- skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y));
- ContentOffset = style.getVector2i(StyleSpec::CONTENT_OFFSET, isPressed()
- ? defaultPressOffset
- : core::vector2d<s32>(0));
- core::rect<s32> childBounds(
- Padding.UpperLeftCorner.X + ContentOffset.X,
- Padding.UpperLeftCorner.Y + ContentOffset.Y,
- AbsoluteRect.getWidth() + Padding.LowerRightCorner.X + ContentOffset.X,
- AbsoluteRect.getHeight() + Padding.LowerRightCorner.Y + ContentOffset.Y);
- for (IGUIElement *child : getChildren()) {
- child->setRelativePosition(childBounds);
- }
- }
- //! Set the styles used for each state
- void GUIButton::setStyles(const std::array<StyleSpec, StyleSpec::NUM_STATES>& styles)
- {
- Styles = styles;
- setFromState();
- }
- // END PATCH
|