// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using System.Collections.Generic;
using FlaxEditor.CustomEditors;
using FlaxEditor.CustomEditors.Editors;
using FlaxEditor.GUI;
using FlaxEditor.GUI.Input;
using FlaxEngine;
using FlaxEngine.GUI;
using FlaxEngine.Utilities;
namespace FlaxEditor.Windows
{
///
/// Editor window for UI .
///
///
public class StyleEditorWindow : EditorWindow
{
private const float ButtonsWidth = 60.0f;
private const float PickerMargin = 6.0f;
private const float PreviewX = 50;
private Style _initialValue;
private Style _value;
private bool _useDynamicEditing;
private StyleValueEditor.ValueChangedEvent _onChanged;
private Button _cCancel;
private Button _cOK;
private CustomEditorPresenter _valueEditor;
private Panel _previewPanel;
///
/// Initializes a new instance of the class.
///
///
/// The initial value.
/// The changed event.
/// True if allow dynamic value editing (slider-like usage), otherwise will change event only on editing end.
public StyleEditorWindow(Editor editor, Style initialValue, StyleValueEditor.ValueChangedEvent valueChanged, bool useDynamicEditing) : base(editor, false, ScrollBars.None)
{
Title = "Style";
_initialValue = initialValue;
_value = _initialValue.DeepClone();
_useDynamicEditing = useDynamicEditing;
_onChanged = valueChanged;
var container = AddChild();
container.Offsets = Margin.Zero;
container.AnchorPreset = AnchorPresets.StretchAll;
container.SlotsVertically = 1;
container.SlotsHorizontally = 2;
var optionsPanel = container.AddChild();
container.Offsets = Margin.Zero;
container.AnchorPreset = AnchorPresets.StretchAll;
optionsPanel.IsScrollable = true;
optionsPanel.ScrollBars = ScrollBars.Vertical;
_valueEditor = new CustomEditorPresenter(null);
_valueEditor.Panel.Parent = optionsPanel;
_valueEditor.OverrideEditor = new GenericEditor();
_valueEditor.Select(_value);
_valueEditor.Modified += OnEdited;
_previewPanel = container.AddChild();
container.Offsets = Margin.Zero;
container.AnchorPreset = AnchorPresets.StretchAll;
var preview = CreatePreview(_value);
preview.Parent = _previewPanel;
// Cancel
_cCancel = new Button
{
Text = "Cancel",
Parent = this,
AnchorPreset = AnchorPresets.BottomRight,
Bounds = new Rectangle(Width - ButtonsWidth - PickerMargin, Height - Button.DefaultHeight - PickerMargin, ButtonsWidth, Button.DefaultHeight),
};
_cCancel.Clicked += OnCancelClicked;
// OK
_cOK = new Button
{
Text = "Ok",
Parent = this,
AnchorPreset = AnchorPresets.BottomRight,
Bounds = new Rectangle(_cCancel.Left - ButtonsWidth - PickerMargin, _cCancel.Y, ButtonsWidth, Button.DefaultHeight),
};
_cOK.Clicked += OnOkClicked;
}
///
/// Creates a preview
///
/// The style to use for the preview
/// The preview
private static ContainerControl CreatePreview(Style style)
{
var currentStyle = Style.Current;
Style.Current = style;
var preview = new ContainerControl
{
Offsets = Margin.Zero,
AnchorPreset = AnchorPresets.StretchAll,
BackgroundColor = style.Background
};
var label = new Label
{
Text = "Example Label",
Parent = preview,
Location = new Float2(PreviewX, 50),
TooltipText = "Example Tooltip"
};
var button = new Button(PreviewX, 100)
{
Text = "Example Button",
Parent = preview,
TooltipText = "Example Tooltip"
};
var textBox = new TextBox(true, PreviewX, 150)
{
Text = "Example TextBox",
Parent = preview
};
var checkBox = new CheckBox(PreviewX, 200)
{
Parent = preview
};
var panel = new Panel
{
Parent = preview,
X = PreviewX,
Y = 250,
BackgroundColor = style.BackgroundSelected,
Width = 250,
Height = 30
};
var progressBar = new ProgressBar(20, 5, 150, 20)
{
Value = 42,
Parent = panel
};
var comboBox = new ComboBox
{
Items = new List
{
"Item 1",
"Item 2",
"Item 3"
},
X = PreviewX,
Y = 300,
Parent = preview,
SelectedIndex = 0,
SelectedItem = "Item 1"
};
var slider = new SliderControl(30, PreviewX, 350, min: 0, max: 100)
{
Parent = preview,
Value = 31
};
Style.Current = currentStyle;
return preview;
}
///
/// Gets called when the style has been edited
///
private void OnEdited()
{
if (_previewPanel != null)
{
_previewPanel.DisposeChildren();
var preview = CreatePreview(_value);
preview.Parent = _previewPanel;
}
if (_useDynamicEditing)
{
_useDynamicEditing = false;
_onChanged?.Invoke(_value, true);
}
}
private void OnOkClicked()
{
_onChanged?.Invoke(_value, false);
Close();
}
private void OnCancelClicked()
{
// Restore old style
if (_useDynamicEditing)
_onChanged?.Invoke(_initialValue, false);
Close(ClosingReason.User);
}
///
protected override void OnClose()
{
base.OnClose();
if (_useDynamicEditing)
_onChanged?.Invoke(_initialValue, false);
}
}
}