From 59577feecf2cd2381f0db7f8822f7ef77a3e2c8f Mon Sep 17 00:00:00 2001 From: Charlie Kindel Date: Fri, 17 Jun 2022 10:07:19 -0700 Subject: [PATCH] Added oldTitle to eventargs and fixed title = null --- Terminal.Gui/Core/Window.cs | 31 ++++++++++++++++++++++--------- Terminal.Gui/Views/FrameView.cs | 3 ++- Terminal.Gui/Views/Menu.cs | 2 +- UnitTests/WindowTests.cs | 18 ++++++++++++++---- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/Terminal.Gui/Core/Window.cs b/Terminal.Gui/Core/Window.cs index 20230e49d..c425cb612 100644 --- a/Terminal.Gui/Core/Window.cs +++ b/Terminal.Gui/Core/Window.cs @@ -23,7 +23,7 @@ namespace Terminal.Gui { /// public class Window : Toplevel { View contentView; - ustring title; + ustring title = ustring.Empty; /// /// The title to be displayed for this window. @@ -32,9 +32,10 @@ namespace Terminal.Gui { public ustring Title { get => title; set { - if (!OnTitleChanging (value)) { + if (!OnTitleChanging (title, value)) { + var old = title; title = value; - OnTitleChanged (title); + OnTitleChanged (old, title); } SetNeedsDisplay (); } @@ -174,6 +175,7 @@ namespace Terminal.Gui { { CanFocus = true; ColorScheme = Colors.Base; + if (title == null) title = ustring.Empty; Title = title; if (border == null) { Border = new Border () { @@ -348,26 +350,35 @@ namespace Terminal.Gui { public ustring NewTitle { get; set; } /// - /// Flag which allows cancelling changing to the new TItle value. + /// The old Window Title. + /// + public ustring OldTitle { get; set; } + + /// + /// Flag which allows cancelling the Title change. /// public bool Cancel { get; set; } /// /// Initializes a new instance of /// + /// The that is/has been replaced. /// The new to be replaced. - public TitleEventArgs (ustring newTitle) + public TitleEventArgs (ustring oldTitle, ustring newTitle) { + OldTitle = oldTitle; NewTitle = newTitle; } } /// /// Called before the changes. Invokes the event, which can be cancelled. /// + /// The that is/has been replaced. + /// The new to be replaced. /// `true` if an event handler cancelled the Title change. - public virtual bool OnTitleChanging (ustring newTitle) + public virtual bool OnTitleChanging (ustring oldTitle, ustring newTitle) { - var args = new TitleEventArgs (newTitle); + var args = new TitleEventArgs (oldTitle, newTitle); TitleChanging?.Invoke (args); return args.Cancel; } @@ -381,9 +392,11 @@ namespace Terminal.Gui { /// /// Called when the has been changed. Invokes the event. /// - public virtual void OnTitleChanged (ustring newTitle) + /// The that is/has been replaced. + /// The new to be replaced. + public virtual void OnTitleChanged (ustring oldTitle, ustring newTitle) { - var args = new TitleEventArgs (title); + var args = new TitleEventArgs (oldTitle, newTitle); TitleChanged?.Invoke (args); } diff --git a/Terminal.Gui/Views/FrameView.cs b/Terminal.Gui/Views/FrameView.cs index 1f97db227..c082d7217 100644 --- a/Terminal.Gui/Views/FrameView.cs +++ b/Terminal.Gui/Views/FrameView.cs @@ -108,7 +108,8 @@ namespace Terminal.Gui { void Initialize (Rect frame, ustring title, View [] views = null, Border border = null) { - this.title = title; + if (title == null) title = ustring.Empty; + this.Title = title; if (border == null) { Border = new Border () { BorderStyle = BorderStyle.Single diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs index 5e3a7d0aa..7433c966e 100644 --- a/Terminal.Gui/Views/Menu.cs +++ b/Terminal.Gui/Views/Menu.cs @@ -359,7 +359,7 @@ namespace Terminal.Gui { void SetTitle (ustring title) { if (title == null) - title = ""; + title = ustring.Empty; Title = title; } diff --git a/UnitTests/WindowTests.cs b/UnitTests/WindowTests.cs index ae75a1e42..d5eb78e90 100644 --- a/UnitTests/WindowTests.cs +++ b/UnitTests/WindowTests.cs @@ -5,6 +5,7 @@ using GraphViewTests = Terminal.Gui.Views.GraphViewTests; // Alias Console to MockConsole so we don't accidentally use Console using Console = Terminal.Gui.FakeConsole; +using NStack; namespace Terminal.Gui.Core { public class WindowTests { @@ -21,7 +22,7 @@ namespace Terminal.Gui.Core { // Parameterless var r = new Window (); Assert.NotNull (r); - Assert.Null (r.Title); + Assert.Equal(ustring.Empty, r.Title); Assert.Equal (LayoutStyle.Computed, r.LayoutStyle); Assert.Equal ("Window()({X=0,Y=0,Width=0,Height=0})", r.ToString ()); Assert.True (r.CanFocus); @@ -100,24 +101,29 @@ namespace Terminal.Gui.Core { public void Set_Title_Fires_TitleChanging () { var r = new Window (); - Assert.Null (r.Title); + Assert.Equal (ustring.Empty, r.Title); - string expectedAfter = null; + string expectedOld = null; string expectedDuring = null; + string expectedAfter = null; bool cancel = false; r.TitleChanging += (args) => { + Assert.Equal (expectedOld, args.OldTitle); Assert.Equal (expectedDuring, args.NewTitle); args.Cancel = cancel; }; + expectedOld = string.Empty; r.Title = expectedDuring = expectedAfter = "title"; Assert.Equal (expectedAfter, r.Title.ToString()); + expectedOld = r.Title.ToString(); r.Title = expectedDuring = expectedAfter = "a different title"; Assert.Equal (expectedAfter, r.Title.ToString ()); // Now setup cancelling the change and change it back to "title" cancel = true; + expectedOld = r.Title.ToString(); r.Title = expectedDuring = "title"; Assert.Equal (expectedAfter, r.Title.ToString ()); r.Dispose (); @@ -128,18 +134,22 @@ namespace Terminal.Gui.Core { public void Set_Title_Fires_TitleChanged () { var r = new Window (); - Assert.Null (r.Title); + Assert.Equal (ustring.Empty, r.Title); + string expectedOld = null; string expected = null; r.TitleChanged += (args) => { + Assert.Equal (expectedOld, args.OldTitle); Assert.Equal (r.Title, args.NewTitle); }; expected = "title"; + expectedOld = r.Title.ToString (); r.Title = expected; Assert.Equal (expected, r.Title.ToString ()); expected = "another title"; + expectedOld = r.Title.ToString (); r.Title = expected; Assert.Equal (expected, r.Title.ToString ()); r.Dispose ();