Add Toplevel.Ready event (#446)

* add Ready event to Toplevel
This commit is contained in:
Charlie Kindel
2020-05-20 11:27:48 -06:00
committed by BDisp
parent 4dd19aa7c2
commit ebccd54157

View File

@@ -1469,10 +1469,25 @@ namespace Terminal.Gui {
/// </remarks>
public class Toplevel : View {
/// <summary>
/// This flag is checked on each iteration of the mainloop and it continues
/// running until this flag is set to false.
/// Gets or sets whether the <see cref="T:Terminal.Gui.MainLoop"/> for this <see cref="T:Terminal.Gui.Toplevel"/> is running or not. Setting
/// this property to false will cause the MainLoop to exit.
/// </summary>
public bool Running;
public bool Running { get; set; }
/// <summary>
/// Fired once the Toplevel's <see cref="T:Terminal.Gui.MainLoop"/> has started it's first iteration.
/// Subscribe to this event to perform tasks when the <see cref="T:Terminal.Gui.Toplevel"/> has been laid out and focus has been set.
/// changes. A Ready event handler is a good place to finalize initialization after calling `<see cref="T:Terminal.Gui.Application.Run"/>(topLevel)`.
/// </summary>
public event EventHandler Ready;
/// <summary>
/// Called from Application.RunLoop after the <see cref="T:Terminal.Gui.Toplevel"/> has entered it's first iteration of the loop.
/// </summary>
internal virtual void OnReady ()
{
Ready?.Invoke (this, EventArgs.Empty);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:Terminal.Gui.Toplevel"/> class with the specified absolute layout.
@@ -2419,8 +2434,15 @@ namespace Terminal.Gui {
if (state.Toplevel == null)
throw new ObjectDisposedException ("state");
bool firstIteration = true;
for (state.Toplevel.Running = true; state.Toplevel.Running;) {
if (MainLoop.EventsPending (wait)) {
// Notify Toplevel it's ready
if (firstIteration) {
state.Toplevel.OnReady ();
}
firstIteration = false;
MainLoop.MainIteration ();
Iteration?.Invoke (null, EventArgs.Empty);
} else if (wait == false)