]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Add 'content_offset' and 'padding' style properties for buttons (#9661)
authorHugues Ross <hugues.ross@gmail.com>
Sat, 2 May 2020 11:32:02 +0000 (07:32 -0400)
committerGitHub <noreply@github.com>
Sat, 2 May 2020 11:32:02 +0000 (13:32 +0200)
* Add padding and content_offset style properties to buttons

doc/lua_api.txt
games/minimal/mods/test/formspec.lua
src/gui/StyleSpec.h
src/gui/guiButton.cpp
src/gui/guiButton.h

index 988acde89bf4bfd82576b48a54bf855d893015c3..1ffb5c39b7109d876211c82fc3294837ff3b42fe 100644 (file)
@@ -2697,10 +2697,14 @@ Some types may inherit styles from parent types.
     * bgimg - standard background image. Defaults to none.
     * bgimg_hovered - background image when hovered. Defaults to bgimg when not provided.
     * bgimg_middle - Makes the bgimg textures render in 9-sliced mode and defines the middle rect.
-                     See background9[] documentation for more details
+                     See background9[] documentation for more details. This property also pads the
+                     button's content when set.
     * bgimg_pressed - background image when pressed. Defaults to bgimg when not provided.
     * border - boolean, draw border. Set to false to hide the bevelled button pane. Default true.
+    * content_offset - 2d vector, shifts the position of the button's content without resizing it.
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * padding - rect, adds space between the edges of the button and the content. This value is
+                relative to bgimg_middle.
     * textcolor - color, default white.
 * checkbox
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
index 4ab4f2717236973ca7b693fdf98fb55c59f57234..a5d3074cd627179a8def17ef9a7cdfff8dd10129 100644 (file)
@@ -95,7 +95,7 @@ local style_fs = [[
        style[one_btn13;border=false]\r
        item_image_button[1.25,8.35;1,1;default:sword_steel;one_btn13;NoBor]\r
 \r
-       style[one_btn14;border=false;bgimg=test_bg.png;fgimg=bubble.png]\r
+       style[one_btn14;border=false;bgimg=test_bg.png;fgimg=bubble.png;padding=8]\r
        style[one_btn14:hovered;bgimg=test_bg_hovered.png;fgimg=default_apple.png;textcolor=red]\r
        style[one_btn14:pressed;bgimg=test_bg_pressed.png;fgimg=heart.png;textcolor=green]\r
        style[one_btn14:hovered+pressed;textcolor=blue]\r
@@ -105,6 +105,7 @@ local style_fs = [[
        item_image_button[1.25,9.6;1,1;default:sword_steel;one_btn15;Bg]\r
 \r
        style[one_btn16;border=false;bgimg=test_bg_9slice.png;bgimg_hovered=test_bg_9slice_hovered.png;bgimg_pressed=test_bg_9slice_pressed.png;bgimg_middle=4,6]\r
+       style[one_btn16:pressed;content_offset=0,1]\r
        button[2.5,9.6;2,1;one_btn16;9-Slice Bg]\r
 \r
 \r
index 799fbf46d5a8141696ad802d35c61fceac64e6e4..3e842e82636ccd15f66b347f4757a4a954c1b218 100644 (file)
@@ -44,6 +44,8 @@ class StyleSpec
                FGIMG_HOVERED, // Note: Deprecated property
                FGIMG_PRESSED, // Note: Deprecated property
                ALPHA,
+               CONTENT_OFFSET,
+               PADDING,
                NUM_PROPERTIES,
                NONE
        };
@@ -92,6 +94,10 @@ class StyleSpec
                        return FGIMG_PRESSED;
                } else if (name == "alpha") {
                        return ALPHA;
+               } else if (name == "content_offset") {
+                       return CONTENT_OFFSET;
+               } else if (name == "padding") {
+                       return PADDING;
                } else {
                        return NONE;
                }
@@ -196,6 +202,29 @@ class StyleSpec
                return rect;
        }
 
+       irr::core::vector2d<s32> getVector2i(Property prop, irr::core::vector2d<s32> def) const
+       {
+               const auto &val = properties[prop];
+               if (val.empty())
+                       return def;
+
+               irr::core::vector2d<s32> vec;
+               if (!parseVector2i(val, &vec))
+                       return def;
+
+               return vec;
+       }
+
+       irr::core::vector2d<s32> getVector2i(Property prop) const
+       {
+               const auto &val = properties[prop];
+               FATAL_ERROR_IF(val.empty(), "Unexpected missing property");
+
+               irr::core::vector2d<s32> vec;
+               parseVector2i(val, &vec);
+               return vec;
+       }
+
        video::ITexture *getTexture(Property prop, ISimpleTextureSource *tsrc,
                        video::ITexture *def) const
        {
@@ -286,4 +315,29 @@ class StyleSpec
 
                return true;
        }
+
+       bool parseVector2i(const std::string &value, irr::core::vector2d<s32> *parsed_vec) const
+       {
+               irr::core::vector2d<s32> vec;
+               std::vector<std::string> v_vector = split(value, ',');
+
+               if (v_vector.size() == 1) {
+                       s32 x = stoi(v_vector[0]);
+                       vec.X = x;
+                       vec.Y = x;
+               } else if (v_vector.size() == 2) {
+                       s32 x = stoi(v_vector[0]);
+                       s32 y = stoi(v_vector[1]);
+                       vec.X = x;
+                       vec.Y = y;
+               } else {
+                       warningstream << "Invalid vector2d string format: \"" << value
+                                       << "\"" << std::endl;
+                       return false;
+               }
+
+               *parsed_vec = vec;
+
+               return true;
+       }
 };
index 9dfe36bc4b94d544637b753f711887824d3719a4..ff35958fd0ddaf8f9fa88c80d479cf9470341d3a 100644 (file)
@@ -592,25 +592,6 @@ void GUIButton::setPressed(bool pressed)
        {\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
@@ -819,7 +800,32 @@ void GUIButton::setFromStyle(const StyleSpec& style)
        } 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
index ef10f926ef5d73bd551f69bc775881417c9a93df..95fa1a2a1bd268e40417db432e83f48d081c0844 100644 (file)
@@ -336,5 +336,7 @@ class GUIButton : public gui::IGUIButton
        gui::IGUIStaticText *StaticText;\r
 \r
        core::rect<s32> BgMiddle;\r
+       core::rect<s32> Padding;\r
+       core::vector2d<s32> ContentOffset;\r
        // END PATCH\r
 };\r