11using System . Collections . Generic ;
2-
2+ using System . IO ;
33using CommunityToolkit . Mvvm . ComponentModel ;
44
55namespace SourceGit . ViewModels
66{
77 public class ChangeTreeNode : ObservableObject
88 {
99 public string FullPath { get ; set ; }
10+ public string DisplayName { get ; set ; }
1011 public int Depth { get ; private set ; } = 0 ;
1112 public Models . Change Change { get ; set ; } = null ;
1213 public List < ChangeTreeNode > Children { get ; set ; } = new List < ChangeTreeNode > ( ) ;
@@ -32,22 +33,22 @@ public bool IsExpanded
3233 set => SetProperty ( ref _isExpanded , value ) ;
3334 }
3435
35- public ChangeTreeNode ( Models . Change c , int depth )
36+ public ChangeTreeNode ( Models . Change c )
3637 {
3738 FullPath = c . Path ;
38- Depth = depth ;
39+ DisplayName = Path . GetFileName ( c . Path ) ;
3940 Change = c ;
4041 IsExpanded = false ;
4142 }
4243
43- public ChangeTreeNode ( string path , bool isExpanded , int depth )
44+ public ChangeTreeNode ( string path , bool isExpanded )
4445 {
4546 FullPath = path ;
46- Depth = depth ;
47+ DisplayName = Path . GetFileName ( path ) ;
4748 IsExpanded = isExpanded ;
4849 }
4950
50- public static List < ChangeTreeNode > Build ( IList < Models . Change > changes , HashSet < string > folded )
51+ public static List < ChangeTreeNode > Build ( IList < Models . Change > changes , HashSet < string > folded , bool compactFolders )
5152 {
5253 var nodes = new List < ChangeTreeNode > ( ) ;
5354 var folders = new Dictionary < string , ChangeTreeNode > ( ) ;
@@ -57,12 +58,11 @@ public static List<ChangeTreeNode> Build(IList<Models.Change> changes, HashSet<s
5758 var sepIdx = c . Path . IndexOf ( '/' ) ;
5859 if ( sepIdx == - 1 )
5960 {
60- nodes . Add ( new ChangeTreeNode ( c , 0 ) ) ;
61+ nodes . Add ( new ChangeTreeNode ( c ) ) ;
6162 }
6263 else
6364 {
6465 ChangeTreeNode lastFolder = null ;
65- int depth = 0 ;
6666
6767 while ( sepIdx != - 1 )
6868 {
@@ -73,27 +73,32 @@ public static List<ChangeTreeNode> Build(IList<Models.Change> changes, HashSet<s
7373 }
7474 else if ( lastFolder == null )
7575 {
76- lastFolder = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) , depth ) ;
76+ lastFolder = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) ) ;
7777 folders . Add ( folder , lastFolder ) ;
7878 InsertFolder ( nodes , lastFolder ) ;
7979 }
8080 else
8181 {
82- var cur = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) , depth ) ;
82+ var cur = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) ) ;
8383 folders . Add ( folder , cur ) ;
8484 InsertFolder ( lastFolder . Children , cur ) ;
8585 lastFolder = cur ;
8686 }
8787
88- depth ++ ;
8988 sepIdx = c . Path . IndexOf ( '/' , sepIdx + 1 ) ;
9089 }
9190
92- lastFolder ? . Children . Add ( new ChangeTreeNode ( c , depth ) ) ;
91+ lastFolder ? . Children . Add ( new ChangeTreeNode ( c ) ) ;
9392 }
9493 }
9594
96- Sort ( nodes ) ;
95+ if ( compactFolders )
96+ {
97+ foreach ( var node in nodes )
98+ Compact ( node ) ;
99+ }
100+
101+ SortAndSetDepth ( nodes , 0 ) ;
97102
98103 folders . Clear ( ) ;
99104 return nodes ;
@@ -113,12 +118,37 @@ private static void InsertFolder(List<ChangeTreeNode> collection, ChangeTreeNode
113118 collection . Add ( subFolder ) ;
114119 }
115120
116- private static void Sort ( List < ChangeTreeNode > nodes )
121+ private static void Compact ( ChangeTreeNode node )
122+ {
123+ var childrenCount = node . Children . Count ;
124+ if ( childrenCount == 0 )
125+ return ;
126+
127+ if ( childrenCount > 1 )
128+ {
129+ foreach ( var c in node . Children )
130+ Compact ( c ) ;
131+ return ;
132+ }
133+
134+ var child = node . Children [ 0 ] ;
135+ if ( child . Change != null )
136+ return ;
137+
138+ node . FullPath = $ "{ node . FullPath } /{ child . DisplayName } ";
139+ node . DisplayName = $ "{ node . DisplayName } / { child . DisplayName } ";
140+ node . IsExpanded = child . IsExpanded ;
141+ node . Children = child . Children ;
142+ Compact ( node ) ;
143+ }
144+
145+ private static void SortAndSetDepth ( List < ChangeTreeNode > nodes , int depth )
117146 {
118147 foreach ( var node in nodes )
119148 {
149+ node . Depth = depth ;
120150 if ( node . IsFolder )
121- Sort ( node . Children ) ;
151+ SortAndSetDepth ( node . Children , depth + 1 ) ;
122152 }
123153
124154 nodes . Sort ( ( l , r ) =>
0 commit comments