using System; using Terminal.Gui; namespace UICatalog.Scenarios; /// /// Provides a composable UI for editing the settings of an Adornment. /// public class AdornmentEditor : View { private readonly ColorPicker _backgroundColorPicker = new () { Title = "_BG", BoxWidth = 1, BoxHeight = 1, BorderStyle = LineStyle.Single, SuperViewRendersLineCanvas = true, Enabled = false }; private readonly ColorPicker _foregroundColorPicker = new () { Title = "_FG", BoxWidth = 1, BoxHeight = 1, BorderStyle = LineStyle.Single, SuperViewRendersLineCanvas = true, Enabled = false }; private Adornment _adornment; public Adornment AdornmentToEdit { get => _adornment; set { if (value == _adornment) { return; } _adornment = value; foreach (var subview in Subviews) { subview.Enabled = _adornment is { }; } if (_adornment is null) { return; } if (IsInitialized) { _topEdit.Value = _adornment.Thickness.Top; _leftEdit.Value = _adornment.Thickness.Left; _bottomEdit.Value = _adornment.Thickness.Bottom; _rightEdit.Value = _adornment.Thickness.Right; _adornment.Initialized += (sender, args) => { var cs = _adornment.ColorScheme; _foregroundColorPicker.SelectedColor = cs.Normal.Foreground.GetClosestNamedColor (); _backgroundColorPicker.SelectedColor = cs.Normal.Background.GetClosestNamedColor (); }; } OnAdornmentChanged (); } } public event EventHandler AdornmentChanged; public void OnAdornmentChanged () { AdornmentChanged?.Invoke (this, EventArgs.Empty); } private Buttons.NumericUpDown _topEdit; private Buttons.NumericUpDown _leftEdit; private Buttons.NumericUpDown _bottomEdit; private Buttons.NumericUpDown _rightEdit; public AdornmentEditor () { Width = Dim.Auto (DimAutoStyle.Content); Height = Dim.Auto (DimAutoStyle.Content); BorderStyle = LineStyle.Dashed; Initialized += AdornmentEditor_Initialized; TabStop = TabBehavior.TabGroup; } private void AdornmentEditor_Initialized (object sender, EventArgs e) { ExpanderButton expandButton; Border.Add (expandButton = new ExpanderButton ()); _topEdit = new () { X = Pos.Center (), Y = 0, Enabled = false }; _topEdit.ValueChanging += Top_ValueChanging; Add (_topEdit); _leftEdit = new () { X = Pos.Left (_topEdit) - Pos.Func (() => _topEdit.Digits) - 2, Y = Pos.Bottom (_topEdit), Enabled = false }; _leftEdit.ValueChanging += Left_ValueChanging; Add (_leftEdit); _rightEdit = new () { X = Pos.Right (_leftEdit) + 5, Y = Pos.Bottom (_topEdit), Enabled = false }; _rightEdit.ValueChanging += Right_ValueChanging; Add (_rightEdit); _bottomEdit = new () { X = Pos.Center (), Y = Pos.Bottom (_leftEdit), Enabled = false }; _bottomEdit.ValueChanging += Bottom_ValueChanging; Add (_bottomEdit); var copyTop = new Button { X = Pos.Center (), Y = Pos.Bottom (_bottomEdit), Text = "Cop_y Top", Enabled = false }; copyTop.Accept += (s, e) => { AdornmentToEdit.Thickness = new (_topEdit.Value); _leftEdit.Value = _rightEdit.Value = _bottomEdit.Value = _topEdit.Value; }; Add (copyTop); // Foreground ColorPicker. _foregroundColorPicker.X = 0; _foregroundColorPicker.Y = Pos.Bottom (copyTop); _foregroundColorPicker.ColorChanged += ColorPickerColorChanged (); Add (_foregroundColorPicker); // Background ColorPicker. _backgroundColorPicker.X = Pos.Right (_foregroundColorPicker) - 1; _backgroundColorPicker.Y = Pos.Top (_foregroundColorPicker); _backgroundColorPicker.ColorChanged += ColorPickerColorChanged (); Add (_backgroundColorPicker); _topEdit.Value = AdornmentToEdit?.Thickness.Top ?? 0; _leftEdit.Value = AdornmentToEdit?.Thickness.Left ?? 0; _rightEdit.Value = AdornmentToEdit?.Thickness.Right ?? 0; _bottomEdit.Value = AdornmentToEdit?.Thickness.Bottom ?? 0; foreach (var subview in Subviews) { subview.Enabled = AdornmentToEdit is { }; } } private EventHandler ColorPickerColorChanged () { return (o, a) => { if (AdornmentToEdit is null) { return; } AdornmentToEdit.ColorScheme = new (AdornmentToEdit.ColorScheme) { Normal = new (_foregroundColorPicker.SelectedColor, _backgroundColorPicker.SelectedColor) }; }; } private void Top_ValueChanging (object sender, CancelEventArgs e) { if (e.NewValue < 0 || AdornmentToEdit is null) { e.Cancel = true; return; } AdornmentToEdit.Thickness = new (AdornmentToEdit.Thickness.Left, e.NewValue, AdornmentToEdit.Thickness.Right, AdornmentToEdit.Thickness.Bottom); } private void Left_ValueChanging (object sender, CancelEventArgs e) { if (e.NewValue < 0 || AdornmentToEdit is null) { e.Cancel = true; return; } AdornmentToEdit.Thickness = new (e.NewValue, AdornmentToEdit.Thickness.Top, AdornmentToEdit.Thickness.Right, AdornmentToEdit.Thickness.Bottom); } private void Right_ValueChanging (object sender, CancelEventArgs e) { if (e.NewValue < 0 || AdornmentToEdit is null) { e.Cancel = true; return; } AdornmentToEdit.Thickness = new (AdornmentToEdit.Thickness.Left, AdornmentToEdit.Thickness.Top, e.NewValue, AdornmentToEdit.Thickness.Bottom); } private void Bottom_ValueChanging (object sender, CancelEventArgs e) { if (e.NewValue < 0 || AdornmentToEdit is null) { e.Cancel = true; return; } AdornmentToEdit.Thickness = new (AdornmentToEdit.Thickness.Left, AdornmentToEdit.Thickness.Top, AdornmentToEdit.Thickness.Right, e.NewValue); } }