#nullable enable using System; using System.Collections.Generic; namespace UICatalog.Scenarios; /// /// Provides an editor UI for the Margin, Border, and Padding of a View. /// public sealed class ArrangementEditor : EditorBase { public ArrangementEditor () { Title = "ArrangementEditor"; TabStop = TabBehavior.TabGroup; Initialized += ArrangementEditor_Initialized; _arrangementSlider.Options = [ new SliderOption { Legend = ViewArrangement.Movable.ToString (), Data = ViewArrangement.Movable }, new SliderOption { Legend = ViewArrangement.LeftResizable.ToString (), Data = ViewArrangement.LeftResizable }, new SliderOption { Legend = ViewArrangement.RightResizable.ToString (), Data = ViewArrangement.RightResizable }, new SliderOption { Legend = ViewArrangement.TopResizable.ToString (), Data = ViewArrangement.TopResizable }, new SliderOption { Legend = ViewArrangement.BottomResizable.ToString (), Data = ViewArrangement.BottomResizable }, new SliderOption { Legend = ViewArrangement.Overlapped.ToString (), Data = ViewArrangement.Overlapped } ]; Add (_arrangementSlider); } private readonly Slider _arrangementSlider = new() { Orientation = Orientation.Vertical, UseMinimumSize = true, Type = SliderType.Multiple, AllowEmpty = true, }; protected override void OnViewToEditChanged () { _arrangementSlider.Enabled = ViewToEdit is not Adornment; _arrangementSlider.OptionsChanged -= ArrangementSliderOnOptionsChanged; // Set the appropriate options in the slider based on _viewToEdit.Arrangement if (ViewToEdit is { }) { _arrangementSlider.Options.ForEach ( option => { _arrangementSlider.ChangeOption ( _arrangementSlider.Options.IndexOf (option), (ViewToEdit.Arrangement & option.Data) == option.Data); }); } _arrangementSlider.OptionsChanged += ArrangementSliderOnOptionsChanged; } private void ArrangementEditor_Initialized (object? sender, EventArgs e) { _arrangementSlider.OptionsChanged += ArrangementSliderOnOptionsChanged; } private void ArrangementSliderOnOptionsChanged (object? sender, SliderEventArgs e) { if (ViewToEdit is { }) { // Set the arrangement based on the selected options var arrangement = ViewArrangement.Fixed; foreach (KeyValuePair> option in e.Options) { arrangement |= option.Value.Data; } ViewToEdit.Arrangement = arrangement; if (ViewToEdit.Arrangement.HasFlag (ViewArrangement.Overlapped)) { ViewToEdit.ShadowStyle = ShadowStyle.Transparent; ViewToEdit.SchemeName = "Toplevel"; } else { ViewToEdit.ShadowStyle = ShadowStyle.None; ViewToEdit.SchemeName = ViewToEdit!.SuperView!.SchemeName; } if (ViewToEdit.Arrangement.HasFlag (ViewArrangement.Movable)) { ViewToEdit.BorderStyle = LineStyle.Double; } else { ViewToEdit.BorderStyle = LineStyle.Single; } } } }