1
1
using System . Collections . Generic ;
2
-
2
+ using System . IO ;
3
3
using CommunityToolkit . Mvvm . ComponentModel ;
4
4
5
5
namespace SourceGit . ViewModels
6
6
{
7
7
public class ChangeTreeNode : ObservableObject
8
8
{
9
9
public string FullPath { get ; set ; }
10
+ public string DisplayName { get ; set ; }
10
11
public int Depth { get ; private set ; } = 0 ;
11
12
public Models . Change Change { get ; set ; } = null ;
12
13
public List < ChangeTreeNode > Children { get ; set ; } = new List < ChangeTreeNode > ( ) ;
@@ -32,22 +33,22 @@ public bool IsExpanded
32
33
set => SetProperty ( ref _isExpanded , value ) ;
33
34
}
34
35
35
- public ChangeTreeNode ( Models . Change c , int depth )
36
+ public ChangeTreeNode ( Models . Change c )
36
37
{
37
38
FullPath = c . Path ;
38
- Depth = depth ;
39
+ DisplayName = Path . GetFileName ( c . Path ) ;
39
40
Change = c ;
40
41
IsExpanded = false ;
41
42
}
42
43
43
- public ChangeTreeNode ( string path , bool isExpanded , int depth )
44
+ public ChangeTreeNode ( string path , bool isExpanded )
44
45
{
45
46
FullPath = path ;
46
- Depth = depth ;
47
+ DisplayName = Path . GetFileName ( path ) ;
47
48
IsExpanded = isExpanded ;
48
49
}
49
50
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 )
51
52
{
52
53
var nodes = new List < ChangeTreeNode > ( ) ;
53
54
var folders = new Dictionary < string , ChangeTreeNode > ( ) ;
@@ -57,12 +58,11 @@ public static List<ChangeTreeNode> Build(IList<Models.Change> changes, HashSet<s
57
58
var sepIdx = c . Path . IndexOf ( '/' ) ;
58
59
if ( sepIdx == - 1 )
59
60
{
60
- nodes . Add ( new ChangeTreeNode ( c , 0 ) ) ;
61
+ nodes . Add ( new ChangeTreeNode ( c ) ) ;
61
62
}
62
63
else
63
64
{
64
65
ChangeTreeNode lastFolder = null ;
65
- int depth = 0 ;
66
66
67
67
while ( sepIdx != - 1 )
68
68
{
@@ -73,27 +73,32 @@ public static List<ChangeTreeNode> Build(IList<Models.Change> changes, HashSet<s
73
73
}
74
74
else if ( lastFolder == null )
75
75
{
76
- lastFolder = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) , depth ) ;
76
+ lastFolder = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) ) ;
77
77
folders . Add ( folder , lastFolder ) ;
78
78
InsertFolder ( nodes , lastFolder ) ;
79
79
}
80
80
else
81
81
{
82
- var cur = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) , depth ) ;
82
+ var cur = new ChangeTreeNode ( folder , ! folded . Contains ( folder ) ) ;
83
83
folders . Add ( folder , cur ) ;
84
84
InsertFolder ( lastFolder . Children , cur ) ;
85
85
lastFolder = cur ;
86
86
}
87
87
88
- depth ++ ;
89
88
sepIdx = c . Path . IndexOf ( '/' , sepIdx + 1 ) ;
90
89
}
91
90
92
- lastFolder ? . Children . Add ( new ChangeTreeNode ( c , depth ) ) ;
91
+ lastFolder ? . Children . Add ( new ChangeTreeNode ( c ) ) ;
93
92
}
94
93
}
95
94
96
- Sort ( nodes ) ;
95
+ if ( compactFolders )
96
+ {
97
+ foreach ( var node in nodes )
98
+ Compact ( node ) ;
99
+ }
100
+
101
+ SortAndSetDepth ( nodes , 0 ) ;
97
102
98
103
folders . Clear ( ) ;
99
104
return nodes ;
@@ -113,12 +118,37 @@ private static void InsertFolder(List<ChangeTreeNode> collection, ChangeTreeNode
113
118
collection . Add ( subFolder ) ;
114
119
}
115
120
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 )
117
146
{
118
147
foreach ( var node in nodes )
119
148
{
149
+ node . Depth = depth ;
120
150
if ( node . IsFolder )
121
- Sort ( node . Children ) ;
151
+ SortAndSetDepth ( node . Children , depth + 1 ) ;
122
152
}
123
153
124
154
nodes . Sort ( ( l , r ) =>
0 commit comments