Browse Source

Fixed page up/down offset and added test

tznind 4 years ago
parent
commit
b2e54ec83d
2 changed files with 49 additions and 7 deletions
  1. 16 7
      Terminal.Gui/Views/TableView.cs
  2. 33 0
      UnitTests/TableViewTests.cs

+ 16 - 7
Terminal.Gui/Views/TableView.cs

@@ -330,6 +330,15 @@ namespace Terminal.Gui {
 			Driver.AddStr (new string (' ', width));
 			Driver.AddStr (new string (' ', width));
 		}
 		}
 
 
+		/// <summary>
+		/// Returns the amount of vertical space currently occupied by the header or 0 if it is not visible.
+		/// </summary>
+		/// <returns></returns>
+		private int GetHeaderHeightIfAny()
+		{
+			return ShouldRenderHeaders()? GetHeaderHeight():0;
+		}
+
 		/// <summary>
 		/// <summary>
 		/// Returns the amount of vertical space required to display the header
 		/// Returns the amount of vertical space required to display the header
 		/// </summary>
 		/// </summary>
@@ -589,12 +598,12 @@ namespace Terminal.Gui {
 				break;
 				break;
 			case Key.PageUp:
 			case Key.PageUp:
 			case Key.PageUp | Key.ShiftMask:
 			case Key.PageUp | Key.ShiftMask:
-				ChangeSelectionByOffset(0,-Frame.Height,keyEvent.Key.HasFlag(Key.ShiftMask));
+				ChangeSelectionByOffset(0,-(Bounds.Height - GetHeaderHeightIfAny()),keyEvent.Key.HasFlag(Key.ShiftMask));
 				Update ();
 				Update ();
 				break;
 				break;
 			case Key.PageDown:
 			case Key.PageDown:
 			case Key.PageDown | Key.ShiftMask:
 			case Key.PageDown | Key.ShiftMask:
-				ChangeSelectionByOffset(0,Frame.Height,keyEvent.Key.HasFlag(Key.ShiftMask));
+				ChangeSelectionByOffset(0,Bounds.Height - GetHeaderHeightIfAny(),keyEvent.Key.HasFlag(Key.ShiftMask));
 				Update ();
 				Update ();
 				break;
 				break;
 			case Key.Home | Key.CtrlMask:
 			case Key.Home | Key.CtrlMask:
@@ -778,8 +787,8 @@ namespace Terminal.Gui {
 				
 				
 				var hit = ScreenToCell(me.OfX,me.OfY);
 				var hit = ScreenToCell(me.OfX,me.OfY);
 				if(hit != null) {
 				if(hit != null) {
-					// TODO : if shift is held down extend selection
-					SetSelection(hit.Value.X,hit.Value.Y,false );
+					
+					SetSelection(hit.Value.X,hit.Value.Y,me.Flags.HasFlag(MouseFlags.ButtonShift));
 					Update();
 					Update();
 				}
 				}
 			}
 			}
@@ -808,7 +817,7 @@ namespace Terminal.Gui {
 
 
 			var viewPort = CalculateViewport(Bounds);
 			var viewPort = CalculateViewport(Bounds);
 				
 				
-			var headerHeight = ShouldRenderHeaders()? GetHeaderHeight():0;
+			var headerHeight = GetHeaderHeightIfAny();
 
 
 			var col = viewPort.LastOrDefault(c=>c.X <= clientX);
 			var col = viewPort.LastOrDefault(c=>c.X <= clientX);
 				
 				
@@ -839,7 +848,7 @@ namespace Terminal.Gui {
 
 
 			var viewPort = CalculateViewport(Bounds);
 			var viewPort = CalculateViewport(Bounds);
 				
 				
-			var headerHeight = ShouldRenderHeaders()? GetHeaderHeight():0;
+			var headerHeight = GetHeaderHeightIfAny();
 
 
 			var colHit = viewPort.FirstOrDefault(c=>c.Column.Ordinal == tableColumn);
 			var colHit = viewPort.FirstOrDefault(c=>c.Column.Ordinal == tableColumn);
 
 
@@ -916,7 +925,7 @@ namespace Terminal.Gui {
 			}
 			}
 
 
 			var columnsToRender = CalculateViewport (Bounds).ToArray();
 			var columnsToRender = CalculateViewport (Bounds).ToArray();
-			var headerHeight = ShouldRenderHeaders()? GetHeaderHeight() : 0;
+			var headerHeight = GetHeaderHeightIfAny();
 
 
 			//if we have scrolled too far to the left 
 			//if we have scrolled too far to the left 
 			if (SelectedColumn < columnsToRender.Min (r => r.Column.Ordinal)) {
 			if (SelectedColumn < columnsToRender.Min (r => r.Column.Ordinal)) {

+ 33 - 0
UnitTests/TableViewTests.cs

@@ -224,6 +224,39 @@ namespace UnitTests {
             Assert.False(tableView.IsSelected(1,2));
             Assert.False(tableView.IsSelected(1,2));
             Assert.False(tableView.IsSelected(2,2));
             Assert.False(tableView.IsSelected(2,2));
         }
         }
+
+        [Fact]
+        public void PageDown_ExcludesHeaders()
+        {
+
+			var driver = new FakeDriver ();
+			Application.Init (driver, new FakeMainLoop (() => FakeConsole.ReadKey (true)));
+			driver.Init (() => { });
+
+
+            var tableView = new TableView(){
+                Table = BuildTable(25,50),
+                MultiSelect = true,
+                Bounds = new Rect(0,0,10,5)
+            };
+
+            // Header should take up 2 lines
+            tableView.Style.ShowHorizontalHeaderOverline = false;
+            tableView.Style.ShowHorizontalHeaderUnderline = true;
+            tableView.Style.AlwaysShowHeaders = false;
+
+            Assert.Equal(0,tableView.RowOffset);
+
+            tableView.ProcessKey(new KeyEvent(Key.PageDown,new KeyModifiers()));
+
+            // window height is 5 rows 2 are header so page down should give 3 new rows
+            Assert.Equal(3,tableView.RowOffset);
+
+            // header is no longer visible so page down should give 5 new rows
+            tableView.ProcessKey(new KeyEvent(Key.PageDown,new KeyModifiers()));
+            
+            Assert.Equal(8,tableView.RowOffset);
+        }
         
         
         /// <summary>
         /// <summary>
 		/// Builds a simple table of string columns with the requested number of columns and rows
 		/// Builds a simple table of string columns with the requested number of columns and rows