Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 95586c5

Browse files
Merge pull request #478 from github-for-unity/fixes/branches-view-expands-on-reload
Maintaining collapsed state during reload
2 parents fd4b6ed + 33b8780 commit 95586c5

File tree

1 file changed

+40
-26
lines changed

1 file changed

+40
-26
lines changed

src/UnityExtension/Assets/Editor/GitHub.Unity/UI/TreeControl.cs

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
namespace 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

Comments
 (0)