浏览代码

Fixes some bugs in the `Scenario/EditorsAndHelpers` and backports `WideGlyphs` (#4494)

* Fix scenario editors and tweak scenarios.

Enhance ShadowStyles with a second shadow window (transparent style) and a button event handler that shows a message box. In WideGlyphs, add AdornmentsEditor and ViewportSettingsEditor for view property editing, apply custom color schemes to arrangeable views, and update superView with a transparent shadow and increased shadow width. These changes improve interactivity and visualization in the demo scenarios.

* Fix scenario editors and tweak scenarios.

Enhance ShadowStyles with a second shadow window (transparent style) and a button event handler that shows a message box. In WideGlyphs, add AdornmentsEditor and ViewportSettingsEditor for view property editing, apply custom color schemes to arrangeable views, and update superView with a transparent shadow and increased shadow width. These changes improve interactivity and visualization in the demo scenarios.

* Scenario Editors code cleanup & latent bug fixes.

Refactored event handler patterns to use correct sender values and discards for unused parameters, aligning with .NET conventions. Cleaned up code by removing redundant usings and comments, and clarified logic in property setters and switch statements. Enhanced robustness and clarity in editor components, fixing issues with value changes, event subscriptions, and nullability. Improved disposal logic in EditorBase and made minor UI and label adjustments. Added "diag" to the custom dictionary. These changes modernize event handling and address subtle bugs in the UICatalog editors.

* code cleanup

* Update Examples/UICatalog/Scenarios/EditorsAndHelpers/EditorBase.cs

Co-authored-by: Copilot <[email protected]>

* PR feedback.

---------

Co-authored-by: Copilot <[email protected]>
Tig 2 小时之前
父节点
当前提交
fb1a3e03f3
共有 25 个文件被更改,包括 268 次插入250 次删除
  1. 1 0
      Examples/UICatalog/Scenarios/Adornments.cs
  2. 19 18
      Examples/UICatalog/Scenarios/EditorsAndHelpers/AdornmentEditor.cs
  3. 9 8
      Examples/UICatalog/Scenarios/EditorsAndHelpers/AdornmentsEditor.cs
  4. 6 13
      Examples/UICatalog/Scenarios/EditorsAndHelpers/AllViewsView.cs
  5. 25 22
      Examples/UICatalog/Scenarios/EditorsAndHelpers/BorderEditor.cs
  6. 37 34
      Examples/UICatalog/Scenarios/EditorsAndHelpers/DimEditor.cs
  7. 21 30
      Examples/UICatalog/Scenarios/EditorsAndHelpers/EditorBase.cs
  8. 1 3
      Examples/UICatalog/Scenarios/EditorsAndHelpers/EventLog.cs
  9. 8 12
      Examples/UICatalog/Scenarios/EditorsAndHelpers/ExpanderButton.cs
  10. 0 5
      Examples/UICatalog/Scenarios/EditorsAndHelpers/LayoutEditor.cs
  11. 5 12
      Examples/UICatalog/Scenarios/EditorsAndHelpers/MarginEditor.cs
  12. 3 6
      Examples/UICatalog/Scenarios/EditorsAndHelpers/PosEditor.cs
  13. 11 19
      Examples/UICatalog/Scenarios/EditorsAndHelpers/ViewPropertiesEditor.cs
  14. 50 54
      Examples/UICatalog/Scenarios/EditorsAndHelpers/ViewportSettingsEditor.cs
  15. 25 2
      Examples/UICatalog/Scenarios/ShadowStyles.cs
  16. 2 0
      Examples/UICatalog/Scenarios/ViewportSettings.cs
  17. 32 5
      Examples/UICatalog/Scenarios/WideGlyphs.cs
  18. 1 1
      Terminal.Gui/App/ApplicationImpl.Run.cs
  19. 1 1
      Terminal.Gui/App/ApplicationNavigation.cs
  20. 1 0
      Terminal.Gui/App/CWP/CWPEventHelper.cs
  21. 4 2
      Terminal.Gui/App/CWP/CWPPropertyHelper.cs
  22. 2 0
      Terminal.Gui/App/CWP/CWPWorkflowHelper.cs
  23. 2 2
      Terminal.Gui/App/Keyboard/KeyboardImpl.cs
  24. 1 1
      Terminal.Gui/App/Mouse/MouseImpl.cs
  25. 1 0
      Terminal.sln.DotSettings

+ 1 - 0
Examples/UICatalog/Scenarios/Adornments.cs

@@ -19,6 +19,7 @@ public class Adornments : Scenario
 
         var editor = new AdornmentsEditor
         {
+            BorderStyle = LineStyle.Single,
             AutoSelectViewToEdit = true,
 
             // This is for giggles, to show that the editor can be moved around.

+ 19 - 18
Examples/UICatalog/Scenarios/EditorsAndHelpers/AdornmentEditor.cs

@@ -1,6 +1,4 @@
 #nullable enable
-using System;
-
 namespace UICatalog.Scenarios;
 
 /// <summary>
@@ -57,11 +55,13 @@ public class AdornmentEditor : EditorBase
                 _bottomEdit!.Value = _adornment.Thickness.Bottom;
                 _rightEdit!.Value = _adornment.Thickness.Right;
 
-                _adornment.Initialized += (sender, args) =>
+                _adornment.Initialized += (_, _) =>
                                           {
-                                              Scheme? cs = _adornment.GetScheme ();
-                                              _foregroundColorPicker.SelectedColor = _adornment.GetAttributeForRole (VisualRole.Normal).Foreground.GetClosestNamedColor16 ();
-                                              _backgroundColorPicker.SelectedColor = _adornment.GetAttributeForRole (VisualRole.Normal).Background.GetClosestNamedColor16 ();
+                                              _foregroundColorPicker.SelectedColor =
+                                                  _adornment.GetAttributeForRole (VisualRole.Normal).Foreground.GetClosestNamedColor16 ();
+
+                                              _backgroundColorPicker.SelectedColor =
+                                                  _adornment.GetAttributeForRole (VisualRole.Normal).Background.GetClosestNamedColor16 ();
                                           };
             }
 
@@ -125,12 +125,12 @@ public class AdornmentEditor : EditorBase
         _bottomEdit.ValueChanging += Bottom_ValueChanging;
         Add (_bottomEdit);
 
-        var copyTop = new Button
+        Button copyTop = new ()
         {
             X = Pos.Center (), Y = Pos.Bottom (_bottomEdit), Text = "Cop_y Top"
         };
 
-        copyTop.Accepting += (s, e) =>
+        copyTop.Accepting += (_, _) =>
                              {
                                  AdornmentToEdit!.Thickness = new (_topEdit.Value);
                                  _leftEdit.Value = _rightEdit.Value = _bottomEdit.Value = _topEdit.Value;
@@ -168,9 +168,9 @@ public class AdornmentEditor : EditorBase
             _diagThicknessCheckBox.CheckedState = Diagnostics.FastHasFlags (ViewDiagnosticFlags.Thickness) ? CheckState.Checked : CheckState.UnChecked;
         }
 
-        _diagThicknessCheckBox.CheckedStateChanging += (s, e) =>
+        _diagThicknessCheckBox.CheckedStateChanging += (_, args) =>
                                                        {
-                                                           if (e.Result == CheckState.Checked)
+                                                           if (args.Result == CheckState.Checked)
                                                            {
                                                                AdornmentToEdit!.Diagnostics |= ViewDiagnosticFlags.Thickness;
                                                            }
@@ -194,9 +194,9 @@ public class AdornmentEditor : EditorBase
             _diagRulerCheckBox.CheckedState = Diagnostics.FastHasFlags (ViewDiagnosticFlags.Ruler) ? CheckState.Checked : CheckState.UnChecked;
         }
 
-        _diagRulerCheckBox.CheckedStateChanging += (s, e) =>
+        _diagRulerCheckBox.CheckedStateChanging += (_, args) =>
                                                    {
-                                                       if (e.Result == CheckState.Checked)
+                                                       if (args.Result == CheckState.Checked)
                                                        {
                                                            AdornmentToEdit!.Diagnostics |= ViewDiagnosticFlags.Ruler;
                                                        }
@@ -212,18 +212,19 @@ public class AdornmentEditor : EditorBase
 
     private EventHandler<ResultEventArgs<Color>> ColorPickerColorChanged ()
     {
-        return (o, a) =>
+        return (_, _) =>
                {
                    if (AdornmentToEdit is null)
                    {
                        return;
                    }
 
-                   AdornmentToEdit.SetScheme (new (AdornmentToEdit.GetScheme ())
-                   {
-                       Normal = new (_foregroundColorPicker.SelectedColor, _backgroundColorPicker.SelectedColor)
-                   })
-                   ;
+                   AdornmentToEdit.SetScheme (
+                                              new (AdornmentToEdit.GetScheme ())
+                                              {
+                                                  Normal = new (_foregroundColorPicker.SelectedColor, _backgroundColorPicker.SelectedColor)
+                                              })
+                       ;
                };
     }
 

+ 9 - 8
Examples/UICatalog/Scenarios/EditorsAndHelpers/AdornmentsEditor.cs

@@ -14,8 +14,6 @@ public class AdornmentsEditor : EditorBase
 
         TabStop = TabBehavior.TabGroup;
 
-        ExpanderButton!.Orientation = Orientation.Horizontal;
-
         Initialized += AdornmentsEditor_Initialized;
 
         SchemeName = "Dialog";
@@ -28,8 +26,6 @@ public class AdornmentsEditor : EditorBase
     /// <inheritdoc/>
     protected override void OnViewToEditChanged ()
     {
-        //Enabled = ViewToEdit is not Adornment;
-
         if (MarginEditor is { })
         {
             MarginEditor.AdornmentToEdit = ViewToEdit?.Margin ?? null;
@@ -47,7 +43,7 @@ public class AdornmentsEditor : EditorBase
 
         if (Padding is { })
         {
-            Padding.Text = $"View: {GetIdentifyingString (ViewToEdit)}";
+            Padding.Text = GetIdentifyingString (ViewToEdit);
         }
     }
 
@@ -92,12 +88,17 @@ public class AdornmentsEditor : EditorBase
 
     private void AdornmentsEditor_Initialized (object? sender, EventArgs e)
     {
+        if (ExpanderButton is { })
+        {
+            ExpanderButton.Orientation = Orientation.Horizontal;
+        }
+
         MarginEditor = new ()
         {
             X = -1,
             Y = 0,
             SuperViewRendersLineCanvas = true,
-            BorderStyle = LineStyle.Single
+            BorderStyle = BorderStyle
         };
         MarginEditor.Border!.Thickness = MarginEditor.Border!.Thickness with { Bottom = 0 };
         Add (MarginEditor);
@@ -107,7 +108,7 @@ public class AdornmentsEditor : EditorBase
             X = Pos.Left (MarginEditor),
             Y = Pos.Bottom (MarginEditor),
             SuperViewRendersLineCanvas = true,
-            BorderStyle = LineStyle.Single
+            BorderStyle = BorderStyle
         };
         BorderEditor.Border!.Thickness = BorderEditor.Border!.Thickness with { Bottom = 0 };
         Add (BorderEditor);
@@ -117,7 +118,7 @@ public class AdornmentsEditor : EditorBase
             X = Pos.Left (BorderEditor),
             Y = Pos.Bottom (BorderEditor),
             SuperViewRendersLineCanvas = true,
-            BorderStyle = LineStyle.Single
+            BorderStyle = BorderStyle
         };
         PaddingEditor.Border!.Thickness = PaddingEditor.Border!.Thickness with { Bottom = 0 };
         Add (PaddingEditor);

+ 6 - 13
Examples/UICatalog/Scenarios/EditorsAndHelpers/AllViewsView.cs

@@ -77,7 +77,7 @@ public class AllViewsView : View
 
         View? previousView = null;
 
-        foreach (Type? type in allClasses)
+        foreach (Type type in allClasses)
         {
             View? view = CreateView (type);
 
@@ -118,15 +118,8 @@ public class AllViewsView : View
                     // Check if the generic parameter has constraints
                     Type [] constraints = arg.GetGenericParameterConstraints ();
 
-                    if (constraints.Length > 0)
-                    {
-                        // Use the first constraint type to satisfy the constraint
-                        typeArguments.Add (constraints [0]);
-                    }
-                    else
-                    {
-                        typeArguments.Add (typeof (object));
-                    }
+                    // Use the first constraint type to satisfy the constraint
+                    typeArguments.Add (constraints.Length > 0 ? constraints [0] : typeof (object));
                 }
             }
 
@@ -193,17 +186,17 @@ public class AllViewsView : View
             return;
         }
 
