using System; using System.Collections.Generic; using System.Linq; using Terminal.Gui; namespace UICatalog.Scenarios; [ScenarioMetadata ("Pos.Align", "Demonstrates Pos.Align")] [ScenarioCategory ("Layout")] public sealed class PosAlignDemo : Scenario { private readonly Aligner _horizAligner = new () { AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.AddSpaceBetweenItems}; private int _leftMargin; private readonly Aligner _vertAligner = new () { AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.AddSpaceBetweenItems }; private int _topMargin; public override void Main () { // Init Application.Init (); // Setup - Create a top-level application window and configure it. Window appWindow = new () { Title = $"{Application.QuitKey} to Quit - Scenario: {GetName ()} - {GetDescription ()}" }; SetupControls (appWindow, Dimension.Width, Colors.ColorSchemes ["TopLevel"]); SetupControls (appWindow, Dimension.Height, Colors.ColorSchemes ["Error"]); Setup3By3Grid (appWindow); // Run - Start the application. Application.Run (appWindow); appWindow.Dispose (); // Shutdown - Calling Application.Shutdown is required. Application.Shutdown (); } private void SetupControls (Window appWindow, Dimension dimension, ColorScheme colorScheme) { RadioGroup alignRadioGroup = new () { RadioLabels = Enum.GetNames (), ColorScheme = colorScheme }; if (dimension == Dimension.Width) { alignRadioGroup.X = Pos.Align (_horizAligner.Alignment); alignRadioGroup.Y = Pos.Center (); } else { alignRadioGroup.X = Pos.Center (); alignRadioGroup.Y = Pos.Align (_vertAligner.Alignment); } alignRadioGroup.SelectedItemChanged += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.Alignment = (Alignment)Enum.Parse ( typeof (Alignment), alignRadioGroup.RadioLabels [alignRadioGroup.SelectedItem]); UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.Alignment = (Alignment)Enum.Parse ( typeof (Alignment), alignRadioGroup.RadioLabels [alignRadioGroup.SelectedItem]); UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (alignRadioGroup); CheckBox endToStartCheckBox = new () { ColorScheme = colorScheme, Text = "EndToStart" }; if (dimension == Dimension.Width) { endToStartCheckBox.State = _horizAligner.AlignmentModes.HasFlag (AlignmentModes.EndToStart) ? CheckState.Checked : CheckState.UnChecked; endToStartCheckBox.X = Pos.Align (_horizAligner.Alignment); endToStartCheckBox.Y = Pos.Top (alignRadioGroup); } else { endToStartCheckBox.State = _vertAligner.AlignmentModes.HasFlag (AlignmentModes.EndToStart) ? CheckState.Checked : CheckState.UnChecked; endToStartCheckBox.X = Pos.Left (alignRadioGroup); endToStartCheckBox.Y = Pos.Align (_vertAligner.Alignment); } endToStartCheckBox.Toggle += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.AlignmentModes = e.NewValue == CheckState.Checked ? _horizAligner.AlignmentModes | AlignmentModes.EndToStart : _horizAligner.AlignmentModes & ~AlignmentModes.EndToStart; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.AlignmentModes = e.NewValue == CheckState.Checked ? _vertAligner.AlignmentModes | AlignmentModes.EndToStart : _vertAligner.AlignmentModes & ~AlignmentModes.EndToStart; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (endToStartCheckBox); CheckBox ignoreFirstOrLast = new () { ColorScheme = colorScheme, Text = "IgnoreFirstOrLast" }; if (dimension == Dimension.Width) { ignoreFirstOrLast.State = _horizAligner.AlignmentModes.HasFlag (AlignmentModes.IgnoreFirstOrLast) ? CheckState.Checked : CheckState.UnChecked; ignoreFirstOrLast.X = Pos.Align (_horizAligner.Alignment); ignoreFirstOrLast.Y = Pos.Top (alignRadioGroup); } else { ignoreFirstOrLast.State = _vertAligner.AlignmentModes.HasFlag (AlignmentModes.IgnoreFirstOrLast) ? CheckState.Checked : CheckState.UnChecked; ignoreFirstOrLast.X = Pos.Left (alignRadioGroup); ignoreFirstOrLast.Y = Pos.Align (_vertAligner.Alignment); } ignoreFirstOrLast.Toggle += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.AlignmentModes = e.NewValue == CheckState.Checked ? _horizAligner.AlignmentModes | AlignmentModes.IgnoreFirstOrLast : _horizAligner.AlignmentModes & ~AlignmentModes.IgnoreFirstOrLast; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.AlignmentModes = e.NewValue == CheckState.Checked ? _vertAligner.AlignmentModes | AlignmentModes.IgnoreFirstOrLast : _vertAligner.AlignmentModes & ~AlignmentModes.IgnoreFirstOrLast; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (ignoreFirstOrLast); CheckBox addSpacesBetweenItems = new () { ColorScheme = colorScheme, Text = "AddSpaceBetweenItems" }; if (dimension == Dimension.Width) { addSpacesBetweenItems.State = _horizAligner.AlignmentModes.HasFlag (AlignmentModes.AddSpaceBetweenItems) ? CheckState.Checked : CheckState.UnChecked; addSpacesBetweenItems.X = Pos.Align (_horizAligner.Alignment); addSpacesBetweenItems.Y = Pos.Top (alignRadioGroup); } else { addSpacesBetweenItems.State = _vertAligner.AlignmentModes.HasFlag (AlignmentModes.AddSpaceBetweenItems) ? CheckState.Checked : CheckState.UnChecked; addSpacesBetweenItems.X = Pos.Left (alignRadioGroup); addSpacesBetweenItems.Y = Pos.Align (_vertAligner.Alignment); } addSpacesBetweenItems.Toggle += (s, e) => { if (dimension == Dimension.Width) { _horizAligner.AlignmentModes = e.NewValue == CheckState.Checked ? _horizAligner.AlignmentModes | AlignmentModes.AddSpaceBetweenItems : _horizAligner.AlignmentModes & ~AlignmentModes.AddSpaceBetweenItems; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _vertAligner.AlignmentModes = e.NewValue == CheckState.Checked ? _vertAligner.AlignmentModes | AlignmentModes.AddSpaceBetweenItems : _vertAligner.AlignmentModes & ~AlignmentModes.AddSpaceBetweenItems; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (addSpacesBetweenItems); CheckBox margin = new () { ColorScheme = colorScheme, Text = "Margin" }; if (dimension == Dimension.Width) { margin.X = Pos.Align (_horizAligner.Alignment); margin.Y = Pos.Top (alignRadioGroup); } else { margin.X = Pos.Left (addSpacesBetweenItems); margin.Y = Pos.Align (_vertAligner.Alignment); } margin.Toggle += (s, e) => { if (dimension == Dimension.Width) { _leftMargin = e.NewValue == CheckState.Checked ? 1 : 0; UpdatePosAlignObjects (appWindow, dimension, _horizAligner); } else { _topMargin = e.NewValue == CheckState.Checked ? 1 : 0; UpdatePosAlignObjects (appWindow, dimension, _vertAligner); } }; appWindow.Add (margin); List