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 abstract class Tree
13
16
{
@@ -24,10 +27,9 @@ public abstract class Tree
24
27
[ SerializeField ] private List < TreeNode > nodes = new List < TreeNode > ( ) ;
25
28
[ SerializeField ] private TreeNode selectedNode = null ;
26
29
[ SerializeField ] private TreeNode activeNode = null ;
27
- [ SerializeField ] private List < string > foldersKeys = new List < string > ( ) ;
30
+ [ SerializeField ] private TreeNodeDictionary folders = new TreeNodeDictionary ( ) ;
28
31
29
32
[ NonSerialized ] private Stack < bool > indents = new Stack < bool > ( ) ;
30
- [ NonSerialized ] private Hashtable folders ;
31
33
32
34
public bool IsInitialized { get { return nodes != null && nodes . Count > 0 && ! String . IsNullOrEmpty ( nodes [ 0 ] . Name ) ; } }
33
35
public bool RequiresRepaint { get ; private set ; }
@@ -48,26 +50,12 @@ private set
48
50
49
51
public TreeNode ActiveNode { get { return activeNode ; } }
50
52
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
-
67
53
public void Load ( IEnumerable < ITreeData > data , string title )
68
54
{
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 ( ) ;
71
59
nodes . Clear ( ) ;
72
60
73
61
var titleNode = new TreeNode ( )
@@ -80,23 +68,27 @@ public void Load(IEnumerable<ITreeData> data, string title)
80
68
SetNodeIcon ( titleNode ) ;
81
69
nodes . Add ( titleNode ) ;
82
70
71
+ var hideChildren = false ;
72
+ var hideChildrenBelowLevel = 0 ;
73
+
83
74
foreach ( var d in data )
84
75
{
85
76
var parts = d . Name . Split ( '/' ) ;
86
77
for ( int i = 0 ; i < parts . Length ; i ++ )
87
78
{
88
79
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 ) ;
90
82
var isFolder = i < parts . Length - 1 ;
91
- var alreadyExists = Folders . ContainsKey ( name ) ;
83
+ var alreadyExists = folders . ContainsKey ( name ) ;
92
84
if ( ! alreadyExists )
93
85
{
94
- var node = new TreeNode ( )
86
+ var node = new TreeNode
95
87
{
96
88
Name = name ,
97
89
IsActive = d . IsActive ,
98
90
Label = label ,
99
- Level = i + 1 ,
91
+ Level = level ,
100
92
IsFolder = isFolder
101
93
} ;
102
94
@@ -105,17 +97,39 @@ public void Load(IEnumerable<ITreeData> data, string title)
105
97
activeNode = node ;
106
98
}
107
99
100
+ if ( hideChildren )
101
+ {
102
+ if ( level <= hideChildrenBelowLevel )
103
+ {
104
+ hideChildren = false ;
105
+ }
106
+ else
107
+ {
108
+ node . IsHidden = true ;
109
+ }
110
+ }
111
+
108
112
SetNodeIcon ( node ) ;
109
113
110
114
nodes . Add ( node ) ;
111
115
if ( isFolder )
112
116
{
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 ) ;
114
129
}
115
130
}
116
131
}
117
132
}
118
- foldersKeys = Folders . Keys . Cast < string > ( ) . ToList ( ) ;
119
133
}
120
134
121
135
public Rect Render ( Rect rect , Vector2 scroll , Action < TreeNode > singleClick = null , Action < TreeNode > doubleClick = null , Action < TreeNode > rightClick = null )
0 commit comments