88
99namespace GitHub . Unity
1010{
11+ [ Serializable ]
12+ public class TreeNodeDictionary : SerializableDictionary < string , TreeNode > { }
13+
1114 [ Serializable ]
1215 public abstract class Tree
1316 {
@@ -24,10 +27,9 @@ public abstract class Tree
2427 [ SerializeField ] private List < TreeNode > nodes = new List < TreeNode > ( ) ;
2528 [ SerializeField ] private TreeNode selectedNode = null ;
2629 [ SerializeField ] private TreeNode activeNode = null ;
27- [ SerializeField ] private List < string > foldersKeys = new List < string > ( ) ;
30+ [ SerializeField ] private TreeNodeDictionary folders = new TreeNodeDictionary ( ) ;
2831
2932 [ NonSerialized ] private Stack < bool > indents = new Stack < bool > ( ) ;
30- [ NonSerialized ] private Hashtable folders ;
3133
3234 public bool IsInitialized { get { return nodes != null && nodes . Count > 0 && ! String . IsNullOrEmpty ( nodes [ 0 ] . Name ) ; } }
3335 public bool RequiresRepaint { get ; private set ; }
@@ -48,26 +50,12 @@ private set
4850
4951 public TreeNode ActiveNode { get { return activeNode ; } }
5052
51- private Hashtable Folders
52- {
53- get
54- {
55- if ( folders == null )
56- {
57- folders = new Hashtable ( ) ;
58- for ( int i = 0 ; i < foldersKeys . Count ; i ++ )
59- {
60- folders . Add ( foldersKeys [ i ] , null ) ;
61- }
62- }
63- return folders ;
64- }
65- }
66-
6753 public void Load ( IEnumerable < ITreeData > data , string title )
6854 {
69- foldersKeys . Clear ( ) ;
70- Folders . Clear ( ) ;
55+ var collapsedFoldersEnumerable = folders . Where ( pair => pair . Value . IsCollapsed ) . Select ( pair => pair . Key ) ;
56+ var collapsedFolders = new HashSet < string > ( collapsedFoldersEnumerable ) ;
57+
58+ folders . Clear ( ) ;
7159 nodes . Clear ( ) ;
7260
7361 var titleNode = new TreeNode ( )
@@ -80,23 +68,27 @@ public void Load(IEnumerable<ITreeData> data, string title)
8068 SetNodeIcon ( titleNode ) ;
8169 nodes . Add ( titleNode ) ;
8270
71+ var hideChildren = false ;
72+ var hideChildrenBelowLevel = 0 ;
73+
8374 foreach ( var d in data )
8475 {
8576 var parts = d . Name . Split ( '/' ) ;
8677 for ( int i = 0 ; i < parts . Length ; i ++ )
8778 {
8879 var label = parts [ i ] ;
89- var name = String . Join ( "/" , parts , 0 , i + 1 ) ;
80+ var level = i + 1 ;
81+ var name = String . Join ( "/" , parts , 0 , level ) ;
9082 var isFolder = i < parts . Length - 1 ;
91- var alreadyExists = Folders . ContainsKey ( name ) ;
83+ var alreadyExists = folders . ContainsKey ( name ) ;
9284 if ( ! alreadyExists )
9385 {
94- var node = new TreeNode ( )
86+ var node = new TreeNode
9587 {
9688 Name = name ,
9789 IsActive = d . IsActive ,
9890 Label = label ,
99- Level = i + 1 ,
91+ Level = level ,
10092 IsFolder = isFolder
10193 } ;
10294
@@ -105,17 +97,39 @@ public void Load(IEnumerable<ITreeData> data, string title)
10597 activeNode = node ;
10698 }
10799
100+ if ( hideChildren )
101+ {
102+ if ( level <= hideChildrenBelowLevel )
103+ {
104+ hideChildren = false ;
105+ }
106+ else
107+ {
108+ node . IsHidden = true ;
109+ }
110+ }
111+
108112 SetNodeIcon ( node ) ;
109113
110114 nodes . Add ( node ) ;
111115 if ( isFolder )
112116 {
113- Folders . Add ( name , null ) ;
117+ if ( collapsedFolders . Contains ( name ) )
118+ {
119+ node . IsCollapsed = true ;
120+
121+ if ( ! hideChildren )
122+ {
123+ hideChildren = true ;
124+ hideChildrenBelowLevel = level ;
125+ }
126+ }
127+
128+ folders . Add ( name , node ) ;
114129 }
115130 }
116131 }
117132 }
118- foldersKeys = Folders . Keys . Cast < string > ( ) . ToList ( ) ;
119133 }
120134
121135 public Rect Render ( Rect rect , Vector2 scroll , Action < TreeNode > singleClick = null , Action < TreeNode > doubleClick = null , Action < TreeNode > rightClick = null )
0 commit comments