diff --git a/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs b/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs
index f65bb4b06..f04d079b5 100644
--- a/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs
@@ -1,6 +1,8 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
+using FlaxEditor.CustomEditors.GUI;
using FlaxEngine;
+using FlaxEngine.GUI;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -87,10 +89,54 @@ namespace FlaxEditor.CustomEditors.Editors
var grayOutFactor = 0.6f;
XElement.ValueBox.BorderColor = Color.Lerp(AxisColorX, back, grayOutFactor);
XElement.ValueBox.BorderSelectedColor = AxisColorX;
+
+ if (XElement.ValueBox.Parent.Parent is PropertiesList list)
+ {
+ foreach (var child in list.Children)
+ {
+ if (!(child is PropertyNameLabel))
+ continue;
+
+ var nameLabel = child as PropertyNameLabel;
+ if (!string.Equals(nameLabel.Text, "Scale"))
+ continue;
+
+ var lockButton = new Button
+ {
+ Parent = nameLabel,
+ Width = 18,
+ Height = 18,
+ BackgroundBrush = new SpriteBrush(Editor.Instance.Icons.Link32),
+ BackgroundColor = Color.White,
+ BorderColor = Color.Transparent,
+ BorderColorSelected = Color.Transparent,
+ BorderColorHighlighted = Color.Transparent,
+ AnchorPreset = AnchorPresets.TopLeft,
+ TooltipText = "Locks/Unlocks setting the scale values.",
+ };
+ lockButton.LocalX += 40;
+ lockButton.LocalY += 1;
+ lockButton.Clicked += () =>
+ {
+ ChangeValuesTogether = !ChangeValuesTogether;
+ // TODO: change image
+ Debug.Log(ChangeValuesTogether);
+ };
+
+ break;
+ }
+ }
+
YElement.ValueBox.BorderColor = Color.Lerp(AxisColorY, back, grayOutFactor);
YElement.ValueBox.BorderSelectedColor = AxisColorY;
ZElement.ValueBox.BorderColor = Color.Lerp(AxisColorZ, back, grayOutFactor);
ZElement.ValueBox.BorderSelectedColor = AxisColorZ;
+
+ Debug.Log(YElement.ValueBox.Parent);
+ Debug.Log(YElement.ValueBox.Parent.Parent);
+ Debug.Log(YElement.ValueBox.Parent.Parent.Parent);
+ Debug.Log(YElement.ValueBox.Parent.Parent.Parent.Parent);
+ Debug.Log(YElement.ValueBox.Parent.Parent.Parent.Parent.Parent);
}
}
}
diff --git a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
index 8ea21e988..83d09b887 100644
--- a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
+++ b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
@@ -44,6 +44,14 @@ namespace FlaxEditor.CustomEditors.Editors
///
public override DisplayStyle Style => DisplayStyle.Inline;
+ ///
+ /// If true, when one value is changed, the other 2 will change as well.
+ ///
+ protected bool ChangeValuesTogether = false;
+ private bool _xChanged;
+ private bool _yChanged;
+ private bool _zChanged;
+
///
public override void Initialize(LayoutElementsContainer layout)
{
@@ -63,28 +71,96 @@ namespace FlaxEditor.CustomEditors.Editors
XElement = grid.FloatValue();
XElement.SetLimits(limit);
- XElement.ValueBox.ValueChanged += OnValueChanged;
+ XElement.ValueBox.ValueChanged += OnXValueChanged;
XElement.ValueBox.SlidingEnd += ClearToken;
YElement = grid.FloatValue();
YElement.SetLimits(limit);
- YElement.ValueBox.ValueChanged += OnValueChanged;
+ YElement.ValueBox.ValueChanged += OnYValueChanged;
YElement.ValueBox.SlidingEnd += ClearToken;
ZElement = grid.FloatValue();
ZElement.SetLimits(limit);
- ZElement.ValueBox.ValueChanged += OnValueChanged;
+ ZElement.ValueBox.ValueChanged += OnZValueChanged;
ZElement.ValueBox.SlidingEnd += ClearToken;
}
+ private void OnXValueChanged()
+ {
+ if (IsSetBlocked)
+ return;
+ if (ChangeValuesTogether)
+ {
+ _xChanged = true;
+ _yChanged = false;
+ _zChanged = false;
+ }
+ OnValueChanged();
+ }
+
+ private void OnYValueChanged()
+ {
+ if (IsSetBlocked)
+ return;
+ if (ChangeValuesTogether)
+ {
+ _xChanged = false;
+ _yChanged = true;
+ _zChanged = false;
+ }
+ OnValueChanged();
+ }
+
+ private void OnZValueChanged()
+ {
+ if (IsSetBlocked)
+ return;
+ if (ChangeValuesTogether)
+ {
+ _xChanged = false;
+ _yChanged = false;
+ _zChanged = true;
+ }
+ OnValueChanged();
+ }
+
private void OnValueChanged()
{
if (IsSetBlocked)
return;
+ var xValue = XElement.ValueBox.Value;
+ var yValue = YElement.ValueBox.Value;
+ var zValue = ZElement.ValueBox.Value;
+
+ if (ChangeValuesTogether)
+ {
+ var adder = 0.0f;
+ if (_xChanged)
+ {
+ adder = xValue - ((Float3)Values[0]).X;
+ yValue += adder;
+ zValue += adder;
+ }
+
+ if (_yChanged)
+ {
+ adder = yValue - ((Float3)Values[0]).Y;
+ xValue += adder;
+ zValue += adder;
+ }
+
+ if (_zChanged)
+ {
+ adder = zValue - ((Float3)Values[0]).Z;
+ xValue += adder;
+ yValue += adder;
+ }
+ }
+
var isSliding = XElement.IsSliding || YElement.IsSliding || ZElement.IsSliding;
var token = isSliding ? this : null;
- var value = new Float3(XElement.ValueBox.Value, YElement.ValueBox.Value, ZElement.ValueBox.Value);
+ var value = new Float3(xValue, yValue, zValue);
object v = Values[0];
if (v is Vector3)
v = (Vector3)value;
@@ -93,6 +169,13 @@ namespace FlaxEditor.CustomEditors.Editors
else if (v is Double3)
v = (Double3)value;
SetValue(v, token);
+
+ if (ChangeValuesTogether)
+ {
+ _xChanged = false;
+ _yChanged = false;
+ _zChanged = false;
+ }
}
///