-        if (view.Width == Dim.Absolute (0) || view.Width is null)
+        if (view.Width == Dim.Absolute (0))
         {
             view.Width = Dim.Fill ();
         }
 
-        if (view.Height == Dim.Absolute (0) || view.Height is null)
+        if (view.Height == Dim.Absolute (0))
         {
             view.Height = MAX_VIEW_FRAME_HEIGHT - 2;
         }
 
-        if (!view.Width!.Has<DimAuto> (out _))
+        if (!view.Width.Has<DimAuto> (out _))
         {
             view.Width = Dim.Fill ();
         }

+ 25 - 22
Examples/UICatalog/Scenarios/EditorsAndHelpers/BorderEditor.cs

@@ -1,7 +1,6 @@
 #nullable enable
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Reflection;
+using Terminal.Gui.ViewBase;
 
 namespace UICatalog.Scenarios;
 
@@ -33,10 +32,10 @@ public class BorderEditor : AdornmentEditor
 
             Y = Pos.Bottom (SubViews.ToArray () [^1]),
             Width = Dim.Fill (),
-            Value = ((Border)AdornmentToEdit!)?.LineStyle ?? LineStyle.None,
+            Value = (AdornmentToEdit as Border)?.LineStyle ?? LineStyle.None,
             BorderStyle = LineStyle.Single,
             Title = "Border St_yle",
