88
99namespace GitHub . Unity
1010{
11+ [ Serializable ]
12+ public class TreeNodeDictionary : SerializableDictionary < string , TreeNode > { }
13+
1114 [ Serializable ]
1215 public class Tree
1316 {
@@ -36,10 +39,9 @@ public class Tree
3639 [ SerializeField ] private List < TreeNode > nodes = new List < TreeNode > ( ) ;
3740 [ SerializeField ] private TreeNode selectedNode = null ;
3841 [ SerializeField ] private TreeNode activeNode = null ;
39- [ SerializeField ] private List < string > foldersKeys = new List < string > ( ) ;
42+ [ SerializeField ] private TreeNodeDictionary folders = new TreeNodeDictionary ( ) ;
4043
4144 [ NonSerialized ] private Stack < bool > indents = new Stack < bool > ( ) ;
42- [ NonSerialized ] private Hashtable folders ;
4345
4446 public bool IsInitialized { get { return nodes != null && nodes . Count > 0 && ! String . IsNullOrEmpty ( nodes [ 0 ] . Name ) ; } }
4547 public bool RequiresRepaint { get ; private set ; }
@@ -60,26 +62,12 @@ private set
6062
6163 public TreeNode ActiveNode { get { return activeNode ; } }
6264
63- private Hashtable Folders
64- {
65- get
66- {
67- if ( folders == null )
68- {
69- folders = new Hashtable ( ) ;
70- for ( int i = 0 ; i < foldersKeys . Count ; i ++ )
71- {
72- folders . Add ( foldersKeys [ i ] , null ) ;
73- }
74- }
75- return folders ;
76- }
77- }
78-
7965 public void Load ( IEnumerable < ITreeData > data , string title )
8066 {
81- foldersKeys . Clear ( ) ;
82- Folders . Clear ( ) ;
67+ var collapsedFoldersEnumerable = folders . Where ( pair => pair . Value . IsCollapsed ) . Select ( pair => pair . Key ) ;
68+ var collapsedFolders = new HashSet < string > ( collapsedFoldersEnumerable ) ;
69+
70+ folders . Clear ( ) ;
8371 nodes . Clear ( ) ;
8472
8573 var titleNode = new TreeNode ( )
@@ -92,23 +80,27 @@ public void Load(IEnumerable<ITreeData> data, string title)
9280 titleNode . Load ( ) ;
9381 nodes . Add ( titleNode ) ;
9482
83+ var hideChildren = false ;
84+ var hideChildrenBelowLevel = 0 ;
85+
9586 foreach ( var d in data )
9687 {
9788 var parts = d . Name . Split ( '/' ) ;
9889 for ( int i = 0 ; i < parts . Length ; i ++ )
9990 {
10091 var label = parts [ i ] ;
101- var name = String . Join ( "/" , parts , 0 , i + 1 ) ;
92+ var level = i + 1 ;
93+ var name = String . Join ( "/" , parts , 0 , level ) ;
10294 var isFolder = i < parts . Length - 1 ;
103- var alreadyExists = Folders . ContainsKey ( name ) ;
95+ var alreadyExists = folders . ContainsKey ( name ) ;
10496 if ( ! alreadyExists )
10597 {
106- var node = new TreeNode ( )
98+ var node = new TreeNode
10799 {
108100 Name = name ,
109101 IsActive = d . IsActive ,
110102 Label = label ,
111- Level = i + 1 ,
103+ Level = level ,
112104 IsFolder = isFolder
113105 } ;
114106
@@ -117,19 +109,41 @@ public void Load(IEnumerable<ITreeData> data, string title)
117109 activeNode = node ;
118110 }
119111
112+ if ( hideChildren )
113+ {
114+ if ( level <= hideChildrenBelowLevel )
115+ {
116+ hideChildren = false ;
117+ }
118+ else
119+ {
120+ node . IsHidden = true ;
121+ }
122+ }
123+
120124 ResetNodeIcons ( node ) ;
121125
122126 node . Load ( ) ;
123127
124128 nodes . Add ( node ) ;
125129 if ( isFolder )
126130 {
127- Folders . Add ( name , null ) ;
131+ if ( collapsedFolders . Contains ( name ) )
132+ {
133+ node . IsCollapsed = true ;
134+
135+ if ( ! hideChildren )
136+ {
137+ hideChildren = true ;
138+ hideChildrenBelowLevel = level ;
139+ }
140+ }
141+
142+ folders . Add ( name , node ) ;
128143 }
129144 }
130145 }
131146 }
132- foldersKeys = Folders . Keys . Cast < string > ( ) . ToList ( ) ;
133147 }
134148
135149 public Rect Render ( Rect rect , Vector2 scroll , Action < TreeNode > singleClick = null , Action < TreeNode > doubleClick = null , Action < TreeNode > rightClick = null )
0 commit comments