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);