Browse Source

Merge branch 'develop' of tig:migueldeicaza/gui.cs into develop

Charlie Kindel 2 years ago
parent
commit
0de748d8c9
4 changed files with 252 additions and 2 deletions
  1. 5 2
      Terminal.Gui/Core/View.cs
  2. 8 0
      Terminal.Gui/Views/ListView.cs
  3. 210 0
      UnitTests/ListViewTests.cs
  4. 29 0
      UnitTests/ViewTests.cs

+ 5 - 2
Terminal.Gui/Core/View.cs

@@ -2562,8 +2562,11 @@ namespace Terminal.Gui {
 			set {
 				if (base.Visible != value) {
 					base.Visible = value;
-					if (!value && HasFocus) {
-						SetHasFocus (false, this);
+					if (!value) {
+						if (HasFocus) {
+							SetHasFocus (false, this);
+						}
+						Clear ();
 					}
 					OnVisibleChanged ();
 					SetNeedsDisplay ();

+ 8 - 0
Terminal.Gui/Views/ListView.cs

@@ -521,12 +521,17 @@ namespace Terminal.Gui {
 					top++;
 				} else if (selected < top) {
 					top = selected;
+				} else if (selected < top) {
+					top = selected;
 				}
 				OnSelectedChanged ();
 				SetNeedsDisplay ();
 			} else if (selected == 0) {
 				OnSelectedChanged ();
 				SetNeedsDisplay ();
+			} else if (selected >= top + Frame.Height) {
+				top = source.Count - Frame.Height;
+				SetNeedsDisplay ();
 			}
 
 			return true;
@@ -561,6 +566,9 @@ namespace Terminal.Gui {
 				}
 				OnSelectedChanged ();
 				SetNeedsDisplay ();
+			} else if (selected < top) {
+				top = selected;
+				SetNeedsDisplay ();
 			}
 			return true;
 		}

+ 210 - 0
UnitTests/ListViewTests.cs

@@ -5,9 +5,17 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Xunit;
+using Xunit.Abstractions;
 
 namespace Terminal.Gui.Views {
 	public class ListViewTests {
+		readonly ITestOutputHelper output;
+
+		public ListViewTests (ITestOutputHelper output)
+		{
+			this.output = output;
+		}
+
 		[Fact]
 		public void Constructors_Defaults ()
 		{
@@ -221,5 +229,207 @@ namespace Terminal.Gui.Views {
 				return item;
 			}
 		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void Ensures_Visibility_SelectedItem_On_MoveDown_And_MoveUp ()
+		{
+			var source = new List<string> ();
+			for (int i = 0; i < 20; i++) {
+				source.Add ($"Line{i}");
+			}
+			var lv = new ListView (source) { Width = Dim.Fill (), Height = Dim.Fill () };
+			var win = new Window ();
+			win.Add (lv);
+			Application.Top.Add (win);
+			Application.Begin (Application.Top);
+			((FakeDriver)Application.Driver).SetBufferSize (12, 12);
+			Application.Refresh ();
+
+			Assert.Equal (0, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line0     │
+│Line1     │
+│Line2     │
+│Line3     │
+│Line4     │
+│Line5     │
+│Line6     │
+│Line7     │
+│Line8     │
+│Line9     │
+└──────────┘", output);
+
+			Assert.True (lv.ScrollDown (10));
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (0, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line10    │
+│Line11    │
+│Line12    │
+│Line13    │
+│Line14    │
+│Line15    │
+│Line16    │
+│Line17    │
+│Line18    │
+│Line19    │
+└──────────┘", output);
+
+			Assert.True (lv.MoveDown ());
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (1, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line1     │
+│Line2     │
+│Line3     │
+│Line4     │
+│Line5     │
+│Line6     │
+│Line7     │
+│Line8     │
+│Line9     │
+│Line10    │
+└──────────┘", output);
+
+			Assert.True (lv.MoveEnd ());
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (19, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line19    │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+└──────────┘", output);
+
+			Assert.True (lv.ScrollUp (20));
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (19, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line0     │
+│Line1     │
+│Line2     │
+│Line3     │
+│Line4     │
+│Line5     │
+│Line6     │
+│Line7     │
+│Line8     │
+│Line9     │
+└──────────┘", output);
+
+			Assert.True (lv.MoveDown ());
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (19, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line10    │
+│Line11    │
+│Line12    │
+│Line13    │
+│Line14    │
+│Line15    │
+│Line16    │
+│Line17    │
+│Line18    │
+│Line19    │
+└──────────┘", output);
+
+			Assert.True (lv.ScrollUp (20));
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (19, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line0     │
+│Line1     │
+│Line2     │
+│Line3     │
+│Line4     │
+│Line5     │
+│Line6     │
+│Line7     │
+│Line8     │
+│Line9     │
+└──────────┘", output);
+
+			Assert.True (lv.MoveDown ());
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (19, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line10    │
+│Line11    │
+│Line12    │
+│Line13    │
+│Line14    │
+│Line15    │
+│Line16    │
+│Line17    │
+│Line18    │
+│Line19    │
+└──────────┘", output);
+
+			Assert.True (lv.MoveHome ());
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (0, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line0     │
+│Line1     │
+│Line2     │
+│Line3     │
+│Line4     │
+│Line5     │
+│Line6     │
+│Line7     │
+│Line8     │
+│Line9     │
+└──────────┘", output);
+
+			Assert.True (lv.ScrollDown (20));
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (0, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line19    │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+│          │
+└──────────┘", output);
+
+			Assert.True (lv.MoveUp ());
+			lv.Redraw (lv.Bounds);
+			Assert.Equal (0, lv.SelectedItem);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌──────────┐
+│Line0     │
+│Line1     │
+│Line2     │
+│Line3     │
+│Line4     │
+│Line5     │
+│Line6     │
+│Line7     │
+│Line8     │
+│Line9     │
+└──────────┘", output);
+		}
 	}
 }

+ 29 - 0
UnitTests/ViewTests.cs

@@ -3803,5 +3803,34 @@ e
 ", output);
 		}
 
+		[Fact, AutoInitShutdown]
+		public void Visible_Clear_The_View_Output ()
+		{
+			var label = new Label ("Testing visibility.");
+			var win = new Window ();
+			win.Add (label);
+			var top = Application.Top;
+			top.Add (win);
+			Application.Begin (top);
+
+			Assert.True (label.Visible);
+			((FakeDriver)Application.Driver).SetBufferSize (30, 5);
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌────────────────────────────┐
+│Testing visibility.         │
+│                            │
+│                            │
+└────────────────────────────┘
+", output);
+
+			label.Visible = false;
+			GraphViewTests.AssertDriverContentsWithFrameAre (@"
+┌────────────────────────────┐
+│                            │
+│                            │
+│                            │
+└────────────────────────────┘
+", output);
+		}
 	}
 }