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

Commit 4ff9775

Browse files
Merge pull request #541 from github-for-unity/fixes/nested-meta-file
Nesting meta files in changes view
2 parents 23d6fad + 40b0749 commit 4ff9775

File tree

5 files changed

+242
-39
lines changed

5 files changed

+242
-39
lines changed

src/GitHub.Api/UI/TreeBase.cs

Lines changed: 70 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ public interface ITreeNode
1717
string Path { get; set; }
1818
string Label { get; set; }
1919
int Level { get; set; }
20+
bool IsContainer { get; set; }
2021
bool IsFolder { get; set; }
22+
bool IsFolderOrContainer { get; }
2123
bool IsCollapsed { get; set; }
2224
bool IsHidden { get; set; }
2325
bool IsActive { get; set; }
@@ -52,29 +54,45 @@ public void Load(IEnumerable<TData> treeDatas)
5254
var isCheckable = IsCheckable;
5355

5456
var isSelected = IsSelectable && selectedNodePath != null && Title == selectedNodePath;
55-
AddNode(Title, Title, -1 + displayRootLevel, true, false, false, false, isSelected, false, null);
57+
AddNode(Title, Title, -1 + displayRootLevel, true, false, false, false, isSelected, false, null, false);
5658

5759
var hideChildren = false;
5860
var hideChildrenBelowLevel = 0;
5961

6062
var folders = new HashSet<string>();
6163

64+
TNode lastAddedNode = null;
6265
foreach (var treeData in treeDatas)
6366
{
6467
var parts = treeData.Path.Split(new[] { pathSeparator }, StringSplitOptions.None);
65-
for (var i = 0; i < parts.Length; i++)
68+
for (var level = 0; level < parts.Length; level++)
6669
{
67-
var label = parts[i];
68-
var level = i + 1;
69-
var nodePath = String.Join(pathSeparator, parts, 0, level);
70-
var isFolder = i < parts.Length - 1;
70+
var label = parts[level];
71+
var nodePath = String.Join(pathSeparator, parts, 0, level + 1);
72+
var isFolder = level < parts.Length - 1;
73+
var parentIsPromoted = false;
74+
75+
if (lastAddedNode != null)
76+
{
77+
if (!lastAddedNode.IsFolder)
78+
{
79+
if (PromoteNode(lastAddedNode, label))
80+
{
81+
Logger.Trace("Promoting Node Label:{0}", lastAddedNode.Label);
82+
83+
parentIsPromoted = true;
84+
lastAddedNode.IsContainer = true;
85+
}
86+
}
87+
}
88+
7189
var alreadyExists = folders.Contains(nodePath);
7290
if (!alreadyExists)
7391
{
7492
var nodeIsHidden = false;
7593
if (hideChildren)
7694
{
77-
if (level <= hideChildrenBelowLevel)
95+
if (level + 1 <= hideChildrenBelowLevel)
7896
{
7997
hideChildren = false;
8098
}
@@ -100,7 +118,7 @@ public void Load(IEnumerable<TData> treeDatas)
100118
if (!hideChildren)
101119
{
102120
hideChildren = true;
103-
hideChildrenBelowLevel = level;
121+
hideChildrenBelowLevel = level + 1;
104122
}
105123
}
106124
}
@@ -112,8 +130,9 @@ public void Load(IEnumerable<TData> treeDatas)
112130
}
113131

114132
isSelected = selectedNodePath != null && nodePath == selectedNodePath;
115-
AddNode(nodePath, label, i + displayRootLevel, isFolder, isActive, nodeIsHidden,
116-
nodeIsCollapsed, isSelected, isChecked, treeNodeTreeData);
133+
134+
lastAddedNode = AddNode(nodePath, label, level + displayRootLevel + (parentIsPromoted ? 1 : 0), isFolder, isActive, nodeIsHidden,
135+
nodeIsCollapsed, isSelected, isChecked, treeNodeTreeData, false);
117136
}
118137
}
119138
}
@@ -124,7 +143,7 @@ public void Load(IEnumerable<TData> treeDatas)
124143
for (var index = nodes.Count - 1; index >= 0; index--)
125144
{
126145
var node = nodes[index];
127-
if (node.Level >= 0 && node.IsFolder)
146+
if (node.Level >= 0 && node.IsFolderOrContainer)
128147
{
129148
bool? anyChecked = null;
130149
bool? allChecked = null;
@@ -150,6 +169,27 @@ public void Load(IEnumerable<TData> treeDatas)
150169
}
151170
}
152171

172+
protected bool PromoteNode(TNode previouslyAddedNode, string nextLabel)
173+
{
174+
if (!PromoteMetaFiles)
175+
{
176+
return false;
177+
}
178+
179+
if (previouslyAddedNode == null)
180+
{
181+
return false;
182+
}
183+
184+
if (!nextLabel.EndsWith(".meta"))
185+
{
186+
return false;
187+
}
188+
189+
var substring = nextLabel.Substring(0, nextLabel.Length - 5);
190+
return previouslyAddedNode.Label == substring;
191+
}
192+
153193
public void SetCheckStateOnAll(bool isChecked)
154194
{
155195
var nodeCheckState = isChecked ? CheckState.Checked : CheckState.Empty;
@@ -174,9 +214,9 @@ public void SetCheckStateOnAll(bool isChecked)
174214

175215
protected abstract IEnumerable<string> GetCollapsedFolders();
176216

177-
protected void AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isSelected, bool isChecked, TData? treeData)
217+
protected TNode AddNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isSelected, bool isChecked, TData? treeData, bool isContainer)
178218
{
179-
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, isChecked, treeData);
219+
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, isChecked, treeData, isContainer);
180220

