1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Linq ;
3
4
4
5
namespace GitHub . Unity
5
6
{
@@ -31,13 +32,14 @@ public void Load(IEnumerable<TData> treeDatas)
31
32
{
32
33
var collapsedFolders = new HashSet < string > ( GetCollapsedFolders ( ) ) ;
33
34
var selectedNodePath = SelectedNodePath ;
35
+ var checkedFiles = new HashSet < string > ( GetCheckedFiles ( ) ) ;
34
36
35
37
Clear ( ) ;
36
38
37
39
var displayRootLevel = DisplayRootNode ? 1 : 0 ;
38
40
39
41
var isSelected = IsSelectable && selectedNodePath != null && Title == selectedNodePath ;
40
- AddNode ( Title , Title , - 1 + displayRootLevel , true , false , false , false , isSelected , null ) ;
42
+ AddNode ( Title , Title , - 1 + displayRootLevel , true , false , false , false , isSelected , false , null ) ;
41
43
42
44
var hideChildren = false ;
43
45
var hideChildrenBelowLevel = 0 ;
@@ -70,6 +72,7 @@ public void Load(IEnumerable<TData> treeDatas)
70
72
}
71
73
72
74
var isActive = false ;
75
+ var isChecked = false ;
73
76
var nodeIsCollapsed = false ;
74
77
TData ? treeNodeTreeData = null ;
75
78
@@ -92,11 +95,42 @@ public void Load(IEnumerable<TData> treeDatas)
92
95
{
93
96
isActive = treeData . IsActive ;
94
97
treeNodeTreeData = treeData ;
98
+ isChecked = checkedFiles . Contains ( nodePath ) ;
95
99
}
96
100
97
101
isSelected = selectedNodePath != null && nodePath == selectedNodePath ;
98
102
AddNode ( nodePath , label , i + displayRootLevel , isFolder , isActive , nodeIsHidden ,
99
- nodeIsCollapsed , isSelected , treeNodeTreeData ) ;
103
+ nodeIsCollapsed , isSelected , isChecked , treeNodeTreeData ) ;
104
+ }
105
+ }
106
+ }
107
+
108
+ if ( IsCheckable && checkedFiles . Any ( ) )
109
+ {
110
+ for ( var index = Nodes . Count - 1 ; index >= 0 ; index -- )
111
+ {
112
+ var node = Nodes [ index ] ;
113
+ if ( node . Level >= 0 && node . IsFolder )
114
+ {
115
+ bool ? anyChecked = null ;
116
+ bool ? allChecked = null ;
117
+
118
+ for ( var i = index + 1 ; i < Nodes . Count ; i ++ )
119
+ {
120
+ var nodeCompare = Nodes [ i ] ;
121
+ if ( nodeCompare . Level < node . Level + 1 )
122
+ {
123
+ break ;
124
+ }
125
+
126
+ var nodeIsChecked = nodeCompare . CheckState == CheckState . Checked ;
127
+ allChecked = ( allChecked ?? true ) && nodeIsChecked ;
128
+ anyChecked = ( anyChecked ?? false ) || nodeIsChecked ;
129
+ }
130
+
131
+ node . CheckState = anyChecked . Value
132
+ ? ( allChecked . Value ? CheckState . Checked : CheckState . Mixed )
133
+ : CheckState . Empty ;
100
134
}
101
135
}
102
136
}
@@ -126,10 +160,9 @@ public void SetCheckStateOnAll(bool isChecked)
126
160
127
161
protected abstract IEnumerable < string > GetCollapsedFolders ( ) ;
128
162
129
- protected void AddNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden ,
130
- bool isCollapsed , bool isSelected , TData ? treeData )
163
+ protected void AddNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden , bool isCollapsed , bool isSelected , bool isChecked , TData ? treeData )
131
164
{
132
- var node = CreateTreeNode ( path , label , level , isFolder , isActive , isHidden , isCollapsed , treeData ) ;
165
+ var node = CreateTreeNode ( path , label , level , isFolder , isActive , isHidden , isCollapsed , isChecked , treeData ) ;
133
166
134
167
SetNodeIcon ( node ) ;
135
168
Nodes . Add ( node ) ;
@@ -151,8 +184,7 @@ protected void Clear()
151
184
152
185
protected abstract void AddCheckedNode ( TNode node ) ;
153
186
154
- protected abstract TNode CreateTreeNode ( string path , string label , int level , bool isFolder , bool isActive ,
155
- bool isHidden , bool isCollapsed , TData ? treeData ) ;
187
+ protected abstract TNode CreateTreeNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden , bool isCollapsed , bool isChecked , TData ? treeData ) ;
156
188
157
189
protected abstract void OnClear ( ) ;
158
190
0 commit comments