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

Commit 2a65f7b

Browse files
Merge branch 'enhancements/tree-view-checked-state' into enhancements/changes-tree-view
2 parents 4fbfdf5 + bccbe5e commit 2a65f7b

File tree

2 files changed

+44
-20
lines changed

2 files changed

+44
-20
lines changed

src/GitHub.Api/UI/TreeLoader.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public interface ITree
88
{
99
void AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isSelected, int customIntTag = 0, string customStringTag = (string)null);
1010
void Clear();
11-
HashSet<string> GetCollapsedFolders();
11+
IEnumerable<string> GetCollapsedFolders();
12+
IEnumerable<string> GetCheckedFiles();
1213
string Title { get; }
1314
bool DisplayRootNode { get; }
1415
bool IsCheckable { get; }
@@ -20,7 +21,7 @@ public static class TreeLoader
2021
{
2122
public static void Load(ITree tree, IEnumerable<ITreeData> treeDatas)
2223
{
23-
var collapsedFolders = tree.GetCollapsedFolders();
24+
var collapsedFolders = new HashSet<string>(tree.GetCollapsedFolders());
2425
var selectedNodePath = tree.SelectedNodePath;
2526

2627
tree.Clear();

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

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public abstract class Tree: ITree
2828

2929
[SerializeField] private List<TreeNode> nodes = new List<TreeNode>();
3030
[SerializeField] private TreeNode selectedNode = null;
31-
[SerializeField] private TreeNode activeNode = null;
3231
[SerializeField] private TreeNodeDictionary folders = new TreeNodeDictionary();
32+
[SerializeField] private TreeNodeDictionary checkedFileNodes = new TreeNodeDictionary();
3333

3434
[NonSerialized] private Stack<bool> indents = new Stack<bool>();
3535
[NonSerialized] private Action<TreeNode> rightClickNextRender;
@@ -100,11 +100,6 @@ public void AddNode(string path, string label, int level, bool isFolder, bool is
100100
SetNodeIcon(node);
101101
nodes.Add(node);
102102

103-
if (isActive)
104-
{
105-
activeNode = node;
106-
}
107-
108103
if (isSelected)
109104
{
110105
SelectedNode = node;
@@ -119,14 +114,19 @@ public void AddNode(string path, string label, int level, bool isFolder, bool is
119114
public void Clear()
120115
{
121116
folders.Clear();
117+
checkedFileNodes.Clear();
122118
nodes.Clear();
123119
SelectedNode = null;
124120
}
125121

126-
public HashSet<string> GetCollapsedFolders()
122+
public IEnumerable<string> GetCollapsedFolders()
127123
{
128-
var collapsedFoldersEnumerable = folders.Where(pair => pair.Value.IsCollapsed).Select(pair => pair.Key);
129-
return new HashSet<string>(collapsedFoldersEnumerable);
124+
return folders.Where(pair => pair.Value.IsCollapsed).Select(pair => pair.Key);
125+
}
126+
127+
public IEnumerable<string> GetCheckedFiles()
128+
{
129+
return checkedFileNodes.Where(pair => pair.Value.CheckState == CheckState.Checked).Select(pair => pair.Key);
130130
}
131131

132132
public Rect Render(Rect containingRect, Rect rect, Vector2 scroll, Action<TreeNode> singleClick = null, Action<TreeNode> doubleClick = null, Action<TreeNode> rightClick = null)
@@ -277,6 +277,13 @@ private void ToggleNodeChecked(int idx, TreeNode node)
277277
{
278278
ToggleChildrenChecked(idx, node, isChecked);
279279
}
280+
else
281+
{
282+
if (isChecked)
283+
{
284+
checkedFileNodes.Add(node.Path, node);
285+
}
286+
}
280287

281288
ToggleParentFoldersChecked(idx, node, isChecked);
282289
}
@@ -297,6 +304,13 @@ private void ToggleChildrenChecked(int idx, TreeNode node, bool isChecked)
297304
{
298305
ToggleChildrenChecked(i, childNode, isChecked);
299306
}
307+
else
308+
{
309+
if (isChecked)
310+
{
311+
checkedFileNodes.Add(node.Path, node);
312+
}
313+
}
300314
}
301315
}
302316

@@ -392,13 +406,13 @@ private void ToggleNodeVisibility(int idx, TreeNode node)
392406

393407
private bool HandleInput(Rect rect, TreeNode currentNode, int index, Action<TreeNode> singleClick = null, Action<TreeNode> doubleClick = null, Action<TreeNode> rightClick = null)
394408
{
395-
bool selectionChanged = false;
409+
var requiresRepaint = false;
396410
var clickRect = new Rect(0f, rect.y, rect.width, rect.height);
397411
if (Event.current.type == EventType.MouseDown && clickRect.Contains(Event.current.mousePosition))
398412
{
399413
Event.current.Use();
400414
SelectedNode = currentNode;
401-
selectionChanged = true;
415+
requiresRepaint = true;
402416
var clickCount = Event.current.clickCount;
403417
var mouseButton = Event.current.button;
404418

@@ -424,41 +438,50 @@ private bool HandleInput(Rect rect, TreeNode currentNode, int index, Action<Tree
424438
int directionX = Event.current.keyCode == KeyCode.LeftArrow ? -1 : Event.current.keyCode == KeyCode.RightArrow ? 1 : 0;
425439
if (directionY != 0 || directionX != 0)
426440
{
441+
Event.current.Use();
442+
427443
if (directionY > 0)
428444
{
429-
selectionChanged = SelectNext(index, false) != index;
445+
requiresRepaint = SelectNext(index, false) != index;
430446
}
431447
else if (directionY < 0)
432448
{
433-
selectionChanged = SelectPrevious(index, false) != index;
449+
requiresRepaint = SelectPrevious(index, false) != index;
434450
}
435451
else if (directionX > 0)
436452
{
437453
if (currentNode.IsFolder && currentNode.IsCollapsed)
438454
{
439455
ToggleNodeVisibility(index, currentNode);
440-
Event.current.Use();
441456
}
442457
else
443458
{
444-
selectionChanged = SelectNext(index, true) != index;
459+
requiresRepaint = SelectNext(index, true) != index;
445460
}
446461
}
447462
else if (directionX < 0)
448463
{
449464
if (currentNode.IsFolder && !currentNode.IsCollapsed)
450465
{
451466
ToggleNodeVisibility(index, currentNode);
452-
Event.current.Use();
453467
}
454468
else
455469
{
456-
selectionChanged = SelectPrevious(index, true) != index;
470+
requiresRepaint = SelectPrevious(index, true) != index;
457471
}
458472
}
459473
}
474+
475+
if (IsCheckable && Event.current.keyCode == KeyCode.Space)
476+
{
477+
Event.current.Use();
478+
479+
ToggleNodeChecked(index, currentNode);
480+
requiresRepaint = true;
481+
}
460482
}
461-
return selectionChanged;
483+
484+
return requiresRepaint;
462485
}
463486

464487
private int SelectNext(int index, bool foldersOnly)

0 commit comments

Comments
 (0)