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

Commit 74b9c57

Browse files
Separating adding general support for nodes that are containers but not folders
1 parent ef194a8 commit 74b9c57

File tree

4 files changed

+50
-29
lines changed

4 files changed

+50
-29
lines changed

src/GitHub.Api/UI/TreeBase.cs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ public interface ITreeNode
1616
string Path { get; set; }
1717
string Label { get; set; }
1818
int Level { get; set; }
19+
bool IsContainer { get; set; }
1920
bool IsFolder { get; set; }
21+
bool IsFolderOrContainer { get; }
2022
bool IsCollapsed { get; set; }
2123
bool IsHidden { get; set; }
2224
bool IsActive { get; set; }
@@ -51,7 +53,7 @@ public void Load(IEnumerable<TData> treeDatas)
5153
var isCheckable = IsCheckable;
5254

5355
var isSelected = IsSelectable && selectedNodePath != null && Title == selectedNodePath;
54-
AddNode(Title, Title, -1 + displayRootLevel, true, false, false, false, isSelected, false, null);
56+
AddNode(Title, Title, -1 + displayRootLevel, true, false, false, false, isSelected, false, null, false);
5557

5658
var hideChildren = false;
5759
var hideChildrenBelowLevel = 0;
@@ -112,7 +114,7 @@ public void Load(IEnumerable<TData> treeDatas)
112114

113115
isSelected = selectedNodePath != null && nodePath == selectedNodePath;
114116
AddNode(nodePath, label, i + displayRootLevel, isFolder, isActive, nodeIsHidden,
115-
nodeIsCollapsed, isSelected, isChecked, treeNodeTreeData);
117+
nodeIsCollapsed, isSelected, isChecked, treeNodeTreeData, false);
116118
}
117119
}
118120
}
@@ -123,7 +125,7 @@ public void Load(IEnumerable<TData> treeDatas)
123125
for (var index = nodes.Count - 1; index >= 0; index--)
124126
{
125127
var node = nodes[index];
126-
if (node.Level >= 0 && node.IsFolder)
128+
if (node.Level >= 0 && node.IsFolderOrContainer)
127129
{
128130
bool? anyChecked = null;
129131
bool? allChecked = null;
@@ -173,9 +175,9 @@ public void SetCheckStateOnAll(bool isChecked)
173175

174176
protected abstract IEnumerable<string> GetCollapsedFolders();
175177

176-
protected void AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isSelected, bool isChecked, TData? treeData)
178+
protected void AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isSelected, bool isChecked, TData? treeData, bool isContainer)
177179
{
178-
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, isChecked, treeData);
180+
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, isChecked, treeData, isContainer);
179181

180182
SetNodeIcon(node);
181183
Nodes.Add(node);
@@ -197,7 +199,7 @@ protected void Clear()
197199

198200
protected abstract void AddCheckedNode(TNode node);
199201

200-
protected abstract TNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, TData? treeData);
202+
protected abstract TNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, TData? treeData, bool isContainer);
201203

202204
protected abstract void OnClear();
203205

@@ -211,7 +213,7 @@ protected void ToggleNodeVisibility(int idx, TNode node)
211213
for (; idx < Nodes.Count && Nodes[idx].Level > nodeLevel; idx++)
212214
{
213215
Nodes[idx].IsHidden = node.IsCollapsed;
214-
if (Nodes[idx].IsFolder && !node.IsCollapsed && Nodes[idx].IsCollapsed)
216+
if (Nodes[idx].IsFolderOrContainer && !node.IsCollapsed && Nodes[idx].IsCollapsed)
215217
{
216218
var level = Nodes[idx].Level;
217219
for (idx++; idx < Nodes.Count && Nodes[idx].Level > level; idx++)
@@ -244,11 +246,7 @@ protected void ToggleNodeChecked(int idx, TNode node)
244246
break;
245247
}
246248

247-
if (node.IsFolder)
248-
{
249-
ToggleChildrenChecked(idx, node, isChecked);
250-
}
251-
else
249+
if (!node.IsFolder)
252250
{
253251
if (isChecked)
254252
{
@@ -260,6 +258,11 @@ protected void ToggleNodeChecked(int idx, TNode node)
260258
}
261259
}
262260

261+
if (node.IsFolderOrContainer)
262+
{
263+
ToggleChildrenChecked(idx, node, isChecked);
264+
}
265+
263266
ToggleParentFoldersChecked(idx, node, isChecked);
264267
}
265268

@@ -271,11 +274,7 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
271274
var wasChecked = childNode.CheckState == CheckState.Checked;
272275
childNode.CheckState = isChecked ? CheckState.Checked : CheckState.Empty;
273276

274-
if (childNode.IsFolder)
275-
{
276-
ToggleChildrenChecked(i, childNode, isChecked);
277-
}
278-
else
277+
if (!childNode.IsFolder)
279278
{
280279
if (isChecked && !wasChecked)
281280
{
@@ -286,6 +285,11 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
286285
RemoveCheckedNode(childNode);
287286
}
288287
}
288+
289+
if (childNode.IsFolderOrContainer)
290+
{
291+
ToggleChildrenChecked(i, childNode, isChecked);
292+
}
289293
}
290294
}
291295

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ protected Texture GetNodeIconBadge(ChangesTreeNode node)
189189
return Styles.GetFileStatusIcon(gitFileStatus, node.IsLocked);
190190
}
191191

