diff --git a/Terminal.Gui/Views/ListView.cs b/Terminal.Gui/Views/ListView.cs index e0d4edbda..ae6528d94 100644 --- a/Terminal.Gui/Views/ListView.cs +++ b/Terminal.Gui/Views/ListView.cs @@ -601,10 +601,12 @@ namespace Terminal.Gui { /// public virtual bool MoveEnd () { - if (source.Count > 0 && selected != source.Count - 1) { + if (source?.Count > 0 && selected != source.Count - 1) { selected = source.Count - 1; if (top + selected > Frame.Height - 1) { - top = selected; + top = selected < Frame.Height - 1 + ? Math.Max (Frame.Height - selected + 1, 0) + : Math.Max (selected - Frame.Height + 1, 0); } OnSelectedChanged (); SetNeedsDisplay (); @@ -749,6 +751,11 @@ namespace Terminal.Gui { public void EnsureSelectedItemVisible () { SuperView?.LayoutSubviews (); + // If last item is selected and is removed, ensures a valid selected item + if (Source != null && selected > Source.Count - 1) { + SelectedItem = Source.Count - 1; + SetNeedsDisplay (); + } if (selected < top) { top = selected; } else if (Frame.Height > 0 && selected >= top + Frame.Height) { @@ -831,11 +838,30 @@ namespace Terminal.Gui { } /// - public int Count => src != null ? src.Count : 0; + public int Count { + get { + CheckAndResizeMarksIfRequired (); + return src?.Count ?? 0; + } + } /// public int Length => len; + void CheckAndResizeMarksIfRequired () + { + if (src != null && count != src.Count) { + count = src.Count; + BitArray newMarks = new BitArray (count); + for (var i = 0; i < Math.Min (marks.Length, newMarks.Length); i++) { + newMarks [i] = marks [i]; + } + marks = newMarks; + + len = GetMaxLengthItem (); + } + } + int GetMaxLengthItem () { if (src == null || src?.Count == 0) { @@ -896,7 +922,7 @@ namespace Terminal.Gui { /// public bool IsMarked (int item) { - if (item >= 0 && item < count) + if (item >= 0 && item < Count) return marks [item]; return false; } @@ -904,7 +930,7 @@ namespace Terminal.Gui { /// public void SetMark (int item, bool value) { - if (item >= 0 && item < count) + if (item >= 0 && item < Count) marks [item] = value; } diff --git a/UnitTests/Views/ListViewTests.cs b/UnitTests/Views/ListViewTests.cs index f705dab25..1f6589204 100644 --- a/UnitTests/Views/ListViewTests.cs +++ b/UnitTests/Views/ListViewTests.cs @@ -300,16 +300,16 @@ namespace Terminal.Gui.ViewTests { Assert.Equal (19, lv.SelectedItem); TestHelpers.AssertDriverContentsWithFrameAre (@" ┌──────────┐ +│Line10 │ +│Line11 │ +│Line12 │ +│Line13 │ +│Line14 │ +│Line15 │ +│Line16 │ +│Line17 │ +│Line18 │ │Line19 │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ └──────────┘", output); Assert.True (lv.ScrollUp (20));