181221
SetNodeIcon(node);
182222
Nodes.Add(node);
@@ -185,6 +225,8 @@ protected void AddNode(string path, string label, int level, bool isFolder, bool
185225
{
186226
SelectedNode = node;
187227
}
228+
229+
return node;
188230
}
189231

190232
protected void Clear()
@@ -198,7 +240,7 @@ protected void Clear()
198240

199241
protected abstract void AddCheckedNode(TNode node);
200242

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

203245
protected abstract void OnClear();
204246

@@ -212,7 +254,7 @@ protected void ToggleNodeVisibility(int idx, TNode node)
212254
for (; idx < Nodes.Count && Nodes[idx].Level > nodeLevel; idx++)
213255
{
214256
Nodes[idx].IsHidden = node.IsCollapsed;
215-
if (Nodes[idx].IsFolder && !node.IsCollapsed && Nodes[idx].IsCollapsed)
257+
if (Nodes[idx].IsFolderOrContainer && !node.IsCollapsed && Nodes[idx].IsCollapsed)
216258
{
217259
var level = Nodes[idx].Level;
218260
for (idx++; idx < Nodes.Count && Nodes[idx].Level > level; idx++)
@@ -245,11 +287,7 @@ protected void ToggleNodeChecked(int idx, TNode node)
245287
break;
246288
}
247289

248-
if (node.IsFolder)
249-
{
250-
ToggleChildrenChecked(idx, node, isChecked);
251-
}
252-
else
290+
if (!node.IsFolder)
253291
{
254292
if (isChecked)
255293
{
@@ -261,6 +299,11 @@ protected void ToggleNodeChecked(int idx, TNode node)
261299
}
262300
}
263301

302+
if (node.IsFolderOrContainer)
303+
{
304+
ToggleChildrenChecked(idx, node, isChecked);
305+
}
306+
264307
ToggleParentFoldersChecked(idx, node, isChecked);
265308
}
266309

@@ -272,11 +315,7 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
272315
var wasChecked = childNode.CheckState == CheckState.Checked;
273316
childNode.CheckState = isChecked ? CheckState.Checked : CheckState.Empty;
274317

275-
if (childNode.IsFolder)
276-
{
277-
ToggleChildrenChecked(i, childNode, isChecked);
278-
}
279-
else
318+
if (!childNode.IsFolder)
280319
{
281320
if (isChecked && !wasChecked)
282321
{
@@ -287,6 +326,11 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
287326
RemoveCheckedNode(childNode);
288327
}
289328
}
329+
330+
if (childNode.IsFolderOrContainer)
331+
{
332+
ToggleChildrenChecked(i, childNode, isChecked);
333+
}
290334
}
291335
}
292336

@@ -367,5 +411,6 @@ private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked)
367411
public abstract bool IsSelectable { get; set; }
368412
public abstract bool IsCheckable { get; set; }
369413
public abstract string PathSeparator { get; set; }
414+
protected abstract bool PromoteMetaFiles { get; }
370415
}
371416
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ public override string PathSeparator
8585
set { pathSeparator = value; }
8686
}
8787

88+
protected override bool PromoteMetaFiles
89+
{
90+
get { return true; }
91+
}
92+
8893
public override ChangesTreeNode SelectedNode
8994
{
9095
get
@@ -189,7 +194,7 @@ protected Texture GetNodeIconBadge(ChangesTreeNode node)
189194
return Styles.GetFileStatusIcon(gitFileStatus, node.IsLocked);
190195
}
191196

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

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

Lines changed: 26 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

@@ -577,6 +589,11 @@ public override string PathSeparator
577589
set { pathSeparator = value; }
578590
}
579591

592+
protected override bool PromoteMetaFiles
593+
{
594+
get { return false; }
595+
}
596+
580597
public override TreeNode SelectedNode
581598
{
582599
get
@@ -643,13 +660,14 @@ protected Texture GetNodeIcon(TreeNode node)
643660
return nodeIcon;
644661
}
645662

646-
protected override TreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitBranchTreeData? treeData)
663+
protected override TreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitBranchTreeData? treeData, bool isContainer)
647664
{
648665
var node = new TreeNode {
649666
Path = path,
650667
Label = label,
651668
Level = level,
652669
IsFolder = isFolder,
670+
IsContainer = isContainer,
653671
IsActive = isActive,
654672
IsHidden = isHidden,
655673
IsCollapsed = isCollapsed,

src/tests/UnitTests/SetUpFixture.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ public void SetUp()
1414
LogHelper.TracingEnabled = true;
1515

1616
LogHelper.LogAdapter = new MultipleLogAdapter(
17-
new FileLogAdapter($"..\\{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}-unit-tests.log")
18-
//, new ConsoleLogAdapter()
17+
new FileLogAdapter($"..\\{DateTime.UtcNow:yyyyMMddHHmmss}-unit-tests.log")
18+
, new ConsoleLogAdapter()
1919
);
2020
}
2121
}

0 commit comments

Comments
 (0)