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

Commit 1ca009a

Browse files
Functionality to retain the checked state of nodes when loading data
1 parent 4836c5a commit 1ca009a

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
@@ -153,7 +153,7 @@ protected Texture GetNodeIconBadge(ChangesTreeNode node)
153153
return Styles.GetFileStatusIcon(gitFileStatus, false);
154154
}
155155

156-
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, GitStatusEntryTreeData? treeData)
156+
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitStatusEntryTreeData? treeData)
157157
{
158158
var node = new ChangesTreeNode
159159
{
@@ -165,11 +165,12 @@ protected override ChangesTreeNode CreateTreeNode(string path, string label, int
165165
IsHidden = isHidden,
166166
IsCollapsed = isCollapsed,
167167
TreeIsCheckable = IsCheckable,
168+
CheckState = isChecked ? CheckState.Checked : CheckState.Empty,
168169
GitFileStatus = treeData.HasValue ? treeData.Value.FileStatus : GitFileStatus.None,
169170
ProjectPath = treeData.HasValue ? treeData.Value.ProjectPath : null
170171
};
171172

172-
if (isFolder)
173+
if (isFolder && level >= 0)
173174
{
174175
folders.Add(node.Path, node);
175176
}

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

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

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

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

0 commit comments

Comments
 (0)