11using System ;
22using System . Collections . Generic ;
3+ using System . Linq ;
34
45namespace GitHub . Unity
56{
@@ -31,13 +32,14 @@ public void Load(IEnumerable<TData> treeDatas)
3132 {
3233 var collapsedFolders = new HashSet < string > ( GetCollapsedFolders ( ) ) ;
3334 var selectedNodePath = SelectedNodePath ;
35+ var checkedFiles = new HashSet < string > ( GetCheckedFiles ( ) ) ;
3436
3537 Clear ( ) ;
3638
3739 var displayRootLevel = DisplayRootNode ? 1 : 0 ;
3840
3941 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 ) ;
4143
4244 var hideChildren = false ;
4345 var hideChildrenBelowLevel = 0 ;
@@ -70,6 +72,7 @@ public void Load(IEnumerable<TData> treeDatas)
7072 }
7173
7274 var isActive = false ;
75+ var isChecked = false ;
7376 var nodeIsCollapsed = false ;
7477 TData ? treeNodeTreeData = null ;
7578
@@ -92,11 +95,42 @@ public void Load(IEnumerable<TData> treeDatas)
9295 {
9396 isActive = treeData . IsActive ;
9497 treeNodeTreeData = treeData ;
98+ isChecked = checkedFiles . Contains ( nodePath ) ;
9599 }
96100
97101 isSelected = selectedNodePath != null && nodePath == selectedNodePath ;
98102 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 ;
100134 }
101135 }
102136 }
@@ -126,10 +160,9 @@ public void SetCheckStateOnAll(bool isChecked)
126160
127161 protected abstract IEnumerable < string > GetCollapsedFolders ( ) ;
128162
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 )
131164 {
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 ) ;
133166
134167 SetNodeIcon ( node ) ;
135168 Nodes . Add ( node ) ;
@@ -151,8 +184,7 @@ protected void Clear()
151184
152185 protected abstract void AddCheckedNode ( TNode node ) ;
153186
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 ) ;
156188
157189 protected abstract void OnClear ( ) ;
158190
0 commit comments