Fixed page up/down offset and added test

This commit is contained in:
tznind
2021-01-03 10:28:27 +00:00
parent 0c2685bcbe
commit b2e54ec83d
2 changed files with 49 additions and 7 deletions

View File

@@ -330,6 +330,15 @@ namespace Terminal.Gui {
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>
/// Returns the amount of vertical space required to display the header
/// </summary>
@@ -589,12 +598,12 @@ namespace Terminal.Gui {
break;
case Key.PageUp:
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 ();
break;
case Key.PageDown:
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 ();
break;
case Key.Home | Key.CtrlMask:
@@ -778,8 +787,8 @@ namespace Terminal.Gui {
var hit = ScreenToCell(me.OfX,me.OfY);
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();
}
}
@@ -808,7 +817,7 @@ namespace Terminal.Gui {
var viewPort = CalculateViewport(Bounds);
var headerHeight = ShouldRenderHeaders()? GetHeaderHeight():0;
var headerHeight = GetHeaderHeightIfAny();
var col = viewPort.LastOrDefault(c=>c.X <= clientX);
@@ -839,7 +848,7 @@ namespace Terminal.Gui {
var viewPort = CalculateViewport(Bounds);
var headerHeight = ShouldRenderHeaders()? GetHeaderHeight():0;
var headerHeight = GetHeaderHeightIfAny();
var colHit = viewPort.FirstOrDefault(c=>c.Column.Ordinal == tableColumn);
@@ -916,7 +925,7 @@ namespace Terminal.Gui {
}
var columnsToRender = CalculateViewport (Bounds).ToArray();
var headerHeight = ShouldRenderHeaders()? GetHeaderHeight() : 0;
var headerHeight = GetHeaderHeightIfAny();
//if we have scrolled too far to the left
if (SelectedColumn < columnsToRender.Min (r => r.Column.Ordinal)) {

View File

@@ -224,6 +224,39 @@ namespace UnitTests {
Assert.False(tableView.IsSelected(1,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>
/// Builds a simple table of string columns with the requested number of columns and rows