8
8
9
9
namespace GitHub . Unity
10
10
{
11
+ [ Serializable ]
12
+ public class TreeNodeDictionary : SerializableDictionary < string , TreeNode > { }
13
+
11
14
[ Serializable ]
12
15
public class Tree
13
16
{
@@ -36,10 +39,9 @@ public class Tree
36
39
[ SerializeField ] private List < TreeNode > nodes = new List < TreeNode > ( ) ;
37
40
[ SerializeField ] private TreeNode selectedNode = null ;
38
41
[ SerializeField ] private TreeNode activeNode = null ;
39
- [ SerializeField ] private List < string > foldersKeys = new List < string > ( ) ;
42
+ [ SerializeField ] private TreeNodeDictionary folders = new TreeNodeDictionary ( ) ;
40
43
41
44
[ NonSerialized ] private Stack < bool > indents = new Stack < bool > ( ) ;
42
- [ NonSerialized ] private Hashtable folders ;
43
45
44
46
public bool IsInitialized { get { return nodes != null && nodes . Count > 0 && ! String . IsNullOrEmpty ( nodes [ 0 ] . Name ) ; } }
45
47
public bool RequiresRepaint { get ; private set ; }
@@ -60,26 +62,12 @@ private set
60
62
61
63
public TreeNode ActiveNode { get { return activeNode ; } }
62
64
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
-
79
65
public void Load ( IEnumerable < ITreeData > data , string title )
80
66
{
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 ( ) ;
83
71
nodes . Clear ( ) ;
84
72
85
73
var titleNode = new TreeNode ( )
@@ -92,23 +80,27 @@ public void Load(IEnumerable<ITreeData> data, string title)
92
80
titleNode . Load ( ) ;
93
81
nodes . Add ( titleNode ) ;
94
82
83
+ var hideChildren = false ;
84
+ var hideChildrenBelowLevel = 0 ;
85
+
95
86
foreach ( var d in data )
96
87
{
97
88
var parts = d . Name . Split ( '/' ) ;
98
89
for ( int i = 0 ; i < parts . Length ; i ++ )
99
90
{
100
91
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 ) ;
102
94
var isFolder = i < parts . Length - 1 ;
103
- var alreadyExists = Folders . ContainsKey ( name ) ;
95
+ var alreadyExists = folders . ContainsKey ( name ) ;
104
96
if ( ! alreadyExists )
105
97
{
106
- var node = new TreeNode ( )
98
+ var node = new TreeNode
107
99
{
108
100
Name = name ,
109
101
IsActive = d . IsActive ,
110
102
Label = label ,
111
- Level = i + 1 ,
103
+ Level = level ,
112
104
IsFolder = isFolder
113
105
} ;
114
106
@@ -117,19 +109,41 @@ public void Load(IEnumerable<ITreeData> data, string title)
117
109
activeNode = node ;
118
110
}
119
111
112
+ if ( hideChildren )
113
+ {
114
+ if ( level <= hideChildrenBelowLevel )
115
+ {
116
+ hideChildren = false ;
117
+ }
118
+ else
119
+ {
120
+ node . IsHidden = true ;
121
+ }
122
+ }
123
+
120
124
ResetNodeIcons ( node ) ;
121
125
122
126
node . Load ( ) ;
123
127
124
128
nodes . Add ( node ) ;
125
129
if ( isFolder )
126
130
{
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 ) ;
128
143
}
129
144
}
130
145
}
131
146
}
132
- foldersKeys = Folders . Keys . Cast < string > ( ) . ToList ( ) ;
133
147
}
134
148
135
149
public Rect Render ( Rect rect , Vector2 scroll , Action < TreeNode > singleClick = null , Action < TreeNode > doubleClick = null , Action < TreeNode > rightClick = null )
0 commit comments