Tig 5 months ago
parent
commit
aff7e2c6d5

+ 47 - 42
Terminal.Gui/Views/Wizard/Wizard.cs

@@ -1,4 +1,5 @@
-using Terminal.Gui.Resources;
+#nullable enable
+using Terminal.Gui.Resources;
 
 
 namespace Terminal.Gui;
 namespace Terminal.Gui;
 
 
@@ -52,7 +53,7 @@ namespace Terminal.Gui;
 public class Wizard : Dialog
 public class Wizard : Dialog
 {
 {
     private readonly LinkedList<WizardStep> _steps = new ();
     private readonly LinkedList<WizardStep> _steps = new ();
-    private WizardStep _currentStep;
+    private WizardStep? _currentStep;
     private bool _finishedPressed;
     private bool _finishedPressed;
     private string _wizardTitle = string.Empty;
     private string _wizardTitle = string.Empty;
 
 
@@ -81,12 +82,12 @@ public class Wizard : Dialog
         //// Add a horiz separator
         //// Add a horiz separator
         var separator = new LineView (Orientation.Horizontal) { Y = Pos.Top (BackButton) - 1 };
         var separator = new LineView (Orientation.Horizontal) { Y = Pos.Top (BackButton) - 1 };
 
 
-        Add (separator);
+        base.Add (separator);
         AddButton (BackButton);
         AddButton (BackButton);
         AddButton (NextFinishButton);
         AddButton (NextFinishButton);
 
 
-        BackButton.Accepting += BackBtn_Clicked;
-        NextFinishButton.Accepting += NextfinishBtn_Clicked;
+        BackButton.Accepting += BackBtn_Accepting;
+        NextFinishButton.Accepting += NextFinishBtn_Accepting;
 
 
         Loaded += Wizard_Loaded;
         Loaded += Wizard_Loaded;
         Closing += Wizard_Closing;
         Closing += Wizard_Closing;
@@ -103,7 +104,7 @@ public class Wizard : Dialog
     public Button BackButton { get; }
     public Button BackButton { get; }
 
 
     /// <summary>Gets or sets the currently active <see cref="WizardStep"/>.</summary>
     /// <summary>Gets or sets the currently active <see cref="WizardStep"/>.</summary>
-    public WizardStep CurrentStep
+    public WizardStep? CurrentStep
     {
     {
         get => _currentStep;
         get => _currentStep;
         set => GoToStep (value);
         set => GoToStep (value);
@@ -197,7 +198,7 @@ public class Wizard : Dialog
     ///     <see cref="Wizard.Modal"/> is <c>true</c>) Wizard from closing, cancel the event by setting
     ///     <see cref="Wizard.Modal"/> is <c>true</c>) Wizard from closing, cancel the event by setting
     ///     <see cref="WizardButtonEventArgs.Cancel"/> to <c>true</c> before returning from the event handler.
     ///     <see cref="WizardButtonEventArgs.Cancel"/> to <c>true</c> before returning from the event handler.
     /// </summary>
     /// </summary>
-    public event EventHandler<WizardButtonEventArgs> Cancelled;
+    public event EventHandler<WizardButtonEventArgs>? Cancelled;
 
 
     /// <summary>
     /// <summary>
     ///     Raised when the Next/Finish button in the <see cref="Wizard"/> is clicked. The Next/Finish button is always
     ///     Raised when the Next/Finish button in the <see cref="Wizard"/> is clicked. The Next/Finish button is always
@@ -205,15 +206,15 @@ public class Wizard : Dialog
     ///     raised if the <see cref="CurrentStep"/> is the last Step in the Wizard flow (otherwise the <see cref="Finished"/>
     ///     raised if the <see cref="CurrentStep"/> is the last Step in the Wizard flow (otherwise the <see cref="Finished"/>
     ///     event is raised).
     ///     event is raised).
     /// </summary>
     /// </summary>
-    public event EventHandler<WizardButtonEventArgs> Finished;
+    public event EventHandler<WizardButtonEventArgs>? Finished;
 
 
     /// <summary>Returns the first enabled step in the Wizard</summary>
     /// <summary>Returns the first enabled step in the Wizard</summary>
     /// <returns>The last enabled step</returns>
     /// <returns>The last enabled step</returns>
-    public WizardStep GetFirstStep () { return _steps.FirstOrDefault (s => s.Enabled); }
+    public WizardStep? GetFirstStep () { return _steps.FirstOrDefault (s => s.Enabled); }
 
 
     /// <summary>Returns the last enabled step in the Wizard</summary>
     /// <summary>Returns the last enabled step in the Wizard</summary>
     /// <returns>The last enabled step</returns>
     /// <returns>The last enabled step</returns>
-    public WizardStep GetLastStep () { return _steps.LastOrDefault (s => s.Enabled); }
+    public WizardStep? GetLastStep () { return _steps.LastOrDefault (s => s.Enabled); }
 
 
     /// <summary>
     /// <summary>
     ///     Returns the next enabled <see cref="WizardStep"/> after the current step. Takes into account steps which are
     ///     Returns the next enabled <see cref="WizardStep"/> after the current step. Takes into account steps which are
@@ -223,9 +224,9 @@ public class Wizard : Dialog
     ///     The next step after the current step, if there is one; otherwise returns <c>null</c>, which indicates either
     ///     The next step after the current step, if there is one; otherwise returns <c>null</c>, which indicates either
     ///     there are no enabled steps or the current step is the last enabled step.
     ///     there are no enabled steps or the current step is the last enabled step.
     /// </returns>
     /// </returns>
-    public WizardStep GetNextStep ()
+    public WizardStep? GetNextStep ()
     {
     {
-        LinkedListNode<WizardStep> step = null;
+        LinkedListNode<WizardStep>? step = null;
 
 
         if (CurrentStep is null)
         if (CurrentStep is null)
         {
         {
@@ -265,9 +266,9 @@ public class Wizard : Dialog
     ///     The first step ahead of the current step, if there is one; otherwise returns <c>null</c>, which indicates
     ///     The first step ahead of the current step, if there is one; otherwise returns <c>null</c>, which indicates
     ///     either there are no enabled steps or the current step is the first enabled step.
     ///     either there are no enabled steps or the current step is the first enabled step.
     /// </returns>
     /// </returns>
-    public WizardStep GetPreviousStep ()
+    public WizardStep? GetPreviousStep ()
     {
     {
-        LinkedListNode<WizardStep> step = null;
+        LinkedListNode<WizardStep>? step = null;
 
 
         if (CurrentStep is null)
         if (CurrentStep is null)
         {
         {
@@ -303,36 +304,42 @@ public class Wizard : Dialog
     ///     Causes the wizard to move to the previous enabled step (or first step if <see cref="CurrentStep"/> is not set).
     ///     Causes the wizard to move to the previous enabled step (or first step if <see cref="CurrentStep"/> is not set).
     ///     If there is no previous step, does nothing.
     ///     If there is no previous step, does nothing.
     /// </summary>
     /// </summary>
-    public void GoBack ()
+    /// <returns><see langword="true"/> if the transition to the step succeeded. <see langword="false"/> if the step was not found or the operation was cancelled.</returns>
+    public bool GoBack ()
     {
     {
-        WizardStep previous = GetPreviousStep ();
+        WizardStep? previous = GetPreviousStep ();
 
 
         if (previous is { })
         if (previous is { })
         {
         {
-            GoToStep (previous);
+           return GoToStep (previous);
         }
         }
+
+        return false;
     }
     }
 
 
     /// <summary>
     /// <summary>
     ///     Causes the wizard to move to the next enabled step (or last step if <see cref="CurrentStep"/> is not set). If
     ///     Causes the wizard to move to the next enabled step (or last step if <see cref="CurrentStep"/> is not set). If
     ///     there is no previous step, does nothing.
     ///     there is no previous step, does nothing.
     /// </summary>
     /// </summary>
-    public void GoNext ()
+    /// <returns><see langword="true"/> if the transition to the step succeeded. <see langword="false"/> if the step was not found or the operation was cancelled.</returns>
+    public bool GoNext ()
     {
     {
-        WizardStep nextStep = GetNextStep ();
+        WizardStep? nextStep = GetNextStep ();
 
 
         if (nextStep is { })
         if (nextStep is { })
         {
         {
-            GoToStep (nextStep);
+            return GoToStep (nextStep);
         }
         }
+
+        return false;
     }
     }
 
 
     /// <summary>Changes to the specified <see cref="WizardStep"/>.</summary>
     /// <summary>Changes to the specified <see cref="WizardStep"/>.</summary>
     /// <param name="newStep">The step to go to.</param>
     /// <param name="newStep">The step to go to.</param>
-    /// <returns>True if the transition to the step succeeded. False if the step was not found or the operation was cancelled.</returns>
-    public bool GoToStep (WizardStep newStep)
+    /// <returns><see langword="true"/> if the transition to the step succeeded. <see langword="false"/> if the step was not found or the operation was cancelled.</returns>
+    public bool GoToStep (WizardStep? newStep)
     {
     {
-        if (OnStepChanging (_currentStep, newStep) || (newStep is { } && !newStep.Enabled))
+        if (OnStepChanging (_currentStep, newStep) || newStep is { Enabled: false })
         {
         {
             return false;
             return false;
         }
         }
@@ -344,20 +351,17 @@ public class Wizard : Dialog
             step.ShowHide ();
             step.ShowHide ();
         }
         }
 
 
-        WizardStep oldStep = _currentStep;
+        WizardStep? oldStep = _currentStep;
         _currentStep = newStep;
         _currentStep = newStep;
 
 
         UpdateButtonsAndTitle ();
         UpdateButtonsAndTitle ();
 
 
         // Set focus on the contentview
         // Set focus on the contentview
-        if (newStep is { })
-        {
-            newStep.Subviews.ToArray () [0].SetFocus ();
-        }
+        newStep?.Subviews.ToArray () [0].SetFocus ();
 
 
         if (OnStepChanged (oldStep, _currentStep))
         if (OnStepChanged (oldStep, _currentStep))
         {
         {
-            // For correctness we do this, but it's meaningless because there's nothing to cancel
+            // For correctness, we do this, but it's meaningless because there's nothing to cancel
             return false;
             return false;
         }
         }
 
 
@@ -368,7 +372,7 @@ public class Wizard : Dialog
     ///     Raised when the Back button in the <see cref="Wizard"/> is clicked. The Back button is always the first button
     ///     Raised when the Back button in the <see cref="Wizard"/> is clicked. The Back button is always the first button
     ///     in the array of Buttons passed to the <see cref="Wizard"/> constructor, if any.
     ///     in the array of Buttons passed to the <see cref="Wizard"/> constructor, if any.
     /// </summary>
     /// </summary>
-    public event EventHandler<WizardButtonEventArgs> MovingBack;
+    public event EventHandler<WizardButtonEventArgs>? MovingBack;
 
 
     /// <summary>
     /// <summary>
     ///     Raised when the Next/Finish button in the <see cref="Wizard"/> is clicked (or the user presses Enter). The
     ///     Raised when the Next/Finish button in the <see cref="Wizard"/> is clicked (or the user presses Enter). The
@@ -376,7 +380,7 @@ public class Wizard : Dialog
     ///     constructor, if any. This event is only raised if the <see cref="CurrentStep"/> is the last Step in the Wizard flow
     ///     constructor, if any. This event is only raised if the <see cref="CurrentStep"/> is the last Step in the Wizard flow
     ///     (otherwise the <see cref="Finished"/> event is raised).
     ///     (otherwise the <see cref="Finished"/> event is raised).
     /// </summary>
     /// </summary>
-    public event EventHandler<WizardButtonEventArgs> MovingNext;
+    public event EventHandler<WizardButtonEventArgs>? MovingNext;
 
 
     /// <summary>
     /// <summary>
     ///     <see cref="Wizard"/> is derived from <see cref="Dialog"/> and Dialog causes <c>Esc</c> to call
     ///     <see cref="Wizard"/> is derived from <see cref="Dialog"/> and Dialog causes <c>Esc</c> to call
@@ -410,7 +414,7 @@ public class Wizard : Dialog
     /// <param name="oldStep">The step the Wizard changed from</param>
     /// <param name="oldStep">The step the Wizard changed from</param>
     /// <param name="newStep">The step the Wizard has changed to</param>
     /// <param name="newStep">The step the Wizard has changed to</param>
     /// <returns>True if the change is to be cancelled.</returns>
     /// <returns>True if the change is to be cancelled.</returns>
-    public virtual bool OnStepChanged (WizardStep oldStep, WizardStep newStep)
+    public virtual bool OnStepChanged (WizardStep? oldStep, WizardStep? newStep)
     {
     {
         var args = new StepChangeEventArgs (oldStep, newStep);
         var args = new StepChangeEventArgs (oldStep, newStep);
         StepChanged?.Invoke (this, args);
         StepChanged?.Invoke (this, args);
@@ -425,7 +429,7 @@ public class Wizard : Dialog
     /// <param name="oldStep">The step the Wizard is about to change from</param>
     /// <param name="oldStep">The step the Wizard is about to change from</param>
     /// <param name="newStep">The step the Wizard is about to change to</param>
     /// <param name="newStep">The step the Wizard is about to change to</param>
     /// <returns>True if the change is to be cancelled.</returns>
     /// <returns>True if the change is to be cancelled.</returns>
-    public virtual bool OnStepChanging (WizardStep oldStep, WizardStep newStep)
+    public virtual bool OnStepChanging (WizardStep? oldStep, WizardStep? newStep)
     {
     {
         var args = new StepChangeEventArgs (oldStep, newStep);
         var args = new StepChangeEventArgs (oldStep, newStep);
         StepChanging?.Invoke (this, args);
         StepChanging?.Invoke (this, args);
@@ -434,26 +438,26 @@ public class Wizard : Dialog
     }
     }
 
 
     /// <summary>This event is raised after the <see cref="Wizard"/> has changed the <see cref="CurrentStep"/>.</summary>
     /// <summary>This event is raised after the <see cref="Wizard"/> has changed the <see cref="CurrentStep"/>.</summary>
-    public event EventHandler<StepChangeEventArgs> StepChanged;
+    public event EventHandler<StepChangeEventArgs>? StepChanged;
 
 
     /// <summary>
     /// <summary>
     ///     This event is raised when the current <see cref="CurrentStep"/>) is about to change. Use
     ///     This event is raised when the current <see cref="CurrentStep"/>) is about to change. Use
     ///     <see cref="StepChangeEventArgs.Cancel"/> to abort the transition.
     ///     <see cref="StepChangeEventArgs.Cancel"/> to abort the transition.
     /// </summary>
     /// </summary>
-    public event EventHandler<StepChangeEventArgs> StepChanging;
+    public event EventHandler<StepChangeEventArgs>? StepChanging;
 
 
-    private void BackBtn_Clicked (object sender, EventArgs e)
+    private void BackBtn_Accepting (object? sender, CommandEventArgs e)
     {
     {
         var args = new WizardButtonEventArgs ();
         var args = new WizardButtonEventArgs ();
         MovingBack?.Invoke (this, args);
         MovingBack?.Invoke (this, args);
 
 
         if (!args.Cancel)
         if (!args.Cancel)
         {
         {
-            GoBack ();
+            e.Cancel = GoBack ();
         }
         }
     }
     }
 
 
-    private void NextfinishBtn_Clicked (object sender, EventArgs e)
+    private void NextFinishBtn_Accepting (object? sender, CommandEventArgs e)
     {
     {
         if (CurrentStep == GetLastStep ())
         if (CurrentStep == GetLastStep ())
         {
         {
@@ -467,6 +471,7 @@ public class Wizard : Dialog
                 if (IsCurrentTop)
                 if (IsCurrentTop)
                 {
                 {
                     Application.RequestStop (this);
                     Application.RequestStop (this);
+                    e.Cancel = true;
                 }
                 }
 
 
                 // Wizard was created as a non-modal (just added to another View). 
                 // Wizard was created as a non-modal (just added to another View). 
@@ -480,7 +485,7 @@ public class Wizard : Dialog
 
 
             if (!args.Cancel)
             if (!args.Cancel)
             {
             {
-                GoNext ();
+                e.Cancel = GoNext ();
             }
             }
         }
         }
     }
     }
@@ -548,7 +553,7 @@ public class Wizard : Dialog
         SetNeedsLayout ();
         SetNeedsLayout ();
     }
     }
 
 
-    private void Wizard_Closing (object sender, ToplevelClosingEventArgs obj)
+    private void Wizard_Closing (object? sender, ToplevelClosingEventArgs obj)
     {
     {
         if (!_finishedPressed)
         if (!_finishedPressed)
         {
         {
@@ -557,14 +562,14 @@ public class Wizard : Dialog
         }
         }
     }
     }
 
 
-    private void Wizard_Loaded (object sender, EventArgs args)
+    private void Wizard_Loaded (object? sender, EventArgs args)
     {
     {
         CurrentStep = GetFirstStep ();
         CurrentStep = GetFirstStep ();
 
 
         // gets the first step if CurrentStep == null
         // gets the first step if CurrentStep == null
     }
     }
 
 
-    private void Wizard_TitleChanged (object sender, EventArgs<string> e)
+    private void Wizard_TitleChanged (object? sender, EventArgs<string> e)
     {
     {
         if (string.IsNullOrEmpty (_wizardTitle))
         if (string.IsNullOrEmpty (_wizardTitle))
         {
         {

+ 5 - 24
Terminal.Gui/Views/Wizard/WizardStep.cs

@@ -1,4 +1,5 @@
-namespace Terminal.Gui;
+#nullable enable 
+namespace Terminal.Gui;
 
 
 /// <summary>
 /// <summary>
 ///     Represents a basic step that is displayed in a <see cref="Wizard"/>. The <see cref="WizardStep"/> view is
 ///     Represents a basic step that is displayed in a <see cref="Wizard"/>. The <see cref="WizardStep"/> view is
@@ -15,26 +16,6 @@
 /// </remarks>
 /// </remarks>
 public class WizardStep : View
 public class WizardStep : View
 {
 {
-    ///// <summary>
-    ///// The title of the <see cref="WizardStep"/>. 
-    ///// </summary>
-    ///// <remarks>The Title is only displayed when the <see cref="Wizard"/> is used as a modal pop-up (see <see cref="Wizard.Modal"/>.</remarks>
-    //public new string Title {
-    //	// BUGBUG: v2 - No need for this as View now has Title w/ notifications.
-    //	get => title;
-    //	set {
-    //		if (!OnTitleChanging (title, value)) {
-    //			var old = title;
-    //			title = value;
-    //			OnTitleChanged (old, title);
-    //		}
-    //		base.Title = value;
-    //		SetNeedsDraw ();
-    //	}
-    //}
-
-    //private string title = string.Empty;
-
     // The contentView works like the ContentView in FrameView.
     // The contentView works like the ContentView in FrameView.
     private readonly View _contentView = new ()
     private readonly View _contentView = new ()
     {
     {
@@ -140,7 +121,7 @@ public class WizardStep : View
 
 
     /// <summary>Add the specified <see cref="View"/> to the <see cref="WizardStep"/>.</summary>
     /// <summary>Add the specified <see cref="View"/> to the <see cref="WizardStep"/>.</summary>
     /// <param name="view"><see cref="View"/> to add to this container</param>
     /// <param name="view"><see cref="View"/> to add to this container</param>
-    public override View Add (View view)
+    public override View Add (View? view)
     {
     {
         _contentView.Add (view);
         _contentView.Add (view);
 
 
@@ -156,10 +137,10 @@ public class WizardStep : View
 
 
     /// <summary>Removes a <see cref="View"/> from <see cref="WizardStep"/>.</summary>
     /// <summary>Removes a <see cref="View"/> from <see cref="WizardStep"/>.</summary>
     /// <remarks></remarks>
     /// <remarks></remarks>
-    public override View Remove (View view)
+    public override View? Remove (View? view)
     {
     {
         SetNeedsDraw ();
         SetNeedsDraw ();
-        View container = view?.SuperView;
+        View? container = view?.SuperView;
 
 
         if (container == this)
         if (container == this)
         {
         {

+ 2 - 2
UICatalog/Scenarios/Wizards.cs

@@ -263,7 +263,7 @@ public class Wizards : Scenario
                                            };
                                            };
                                            thirdStep.Add (progLbl, progressBar);
                                            thirdStep.Add (progLbl, progressBar);
                                            thirdStep.Enabled = thirdStepEnabledCeckBox.CheckedState == CheckState.Checked;
                                            thirdStep.Enabled = thirdStepEnabledCeckBox.CheckedState == CheckState.Checked;
-                                           thirdStepEnabledCeckBox.CheckedStateChanging += (s, e) => { thirdStep.Enabled = thirdStepEnabledCeckBox.CheckedState == CheckState.Checked; };
+                                           thirdStepEnabledCeckBox.CheckedStateChanged += (s, e) => { thirdStep.Enabled = thirdStepEnabledCeckBox.CheckedState == CheckState.Checked; };
 
 
                                            // Add 4th step
                                            // Add 4th step
                                            var fourthStep = new WizardStep { Title = "Step Four" };
                                            var fourthStep = new WizardStep { Title = "Step Four" };
@@ -357,7 +357,7 @@ public class Wizards : Scenario
                                                "This step only shows if it was enabled on the other last step.";
                                                "This step only shows if it was enabled on the other last step.";
                                            finalFinalStep.Enabled = thirdStepEnabledCeckBox.CheckedState == CheckState.Checked;
                                            finalFinalStep.Enabled = thirdStepEnabledCeckBox.CheckedState == CheckState.Checked;
 
 
-                                           finalFinalStepEnabledCeckBox.CheckedStateChanging += (s, e) =>
+                                           finalFinalStepEnabledCeckBox.CheckedStateChanged += (s, e) =>
                                                                                    {
                                                                                    {
                                                                                        finalFinalStep.Enabled = finalFinalStepEnabledCeckBox.CheckedState == CheckState.Checked;
                                                                                        finalFinalStep.Enabled = finalFinalStepEnabledCeckBox.CheckedState == CheckState.Checked;
                                                                                    };
                                                                                    };