mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-28 00:38:00 +01:00
Merge pull request #1703 from tznind/tv-colors
Adds support for custom colors in TreeView
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user