From 9d1ae80e89530e2d8883606cc35b7560edd37489 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 14 Apr 2023 00:09:29 +0100 Subject: [PATCH] Add focused styling to buttons (#13414) --- doc/lua_api.txt | 1 + games/devtest/mods/testformspec/formspec.lua | 3 ++- .../textures/testformspec_bg_9slice_focused.png | Bin 0 -> 5577 bytes .../textures/testformspec_bg_focused.png | Bin 0 -> 5149 bytes src/gui/StyleSpec.h | 15 ++++++++++----- src/gui/guiButton.cpp | 16 ++++++++++++++-- src/gui/guiButton.h | 4 ++++ 7 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_9slice_focused.png create mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_focused.png diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 7fd56c9f7..2a4f92ab7 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -3211,6 +3211,7 @@ Some types may inherit styles from parent types. * *all elements* * default - Equivalent to providing no states * button, button_exit, image_button, item_image_button + * focused - Active when button has focus * hovered - Active when the mouse is hovering over the element * pressed - Active when the button is pressed diff --git a/games/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua index 5f1f8970e..48c8763de 100644 --- a/games/devtest/mods/testformspec/formspec.lua +++ b/games/devtest/mods/testformspec/formspec.lua @@ -190,6 +190,7 @@ local style_fs = [[ style[one_btn14:hovered;bgimg=testformspec_bg_hovered.png;fgimg=testformspec_hovered.png;textcolor=yellow] style[one_btn14:pressed;bgimg=testformspec_bg_pressed.png;fgimg=testformspec_pressed.png;textcolor=blue] style[one_btn14:hovered+pressed;textcolor=purple] + style[one_btn14:focused;textcolor=red] image_button[0,9.6;1,1;testformspec_button_image.png;one_btn14;Bg] style[one_btn15;border=false;bgcolor=#1cc;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png] @@ -198,10 +199,10 @@ local style_fs = [[ style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_middle=4,6;padding=5,7;fgimg=testformspec_bg.png;fgimg_middle=1] style[one_btn16:hovered;bgimg=testformspec_bg_9slice_hovered.png;fgimg=testformspec_bg_hovered.png] style[one_btn16:pressed;bgimg=testformspec_bg_9slice_pressed.png;fgimg=testformspec_bg_pressed.png] + style[one_btn16:focused;bgimg=testformspec_bg_9slice_focused.png;fgimg=testformspec_bg_focused.png] image_button[2.5,9.6;2,1;;one_btn16;9-Slice Bg] - container[2.75,0] style[one_tb1;textcolor=Yellow] diff --git a/games/devtest/mods/testformspec/textures/testformspec_bg_9slice_focused.png b/games/devtest/mods/testformspec/textures/testformspec_bg_9slice_focused.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d5a7886d4f8d1587c7a0db72ac8f41572c306a GIT binary patch literal 5577 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.MouseInput.X, event.MouseInput.Y ))) { + Environment->setFocus(this); setPressed(true); } @@ -258,8 +259,10 @@ void GUIButton::draw() // PATCH // Track hovered state, if it has changed then we need to update the style. bool hovered = isHovered(); - if (hovered != WasHovered) { + bool focused = isFocused(); + if (hovered != WasHovered || focused != WasFocused) { WasHovered = hovered; + WasFocused = focused; setFromState(); } @@ -387,7 +390,7 @@ EGUI_BUTTON_IMAGE_STATE GUIButton::getImageState(bool pressed, const ButtonImage { // figure state we should have EGUI_BUTTON_IMAGE_STATE state = EGBIS_IMAGE_DISABLED; - bool focused = Environment->hasFocus((IGUIElement*)this); + bool focused = isFocused(); bool mouseOver = isHovered(); if (isEnabled()) { @@ -582,6 +585,12 @@ 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 @@ -662,6 +671,9 @@ void GUIButton::setFromState() if (isHovered()) state = static_cast(state | StyleSpec::STATE_HOVERED); + if (isFocused()) + state = static_cast(state | StyleSpec::STATE_FOCUSED); + setFromStyle(StyleSpec::getStyleFromStatePropagation(Styles, state)); } diff --git a/src/gui/guiButton.h b/src/gui/guiButton.h index 31105bcda..5006e2df9 100644 --- a/src/gui/guiButton.h +++ b/src/gui/guiButton.h @@ -123,6 +123,9 @@ public: // PATCH //! Returns if this element (or one of its direct children) is hovered bool isHovered() const; + + //! Returns if this element (or one of its direct children) is focused + bool isFocused() const; // END PATCH //! Sets if the button should use the skin to draw its border @@ -268,6 +271,7 @@ private: video::SColor Colors[4]; // PATCH bool WasHovered = false; + bool WasFocused = false; ISimpleTextureSource *TSrc; gui::IGUIStaticText *StaticText;