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