-            SuperViewRendersLineCanvas = true,
+            SuperViewRendersLineCanvas = true
         };
         Add (_osBorderStyle);
 
@@ -49,7 +48,7 @@ public class BorderEditor : AdornmentEditor
 
             CheckedState = CheckState.Checked,
             SuperViewRendersLineCanvas = true,
-            Text = "Title",
+            Text = "Title"
         };
 
         _ckbTitle.CheckedStateChanging += OnCkbTitleOnToggle;
@@ -62,7 +61,7 @@ public class BorderEditor : AdornmentEditor
 
             CheckedState = CheckState.Checked,
             SuperViewRendersLineCanvas = true,
-            Text = "Gradient",
+            Text = "Gradient"
         };
 
         _ckbGradient.CheckedStateChanging += OnCkbGradientOnToggle;
@@ -72,51 +71,55 @@ public class BorderEditor : AdornmentEditor
 
         void OnRbBorderStyleOnValueChanged (object? s, EventArgs<LineStyle?> args)
         {
-            LineStyle prevBorderStyle = AdornmentToEdit!.BorderStyle;
-
-            if (args.Value is { })
+            if (AdornmentToEdit is not Border border)
             {
-                ((Border)AdornmentToEdit).LineStyle = (LineStyle)args.Value;
+                return;
             }
 
-            if (((Border)AdornmentToEdit).LineStyle == LineStyle.None)
-            {
-                ((Border)AdornmentToEdit).Thickness = new (0);
-            }
-            else if (prevBorderStyle == LineStyle.None && ((Border)AdornmentToEdit).LineStyle != LineStyle.None)
+            if (args.Value is { })
             {
-                ((Border)AdornmentToEdit).Thickness = new (1);
+                border.LineStyle = (LineStyle)args.Value;
             }
 
-            ((Border)AdornmentToEdit).SetNeedsDraw ();
+            border.SetNeedsDraw ();
             SetNeedsLayout ();
         }
 
         void OnCkbTitleOnToggle (object? _, ResultEventArgs<CheckState> args)
         {
+            if (AdornmentToEdit is not Border border)
+            {
+                return;
+            }
+
             if (args.Result == CheckState.Checked)
 
             {
-                ((Border)AdornmentToEdit!).Settings |= BorderSettings.Title;
+                border.Settings |= BorderSettings.Title;
             }
             else
 
             {
-                ((Border)AdornmentToEdit!).Settings &= ~BorderSettings.Title;
+                border.Settings &= ~BorderSettings.Title;
             }
         }
 
         void OnCkbGradientOnToggle (object? _, ResultEventArgs<CheckState> args)
         {
+            if (AdornmentToEdit is not Border border)
+            {
+                return;
+            }
+
             if (args.Result == CheckState.Checked)
 
             {
-                ((Border)AdornmentToEdit!).Settings |= BorderSettings.Gradient;
+                border.Settings |= BorderSettings.Gradient;
             }
             else
 
             {
-                ((Border)AdornmentToEdit!).Settings &= ~BorderSettings.Gradient;
+                border.Settings &= ~BorderSettings.Gradient;
             }
         }
     }

+ 37 - 34
Examples/UICatalog/Scenarios/EditorsAndHelpers/DimEditor.cs

@@ -1,8 +1,5 @@
 #nullable enable
-using System;
-using System.Collections.Generic;
 using System.Diagnostics;
-using System.Linq;
 
 namespace UICatalog.Scenarios;
 
@@ -21,7 +18,7 @@ public class DimEditor : EditorBase
     private OptionSelector? _dimOptionSelector;
     private TextField? _valueEdit;
 
-    /// <inheritdoc />
+    /// <inheritdoc/>
     protected override void OnViewToEditChanged ()
     {
         if (ViewToEdit is { })
@@ -39,12 +36,11 @@ public class DimEditor : EditorBase
             return;
         }
 
-        Dim? dim;
-        dim = Dimension == Dimension.Width ? ViewToEdit.Width : ViewToEdit.Height;
+        Dim dim = Dimension == Dimension.Width ? ViewToEdit.Width : ViewToEdit.Height;
 
         try
         {
-            _dimOptionSelector!.Value = _dimNames.IndexOf (_dimNames.First (s => dim!.ToString ().StartsWith (s)));
+            _dimOptionSelector!.Value = _dimNames.IndexOf (_dimNames.First (s => dim.ToString ().StartsWith (s)));
         }
         catch (InvalidOperationException e)
         {
@@ -53,31 +49,37 @@ public class DimEditor : EditorBase
         }
 
         _valueEdit!.Enabled = false;
+
         switch (dim)
         {
             case DimAbsolute absolute:
                 _valueEdit.Enabled = true;
                 _value = absolute.Size;
                 _valueEdit!.Text = _value.ToString ();
+
                 break;
             case DimFill fill:
                 var margin = fill.Margin as DimAbsolute;
                 _valueEdit.Enabled = margin is { };
                 _value = margin?.Size ?? 0;
                 _valueEdit!.Text = _value.ToString ();
+
                 break;
             case DimFunc func:
                 _valueEdit.Enabled = true;
                 _value = func.Fn (null);
                 _valueEdit!.Text = _value.ToString ();
+
                 break;
             case DimPercent percent:
                 _valueEdit.Enabled = true;
                 _value = percent.Percentage;
                 _valueEdit!.Text = _value.ToString ();
+
                 break;
             default:
-                _valueEdit!.Text = dim!.ToString ();
+                _valueEdit!.Text = dim.ToString ();
+
                 break;
         }
     }
@@ -94,6 +96,7 @@ public class DimEditor : EditorBase
         Add (label);
         _dimOptionSelector = new () { X = 0, Y = Pos.Bottom (label), Labels = _optionLabels };
         _dimOptionSelector.ValueChanged += OnOptionSelectorOnValueChanged;
+
         _valueEdit = new ()
         {
             X = Pos.Right (label) + 1,
@@ -102,30 +105,30 @@ public class DimEditor : EditorBase
             Text = $"{_value}"
         };
 
-        _valueEdit.Accepting += (s, args) =>
-        {
-            try
-            {
-                _value = int.Parse (_valueEdit.Text);
-                DimChanged ();
-            }
-            catch
-            {
-                // ignored
-            }
-            args.Handled = true;
-        };
+        _valueEdit.Accepting += (_, args) =>
+                                {
+                                    try
+                                    {
+                                        _value = int.Parse (_valueEdit.Text);
+                                        DimChanged ();
+                                    }
+                                    catch
+                                    {
+                                        // ignored
+                                    }
+
+                                    args.Handled = true;
+                                };
         Add (_valueEdit);
 
         Add (_dimOptionSelector);
