diff --git a/Terminal.Gui/Views/ScrollView.cs b/Terminal.Gui/Views/ScrollView.cs index 23bfedbce..1e60995a6 100644 --- a/Terminal.Gui/Views/ScrollView.cs +++ b/Terminal.Gui/Views/ScrollView.cs @@ -237,6 +237,39 @@ namespace Terminal.Gui { SetNeedsLayout (); } + /// + /// Removes the view from the scrollview. + /// + /// The view to remove from the scrollview. + public override void Remove (View view) + { + if (view == null) { + return; + } + + SetNeedsDisplay (); + var container = view?.SuperView; + if (container == this) { + base.Remove (view); + } else { + container?.Remove (view); + } + + if (contentView.InternalSubviews.Count < 1) { + this.CanFocus = false; + } + } + + /// + /// Removes all widgets from this container. + /// + /// + /// + public override void RemoveAll () + { + contentView.RemoveAll (); + } + void View_MouseLeave (MouseEventArgs e) { if (Application.MouseGrabView != null && Application.MouseGrabView != vertical && Application.MouseGrabView != horizontal) { @@ -280,16 +313,6 @@ namespace Terminal.Gui { } } - /// - /// Removes all widgets from this container. - /// - /// - /// - public override void RemoveAll () - { - contentView.RemoveAll (); - } - /// /// Gets or sets the visibility for the vertical scroll indicator. /// diff --git a/UnitTests/Views/ScrollViewTests.cs b/UnitTests/Views/ScrollViewTests.cs index f441e3c86..20829dd69 100644 --- a/UnitTests/Views/ScrollViewTests.cs +++ b/UnitTests/Views/ScrollViewTests.cs @@ -498,5 +498,28 @@ namespace Terminal.Gui.ViewTests { 00000000000000000000000 00000000000000000000000", attributes); } + + [Fact, AutoInitShutdown] + public void Remove_Added_View_Is_Allowed () + { + var sv = new ScrollView () { + Width = 20, + Height = 20, + ContentSize = new Size (100, 100) + }; + sv.Add (new View () { Width = Dim.Fill (), Height = Dim.Fill (50), Id = "View1" }, + new View () { Y = 51, Width = Dim.Fill (), Height = Dim.Fill (), Id = "View2" }); + + Application.Top.Add (sv); + Application.Begin (Application.Top); + + Assert.Equal (3, sv.Subviews.Count); + Assert.Equal (2, sv.Subviews [0].Subviews.Count); + + sv.Remove (sv.Subviews [0].Subviews [1]); + Assert.Equal (3, sv.Subviews.Count); + Assert.Single (sv.Subviews [0].Subviews); + Assert.Equal ("View1", sv.Subviews [0].Subviews [0].Id); + } } }