Merge pull request #1703 from tznind/tv-colors

Adds support for custom colors in TreeView
This commit is contained in:
Tig Kindel
2022-05-08 19:30:01 -07:00
committed by GitHub
4 changed files with 131 additions and 2 deletions

View File

@@ -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));

View File

@@ -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>

View File

@@ -24,6 +24,7 @@ namespace UICatalog.Scenarios {
private MenuItem miUnicodeSymbols;
private MenuItem miFullPaths;
private MenuItem miLeaveLastRow;
private MenuItem miCustomColors;
private Terminal.Gui.Attribute green;
private Terminal.Gui.Attribute red;
@@ -52,6 +53,7 @@ namespace UICatalog.Scenarios {
miInvertSymbols = new MenuItem ("_InvertSymbols", "", () => InvertExpandableSymbols()){Checked = false, CheckType = MenuItemCheckStyle.Checked},
miFullPaths = new MenuItem ("_FullPaths", "", () => SetFullName()){Checked = false, CheckType = MenuItemCheckStyle.Checked},
miLeaveLastRow = new MenuItem ("_LeaveLastRow", "", () => SetLeaveLastRow()){Checked = true, CheckType = MenuItemCheckStyle.Checked},
miCustomColors = new MenuItem ("C_ustomColors", "", () => SetCustomColors()){Checked = false, CheckType = MenuItemCheckStyle.Checked},
}),
});
Top.Add (menu);
@@ -209,6 +211,28 @@ namespace UICatalog.Scenarios {
miLeaveLastRow.Checked = !miLeaveLastRow.Checked;
treeViewFiles.Style.LeaveLastRow = miLeaveLastRow.Checked;
}
private void SetCustomColors()
{
var yellow = new ColorScheme
{
Focus = new Terminal.Gui.Attribute(Color.BrightYellow,treeViewFiles.ColorScheme.Focus.Background),
Normal = new Terminal.Gui.Attribute (Color.BrightYellow,treeViewFiles.ColorScheme.Normal.Background),
};
miCustomColors.Checked = !miCustomColors.Checked;
if(miCustomColors.Checked)
{
treeViewFiles.ColorGetter = (m)=>
{
return m is DirectoryInfo ? yellow : null;
};
}
else
{
treeViewFiles.ColorGetter = null;
}
}
private IEnumerable<FileSystemInfo> GetChildren (FileSystemInfo model)

View File

@@ -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>