-
     }
 
     private void OnOptionSelectorOnValueChanged (object? s, EventArgs<int?> selected) { DimChanged (); }
 
-    // These need to have same order 
-    private readonly List<string> _dimNames = ["Absolute", "Auto", "Fill", "Func", "Percent",];
-    private readonly string [] _optionLabels = ["Absolute(n)", "Auto", "Fill(n)", "Func(()=>n)", "Percent(n)",];
+    // These need to have same order
+    private readonly List<string> _dimNames = ["Absolute", "Auto", "Fill", "Func", "Percent"];
+    private readonly string [] _optionLabels = ["Absolute(n)", "Auto", "Fill(n)", "Func(()=>n)", "Percent(n)"];
 
     private void DimChanged ()
     {
@@ -136,15 +139,15 @@ public class DimEditor : EditorBase
 
         try
         {
-            Dim? dim = _dimOptionSelector!.Value switch
-            {
-                0 => Dim.Absolute (_value),
-                1 => Dim.Auto (),
-                2 => Dim.Fill (_value),
-                3 => Dim.Func (_ => _value),
-                4 => Dim.Percent (_value),
-                _ => Dimension == Dimension.Width ? ViewToEdit.Width : ViewToEdit.Height
-            };
+            Dim dim = _dimOptionSelector!.Value switch
+                       {
+                           0 => Dim.Absolute (_value),
+                           1 => Dim.Auto (),
+                           2 => Dim.Fill (_value),
+                           3 => Dim.Func (_ => _value),
+                           4 => Dim.Percent (_value),
+                           _ => Dimension == Dimension.Width ? ViewToEdit.Width : ViewToEdit.Height
+                       };
 
             if (Dimension == Dimension.Width)
             {

+ 21 - 30
Examples/UICatalog/Scenarios/EditorsAndHelpers/EditorBase.cs

@@ -1,8 +1,4 @@
 #nullable enable
-using System;
-using System.Diagnostics;
-using System.Linq;
-
 namespace UICatalog.Scenarios;
 
 public abstract class EditorBase : View
@@ -19,36 +15,21 @@ public abstract class EditorBase : View
             Orientation = Orientation.Vertical
         };
 
-
         TabStop = TabBehavior.TabStop;
 
         Initialized += OnInitialized;
 
         void OnInitialized (object? sender, EventArgs e)
         {
-            if (Border is { })
-            {
-                Border.Add (ExpanderButton);
-
-                if (ExpanderButton.Orientation == Orientation.Vertical)
-                {
-                    ExpanderButton.X = Pos.AnchorEnd () - 1;
-                }
-                else
-                {
-                    ExpanderButton.Y = Pos.AnchorEnd () - 1;
-                }
-            }
-
-            Application.MouseEvent += ApplicationOnMouseEvent;
-            Application.Navigation!.FocusedChanged += NavigationOnFocusedChanged;
+            Border?.Add (ExpanderButton);
 
+            App!.Mouse.MouseEvent += ApplicationOnMouseEvent;
+            App!.Navigation!.FocusedChanged += NavigationOnFocusedChanged;
         }
 
         AddCommand (Command.Accept, () => true);
 
         SchemeName = "Dialog";
-
     }
 
     private readonly ExpanderButton? _expanderButton;
@@ -58,15 +39,16 @@ public abstract class EditorBase : View
         get => _expanderButton;
         init
         {
-            if (_expanderButton == value)
+            if (ReferenceEquals (_expanderButton, value))
             {
                 return;
             }
+
             _expanderButton = value;
         }
     }
 
-    public bool UpdatingLayoutSettings { get; private set; } = false;
+    public bool UpdatingLayoutSettings { get; private set; }
 
     private void View_LayoutComplete (object? sender, LayoutEventArgs e)
     {
@@ -77,7 +59,6 @@ public abstract class EditorBase : View
         UpdatingLayoutSettings = false;
     }
 
-
     private View? _viewToEdit;
 
     public View? ViewToEdit
@@ -90,7 +71,6 @@ public abstract class EditorBase : View
                 return;
             }
 
-
             if (value is null && _viewToEdit is { })
             {
                 _viewToEdit.SubViewsLaidOut -= View_LayoutComplete;
@@ -127,7 +107,6 @@ public abstract class EditorBase : View
     /// </summary>
     public bool AutoSelectAdornments { get; set; }
 
-
     private void NavigationOnFocusedChanged (object? sender, EventArgs e)
     {
         if (AutoSelectSuperView is null)
@@ -135,17 +114,17 @@ public abstract class EditorBase : View
             return;
         }
 
-        if (ApplicationNavigation.IsInHierarchy (this, Application.Navigation!.GetFocused ()))
+        if (ApplicationNavigation.IsInHierarchy (this, App?.Navigation?.GetFocused ()))
         {
             return;
         }
 
-        if (!ApplicationNavigation.IsInHierarchy (AutoSelectSuperView, Application.Navigation!.GetFocused ()))
+        if (!ApplicationNavigation.IsInHierarchy (AutoSelectSuperView, App?.Navigation?.GetFocused ()))
         {
             return;
         }
 
-        ViewToEdit = Application.Navigation!.GetFocused ();
+        ViewToEdit = App!.Navigation!.GetFocused ();
     }
 
     private void ApplicationOnMouseEvent (object? sender, MouseEventArgs e)
@@ -177,4 +156,16 @@ public abstract class EditorBase : View
             ViewToEdit = view;
         }
     }
+
+    /// <inheritdoc />
+    protected override void Dispose (bool disposing)
+    {
+        if (disposing && App is {})
+        {
+            App.Navigation!.FocusedChanged -= NavigationOnFocusedChanged;
+            App.Mouse.MouseEvent -= ApplicationOnMouseEvent;
+        }
+
+        base.Dispose (disposing);
+    }
 }

+ 1 - 3
Examples/UICatalog/Scenarios/EditorsAndHelpers/EventLog.cs

@@ -1,5 +1,4 @@
 #nullable enable
-using System;
 using System.Collections.ObjectModel;
 
 namespace UICatalog.Scenarios;
@@ -19,8 +18,7 @@ public class EventLog : ListView
         X = Pos.AnchorEnd ();
         Y = 0;
 