192-
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitStatusEntryTreeData? treeData)
192+
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitStatusEntryTreeData? treeData, bool isContainer)
193193
{
194194
var gitFileStatus = GitFileStatus.None;
195195
var projectPath = (string) null;

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

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ private bool HandleInput(Rect rect, TNode currentNode, int index, Action<TNode>
240240
}
241241
else if (directionX > 0)
242242
{
243-
if (currentNode.IsFolder && currentNode.IsCollapsed)
243+
if (currentNode.IsFolderOrContainer && currentNode.IsCollapsed)
244244
{
245245
ToggleNodeVisibility(index, currentNode);
246246
}
@@ -251,7 +251,7 @@ private bool HandleInput(Rect rect, TNode currentNode, int index, Action<TNode>
251251
}
252252
else if (directionX < 0)
253253
{
254-
if (currentNode.IsFolder && !currentNode.IsCollapsed)
254+
if (currentNode.IsFolderOrContainer && !currentNode.IsCollapsed)
255255
{
256256
ToggleNodeVisibility(index, currentNode);
257257
}
@@ -274,13 +274,13 @@ private bool HandleInput(Rect rect, TNode currentNode, int index, Action<TNode>
274274
return requiresRepaint;
275275
}
276276

277-
private int SelectNext(int index, bool foldersOnly)
277+
private int SelectNext(int index, bool foldersOrContainersOnly)
278278
{
279279
for (index++; index < Nodes.Count; index++)
280280
{
281281
if (Nodes[index].IsHidden)
282282
continue;
283-
if (!Nodes[index].IsFolder && foldersOnly)
283+
if (!Nodes[index].IsFolderOrContainer && foldersOrContainersOnly)
284284
continue;
285285
break;
286286
}
@@ -296,13 +296,13 @@ private int SelectNext(int index, bool foldersOnly)
296296
return index;
297297
}
298298

299-
private int SelectPrevious(int index, bool foldersOnly)
299+
private int SelectPrevious(int index, bool foldersOrContainersOnly)
300300
{
301301
for (index--; index >= 0; index--)
302302
{
303303
if (Nodes[index].IsHidden)
304304
continue;
305-
if (!Nodes[index].IsFolder && foldersOnly)
305+
if (!Nodes[index].IsFolderOrContainer && foldersOrContainersOnly)
306306
continue;
307307
break;
308308
}
@@ -344,6 +344,7 @@ public class TreeNode : ITreeNode
344344
public string label;
345345
public int level;
346346
public bool isFolder;
347+
public bool isContainer;
347348
public bool isCollapsed;
348349
public bool isHidden;
349350
public bool isActive;
@@ -372,12 +373,23 @@ public int Level
372373
set { level = value; }
373374
}
374375

376+
public bool IsContainer
377+
{
378+
get { return isContainer; }
379+
set { isContainer = value; }
380+
}
381+
375382
public bool IsFolder
376383
{
377384
get { return isFolder; }
378385
set { isFolder = value; }
379386
}
380387

388+
public bool IsFolderOrContainer
389+
{
390+
get { return IsFolder || IsContainer; }
391+
}
392+
381393
public bool IsCollapsed
382394
{
383395
get { return isCollapsed; }
@@ -459,7 +471,7 @@ public TreeNodeRenderResult Render(Rect rect, float indentation, bool isSelected
459471
}
460472

461473
var styleOn = false;
462-
if (IsFolder)
474+
if (IsFolderOrContainer)
463475
{
464476
styleOn = !IsCollapsed;
465477

@@ -643,13 +655,14 @@ protected Texture GetNodeIcon(TreeNode node)
643655
return nodeIcon;
644656
}
645657

646-
protected override TreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitBranchTreeData? treeData)
658+
protected override TreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitBranchTreeData? treeData, bool isContainer)
647659
{
648660
var node = new TreeNode {
649661
Path = path,
650662
Label = label,
651663
Level = level,
652664
IsFolder = isFolder,
665+
IsContainer = isContainer,
653666
IsActive = isActive,
654667
IsHidden = isHidden,
655668
IsCollapsed = isCollapsed,

src/tests/UnitTests/UI/TreeBaseTests.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ public class TestTreeNode : ITreeNode
1414
public string Path { get; set; }
1515
public string Label { get; set; }
1616
public int Level { get; set; }
17+
18+
public bool IsContainer { get; set; }
19+
1720
public bool IsFolder { get; set; }
21+
22+
public bool IsFolderOrContainer => IsFolder || IsContainer;
23+
1824
public bool IsCollapsed { get; set; }
1925
public bool IsHidden { get; set; }
2026
public bool IsActive { get; set; }
@@ -106,8 +112,7 @@ protected override void AddCheckedNode(TestTreeNode node)
106112
TestTreeListener.AddCheckedNode(node);
107113
}
108114

109-
protected override TestTreeNode CreateTreeNode(string path, string label, int level, bool isFolder,
110-
bool isActive, bool isHidden, bool isCollapsed, bool isChecked, TestTreeData? treeData)
115+
protected override TestTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, TestTreeData? treeData, bool isContainer)
111116
{
112117
if (traceLogging)
113118
{
@@ -471,7 +476,6 @@ public void ShouldPopulateTreeWithSingleEntryInPath()
471476
});
472477
}
473478

474-
475479
[Test]
476480
public void ShouldPopulateTreeWithTwoEntriesInPath()
477481
{

0 commit comments

Comments
 (0)