diff --git a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs index 833d7d7d3..c709894a7 100644 --- a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs @@ -39,6 +39,13 @@ namespace FlaxEditor.CustomEditors.Dedicated public bool IsSelected; + public bool SupportsShiftModulation; + + private void OnPresetsChanged() + { + TooltipText = CustomEditorsUtil.GetPropertyNameUI(_presets.ToString()); + } + /// public override void Draw() { @@ -74,6 +81,15 @@ namespace FlaxEditor.CustomEditors.Dedicated borderColor = BorderColorHighlighted; } + if (Input.GetKey(KeyboardKeys.Shift) && SupportsShiftModulation) + { + backgroundColor = BackgroundColorSelected; + } + if (Input.GetKey(KeyboardKeys.Control) && SupportsShiftModulation) + { + borderColor = BackgroundColorSelected; + } + // Calculate fill area float fillSize = rect.Width / 3; Rectangle fillArea; @@ -161,12 +177,17 @@ namespace FlaxEditor.CustomEditors.Dedicated const float DialogWidth = ButtonsSize * 4 + ButtonsMargin * 5 + ButtonsMarginStretch; const float DialogHeight = TitleHeight + ButtonsSize * 4 + ButtonsMargin * 5 + ButtonsMarginStretch; + bool SupportsShiftModulation = false; + /// /// Initializes a new instance of the class. /// /// The initial value. - public AnchorPresetsEditorPopup(AnchorPresets presets) + /// If the popup should react to shift + public AnchorPresetsEditorPopup(AnchorPresets presets, bool supportsShiftModulation) { + SupportsShiftModulation = supportsShiftModulation; + var style = FlaxEngine.GUI.Style.Current; Tag = presets; Size = new Vector2(DialogWidth, DialogHeight); @@ -214,6 +235,7 @@ namespace FlaxEditor.CustomEditors.Dedicated Parent = this, Presets = presets, IsSelected = presets == (AnchorPresets)Tag, + SupportsShiftModulation = SupportsShiftModulation, Tag = presets, }; button.ButtonClicked += OnButtonClicked; @@ -273,7 +295,7 @@ namespace FlaxEditor.CustomEditors.Dedicated private void OnButtonClicked() { var location = _button.Center + new Vector2(3.0f); - var editor = new AnchorPresetsEditorPopup(_button.Presets); + var editor = new AnchorPresetsEditorPopup(_button.Presets, true); editor.VisibleChanged += OnEditorVisibleChanged; editor.Show(_button.Parent, location); } @@ -284,6 +306,29 @@ namespace FlaxEditor.CustomEditors.Dedicated return; SetValue(control.Tag); } + /// + protected override void SynchronizeValue(object value) + { + // Custom anchors editing for Control to handle bounds preservation via key modifiers + if (ParentEditor != null) + { + var centerToPosition = Input.GetKey(KeyboardKeys.Shift); + var setPivot = Input.GetKey(KeyboardKeys.Control); + var editedAny = false; + foreach (var parentValue in ParentEditor.Values) + { + if (parentValue is Control parentControl) + { + parentControl.SetAnchorPreset((AnchorPresets)value, !centerToPosition, setPivot); + editedAny = true; + } + } + if (editedAny) + return; + } + + base.SynchronizeValue(value); + } /// public override void Refresh() diff --git a/Source/Engine/UI/GUI/Control.Bounds.cs b/Source/Engine/UI/GUI/Control.Bounds.cs index 91f377c91..717b3c4d7 100644 --- a/Source/Engine/UI/GUI/Control.Bounds.cs +++ b/Source/Engine/UI/GUI/Control.Bounds.cs @@ -491,7 +491,8 @@ namespace FlaxEngine.GUI /// /// The anchor preset to set. /// True if preserve current control bounds, otherwise will align control position accordingly to the anchor location. - public void SetAnchorPreset(AnchorPresets anchorPreset, bool preserveBounds) + /// Whether or not we should set the pivot too, eg left-top 0,0, bottom-right 1,1 + public void SetAnchorPreset(AnchorPresets anchorPreset, bool preserveBounds, bool setPivotToo = false) { for (int i = 0; i < AnchorPresetsData.Length; i++) { @@ -583,6 +584,10 @@ namespace FlaxEngine.GUI } SetBounds(ref bounds); } + if (setPivotToo) + { + Pivot = (anchorMin + anchorMax) / 2; + } _parent?.PerformLayout(); return; }