浏览代码

Added ColorGetter to TreeView

Thomas 3 年之前
父节点
当前提交
8e148013ec
共有 3 个文件被更改,包括 107 次插入2 次删除
  1. 20 2
      Terminal.Gui/Core/Trees/Branch.cs
  2. 7 0
      Terminal.Gui/Views/TreeView.cs
  3. 80 0
      UnitTests/TreeViewTests.cs

+ 20 - 2
Terminal.Gui/Core/Trees/Branch.cs

@@ -159,9 +159,27 @@ namespace Terminal.Gui.Trees {
 				availableWidth -= lineBody.Length;
 			}
 
-			//reset the line color if it was changed for rendering expansion symbol
-			driver.SetAttribute (lineColor);
+
+			// default behaviour is for model to use the color scheme
+			// of the tree view
+			var modelColor = lineColor;
+
+			// if custom color delegate invoke it
+			if(tree.ColorGetter != null)
+			{
+				var modelScheme = tree.ColorGetter(Model);
+
+				// if custom color scheme is defined for this Model
+				if(modelScheme != null)
+				{
+					// use it
+					modelColor = isSelected ? modelScheme.Focus : modelScheme.Normal;
+				}
+			}
+
+			driver.SetAttribute (modelColor);
 			driver.AddStr (lineBody);
+			driver.SetAttribute (lineColor);
 
 			if (availableWidth > 0) {
 				driver.AddStr (new string (' ', availableWidth));

+ 7 - 0
Terminal.Gui/Views/TreeView.cs

@@ -140,6 +140,13 @@ namespace Terminal.Gui {
 		/// <value></value>
 		public MouseFlags? ObjectActivationButton { get; set; } = MouseFlags.Button1DoubleClicked;
 
+		
+		/// <summary>
+		/// Delegate for multi colored tree views.  Return the <see cref="ColorScheme"/> to use
+		/// for each passed object or null to use the default.
+		/// </summary>
+		public Func<T,ColorScheme> ColorGetter {get;set;}
+
 		/// <summary>
 		/// Secondary selected regions of tree when <see cref="MultiSelect"/> is true
 		/// </summary>

+ 80 - 0
UnitTests/TreeViewTests.cs

@@ -6,10 +6,19 @@ using System.Threading.Tasks;
 using Terminal.Gui;
 using Terminal.Gui.Trees;
 using Xunit;
+using Xunit.Abstractions;
 
 namespace Terminal.Gui.Views {
 
 	public class TreeViewTests {
+
+		readonly ITestOutputHelper output;
+
+		public TreeViewTests (ITestOutputHelper output)
+		{
+			this.output = output;
+		}
+
 		#region Test Setup Methods
 		class Factory {
 			public Car [] Cars { get; set; }
@@ -712,6 +721,77 @@ namespace Terminal.Gui.Views {
 
 		}
 
+		[Fact, AutoInitShutdown]
+		public void TestTreeViewColor()
+		{
+			var tv = new TreeView{Width = 20,Height = 10};
+
+			var n1 = new TreeNode("normal");
+			var n1_1 = new TreeNode("pink");
+			var n1_2 = new TreeNode("normal");
+			n1.Children.Add(n1_1);
+			n1.Children.Add(n1_2);
+
+			var n2 = new TreeNode("pink");
+			tv.AddObject(n1);
+			tv.AddObject(n2);
+			tv.Expand(n1);
+
+			var pink = new Attribute(Color.Magenta,Color.Black);
+			var hotpink = new Attribute(Color.BrightMagenta,Color.Black);
+
+			tv.ColorScheme = new ColorScheme();
+			tv.Redraw(tv.Bounds);
+
+			// Normal drawing of the tree view
+			GraphViewTests.AssertDriverContentsAre(
+@"├-normal
+│ ├─pink
+│ └─normal
+└─pink
+",output);
+			// Should all be the same color
+			GraphViewTests.AssertDriverColorsAre(
+@"00000000
+00000000
+0000000000
+000000
+",
+				new []{tv.ColorScheme.Normal,pink});
+
+			// create a new color scheme
+			var pinkScheme = new ColorScheme
+			{
+				Normal = pink,
+				Focus = hotpink
+			};
+
+			// and a delegate that uses the pink color scheme 
+			// for nodes "pink"
+			tv.ColorGetter = (n)=> n.Text.Equals("pink") ? pinkScheme : null;
+
+			// redraw now that the custom color
+			// delegate is registered
+			tv.Redraw(tv.Bounds);
+	
+			// Same text
+			GraphViewTests.AssertDriverContentsAre(
+@"├-normal
+│ ├─pink
+│ └─normal
+└─pink
+",output);
+			// but now the item (only not lines) appear
+			// in pink when they are the word "pink"
+			GraphViewTests.AssertDriverColorsAre(
+@"00000000
+00001111
+0000000000
+001111
+",
+				new []{tv.ColorScheme.Normal,pink});
+		}
+
 		/// <summary>
 		/// Test object which considers for equality only <see cref="Name"/>
 		/// </summary>