-        Width = Dim.Func (
-                          _ =>
+        Width = Dim.Func (_ =>
                           {
                               if (!IsInitialized)
                               {

+ 8 - 12
Examples/UICatalog/Scenarios/EditorsAndHelpers/ExpanderButton.cs

@@ -1,5 +1,4 @@
 #nullable enable
-using System;
 using System.Text;
 
 namespace UICatalog.Scenarios;
@@ -43,14 +42,11 @@ public class ExpanderButton : Button
 
         Orientation = Orientation.Vertical;
 
-        HighlightStates = Terminal.Gui.ViewBase.MouseState.None;
+        HighlightStates = MouseState.In;
 
         Initialized += ExpanderButton_Initialized;
 
-        EnabledChanged += (sender, args) =>
-                          {
-                              ShowHide ();
-                          };
+        EnabledChanged += (_, _) => { ShowHide (); };
     }
 
     private void ShowHide ()
@@ -85,7 +81,7 @@ public class ExpanderButton : Button
 
         if (SuperView is Border { } border)
         {
-            border.ThicknessChanged += (o, args) => ShowHide ();
+            border.ThicknessChanged += (_, _) => ShowHide ();
         }
     }
 
@@ -111,7 +107,7 @@ public class ExpanderButton : Button
     /// <returns>True of the event was cancelled.</returns>
     protected virtual bool OnOrientationChanging (Orientation newOrientation)
     {
-        CancelEventArgs<Orientation> args = new CancelEventArgs<Orientation> (in _orientation, ref newOrientation);
+        CancelEventArgs<Orientation> args = new (in _orientation, ref newOrientation);
         OrientationChanging?.Invoke (this, args);
 
         if (!args.Cancel)
@@ -120,7 +116,7 @@ public class ExpanderButton : Button
 
             if (Orientation == Orientation.Vertical)
             {
-                X = Pos.AnchorEnd ();
+                X = Pos.AnchorEnd () - 1;
                 Y = 0;
                 CollapseGlyph = new ('\u21d1'); // ⇑
                 ExpandGlyph = new ('\u21d3'); // ⇓
@@ -128,7 +124,7 @@ public class ExpanderButton : Button
             else
             {
                 X = 0;
-                Y = Pos.AnchorEnd ();
+                Y = Pos.AnchorEnd () - 1;
                 CollapseGlyph = new ('\u21d0'); // ⇐
                 ExpandGlyph = new ('\u21d2'); // ⇒
             }
@@ -222,12 +218,12 @@ public class ExpanderButton : Button
             // Collapse
             if (Orientation == Orientation.Vertical)
             {
-                _previousDim = superView!.Height!;
+                _previousDim = superView.Height;
                 superView.Height = 1;
             }
             else
             {
-                _previousDim = superView!.Width!;
+                _previousDim = superView.Width;
                 superView.Width = 1;
             }
         }

+ 0 - 5
Examples/UICatalog/Scenarios/EditorsAndHelpers/LayoutEditor.cs

@@ -1,8 +1,4 @@
 #nullable enable
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
 namespace UICatalog.Scenarios;
 
 /// <summary>
@@ -64,7 +60,6 @@ public class LayoutEditor : EditorBase
             X = Pos.Right (_xEditor) + 1
         };
 
-
         _widthEditor = new ()
         {
             Title = "_Width",

+ 5 - 12
Examples/UICatalog/Scenarios/EditorsAndHelpers/MarginEditor.cs

@@ -1,6 +1,4 @@
 #nullable enable
-using System;
-
 namespace UICatalog.Scenarios;
 
 public class MarginEditor : AdornmentEditor
@@ -34,7 +32,7 @@ public class MarginEditor : AdornmentEditor
         _optionsShadow = new ()
         {
             X = 0,
-            Y = Pos.Bottom (SubViews.ElementAt(SubViews.Count-1)),
+            Y = Pos.Bottom (SubViews.ElementAt (SubViews.Count - 1)),
 
             SuperViewRendersLineCanvas = true,
             Title = "_Shadow",
@@ -51,14 +49,14 @@ public class MarginEditor : AdornmentEditor
 
         Add (_optionsShadow);
 
-        _flagSelectorTransparent = new FlagSelector<ViewportSettingsFlags> ()
+        _flagSelectorTransparent = new FlagSelector<ViewportSettingsFlags>
         {
             X = 0,
             Y = Pos.Bottom (_optionsShadow),
 
             SuperViewRendersLineCanvas = true,
             Title = "_ViewportSettings",
-            BorderStyle = LineStyle.Single,
+            BorderStyle = LineStyle.Single
         };
         _flagSelectorTransparent.Values = [(int)ViewportSettingsFlags.Transparent, (int)ViewportSettingsFlags.TransparentMouse];
         _flagSelectorTransparent.Labels = ["Transparent", "TransparentMouse"];
@@ -71,11 +69,6 @@ public class MarginEditor : AdornmentEditor
             _flagSelectorTransparent.Value = (int)((Margin)AdornmentToEdit).ViewportSettings;
         }
 
-        _flagSelectorTransparent.ValueChanged += (_, args) =>
-                                                 {
-                                                     ((Margin)AdornmentToEdit!).ViewportSettings = (ViewportSettingsFlags)args.Value!;
-                                                 };
-
-
+        _flagSelectorTransparent.ValueChanged += (_, args) => { ((Margin)AdornmentToEdit!).ViewportSettings = (ViewportSettingsFlags)args.Value!; };
     }
-}
+}

+ 3 - 6
Examples/UICatalog/Scenarios/EditorsAndHelpers/PosEditor.cs

@@ -1,8 +1,5 @@
 #nullable enable
-using System;
-using System.Collections.Generic;
 using System.Diagnostics;
-using System.Linq;
 
 namespace UICatalog.Scenarios;
 
@@ -102,7 +99,7 @@ public class PosEditor : EditorBase
             Text = $"{_value}"
         };
 
