Quellcode durchsuchen

v1 Fixes #2897. ListView ListWrapper - marking does work if you give an IList which in which the count changes

BDisp vor 1 Jahr
Ursprung
Commit
87ea75b3c1
1 geänderte Dateien mit 27 neuen und 3 gelöschten Zeilen
  1. 27 3
      Terminal.Gui/Views/ListView.cs

+ 27 - 3
Terminal.Gui/Views/ListView.cs

@@ -749,6 +749,11 @@ namespace Terminal.Gui {
 		public void EnsureSelectedItemVisible ()
 		public void EnsureSelectedItemVisible ()
 		{
 		{
 			SuperView?.LayoutSubviews ();
 			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) {
 			if (selected < top) {
 				top = selected;
 				top = selected;
 			} else if (Frame.Height > 0 && selected >= top + Frame.Height) {
 			} else if (Frame.Height > 0 && selected >= top + Frame.Height) {
@@ -831,11 +836,30 @@ namespace Terminal.Gui {
 		}
 		}
 
 
 		/// <inheritdoc/>
 		/// <inheritdoc/>
-		public int Count => src != null ? src.Count : 0;
+		public int Count {
+			get {
+				CheckAndResizeMarksIfRequired ();
+				return src?.Count ?? 0;
+			}
+		}
 
 
 		/// <inheritdoc/>
 		/// <inheritdoc/>
 		public int Length => len;
 		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 ()
 		int GetMaxLengthItem ()
 		{
 		{
 			if (src == null || src?.Count == 0) {
 			if (src == null || src?.Count == 0) {
@@ -896,7 +920,7 @@ namespace Terminal.Gui {
 		/// <inheritdoc/>
 		/// <inheritdoc/>
 		public bool IsMarked (int item)
 		public bool IsMarked (int item)
 		{
 		{
-			if (item >= 0 && item < count)
+			if (item >= 0 && item < Count)
 				return marks [item];
 				return marks [item];
 			return false;
 			return false;
 		}
 		}
@@ -904,7 +928,7 @@ namespace Terminal.Gui {
 		/// <inheritdoc/>
 		/// <inheritdoc/>
 		public void SetMark (int item, bool value)
 		public void SetMark (int item, bool value)
 		{
 		{
-			if (item >= 0 && item < count)
+			if (item >= 0 && item < Count)
 				marks [item] = value;
 				marks [item] = value;
 		}
 		}