From 897b3a3eea69e432e952d0dcf045199c21c75c44 Mon Sep 17 00:00:00 2001 From: tznind Date: Sun, 23 Jul 2023 17:25:56 +0100 Subject: [PATCH] Layout tidy up and whitespace fixes --- Terminal.Gui/Views/TreeView/Branch.cs | 45 ++++----- .../TreeView/DrawTreeViewLineEventArgs.cs | 66 +++++++++++++ Terminal.Gui/Views/TreeView/TreeView.cs | 99 ++++--------------- UICatalog/Scenarios/TreeViewFileSystem.cs | 37 ++++--- 4 files changed, 120 insertions(+), 127 deletions(-) create mode 100644 Terminal.Gui/Views/TreeView/DrawTreeViewLineEventArgs.cs diff --git a/Terminal.Gui/Views/TreeView/Branch.cs b/Terminal.Gui/Views/TreeView/Branch.cs index 7d4bcc7f3..83acdf745 100644 --- a/Terminal.Gui/Views/TreeView/Branch.cs +++ b/Terminal.Gui/Views/TreeView/Branch.cs @@ -65,11 +65,10 @@ namespace Terminal.Gui { if (Depth >= tree.MaxDepth) { children = Enumerable.Empty (); - } - else { + } else { children = tree.TreeBuilder.GetChildren (this.Model) ?? Enumerable.Empty (); } - + this.ChildBranches = children.ToDictionary (k => k, val => new Branch (tree, this, val)); } @@ -95,10 +94,10 @@ namespace Terminal.Gui { /// public virtual void Draw (ConsoleDriver driver, ColorScheme colorScheme, int y, int availableWidth) { - var cells = new List(); + var cells = new List (); int? indexOfExpandCollapseSymbol = null; int indexOfModelText; - + // true if the current line of the tree is the selected one and control has focus bool isSelected = tree.IsSelected (Model); @@ -123,7 +122,7 @@ namespace Terminal.Gui { if (toSkip > 0) { toSkip--; } else { - cells.Add(NewRuneCell(attr,r)); + cells.Add (NewRuneCell (attr, r)); availableWidth -= r.GetColumns (); } } @@ -153,13 +152,13 @@ namespace Terminal.Gui { toSkip--; } else { indexOfExpandCollapseSymbol = cells.Count; - cells.Add(NewRuneCell(attr,expansion)); + cells.Add (NewRuneCell (attr, expansion)); availableWidth -= expansion.GetColumns (); } // horizontal scrolling has already skipped the prefix but now must also skip some of the line body if (toSkip > 0) { - + // For the event record a negative location for where model text starts since it // is pushed off to the left because of scrolling indexOfModelText = -toSkip; @@ -169,9 +168,7 @@ namespace Terminal.Gui { } else { lineBody = lineBody.Substring (toSkip); } - } - else - { + } else { indexOfModelText = cells.Count; } @@ -202,18 +199,18 @@ namespace Terminal.Gui { } attr = modelColor; - cells.AddRange(lineBody.Select(r=>NewRuneCell(attr,new Rune(r)))); + cells.AddRange (lineBody.Select (r => NewRuneCell (attr, new Rune (r)))); if (availableWidth > 0) { attr = symbolColor; - cells.AddRange( - Enumerable.Repeat( - NewRuneCell(attr,new Rune(' ')), + cells.AddRange ( + Enumerable.Repeat ( + NewRuneCell (attr, new Rune (' ')), availableWidth )); } - var e = new DrawTreeViewLineEventArgs{ + var e = new DrawTreeViewLineEventArgs { Model = Model, Y = y, RuneCells = cells, @@ -221,14 +218,12 @@ namespace Terminal.Gui { IndexOfExpandCollapseSymbol = indexOfExpandCollapseSymbol, IndexOfModelText = indexOfModelText, }; - tree.OnDrawLine(e); + tree.OnDrawLine (e); - if(!e.Handled) - { - foreach(var cell in cells) - { - driver.SetAttribute(cell.ColorScheme.Normal); - driver.AddRune(cell.Rune); + if (!e.Handled) { + foreach (var cell in cells) { + driver.SetAttribute (cell.ColorScheme.Normal); + driver.AddRune (cell.Rune); } } @@ -237,9 +232,9 @@ namespace Terminal.Gui { private static RuneCell NewRuneCell (Attribute attr, Rune r) { - return new RuneCell{ + return new RuneCell { Rune = r, - ColorScheme = new ColorScheme(attr) + ColorScheme = new ColorScheme (attr) }; } diff --git a/Terminal.Gui/Views/TreeView/DrawTreeViewLineEventArgs.cs b/Terminal.Gui/Views/TreeView/DrawTreeViewLineEventArgs.cs new file mode 100644 index 000000000..16b90f392 --- /dev/null +++ b/Terminal.Gui/Views/TreeView/DrawTreeViewLineEventArgs.cs @@ -0,0 +1,66 @@ +// This code is based on http://objectlistview.sourceforge.net (GPLv3 tree/list controls +// by phillip.piper@gmail.com). Phillip has explicitly granted permission for his design +// and code to be used in this library under the MIT license. + +using System.Collections.Generic; + +namespace Terminal.Gui { + /// + /// Event args for the event + /// + /// + public class DrawTreeViewLineEventArgs where T : class { + + /// + /// The object at this line in the tree + /// + public T Model { get; init; } + + /// + /// The that is performing the + /// rendering. + /// + public TreeView Tree { get; init; } + + /// + /// The line within tree view bounds that is being rendered + /// + public int Y { get; init; } + + /// + /// Set to true to cancel drawing (e.g. if you have already manually + /// drawn content). + /// + public bool Handled { get; set; } + + /// + /// The rune and color of each symbol that will be rendered. Note + /// that only is respected. You + /// can modify these to change what is rendered. + /// + /// + /// Changing the length of this collection may result in corrupt rendering + /// + public List RuneCells { get; init; } + + /// + /// The notional index in which contains the first + /// character of the text (i.e. + /// after all branch lines and expansion/collapse sybmols). + /// + /// + /// May be negative or outside of bounds of if the view + /// has been scrolled horizontally. + /// + + public int IndexOfModelText { get; init; } + + /// + /// If line contains a branch that can be expanded/collapsed then this is + /// the index in at which the symbol is (or null for + /// leaf elements). + /// + public int? IndexOfExpandCollapseSymbol { get; init; } + + } +} \ No newline at end of file diff --git a/Terminal.Gui/Views/TreeView/TreeView.cs b/Terminal.Gui/Views/TreeView/TreeView.cs index b959fdaff..ba6394411 100644 --- a/Terminal.Gui/Views/TreeView/TreeView.cs +++ b/Terminal.Gui/Views/TreeView/TreeView.cs @@ -563,10 +563,9 @@ namespace Terminal.Gui { List> toReturn = new List> (); foreach (var root in roots.Values) { - + var toAdd = AddToLineMap (root, false, out var isMatch); - if(isMatch) - { + if (isMatch) { toReturn.AddRange (toAdd); } } @@ -580,41 +579,38 @@ namespace Terminal.Gui { private bool IsFilterMatch (Branch branch) { - return Filter?.IsMatch(branch.Model) ?? true; + return Filter?.IsMatch (branch.Model) ?? true; } - private IEnumerable> AddToLineMap (Branch currentBranch,bool parentMatches, out bool match) + private IEnumerable> AddToLineMap (Branch currentBranch, bool parentMatches, out bool match) { - bool weMatch = IsFilterMatch(currentBranch); + bool weMatch = IsFilterMatch (currentBranch); bool anyChildMatches = false; - - var toReturn = new List>(); - var children = new List>(); + + var toReturn = new List> (); + var children = new List> (); if (currentBranch.IsExpanded) { foreach (var subBranch in currentBranch.ChildBranches.Values) { foreach (var sub in AddToLineMap (subBranch, weMatch, out var childMatch)) { - - if(childMatch) - { - children.Add(sub); + + if (childMatch) { + children.Add (sub); anyChildMatches = true; } } } } - if(parentMatches || weMatch || anyChildMatches) - { + if (parentMatches || weMatch || anyChildMatches) { match = true; - toReturn.Add(currentBranch); - } - else{ + toReturn.Add (currentBranch); + } else { match = false; } - - toReturn.AddRange(children); + + toReturn.AddRange (children); return toReturn; } @@ -1434,71 +1430,10 @@ namespace Terminal.Gui { /// internal void OnDrawLine (DrawTreeViewLineEventArgs e) { - DrawLine?.Invoke(this,e); + DrawLine?.Invoke (this, e); } } - - /// - /// Event args for the event - /// - /// - public class DrawTreeViewLineEventArgs where T : class{ - - /// - /// The object at this line in the tree - /// - public T Model {get;init;} - - /// - /// The that is performing the - /// rendering. - /// - public TreeView Tree {get; init;} - - /// - /// The line within tree view bounds that is being rendered - /// - public int Y {get;init;} - - /// - /// Set to true to cancel drawing (e.g. if you have already manually - /// drawn content). - /// - public bool Handled {get;set;} - - /// - /// The rune and color of each symbol that will be rendered. Note - /// that only is respected. You - /// can modify these to change what is rendered. - /// - /// - /// Changing the length of this collection may result in corrupt rendering - /// - public List RuneCells {get; init;} - - /// - /// The notional index in which contains the first - /// character of the text (i.e. - /// after all branch lines and expansion/collapse sybmols). - /// - /// - /// May be negative or outside of bounds of if the view - /// has been scrolled horizontally. - /// - - public int IndexOfModelText {get;init;} - - /// - /// If line contains a branch that can be expanded/collapsed then this is - /// the index in at which the symbol is (or null for - /// leaf elements). - /// - public int? IndexOfExpandCollapseSymbol {get;init;} - - } - - class TreeSelection where T : class { public Branch Origin { get; } diff --git a/UICatalog/Scenarios/TreeViewFileSystem.cs b/UICatalog/Scenarios/TreeViewFileSystem.cs index d0cd8078c..0f5cc497f 100644 --- a/UICatalog/Scenarios/TreeViewFileSystem.cs +++ b/UICatalog/Scenarios/TreeViewFileSystem.cs @@ -107,7 +107,7 @@ namespace UICatalog.Scenarios { SetupScrollBar (); treeViewFiles.SetFocus (); - + UpdateIconCheckedness (); } @@ -144,15 +144,12 @@ namespace UICatalog.Scenarios { private void TreeViewFiles_DrawLine (object sender, DrawTreeViewLineEventArgs e) { // Render directory icons in yellow - if(e.Model is IDirectoryInfo d) - { - if(_iconProvider.UseNerdIcons || _iconProvider.UseUnicodeCharacters) - { - if(e.IndexOfModelText > 0 && e.IndexOfModelText < e.RuneCells.Count) - { - var cell = e.RuneCells[e.IndexOfModelText]; - cell.ColorScheme = new ColorScheme( - new Terminal.Gui.Attribute( + if (e.Model is IDirectoryInfo d) { + if (_iconProvider.UseNerdIcons || _iconProvider.UseUnicodeCharacters) { + if (e.IndexOfModelText > 0 && e.IndexOfModelText < e.RuneCells.Count) { + var cell = e.RuneCells [e.IndexOfModelText]; + cell.ColorScheme = new ColorScheme ( + new Terminal.Gui.Attribute ( Color.BrightYellow, cell.ColorScheme.Normal.Background) ); @@ -216,7 +213,7 @@ namespace UICatalog.Scenarios { private IFileSystemInfo fileInfo; private FileSystemIconProvider _iconProvider; - public DetailsFrame (FileSystemIconProvider iconProvider) + public DetailsFrame (FileSystemIconProvider iconProvider) { Title = "Details"; Visible = true; @@ -230,7 +227,7 @@ namespace UICatalog.Scenarios { System.Text.StringBuilder sb = null; if (fileInfo is IFileInfo f) { - Title = $"{_iconProvider.GetIconWithOptionalSpace(f)}{f.Name}".Trim(); + Title = $"{_iconProvider.GetIconWithOptionalSpace (f)}{f.Name}".Trim (); sb = new System.Text.StringBuilder (); sb.AppendLine ($"Path:\n {f.FullName}\n"); sb.AppendLine ($"Size:\n {f.Length:N0} bytes\n"); @@ -239,7 +236,7 @@ namespace UICatalog.Scenarios { } if (fileInfo is IDirectoryInfo dir) { - Title = $"{_iconProvider.GetIconWithOptionalSpace(dir)}{dir.Name}".Trim(); + Title = $"{_iconProvider.GetIconWithOptionalSpace (dir)}{dir.Name}".Trim (); sb = new System.Text.StringBuilder (); sb.AppendLine ($"Path:\n {dir?.FullName}\n"); sb.AppendLine ($"Modified:\n {dir.LastWriteTime}\n"); @@ -262,7 +259,7 @@ namespace UICatalog.Scenarios { var scrollBar = new ScrollBarView (treeViewFiles, true); - scrollBar.ChangedPosition += (s,e) => { + scrollBar.ChangedPosition += (s, e) => { treeViewFiles.ScrollOffsetVertical = scrollBar.Position; if (treeViewFiles.ScrollOffsetVertical != scrollBar.Position) { scrollBar.Position = treeViewFiles.ScrollOffsetVertical; @@ -270,7 +267,7 @@ namespace UICatalog.Scenarios { treeViewFiles.SetNeedsDisplay (); }; - scrollBar.OtherScrollBarView.ChangedPosition += (s,e) => { + scrollBar.OtherScrollBarView.ChangedPosition += (s, e) => { treeViewFiles.ScrollOffsetHorizontal = scrollBar.OtherScrollBarView.Position; if (treeViewFiles.ScrollOffsetHorizontal != scrollBar.OtherScrollBarView.Position) { scrollBar.OtherScrollBarView.Position = treeViewFiles.ScrollOffsetHorizontal; @@ -278,7 +275,7 @@ namespace UICatalog.Scenarios { treeViewFiles.SetNeedsDisplay (); }; - treeViewFiles.DrawContent += (s,e) => { + treeViewFiles.DrawContent += (s, e) => { scrollBar.Size = treeViewFiles.ContentHeight; scrollBar.Position = treeViewFiles.ScrollOffsetVertical; scrollBar.OtherScrollBarView.Size = treeViewFiles.GetContentWidth (true); @@ -290,20 +287,20 @@ namespace UICatalog.Scenarios { private void SetupFileTree () { // setup how to build tree - var fs = new FileSystem(); - var rootDirs = DriveInfo.GetDrives ().Select (d=>fs.DirectoryInfo.New(d.RootDirectory.FullName)); + var fs = new FileSystem (); + var rootDirs = DriveInfo.GetDrives ().Select (d => fs.DirectoryInfo.New (d.RootDirectory.FullName)); treeViewFiles.TreeBuilder = new FileSystemTreeBuilder (); treeViewFiles.AddObjects (rootDirs); // Determines how to represent objects as strings on the screen treeViewFiles.AspectGetter = AspectGetter; - + _iconProvider.IsOpenGetter = treeViewFiles.IsExpanded; } private string AspectGetter (IFileSystemInfo f) { - return (_iconProvider.GetIconWithOptionalSpace(f) + f.Name).Trim(); + return (_iconProvider.GetIconWithOptionalSpace (f) + f.Name).Trim (); } private void ShowLines ()