diff --git a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs index f71a9e020..0a78240f2 100644 --- a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs @@ -408,6 +408,8 @@ namespace FlaxEditor.CustomEditors.Dedicated { private Type _cachedType; private bool _anchorDropDownClosed = true; + private Button _pivotRelativeButton; + /// public override void Initialize(LayoutElementsContainer layout) @@ -487,10 +489,52 @@ namespace FlaxEditor.CustomEditors.Dedicated BuildLocationSizeOffsets(horUp, horDown, _cachedXEq, _cachedYEq, valueTypes); + BuildExtraButtons(group); + main.Space(10); BuildAnchorsDropper(main, valueTypes); } + private void BuildExtraButtons(VerticalPanelElement group) + { + (Values[0] as Control).PivotRelative = Editor.Instance.Windows.PropertiesWin.PivotRelativeSize; + + var current = Editor.Instance.Windows.PropertiesWin.PivotRelativeSize; + + var panel = group.CustomContainer(); + panel.CustomControl.Height = TextBoxBase.DefaultHeight; + panel.CustomControl.ClipChildren = false; + panel.CustomControl.Parent = group.ContainerControl; + + _pivotRelativeButton = new Button() + { + Parent = panel.ContainerControl, + Width = 18, + Height = 18, + BackgroundBrush = new SpriteBrush(Editor.Instance.Icons.Scale32), + AnchorPreset = AnchorPresets.TopRight, + X = 77, + }; + + SetStyle(current); + _pivotRelativeButton.Clicked += PivotRelativeClicked; + } + + private void PivotRelativeClicked() + { + var current = (Values[0] as Control).PivotRelative; + (Values[0] as Control).PivotRelative = !current; + Editor.Instance.Windows.PropertiesWin.PivotRelativeSize = !current; + SetStyle((Values[0] as Control).PivotRelative); + } + + private void SetStyle(bool current) + { + var style = FlaxEngine.GUI.Style.Current; + var backgroundColor = current ? style.Foreground : style.ForegroundDisabled; + _pivotRelativeButton.SetColors(backgroundColor); + } + private void BuildAnchorsDropper(LayoutElementsContainer main, ScriptType[] valueTypes) { ScriptMemberInfo minInfo = valueTypes[0].GetProperty("AnchorMin"); diff --git a/Source/Editor/Windows/PropertiesWindow.cs b/Source/Editor/Windows/PropertiesWindow.cs index 601717f38..69fac31d7 100644 --- a/Source/Editor/Windows/PropertiesWindow.cs +++ b/Source/Editor/Windows/PropertiesWindow.cs @@ -30,6 +30,11 @@ namespace FlaxEditor.Windows /// public bool ScaleLinked = false; + /// + /// Indictation of if UI elements should size relative to the pivot point + /// + public bool PivotRelativeSize = true; + /// /// Initializes a new instance of the class. /// diff --git a/Source/Engine/UI/GUI/Control.Bounds.cs b/Source/Engine/UI/GUI/Control.Bounds.cs index 428e485d8..bdef1c8ac 100644 --- a/Source/Engine/UI/GUI/Control.Bounds.cs +++ b/Source/Engine/UI/GUI/Control.Bounds.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; +using System.Runtime.Remoting.Messaging; namespace FlaxEngine.GUI { @@ -169,6 +170,16 @@ namespace FlaxEngine.GUI set => Bounds = new Rectangle(value + (_parent != null ? _parent.Bounds.Size * (_anchorMax + _anchorMin) * 0.5f : Float2.Zero) - _bounds.Size * _pivot, _bounds.Size); } + /// + /// Whether to resize the UI Control based on where the pivot is rather than just the top-left. + /// + [NoSerialize, HideInEditor] + public bool PivotRelative + { + get => _pivotRelativeSizing; + set => _pivotRelativeSizing = value; + } + /// /// Gets or sets width of the control. /// @@ -180,7 +191,13 @@ namespace FlaxEngine.GUI { if (Mathf.NearEqual(_bounds.Size.X, value)) return; - var bounds = new Rectangle(_bounds.Location, value, _bounds.Size.Y); + var rectLocation = _bounds.Location; + if (PivotRelative) + { + var delta = _bounds.Size.X - value; + rectLocation.X += delta * Pivot.X; + } + var bounds = new Rectangle(rectLocation, value, _bounds.Size.Y); SetBounds(ref bounds); } } @@ -196,7 +213,13 @@ namespace FlaxEngine.GUI { if (Mathf.NearEqual(_bounds.Size.Y, value)) return; - var bounds = new Rectangle(_bounds.Location, _bounds.Size.X, value); + var rectLocation = _bounds.Location; + if (PivotRelative) + { + var delta = _bounds.Size.Y - value; + rectLocation.Y += delta * Pivot.Y; + } + var bounds = new Rectangle(rectLocation, _bounds.Size.X, value); SetBounds(ref bounds); } } diff --git a/Source/Engine/UI/GUI/Control.cs b/Source/Engine/UI/GUI/Control.cs index 49b7f65d3..b3e0dc990 100644 --- a/Source/Engine/UI/GUI/Control.cs +++ b/Source/Engine/UI/GUI/Control.cs @@ -76,6 +76,7 @@ namespace FlaxEngine.GUI private float _rotation; internal Matrix3x3 _cachedTransform; internal Matrix3x3 _cachedTransformInv; + private bool _pivotRelativeSizing = false; // Style