From 87ea75b3c11d797a65260c42bb60824a7547bc9b Mon Sep 17 00:00:00 2001 From: BDisp Date: Sun, 26 May 2024 17:23:19 +0100 Subject: [PATCH] v1 Fixes #2897. ListView ListWrapper - marking does work if you give an IList which in which the count changes --- Terminal.Gui/Views/ListView.cs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Terminal.Gui/Views/ListView.cs b/Terminal.Gui/Views/ListView.cs index e0d4edbda..f340d7ebd 100644 --- a/Terminal.Gui/Views/ListView.cs +++ b/Terminal.Gui/Views/ListView.cs @@ -749,6 +749,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 +836,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 (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 +920,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 +928,7 @@ namespace Terminal.Gui { /// public void SetMark (int item, bool value) { - if (item >= 0 && item < count) + if (item >= 0 && item < Count) marks [item] = value; }