-        _valueEdit.Accepting += (s, args) =>
+        _valueEdit.Accepting += (_, args) =>
                                 {
                                     try
                                     {
@@ -123,7 +120,7 @@ public class PosEditor : EditorBase
 
     private void OnOptionSelectorOnValueChanged (object? s, EventArgs<int?> selected) { PosChanged (); }
 
-    // These need to have same order 
+    // These need to have same order
     private readonly List<string> _posNames = ["Absolute", "Align", "AnchorEnd", "Center", "Func", "Percent"];
     private readonly string [] _optionLabels = ["Absolute(n)", "Align", "AnchorEnd", "Center", "Func(()=>n)", "Percent(n)"];
 
@@ -136,7 +133,7 @@ public class PosEditor : EditorBase
 
         try
         {
-            Pos? pos = _posOptionSelector!.Value switch
+            Pos pos = _posOptionSelector!.Value switch
                        {
                            0 => Pos.Absolute (_value),
                            1 => Pos.Align (Alignment.Start),

+ 11 - 19
Examples/UICatalog/Scenarios/EditorsAndHelpers/ViewPropertiesEditor.cs

@@ -20,7 +20,7 @@ public class ViewPropertiesEditor : EditorBase
             CheckedState = ViewToEdit is { } ? ViewToEdit.CanFocus ? CheckState.Checked : CheckState.UnChecked : CheckState.UnChecked
         };
 
-        _canFocusCheckBox.CheckedStateChanged += (s, args) =>
+        _canFocusCheckBox.CheckedStateChanged += (_, _) =>
                                                  {
                                                      if (ViewToEdit is { })
                                                      {
@@ -37,7 +37,7 @@ public class ViewPropertiesEditor : EditorBase
             CheckedState = ViewToEdit is { } ? ViewToEdit.Enabled ? CheckState.Checked : CheckState.UnChecked : CheckState.UnChecked
         };
 
-        _enabledCheckBox.CheckedStateChanged += (s, args) =>
+        _enabledCheckBox.CheckedStateChanged += (_, _) =>
                                                 {
                                                     if (ViewToEdit is { })
                                                     {
@@ -55,13 +55,13 @@ public class ViewPropertiesEditor : EditorBase
             Orientation = Orientation.Horizontal
         };
 
-        _orientationOptionSelector.ValueChanged += (s, selected) =>
-                                            {
-                                                if (ViewToEdit is IOrientation orientatedView)
-                                                {
-                                                    orientatedView.Orientation = _orientationOptionSelector.Value!.Value;
-                                                }
-                                            };
+        _orientationOptionSelector.ValueChanged += (_, _) =>
+                                                   {
+                                                       if (ViewToEdit is IOrientation orientatedView)
+                                                       {
+                                                           orientatedView.Orientation = _orientationOptionSelector.Value!.Value;
+                                                       }
+                                                   };
         Add (label, _orientationOptionSelector);
 
         label = new () { X = 0, Y = Pos.Bottom (_orientationOptionSelector), Text = "Text:" };
@@ -75,7 +75,7 @@ public class ViewPropertiesEditor : EditorBase
             Text = "This is demo text"
         };
 
-        _text.ContentsChanged += (s, e) =>
+        _text.ContentsChanged += (_, _) =>
                                  {
                                      if (ViewToEdit is { })
                                      {
@@ -90,15 +90,7 @@ public class ViewPropertiesEditor : EditorBase
 
     public string DemoText
     {
-        get
-        {
-            if (_text is null)
-            {
-                return string.Empty;
-            }
-
-            return _text!.Text;
-        }
+        get => _text is null ? string.Empty : _text!.Text;
         set => _text!.Text = value;
     }
 

+ 50 - 54
Examples/UICatalog/Scenarios/EditorsAndHelpers/ViewportSettingsEditor.cs

@@ -1,6 +1,4 @@
 #nullable enable
-using System;
-
 namespace UICatalog.Scenarios;
 
 /// <summary>
@@ -60,8 +58,8 @@ public sealed class ViewportSettingsEditor : EditorBase
                                                : CheckState.UnChecked;
 
             _cbTransparentMouse!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.TransparentMouse)
-                                               ? CheckState.Checked
-                                               : CheckState.UnChecked;
+                                                    ? CheckState.Checked
+                                                    : CheckState.UnChecked;
 
             _cbVerticalScrollBar!.CheckedState = ViewToEdit.VerticalScrollBar.Visible ? CheckState.Checked : CheckState.UnChecked;
             _cbAutoShowVerticalScrollBar!.CheckedState = ViewToEdit.VerticalScrollBar.AutoShow ? CheckState.Checked : CheckState.UnChecked;
@@ -115,27 +113,27 @@ public sealed class ViewportSettingsEditor : EditorBase
 
         Add (_cbAllowXGreaterThanContentWidth);
 
-        void AllowNegativeXToggle (object? sender, ResultEventArgs<CheckState> e)
+        void AllowNegativeXToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeX;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.AllowNegativeX;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeX;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.AllowNegativeX;
             }
         }
 
-        void AllowXGreaterThanContentWidthToggle (object? sender, ResultEventArgs<CheckState> e)
+        void AllowXGreaterThanContentWidthToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowXGreaterThanContentWidth;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.AllowXGreaterThanContentWidth;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowXGreaterThanContentWidth;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.AllowXGreaterThanContentWidth;
             }
         }
 
@@ -153,27 +151,27 @@ public sealed class ViewportSettingsEditor : EditorBase
 
         Add (_cbAllowYGreaterThanContentHeight);
 
-        void AllowNegativeYToggle (object? sender, ResultEventArgs<CheckState> e)
+        void AllowNegativeYToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeY;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.AllowNegativeY;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeY;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.AllowNegativeY;
             }
         }
 
-        void AllowYGreaterThanContentHeightToggle (object? sender, ResultEventArgs<CheckState> e)
+        void AllowYGreaterThanContentHeightToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowYGreaterThanContentHeight;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.AllowYGreaterThanContentHeight;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowYGreaterThanContentHeight;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.AllowYGreaterThanContentHeight;
             }
         }
 
@@ -193,17 +191,16 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _contentSizeWidth.ValueChanging += ContentSizeWidthValueChanged;
 
-        void ContentSizeWidthValueChanged (object? sender, CancelEventArgs<int> e)
+        void ContentSizeWidthValueChanged (object? sender, CancelEventArgs<int> cea)
         {
-            if (e.NewValue < 0)
+            if (cea.NewValue < 0)
             {
-                e.Cancel = true;
+                cea.Cancel = true;
 
                 return;
             }
 
-            // BUGBUG: set_ContentSize is supposed to be `protected`. 
-            ViewToEdit!.SetContentSize (ViewToEdit.GetContentSize () with { Width = e.NewValue });
+            ViewToEdit!.SetContentSize (ViewToEdit.GetContentSize () with { Width = cea.NewValue });
         }
 
         var labelComma = new Label
@@ -221,17 +218,16 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _contentSizeHeight.ValueChanging += ContentSizeHeightValueChanged;
 
-        void ContentSizeHeightValueChanged (object? sender, CancelEventArgs<int> e)
+        void ContentSizeHeightValueChanged (object? sender, CancelEventArgs<int> cea)
         {
-            if (e.NewValue < 0)
+            if (cea.NewValue < 0)
             {
-                e.Cancel = true;
+                cea.Cancel = true;
 
                 return;
             }
 
-            // BUGBUG: set_ContentSize is supposed to be `protected`. 
-            ViewToEdit?.SetContentSize (ViewToEdit.GetContentSize () with { Height = e.NewValue });
+            ViewToEdit?.SetContentSize (ViewToEdit.GetContentSize () with { Height = cea.NewValue });
         }
 
         _cbClearContentOnly = new ()
@@ -243,15 +239,15 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbClearContentOnly.CheckedStateChanging += ClearContentOnlyToggle;
 
-        void ClearContentOnlyToggle (object? sender, ResultEventArgs<CheckState> e)
+        void ClearContentOnlyToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.ClearContentOnly;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.ClearContentOnly;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.ClearContentOnly;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.ClearContentOnly;
             }
         }
 
@@ -264,15 +260,15 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbClipContentOnly.CheckedStateChanging += ClipContentOnlyToggle;
 
