Add Style.ShowHeaders to TableView (#2514)

* Add Style.HideHeaders to TableView

* Revisions to TableView HideHeaders from review

Also add to UICatalog TableEditor Scenario

* Allow ShowHorizontalHeaderUnderline to draw top border even when HideHeaders is enabled; AlwaysShowHeader will keep it there on scroll

* Add Unit Tests for TableView.Style.HideHeaders

* Rename HideHeaders to ShowHeaders and simplify logic

---------

Co-authored-by: tznind <tznind@dundee.ac.uk>
This commit is contained in:
Nutzzz
2023-04-15 17:27:05 -07:00
committed by GitHub
parent 62746f8037
commit dcdb4f9b49
3 changed files with 105 additions and 5 deletions

View File

@@ -1,5 +1,6 @@
using NStack;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
@@ -258,8 +259,10 @@ namespace Terminal.Gui {
line++;
}
RenderHeaderMidline (line, columnsToRender);
line++;
if (Style.ShowHeaders) {
RenderHeaderMidline (line, columnsToRender);
line++;
}
if (Style.ShowHorizontalHeaderUnderline) {
RenderHeaderUnderline (line, bounds.Width, columnsToRender);
@@ -321,7 +324,7 @@ namespace Terminal.Gui {
/// <returns></returns>
private int GetHeaderHeight ()
{
int heightRequired = 1;
int heightRequired = Style.ShowHeaders ? 1 : 0;
if (Style.ShowHorizontalHeaderOverline)
heightRequired++;
@@ -1800,6 +1803,14 @@ namespace Terminal.Gui {
/// </summary>
public class TableStyle {
/// <summary>
/// Gets or sets a flag indicating whether to render headers of a <see cref="TableView"/>.
/// Defaults to <see langword="true"/>.
/// </summary>
/// <remarks><see cref="ShowHorizontalHeaderOverline"/>, <see cref="ShowHorizontalHeaderUnderline"/> etc
/// may still be used even if <see cref="ShowHeaders"/> is <see langword="false"/>.</remarks>
public bool ShowHeaders { get; set; } = true;
/// <summary>
/// When scrolling down always lock the column headers in place as the first row of the table
/// </summary>

View File

@@ -16,6 +16,7 @@ namespace UICatalog.Scenarios {
[ScenarioCategory ("Top Level Windows")]
public class TableEditor : Scenario {
TableView tableView;
private MenuItem miShowHeaders;
private MenuItem miAlwaysShowHeaders;
private MenuItem miHeaderOverline;
private MenuItem miHeaderMidline;
@@ -56,7 +57,8 @@ namespace UICatalog.Scenarios {
new MenuItem ("_Quit", "", () => Quit()),
}),
new MenuBarItem ("_View", new MenuItem [] {
miAlwaysShowHeaders = new MenuItem ("_AlwaysShowHeaders", "", () => ToggleAlwaysShowHeader()){Checked = tableView.Style.AlwaysShowHeaders, CheckType = MenuItemCheckStyle.Checked },
miShowHeaders = new MenuItem ("_ShowHeaders", "", () => ToggleShowHeaders()){Checked = tableView.Style.ShowHeaders, CheckType = MenuItemCheckStyle.Checked },
miAlwaysShowHeaders = new MenuItem ("_AlwaysShowHeaders", "", () => ToggleAlwaysShowHeaders()){Checked = tableView.Style.AlwaysShowHeaders, CheckType = MenuItemCheckStyle.Checked },
miHeaderOverline = new MenuItem ("_HeaderOverLine", "", () => ToggleOverline()){Checked = tableView.Style.ShowHorizontalHeaderOverline, CheckType = MenuItemCheckStyle.Checked },
miHeaderMidline = new MenuItem ("_HeaderMidLine", "", () => ToggleHeaderMidline()){Checked = tableView.Style.ShowVerticalHeaderLines, CheckType = MenuItemCheckStyle.Checked },
miHeaderUnderline = new MenuItem ("_HeaderUnderLine", "", () => ToggleUnderline()){Checked = tableView.Style.ShowHorizontalHeaderUnderline, CheckType = MenuItemCheckStyle.Checked },
@@ -374,7 +376,14 @@ namespace UICatalog.Scenarios {
tableView.Update ();
}
private void ToggleAlwaysShowHeader ()
private void ToggleShowHeaders ()
{
miShowHeaders.Checked = !miShowHeaders.Checked;
tableView.Style.ShowHeaders = (bool)miShowHeaders.Checked;
tableView.Update ();
}
private void ToggleAlwaysShowHeaders ()
{
miAlwaysShowHeaders.Checked = !miAlwaysShowHeaders.Checked;
tableView.Style.AlwaysShowHeaders = (bool)miAlwaysShowHeaders.Checked;

View File

@@ -444,6 +444,86 @@ namespace Terminal.Gui.ViewsTests {
Assert.Equal (new Point (8, 3), selected [5]);
}
[Fact, AutoInitShutdown]
public void TableView_ShowHeadersFalse_AndNoHeaderLines ()
{
var tv = GetABCDEFTableView (out _);
tv.Bounds = new Rect (0, 0, 5, 5);
tv.Style.ShowHeaders = false;
tv.Style.ShowHorizontalHeaderOverline = false;
tv.Style.ShowHorizontalHeaderUnderline = false;
tv.Redraw (tv.Bounds);
string expected = @"
│1│2│
";
TestHelpers.AssertDriverContentsAre (expected, output);
}
[Fact, AutoInitShutdown]
public void TableView_ShowHeadersFalse_OverlineTrue ()
{
var tv = GetABCDEFTableView (out _);
tv.Bounds = new Rect (0, 0, 5, 5);
tv.Style.ShowHeaders = false;
tv.Style.ShowHorizontalHeaderOverline = true;
tv.Style.ShowHorizontalHeaderUnderline = false;
tv.Redraw (tv.Bounds);
string expected = @"
┌─┬─┐
│1│2│
";
TestHelpers.AssertDriverContentsAre (expected, output);
}
[Fact, AutoInitShutdown]
public void TableView_ShowHeadersFalse_UnderlineTrue ()
{
var tv = GetABCDEFTableView (out _);
tv.Bounds = new Rect (0, 0, 5, 5);
tv.Style.ShowHeaders = false;
tv.Style.ShowHorizontalHeaderOverline = false;
tv.Style.ShowHorizontalHeaderUnderline = true;
// Horizontal scrolling option is part of the underline
tv.Style.ShowHorizontalScrollIndicators = true;
tv.Redraw (tv.Bounds);
string expected = @"
├─┼─►
│1│2│
";
TestHelpers.AssertDriverContentsAre (expected, output);
}
[Fact, AutoInitShutdown]
public void TableView_ShowHeadersFalse_AllLines ()
{
var tv = GetABCDEFTableView (out _);
tv.Bounds = new Rect (0, 0, 5, 5);
tv.Style.ShowHeaders = false;
tv.Style.ShowHorizontalHeaderOverline = true;
tv.Style.ShowHorizontalHeaderUnderline = true;
// Horizontal scrolling option is part of the underline
tv.Style.ShowHorizontalScrollIndicators = true;
tv.Redraw (tv.Bounds);
string expected = @"
┌─┬─┐
├─┼─►
│1│2│
";
TestHelpers.AssertDriverContentsAre (expected, output);
}
[Fact, AutoInitShutdown]
public void TableView_ExpandLastColumn_True ()
{