ソースを参照

Ensuring visibility to the SelectedItem of the ListView when getting focus.

BDisp 4 年 前
コミット
542c507b59
1 ファイル変更14 行追加2 行削除
  1. 14 2
      Terminal.Gui/Views/ListView.cs

+ 14 - 2
Terminal.Gui/Views/ListView.cs

@@ -586,7 +586,7 @@ namespace Terminal.Gui {
 		/// <param name="lines">Number of lines to scroll down.</param>
 		public virtual void ScrollDown (int lines)
 		{
-			top = Math.Min (top + lines, source.Count - 1);
+			top = Math.Max (Math.Min (top + lines, source.Count - 1), 0);
 			SetNeedsDisplay ();
 		}
 
@@ -632,7 +632,9 @@ namespace Terminal.Gui {
 			if (selected != lastSelectedItem) {
 				var value = source?.Count > 0 ? source.ToList () [selected] : null;
 				SelectedItemChanged?.Invoke (new ListViewItemEventArgs (selected, value));
-				lastSelectedItem = selected;
+				if (HasFocus) {
+					lastSelectedItem = selected;
+				}
 				return true;
 			}
 
@@ -656,6 +658,7 @@ namespace Terminal.Gui {
 		public override bool OnEnter (View view)
 		{
 			if (lastSelectedItem == -1) {
+				EnsuresVisibilitySelectedItem ();
 				OnSelectedChanged ();
 				return true;
 			}
@@ -674,6 +677,15 @@ namespace Terminal.Gui {
 			return false;
 		}
 
+		void EnsuresVisibilitySelectedItem ()
+		{
+			if (selected < top) {
+				top = selected;
+			} else if (selected >= top + Frame.Height) {
+				top = Math.Max (selected - Frame.Height + 1, 0);
+			}
+		}
+
 		///<inheritdoc/>
 		public override void PositionCursor ()
 		{