Added SuperViewChangedEventArgs for Added/Removed to clarify situation

This commit is contained in:
tznind
2023-03-11 12:01:04 +00:00
parent 1491e01d6a
commit 02825d89ba
8 changed files with 64 additions and 25 deletions

View File

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

View File

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

View File

@@ -0,0 +1,33 @@
using System;
namespace Terminal.Gui {
/// <summary>
/// Args for events where the <see cref="View.SuperView"/> of a <see cref="View"/> is changed
/// (e.g. <see cref="View.Removed"/> / <see cref="View.Added"/> events).
/// </summary>
public class SuperViewChangedEventArgs : EventArgs
{
/// <summary>
/// Creates a new instance of the <see cref="SuperViewChangedEventArgs"/> class.
/// </summary>
/// <param name="parent"></param>
/// <param name="child"></param>
public SuperViewChangedEventArgs (View parent, View child)
{
Parent = parent;
Child = child;
}
/// <summary>
/// The parent. For <see cref="View.Removed"/> this is the old
/// parent (new parent now being null). For <see cref="View.Added"/>
/// it is the new parent to whom view now belongs.
/// </summary>
public View Parent { get; }
/// <summary>
/// The view that is having it's <see cref="View.SuperView"/> changed
/// </summary>
public View Child { get; }
}
}

View File

@@ -4,8 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Terminal.Gui{
namespace Terminal.Gui {
/// <summary>
/// Args for events that relate to specific <see cref="View"/>
/// </summary>

View File

@@ -117,14 +117,14 @@ namespace Terminal.Gui {
ShortcutHelper shortcutHelper;
/// <summary>
/// Event fired when a subview is being added to this view.
/// Event fired when this view is added to another.
/// </summary>
public event EventHandler<ViewEventArgs> Added;
public event EventHandler<SuperViewChangedEventArgs> Added;
/// <summary>
/// Event fired when a subview is being removed from this view.
/// Event fired when this view is removed from another.
/// </summary>
public event EventHandler<ViewEventArgs> Removed;
public event EventHandler<SuperViewChangedEventArgs> Removed;
/// <summary>
/// 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.
/// </summary>
/// <param name="e">Event where <see cref="ViewEventArgs.View"/> is the subview being added.</param>
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.
/// </summary>
/// <param name="e">Event args describing the subview being removed.</param>
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);
}

View File

@@ -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 ()

View File

@@ -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) => {

View File

@@ -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<NullReferenceException> (() => Application.Top.AlternateForwardKeyChanged += (s,e) => alternateForwardKey = e.OldKey);
Assert.Throws<NullReferenceException> (() => Application.Top.AlternateBackwardKeyChanged += (s,e) => alternateBackwardKey = e.OldKey);