using FlaxEditor.CustomEditors.Elements; using FlaxEditor.GUI; using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.CustomEditors.Editors { /// /// Base class for custom button editors. /// See , and . /// public class BindableButtonEditor : EnumEditor { private bool _isListeningForInput; private Button _button; /// /// Where or not we are currently listening for any input. /// protected bool IsListeningForInput { get => _isListeningForInput; set { _isListeningForInput = value; if (_isListeningForInput) SetupButton(); else ResetButton(); } } /// /// The window this editor is attached to. /// Useful to hook into for key pressed, mouse buttons etc. /// protected Window Window { get; private set; } /// public override void Initialize(LayoutElementsContainer layout) { Window = layout.Control.RootWindow.Window; var panelElement = layout.CustomContainer(); var panel = panelElement.ContainerControl as Panel; var button = panelElement.Button("Listen", "Press to listen for input events"); _button = button.Button; _button.Width = FlaxEngine.GUI.Style.Current.FontMedium.MeasureText("Listening...").X + 8; _button.Height = ComboBox.DefaultHeight; _button.Clicked += OnButtonClicked; ResetButton(); panel.Height = ComboBox.DefaultHeight; base.Initialize(panelElement); if (panelElement.Children.Find(x => x is EnumElement) is EnumElement comboBoxElement) { var comboBox = comboBoxElement.ComboBox; comboBox.AnchorPreset = AnchorPresets.StretchAll; comboBox.Offsets = new Margin(0, _button.Width + 2, 0, 0); comboBox.LocalX += _button.Width + 2; } } /// protected override void Deinitialize() { _button.Clicked -= OnButtonClicked; base.Deinitialize(); } private void ResetButton() { _button.Text = "Listen"; _button.BorderThickness = 1; var style = FlaxEngine.GUI.Style.Current; _button.BorderColor = style.BorderNormal; _button.BorderColorHighlighted = style.BorderHighlighted; _button.BorderColorSelected = style.BorderSelected; } private void SetupButton() { _button.Text = "Listening..."; _button.BorderThickness = 2; var color = FlaxEngine.GUI.Style.Current.ProgressNormal; _button.BorderColor = color; _button.BorderColorHighlighted = color; _button.BorderColorSelected = color; } private void OnButtonClicked() { _isListeningForInput = !_isListeningForInput; if (_isListeningForInput) SetupButton(); else ResetButton(); } } }