#nullable enable
using System;
namespace UICatalog.Scenarios;
///
/// Provides a composable UI for editing the settings of an Adornment.
///
public class AdornmentEditor : EditorBase
{
private readonly ColorPicker16 _backgroundColorPicker = new ()
{
Title = "_BG",
BoxWidth = 1,
BoxHeight = 1,
BorderStyle = LineStyle.Single,
SuperViewRendersLineCanvas = true
};
private readonly ColorPicker16 _foregroundColorPicker = new ()
{
Title = "_FG",
BoxWidth = 1,
BoxHeight = 1,
BorderStyle = LineStyle.Single,
SuperViewRendersLineCanvas = true
};
private CheckBox? _diagThicknessCheckBox;
private CheckBox? _diagRulerCheckBox;
private Adornment? _adornment;
public Adornment? AdornmentToEdit
{
get => _adornment;
set
{
Enabled = value is { };
if (value == _adornment)
{
return;
}
_adornment = value;
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) =>
{
Scheme? cs = _adornment.GetScheme ();
_foregroundColorPicker.SelectedColor = _adornment.GetAttributeForRole (VisualRole.Normal).Foreground.GetClosestNamedColor16 ();
_backgroundColorPicker.SelectedColor = _adornment.GetAttributeForRole (VisualRole.Normal).Background.GetClosestNamedColor16 ();
};
}
OnAdornmentChanged ();
}
}
public event EventHandler? AdornmentChanged;
public void OnAdornmentChanged () { AdornmentChanged?.Invoke (this, EventArgs.Empty); }
///
protected override void OnViewToEditChanged () { AdornmentToEdit = ViewToEdit as Adornment; }
private NumericUpDown? _topEdit;
private NumericUpDown? _leftEdit;
private NumericUpDown? _bottomEdit;
private NumericUpDown? _rightEdit;
public AdornmentEditor ()
{
CanFocus = true;
Initialized += AdornmentEditor_Initialized;
}
private void AdornmentEditor_Initialized (object? sender, EventArgs e)
{
_topEdit = new ()
{
X = Pos.Center (), Y = 0,
Format = "{0, 2}"
};
_topEdit.ValueChanging += Top_ValueChanging;
Add (_topEdit);
_leftEdit = new ()
{
X = Pos.Left (_topEdit) - Pos.Func (_ => _topEdit.Text.Length) - 2, Y = Pos.Bottom (_topEdit),
Format = _topEdit.Format
};
_leftEdit.ValueChanging += Left_ValueChanging;
Add (_leftEdit);
_rightEdit = new ()
{
X = Pos.Right (_leftEdit) + 5, Y = Pos.Bottom (_topEdit),
Format = _topEdit.Format
};
_rightEdit.ValueChanging += Right_ValueChanging;
Add (_rightEdit);
_bottomEdit = new ()
{
X = Pos.Center (), Y = Pos.Bottom (_leftEdit),
Format = _topEdit.Format
};
_bottomEdit.ValueChanging += Bottom_ValueChanging;
Add (_bottomEdit);
var copyTop = new Button
{
X = Pos.Center (), Y = Pos.Bottom (_bottomEdit), Text = "Cop_y Top"
};
copyTop.Accepting += (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;
_diagThicknessCheckBox = new () { Text = "_Thickness Diag." };
if (AdornmentToEdit is { })
{
_diagThicknessCheckBox.CheckedState =
AdornmentToEdit.Diagnostics.FastHasFlags (ViewDiagnosticFlags.Thickness) ? CheckState.Checked : CheckState.UnChecked;
}
else
{
_diagThicknessCheckBox.CheckedState = Diagnostics.FastHasFlags (ViewDiagnosticFlags.Thickness) ? CheckState.Checked : CheckState.UnChecked;
}
_diagThicknessCheckBox.CheckedStateChanging += (s, e) =>
{
if (e.Result == CheckState.Checked)
{
AdornmentToEdit!.Diagnostics |= ViewDiagnosticFlags.Thickness;
}
else
{
AdornmentToEdit!.Diagnostics &= ~ViewDiagnosticFlags.Thickness;
}
};
Add (_diagThicknessCheckBox);
_diagThicknessCheckBox.Y = Pos.Bottom (_backgroundColorPicker);
_diagRulerCheckBox = new () { Text = "_Ruler" };
if (AdornmentToEdit is { })
{
_diagRulerCheckBox.CheckedState = AdornmentToEdit.Diagnostics.FastHasFlags (ViewDiagnosticFlags.Ruler) ? CheckState.Checked : CheckState.UnChecked;
}
else
{
_diagRulerCheckBox.CheckedState = Diagnostics.FastHasFlags (ViewDiagnosticFlags.Ruler) ? CheckState.Checked : CheckState.UnChecked;
}
_diagRulerCheckBox.CheckedStateChanging += (s, e) =>
{
if (e.Result == CheckState.Checked)
{
AdornmentToEdit!.Diagnostics |= ViewDiagnosticFlags.Ruler;
}
else
{
AdornmentToEdit!.Diagnostics &= ~ViewDiagnosticFlags.Ruler;
}
};
Add (_diagRulerCheckBox);
_diagRulerCheckBox.Y = Pos.Bottom (_diagThicknessCheckBox);
}
private EventHandler> ColorPickerColorChanged ()
{
return (o, a) =>
{
if (AdornmentToEdit is null)
{
return;
}
AdornmentToEdit.SetScheme (new (AdornmentToEdit.GetScheme ())
{
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);
}
}