From 02825d89baf65d5ec820ddf714b79267ef4aaebd Mon Sep 17 00:00:00 2001 From: tznind Date: Sat, 11 Mar 2023 12:01:04 +0000 Subject: [PATCH] Added SuperViewChangedEventArgs for Added/Removed to clarify situation --- .../Core/Autocomplete/Autocomplete.cs | 2 +- Terminal.Gui/Core/Border.cs | 2 +- .../EventArgs/SuperViewChangedEventArgs.cs | 33 +++++++++++++++++++ Terminal.Gui/Core/EventArgs/ViewEventArgs.cs | 3 +- Terminal.Gui/Core/View.cs | 20 +++++------ UICatalog/KeyBindingsDialog.cs | 5 ++- UnitTests/Core/ViewTests.cs | 22 ++++++++----- UnitTests/TopLevels/ToplevelTests.cs | 2 +- 8 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 Terminal.Gui/Core/EventArgs/SuperViewChangedEventArgs.cs diff --git a/Terminal.Gui/Core/Autocomplete/Autocomplete.cs b/Terminal.Gui/Core/Autocomplete/Autocomplete.cs index 26f4adf98..ea987c16b 100644 --- a/Terminal.Gui/Core/Autocomplete/Autocomplete.cs +++ b/Terminal.Gui/Core/Autocomplete/Autocomplete.cs @@ -74,7 +74,7 @@ namespace Terminal.Gui { } } - private void Top_Removed (object sender, ViewEventArgs e) + private void Top_Removed (object sender, SuperViewChangedEventArgs e) { Visible = false; ManipulatePopup (); diff --git a/Terminal.Gui/Core/Border.cs b/Terminal.Gui/Core/Border.cs index 2e8197ab3..de005f990 100644 --- a/Terminal.Gui/Core/Border.cs +++ b/Terminal.Gui/Core/Border.cs @@ -460,7 +460,7 @@ namespace Terminal.Gui { } } - private void Parent_Removed (object sender, ViewEventArgs e) + private void Parent_Removed (object sender, SuperViewChangedEventArgs e) { BorderBrush = default; Background = default; diff --git a/Terminal.Gui/Core/EventArgs/SuperViewChangedEventArgs.cs b/Terminal.Gui/Core/EventArgs/SuperViewChangedEventArgs.cs new file mode 100644 index 000000000..fdd4da3cf --- /dev/null +++ b/Terminal.Gui/Core/EventArgs/SuperViewChangedEventArgs.cs @@ -0,0 +1,33 @@ +using System; + +namespace Terminal.Gui { + /// + /// Args for events where the of a is changed + /// (e.g. / events). + /// + public class SuperViewChangedEventArgs : EventArgs + { + /// + /// Creates a new instance of the class. + /// + /// + /// + public SuperViewChangedEventArgs (View parent, View child) + { + Parent = parent; + Child = child; + } + + /// + /// The parent. For this is the old + /// parent (new parent now being null). For + /// it is the new parent to whom view now belongs. + /// + public View Parent { get; } + + /// + /// The view that is having it's changed + /// + public View Child { get; } + } +} diff --git a/Terminal.Gui/Core/EventArgs/ViewEventArgs.cs b/Terminal.Gui/Core/EventArgs/ViewEventArgs.cs index ed4706801..53b1a985b 100644 --- a/Terminal.Gui/Core/EventArgs/ViewEventArgs.cs +++ b/Terminal.Gui/Core/EventArgs/ViewEventArgs.cs @@ -4,8 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Terminal.Gui{ - +namespace Terminal.Gui { /// /// Args for events that relate to specific /// diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index edba716cf..3147c61ac 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -117,14 +117,14 @@ namespace Terminal.Gui { ShortcutHelper shortcutHelper; /// - /// Event fired when a subview is being added to this view. + /// Event fired when this view is added to another. /// - public event EventHandler Added; + public event EventHandler Added; /// - /// Event fired when a subview is being removed from this view. + /// Event fired when this view is removed from another. /// - public event EventHandler Removed; + public event EventHandler Removed; /// /// Event fired when the view gets focus. @@ -942,7 +942,7 @@ namespace Terminal.Gui { } SetNeedsLayout (); SetNeedsDisplay (); - OnAdded (new ViewEventArgs(view)); + OnAdded (new SuperViewChangedEventArgs (this,view)); if (IsInitialized) { view.BeginInit (); view.EndInit (); @@ -1002,7 +1002,7 @@ namespace Terminal.Gui { if (v.Frame.IntersectsWith (touched)) view.SetNeedsDisplay (); } - OnRemoved (new ViewEventArgs(view)); + OnRemoved (new SuperViewChangedEventArgs (this, view)); if (focused == view) { focused = null; } @@ -1355,9 +1355,9 @@ namespace Terminal.Gui { /// Method invoked when a subview is being added to this view. /// /// Event where is the subview being added. - public virtual void OnAdded (ViewEventArgs e) + public virtual void OnAdded (SuperViewChangedEventArgs e) { - var view = e.View; + var view = e.Child; view.IsAdded = true; view.x ??= view.frame.X; view.y ??= view.frame.Y; @@ -1371,9 +1371,9 @@ namespace Terminal.Gui { /// Method invoked when a subview is being removed from this view. /// /// Event args describing the subview being removed. - public virtual void OnRemoved (ViewEventArgs e) + public virtual void OnRemoved (SuperViewChangedEventArgs e) { - var view = e.View; + var view = e.Child; view.IsAdded = false; view.Removed?.Invoke (this, e); } diff --git a/UICatalog/KeyBindingsDialog.cs b/UICatalog/KeyBindingsDialog.cs index 5c21166d7..ac46bbdb7 100644 --- a/UICatalog/KeyBindingsDialog.cs +++ b/UICatalog/KeyBindingsDialog.cs @@ -60,8 +60,11 @@ namespace UICatalog { foreach (var sub in view.Subviews) { RecordView (sub); } + // TODO: BUG: Based on my new understanding of Added event I think this is wrong + // (and always was wrong). Parents don't get to be told when new views are added + // to them - view.Added += (s,e)=>RecordView(e.View); + view.Added += (s,e)=>RecordView(e.Child); } internal static void Initialize () diff --git a/UnitTests/Core/ViewTests.cs b/UnitTests/Core/ViewTests.cs index ed958029e..3128bea48 100644 --- a/UnitTests/Core/ViewTests.cs +++ b/UnitTests/Core/ViewTests.cs @@ -239,10 +239,14 @@ namespace Terminal.Gui.CoreTests { var t = new View (); v.Added += (s,e) => { - Assert.True (v.SuperView == e.View); + Assert.Same (v.SuperView, e.Parent); + Assert.Same (t, e.Parent); + Assert.Same (v, e.Child); }; v.Removed += (s, e) => { + Assert.Same (t, e.Parent); + Assert.Same (v, e.Child); Assert.True (v.SuperView == null); }; @@ -655,20 +659,20 @@ namespace Terminal.Gui.CoreTests { int tc = 0, wc = 0, v1c = 0, v2c = 0, sv1c = 0; w.Added += (s,e) => { - Assert.Equal (e.View.Frame.Width, w.Frame.Width); - Assert.Equal (e.View.Frame.Height, w.Frame.Height); + Assert.Equal (e.Parent.Frame.Width, w.Frame.Width); + Assert.Equal (e.Parent.Frame.Height, w.Frame.Height); }; v1.Added += (s, e) => { - Assert.Equal (e.View.Frame.Width, v1.Frame.Width); - Assert.Equal (e.View.Frame.Height, v1.Frame.Height); + Assert.Equal (e.Parent.Frame.Width, v1.Frame.Width); + Assert.Equal (e.Parent.Frame.Height, v1.Frame.Height); }; v2.Added += (s, e) => { - Assert.Equal (e.View.Frame.Width, v2.Frame.Width); - Assert.Equal (e.View.Frame.Height, v2.Frame.Height); + Assert.Equal (e.Parent.Frame.Width, v2.Frame.Width); + Assert.Equal (e.Parent.Frame.Height, v2.Frame.Height); }; sv1.Added += (s, e) => { - Assert.Equal (e.View.Frame.Width, sv1.Frame.Width); - Assert.Equal (e.View.Frame.Height, sv1.Frame.Height); + Assert.Equal (e.Parent.Frame.Width, sv1.Frame.Width); + Assert.Equal (e.Parent.Frame.Height, sv1.Frame.Height); }; t.Initialized += (s, e) => { diff --git a/UnitTests/TopLevels/ToplevelTests.cs b/UnitTests/TopLevels/ToplevelTests.cs index 2fee5f48d..a42b732d4 100644 --- a/UnitTests/TopLevels/ToplevelTests.cs +++ b/UnitTests/TopLevels/ToplevelTests.cs @@ -587,7 +587,7 @@ namespace Terminal.Gui.TopLevelTests { var view = new View (); view.Added += View_Added; - void View_Added (object sender, ViewEventArgs e) + void View_Added (object sender, SuperViewChangedEventArgs e) { Assert.Throws (() => Application.Top.AlternateForwardKeyChanged += (s,e) => alternateForwardKey = e.OldKey); Assert.Throws (() => Application.Top.AlternateBackwardKeyChanged += (s,e) => alternateBackwardKey = e.OldKey);