Explorar el Código

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 <[email protected]>
Nutzzz hace 2 años
padre
commit
dcdb4f9b49

+ 14 - 3
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 {
 		/// <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>

+ 11 - 2
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;

+ 80 - 0
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 ()
 		{