-        void ClipContentOnlyToggle (object? sender, ResultEventArgs<CheckState> e)
+        void ClipContentOnlyToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.ClipContentOnly;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.ClipContentOnly;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.ClipContentOnly;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.ClipContentOnly;
             }
         }
 
@@ -285,15 +281,15 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbTransparent.CheckedStateChanging += TransparentToggle;
 
-        void TransparentToggle (object? sender, ResultEventArgs<CheckState> e)
+        void TransparentToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.Transparent;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.Transparent;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.Transparent;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.Transparent;
             }
         }
 
@@ -306,15 +302,15 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbTransparentMouse.CheckedStateChanging += TransparentMouseToggle;
 
-        void TransparentMouseToggle (object? sender, ResultEventArgs<CheckState> e)
+        void TransparentMouseToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            if (e.Result == CheckState.Checked)
+            if (rea.Result == CheckState.Checked)
             {
-                ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.TransparentMouse;
+                ViewToEdit!.ViewportSettings |= ViewportSettingsFlags.TransparentMouse;
             }
             else
             {
-                ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.TransparentMouse;
+                ViewToEdit!.ViewportSettings &= ~ViewportSettingsFlags.TransparentMouse;
             }
         }
 
@@ -327,9 +323,9 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbVerticalScrollBar.CheckedStateChanging += VerticalScrollBarToggle;
 
-        void VerticalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
+        void VerticalScrollBarToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            ViewToEdit!.VerticalScrollBar.Visible = e.Result == CheckState.Checked;
+            ViewToEdit!.VerticalScrollBar.Visible = rea.Result == CheckState.Checked;
         }
 
         _cbAutoShowVerticalScrollBar = new ()
@@ -341,9 +337,9 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbAutoShowVerticalScrollBar.CheckedStateChanging += AutoShowVerticalScrollBarToggle;
 
-        void AutoShowVerticalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
+        void AutoShowVerticalScrollBarToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            ViewToEdit!.VerticalScrollBar.AutoShow = e.Result == CheckState.Checked;
+            ViewToEdit!.VerticalScrollBar.AutoShow = rea.Result == CheckState.Checked;
         }
 
         _cbHorizontalScrollBar = new ()
@@ -355,9 +351,9 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbHorizontalScrollBar.CheckedStateChanging += HorizontalScrollBarToggle;
 
-        void HorizontalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
+        void HorizontalScrollBarToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            ViewToEdit!.HorizontalScrollBar.Visible = e.Result == CheckState.Checked;
+            ViewToEdit!.HorizontalScrollBar.Visible = rea.Result == CheckState.Checked;
         }
 
         _cbAutoShowHorizontalScrollBar = new ()
@@ -369,9 +365,9 @@ public sealed class ViewportSettingsEditor : EditorBase
         };
         _cbAutoShowHorizontalScrollBar.CheckedStateChanging += AutoShowHorizontalScrollBarToggle;
 
-        void AutoShowHorizontalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
+        void AutoShowHorizontalScrollBarToggle (object? sender, ResultEventArgs<CheckState> rea)
         {
-            ViewToEdit!.HorizontalScrollBar.AutoShow = e.Result == CheckState.Checked;
+            ViewToEdit!.HorizontalScrollBar.AutoShow = rea.Result == CheckState.Checked;
         }
 
         Add (

+ 25 - 2
Examples/UICatalog/Scenarios/ShadowStyles.cs

@@ -62,6 +62,22 @@ public class ShadowStyles : Scenario
         shadowWindow.Add (buttonInWin);
         app.Add (shadowWindow);
 
+        Window shadowWindow2 = new ()
+        {
+
+            Id = "shadowWindow2",
+            X = Pos.Right (editor) + 10,
+            Y = 10,
+            Width = Dim.Percent (30),
+            Height = Dim.Percent (30),
+            Title = "Shadow Window #2",
+            Arrangement = ViewArrangement.Movable | ViewArrangement.Overlapped,
+            BorderStyle = LineStyle.Double,
+            ShadowStyle = ShadowStyle.Transparent,
+        };
+        app.Add (shadowWindow2);
+
+
         var button = new Button
         {
             Id = "button",
@@ -69,6 +85,7 @@ public class ShadowStyles : Scenario
             Y = Pos.Center (), Text = "Button",
             ShadowStyle = ShadowStyle.Opaque
         };
+        button.Accepting += ButtonOnAccepting;
 
         ColorPicker colorPicker = new ()
         {
@@ -77,12 +94,12 @@ public class ShadowStyles : Scenario
             Id = "colorPicker16",
             X = Pos.Center (),
             Y = Pos.AnchorEnd (),
-            Width = Dim.Percent(80),
+            Width = Dim.Percent (80),
         };
         colorPicker.ColorChanged += (sender, args) =>
                                     {
                                         var normal = app.GetScheme ().Normal;
-                                        app.SetScheme (app.GetScheme() with {Normal = new Attribute(normal.Foreground, args.Result)});
+                                        app.SetScheme (app.GetScheme () with { Normal = new Attribute (normal.Foreground, args.Result) });
                                     };
         app.Add (button, colorPicker);
 
@@ -96,4 +113,10 @@ public class ShadowStyles : Scenario
         Application.Shutdown ();
 
     }
+
+    private void ButtonOnAccepting (object sender, CommandEventArgs e)
+    {
+        MessageBox.Query ((sender as View)?.App, "Hello", "You pushed the button!");
+        e.Handled = true;
+    }
 }

+ 2 - 0
Examples/UICatalog/Scenarios/ViewportSettings.cs

@@ -108,6 +108,7 @@ public class ViewportSettings : Scenario
 
         var adornmentsEditor = new AdornmentsEditor
         {
+            BorderStyle = LineStyle.Single,
             X = Pos.AnchorEnd (),
             AutoSelectViewToEdit = true,
             ShowViewIdentifier = true
@@ -224,6 +225,7 @@ public class ViewportSettings : Scenario
         view.Initialized += (s, e) =>
                                               {
                                                   viewportSettingsEditor.ViewToEdit = view;
+                                                  adornmentsEditor.ViewToEdit = view;
                                               };
         view.SetFocus ();
         Application.Run (app);

+ 32 - 5
Examples/UICatalog/Scenarios/WideGlyphs.cs

@@ -24,6 +24,31 @@ public sealed class WideGlyphs : Scenario
             BorderStyle = LineStyle.None
         };
 
