diff --git a/Terminal.Gui/Views/SpinnerView/SpinnerView.cs b/Terminal.Gui/Views/SpinnerView/SpinnerView.cs index 25ae37ec0..f4b45690a 100644 --- a/Terminal.Gui/Views/SpinnerView/SpinnerView.cs +++ b/Terminal.Gui/Views/SpinnerView/SpinnerView.cs @@ -190,9 +190,23 @@ namespace Terminal.Gui { } /// - /// Automates spinning + /// Gets or sets whether spinning should occur automatically or be manually + /// triggered (e.g. from a background task). /// - public void AutoSpin () + public bool AutoSpin { + get { + return _timeout != null; + } + set { + if (value) { + AddAutoSpinTimeout (); + } else { + RemoveAutoSpinTimeout (); + } + } + } + + private void AddAutoSpinTimeout () { if (_timeout != null) { return; @@ -205,13 +219,22 @@ namespace Terminal.Gui { }); } - /// - protected override void Dispose (bool disposing) + + private void RemoveAutoSpinTimeout () { if (_timeout != null) { Application.MainLoop.RemoveTimeout (_timeout); _timeout = null; } + } + + + + + /// + protected override void Dispose (bool disposing) + { + RemoveAutoSpinTimeout (); base.Dispose (disposing); } diff --git a/UICatalog/Scenarios/CharacterMap.cs b/UICatalog/Scenarios/CharacterMap.cs index bb8c8a4d1..ca1d79234 100644 --- a/UICatalog/Scenarios/CharacterMap.cs +++ b/UICatalog/Scenarios/CharacterMap.cs @@ -516,7 +516,7 @@ class CharMap : ScrollView { Style = new SpinnerStyle.Aesthetic (), }; - spinner.AutoSpin (); + spinner.AutoSpin = true; waitIndicator.Add (errorLabel); waitIndicator.Add (spinner); waitIndicator.Ready += async (s, a) => { diff --git a/UICatalog/Scenarios/SpinnerStyles.cs b/UICatalog/Scenarios/SpinnerStyles.cs index 792fd7084..dbd8a8fe1 100644 --- a/UICatalog/Scenarios/SpinnerStyles.cs +++ b/UICatalog/Scenarios/SpinnerStyles.cs @@ -39,7 +39,7 @@ namespace UICatalog.Scenarios { Y = 0 }; preview.Add (spinner); - spinner.AutoSpin (); + spinner.AutoSpin = true; var ckbAscii = new CheckBox ("Ascii Only", false) { X = Pos.Center () - 7, diff --git a/UnitTests/Views/SpinnerViewTests.cs b/UnitTests/Views/SpinnerViewTests.cs index fe727fa2e..32107ff4d 100644 --- a/UnitTests/Views/SpinnerViewTests.cs +++ b/UnitTests/Views/SpinnerViewTests.cs @@ -13,24 +13,33 @@ namespace Terminal.Gui.ViewsTests { this.output = output; } - [Fact, AutoInitShutdown] - public void TestSpinnerView_AutoSpin() + [Theory, AutoInitShutdown] + [InlineData(true)] + [InlineData(false)] + public void TestSpinnerView_AutoSpin(bool callStop) { var view = GetSpinnerView (); Assert.Empty (Application.MainLoop.timeouts); - view.AutoSpin (); + view.AutoSpin = true; Assert.NotEmpty (Application.MainLoop.timeouts); //More calls to AutoSpin do not add more timeouts Assert.Single (Application.MainLoop.timeouts); - view.AutoSpin (); - view.AutoSpin (); - view.AutoSpin (); + view.AutoSpin = true; + view.AutoSpin = true; + view.AutoSpin = true; Assert.Single (Application.MainLoop.timeouts); + if(callStop) { + view.AutoSpin = false; + Assert.Empty (Application.MainLoop.timeouts); + } + else { + Assert.NotEmpty (Application.MainLoop.timeouts); + } + // Dispose clears timeout - Assert.NotEmpty (Application.MainLoop.timeouts); view.Dispose (); Assert.Empty (Application.MainLoop.timeouts); }