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

Commit 4baadd7

Browse files
Merge pull request #530 from github-for-unity/fixes/tree-retains-checked-state
Functionality to retain the checked state of nodes when loading data
2 parents a513bee + 8dab7ad commit 4baadd7

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

src/GitHub.Api/UI/TreeBase.cs

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34

45
namespace GitHub.Unity
56
{
@@ -31,13 +32,14 @@ public void Load(IEnumerable<TData> treeDatas)
3132
{
3233
var collapsedFolders = new HashSet<string>(GetCollapsedFolders());
3334
var selectedNodePath = SelectedNodePath;
35+
var checkedFiles = new HashSet<string>(GetCheckedFiles());
3436

3537
Clear();
3638

3739
var displayRootLevel = DisplayRootNode ? 1 : 0;
3840

3941
var isSelected = IsSelectable && selectedNodePath != null && Title == selectedNodePath;
40-
AddNode(Title, Title, -1 + displayRootLevel, true, false, false, false, isSelected, null);
42+
AddNode(Title, Title, -1 + displayRootLevel, true, false, false, false, isSelected, false, null);
4143

4244
var hideChildren = false;
4345
var hideChildrenBelowLevel = 0;
@@ -70,6 +72,7 @@ public void Load(IEnumerable<TData> treeDatas)
7072
}
7173

7274
var isActive = false;
75+
var isChecked = false;
7376
var nodeIsCollapsed = false;
7477
TData? treeNodeTreeData = null;
7578

@@ -92,11 +95,42 @@ public void Load(IEnumerable<TData> treeDatas)
9295
{
9396
isActive = treeData.IsActive;
9497
treeNodeTreeData = treeData;
98+
isChecked = checkedFiles.Contains(nodePath);
9599
}
96100

97101
isSelected = selectedNodePath != null && nodePath == selectedNodePath;
98102
AddNode(nodePath, label, i + displayRootLevel, isFolder, isActive, nodeIsHidden,
99-
nodeIsCollapsed, isSelected, treeNodeTreeData);
103+
nodeIsCollapsed, isSelected, isChecked, treeNodeTreeData);
104+
}
105+
}
106+
}
107+
108+
if (IsCheckable && checkedFiles.Any())
109+
{
110+
for (var index = Nodes.Count - 1; index >= 0; index--)
111+
{
112+
var node = Nodes[index];
113+
if (node.Level >= 0 && node.IsFolder)
114+
{
115+
bool? anyChecked = null;
116+
bool? allChecked = null;
117+
118+
for (var i = index + 1; i < Nodes.Count; i++)
119+
{
120+
var nodeCompare = Nodes[i];
121+
if (nodeCompare.Level < node.Level + 1)
122+
{
123+
break;
124+
}
125+
126+
var nodeIsChecked = nodeCompare.CheckState == CheckState.Checked;
127+
allChecked = (allChecked ?? true) && nodeIsChecked;
128+
anyChecked = (anyChecked ?? false) || nodeIsChecked;
129+
}
130+
131+
node.CheckState = anyChecked.Value
132+
? (allChecked.Value ? CheckState.Checked : CheckState.Mixed)
133+
: CheckState.Empty;
100134
}
101135
}
102136
}
@@ -126,10 +160,9 @@ public void SetCheckStateOnAll(bool isChecked)
126160

127161
protected abstract IEnumerable<string> GetCollapsedFolders();
128162

129-
protected void AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden,
130-
bool isCollapsed, bool isSelected, TData? treeData)
163+
protected void AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isSelected, bool isChecked, TData? treeData)
131164
{
132-
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, treeData);
165+
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, isChecked, treeData);
133166

134167
SetNodeIcon(node);
135168
Nodes.Add(node);
@@ -151,8 +184,7 @@ protected void Clear()
151184

152185
protected abstract void AddCheckedNode(TNode node);
153186

154-
protected abstract TNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive,
155-
bool isHidden, bool isCollapsed, TData? treeData);
187+
protected abstract TNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, TData? treeData);
156188

157189
protected abstract void OnClear();
158190

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ protected Texture GetNodeIconBadge(ChangesTreeNode node)
160160
return Styles.GetFileStatusIcon(gitFileStatus, node.IsLocked);
161161
}
162162

163-
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, GitStatusEntryTreeData? treeData)
163+
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitStatusEntryTreeData? treeData)
164164
{
165165
var gitFileStatus = GitFileStatus.None;
166166
var projectPath = (string) null;
@@ -183,12 +183,13 @@ protected override ChangesTreeNode CreateTreeNode(string path, string label, int
183183
IsHidden = isHidden,
184184
IsCollapsed = isCollapsed,
185185
TreeIsCheckable = IsCheckable,
186+
CheckState = isChecked ? CheckState.Checked : CheckState.Empty,
186187
GitFileStatus = gitFileStatus,
187188
ProjectPath = projectPath,
188189
IsLocked = isLocked
189190
};
190191

191-
if (isFolder)
192+
if (isFolder && level >= 0)
192193
{
193194
folders.Add(node.Path, node);
194195
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ protected Texture GetNodeIcon(TreeNode node)
633633
return nodeIcon;
634634
}
635635

636-
protected override TreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, GitBranchTreeData? treeData)
636+
protected override TreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitBranchTreeData? treeData)
637637
{
638638
var node = new TreeNode {
639639
Path = path,
@@ -643,10 +643,11 @@ protected override TreeNode CreateTreeNode(string path, string label, int level,
643643
IsActive = isActive,
644644
IsHidden = isHidden,
645645
IsCollapsed = isCollapsed,
646-
TreeIsCheckable = IsCheckable
646+
TreeIsCheckable = IsCheckable,
647+
CheckState = isChecked ? CheckState.Checked: CheckState.Empty
647648
};
648649

649-
if (isFolder)
650+
if (isFolder && level >= 0)
650651
{
651652
folders.Add(node.Path, node);
652653
}

0 commit comments

Comments
 (0)