+        // Add Editors
+
+        AdornmentsEditor adornmentsEditor = new ()
+        {
+            BorderStyle = LineStyle.Single,
+            X = Pos.AnchorEnd (),
+            AutoSelectViewToEdit = true,
+            AutoSelectAdornments = false,
+            ShowViewIdentifier = true
+        };
+        adornmentsEditor.ExpanderButton.Accepting += (sender, args) =>
+                                                             {
+                                                                 //adornmentsEditor.ExpanderButton.Collapsed = args.NewValue;
+                                                             };
+        appWindow.Add (adornmentsEditor);
+
+        ViewportSettingsEditor viewportSettingsEditor = new ()
+        {
+            BorderStyle = LineStyle.Single,
+            Y = Pos.AnchorEnd (),
+            X = Pos.AnchorEnd (),
+            AutoSelectViewToEdit = true,
+        };
+        appWindow.Add (viewportSettingsEditor);
+
         // Build the array of codepoints once when subviews are laid out
         appWindow.SubViewsLaidOut += (s, _) =>
         {
@@ -53,7 +78,7 @@ public sealed class WideGlyphs : Scenario
         // Fill the window with the pre-built codepoints array
         // For detailed documentation on the draw code flow from Application.Run to this event,
         // see WideGlyphs.DrawFlow.md in this directory
-        appWindow.DrawingContent += (s, _) =>
+        appWindow.DrawingContent += (s, e) =>
         {
             View? view = s as View;
             if (view is null || _codepoints is null)
@@ -73,6 +98,7 @@ public sealed class WideGlyphs : Scenario
                     }
                 }
             }
+            e.DrawContext?.AddDrawnRectangle (view.Viewport);
         };
 
         Line verticalLineAtEven = new ()
@@ -99,12 +125,12 @@ public sealed class WideGlyphs : Scenario
             Y = 5,
             Width = 15,
             Height = 5,
-            //BorderStyle = LineStyle.Dashed,
+            //BorderStyle = LineStyle.Dashed
         };
 
         // Proves it's not LineCanvas related
         arrangeableViewAtEven!.Border!.Thickness = new (1);
-        arrangeableViewAtEven.Border.Add(new View () { Height = Dim.Auto(), Width = Dim.Auto(), Text = "Even" });
+        arrangeableViewAtEven.Border.Add (new View () { Height = Dim.Auto (), Width = Dim.Auto (), Text = "Even" });
         appWindow.Add (arrangeableViewAtEven);
 
         View arrangeableViewAtOdd = new ()
@@ -117,6 +143,7 @@ public sealed class WideGlyphs : Scenario
             Height = 5,
             BorderStyle = LineStyle.Dashed,
         };
+
         appWindow.Add (arrangeableViewAtOdd);
 
         var superView = new View
@@ -124,8 +151,8 @@ public sealed class WideGlyphs : Scenario
             CanFocus = true,
             X = 30, // on an even column to start
             Y = Pos.Center (),
-            Width = Dim.Auto () + 4,
-            Height = Dim.Auto () + 1,
+            Width = Dim.Auto (),
+            Height = Dim.Auto (),
             BorderStyle = LineStyle.Single,
             Arrangement = ViewArrangement.Movable | ViewArrangement.Resizable
         };

+ 1 - 1
Terminal.Gui/App/ApplicationImpl.Run.cs

@@ -36,7 +36,7 @@ internal partial class ApplicationImpl
     public event EventHandler<EventArgs<IApplication?>>? Iteration;
 
     /// <inheritdoc/>
-    public void RaiseIteration () { Iteration?.Invoke (null, new (this)); }
+    public void RaiseIteration () { Iteration?.Invoke (this, new (this)); }
 
     #endregion Main Loop Iteration
 

+ 1 - 1
Terminal.Gui/App/ApplicationNavigation.cs

@@ -89,7 +89,7 @@ public class ApplicationNavigation
 
         _focused = value;
 
-        FocusedChanged?.Invoke (null, EventArgs.Empty);
+        FocusedChanged?.Invoke (this, EventArgs.Empty);
     }
 
     /// <summary>

+ 1 - 0
Terminal.Gui/App/CWP/CWPEventHelper.cs

@@ -49,6 +49,7 @@ public static class CWPEventHelper
             return false;
         }
 
+        // BUGBUG: This should pass this not null; need to test
         eventHandler.Invoke (null, args);
         return args.Handled;
     }

+ 4 - 2
Terminal.Gui/App/CWP/CWPPropertyHelper.cs

@@ -84,6 +84,7 @@ public static class CWPPropertyHelper
             }
         }
 
+        // BUGBUG: This should pass this not null; need to test
         changingEvent?.Invoke (null, args);
 
         if (args.Handled)
@@ -100,13 +101,14 @@ public static class CWPPropertyHelper
         }
 
         finalValue = args.NewValue;
-        
+
         // Do the work (set backing field, update related properties, etc.) BEFORE raising Changed events
         doWork (finalValue);
-        
+
         ValueChangedEventArgs<T> changedArgs = new (currentValue, finalValue);
         currentValue = finalValue;
         onChanged?.Invoke (changedArgs);
+        // BUGBUG: This should pass this not null; need to test
         changedEvent?.Invoke (null, changedArgs);
 
         return true;

+ 2 - 0
Terminal.Gui/App/CWP/CWPWorkflowHelper.cs

@@ -53,6 +53,7 @@ public static class CWPWorkflowHelper
             return true;
         }
 
+        // BUGBUG: This should pass this not null; need to test
         eventHandler?.Invoke (null, args);
         if (args.Handled)
         {
@@ -112,6 +113,7 @@ public static class CWPWorkflowHelper
             return args.Result!;
         }
 
+        // BUGBUG: This should pass this not null; need to test
         eventHandler?.Invoke (null, args);
 
         if (!args.Handled)

+ 2 - 2
Terminal.Gui/App/Keyboard/KeyboardImpl.cs

@@ -160,7 +160,7 @@ internal class KeyboardImpl : IKeyboard, IDisposable
         //#endif
 
         // TODO: This should match standard event patterns
-        KeyDown?.Invoke (null, key);
+        KeyDown?.Invoke (this, key);
 
         if (key.Handled)
         {
@@ -216,7 +216,7 @@ internal class KeyboardImpl : IKeyboard, IDisposable
             return true;
         }
 
-        KeyUp?.Invoke (null, key);
+        KeyUp?.Invoke (this, key);
 
         if (key.Handled)
         {

+ 1 - 1
Terminal.Gui/App/Mouse/MouseImpl.cs

@@ -86,7 +86,7 @@ internal class MouseImpl : IMouse, IDisposable
             mouseEvent.View = deepestViewUnderMouse;
         }
 
-        MouseEvent?.Invoke (null, mouseEvent);
+        MouseEvent?.Invoke (this, mouseEvent);
 
         if (mouseEvent.Handled)
         {

+ 1 - 0
Terminal.sln.DotSettings

@@ -416,6 +416,7 @@
 	<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=Attribute_0020attribute/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=conhost/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=Decscusr/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/UserDictionary/Words/=diag/@EntryIndexedValue">True</s:Boolean>
 	
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=Gainsboro/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=Gonek/@EntryIndexedValue">True</s:Boolean>