From dcdb4f9b49d178e384fc715be278aa071fa09e15 Mon Sep 17 00:00:00 2001 From: Nutzzz Date: Sat, 15 Apr 2023 17:27:05 -0700 Subject: [PATCH] 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 --- Terminal.Gui/Views/TableView/TableView.cs | 17 ++++- UICatalog/Scenarios/TableEditor.cs | 13 +++- UnitTests/Views/TableViewTests.cs | 80 +++++++++++++++++++++++ 3 files changed, 105 insertions(+), 5 deletions(-) diff --git a/Terminal.Gui/Views/TableView/TableView.cs b/Terminal.Gui/Views/TableView/TableView.cs index 9b5b59f64..238c58f2f 100644 --- a/Terminal.Gui/Views/TableView/TableView.cs +++ b/Terminal.Gui/Views/TableView/TableView.cs @@ -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 { /// private int GetHeaderHeight () { - int heightRequired = 1; + int heightRequired = Style.ShowHeaders ? 1 : 0; if (Style.ShowHorizontalHeaderOverline) heightRequired++; @@ -1800,6 +1803,14 @@ namespace Terminal.Gui { /// public class TableStyle { + /// + /// Gets or sets a flag indicating whether to render headers of a . + /// Defaults to . + /// + /// , etc + /// may still be used even if is . + public bool ShowHeaders { get; set; } = true; + /// /// When scrolling down always lock the column headers in place as the first row of the table /// diff --git a/UICatalog/Scenarios/TableEditor.cs b/UICatalog/Scenarios/TableEditor.cs index 9031a4032..a5eec0912 100644 --- a/UICatalog/Scenarios/TableEditor.cs +++ b/UICatalog/Scenarios/TableEditor.cs @@ -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; diff --git a/UnitTests/Views/TableViewTests.cs b/UnitTests/Views/TableViewTests.cs index b4fd6a474..d65c084b2 100644 --- a/UnitTests/Views/TableViewTests.cs +++ b/UnitTests/Views/TableViewTests.cs @@ -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 () {