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

Commit 56bc104

Browse files
Completing functionality to nest meta files
1 parent 994d52f commit 56bc104

File tree

5 files changed

+142
-18
lines changed

5 files changed

+142
-18
lines changed

src/GitHub.Api/UI/TreeBase.cs

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,38 @@ public void Load(IEnumerable<TData> treeDatas)
6060

6161
var folders = new HashSet<string>();
6262

63+
TNode lastAddedNode = null;
6364
foreach (var treeData in treeDatas)
6465
{
6566
var parts = treeData.Path.Split(new[] { pathSeparator }, StringSplitOptions.None);
66-
for (var i = 0; i < parts.Length; i++)
67+
for (var level = 0; level < parts.Length; level++)
6768
{
68-
var label = parts[i];
69-
var level = i + 1;
70-
var nodePath = String.Join(pathSeparator, parts, 0, level);
71-
var isFolder = i < parts.Length - 1;
69+
var label = parts[level];
70+
var nodePath = String.Join(pathSeparator, parts, 0, level + 1);
71+
var isFolder = level < parts.Length - 1;
72+
var parentIsPromoted = false;
73+
74+
if (lastAddedNode != null)
75+
{
76+
if (!lastAddedNode.IsFolder)
77+
{
78+
if (PromoteNode(lastAddedNode, label))
79+
{
80+
Logger.Trace("Promoting Node Label:{0}", lastAddedNode.Label);
81+
82+
parentIsPromoted = true;
83+
lastAddedNode.IsContainer = true;
84+
}
85+
}
86+
}
87+
7288
var alreadyExists = folders.Contains(nodePath);
7389
if (!alreadyExists)
7490
{
7591
var nodeIsHidden = false;
7692
if (hideChildren)
7793
{
78-
if (level <= hideChildrenBelowLevel)
94+
if (level + 1 <= hideChildrenBelowLevel)
7995
{
8096
hideChildren = false;
8197
}
@@ -101,7 +117,7 @@ public void Load(IEnumerable<TData> treeDatas)
101117
if (!hideChildren)
102118
{
103119
hideChildren = true;
104-
hideChildrenBelowLevel = level;
120+
hideChildrenBelowLevel = level + 1;
105121
}
106122
}
107123
}
@@ -113,7 +129,8 @@ public void Load(IEnumerable<TData> treeDatas)
113129
}
114130

115131
isSelected = selectedNodePath != null && nodePath == selectedNodePath;
116-
AddNode(nodePath, label, i + displayRootLevel, isFolder, isActive, nodeIsHidden,
132+
133+
lastAddedNode = AddNode(nodePath, label, level + displayRootLevel + (parentIsPromoted ? 1 : 0), isFolder, isActive, nodeIsHidden,
117134
nodeIsCollapsed, isSelected, isChecked, treeNodeTreeData, false);
118135
}
119136
}
@@ -151,6 +168,27 @@ public void Load(IEnumerable<TData> treeDatas)
151168
}
152169
}
153170

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

176214
protected abstract IEnumerable<string> GetCollapsedFolders();
177215

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)
216+
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)
179217
{
180218
var node = CreateTreeNode(path, label, level, isFolder, isActive, isHidden, isCollapsed, isChecked, treeData, isContainer);
181219

@@ -186,6 +224,8 @@ protected void AddNode(string path, string label, int level, bool isFolder, bool
186224
{
187225
SelectedNode = node;
188226
}
227+
228+
return node;
189229
}
190230

191231
protected void Clear()
@@ -370,5 +410,6 @@ private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked)
370410
public abstract bool IsSelectable { get; set; }
371411
public abstract bool IsCheckable { get; set; }
372412
public abstract string PathSeparator { get; set; }
413+
protected abstract bool PromoteMetaFiles { get; }
373414
}
374415
}

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

Lines changed: 5 additions & 0 deletions
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

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,11 @@ public override string PathSeparator
589589
set { pathSeparator = value; }
590590
}
591591

592+
protected override bool PromoteMetaFiles
593+
{
594+
get { return false; }
595+
}
596+
592597
public override TreeNode SelectedNode
593598
{
594599
get

src/tests/UnitTests/SetUpFixture.cs

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

1515
Logging.LogAdapter = new MultipleLogAdapter(
16-
new FileLogAdapter($"..\\{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}-unit-tests.log")
17-
//, new ConsoleLogAdapter()
16+
new FileLogAdapter($"..\\{DateTime.UtcNow:yyyyMMddHHmmss}-unit-tests.log")
17+
, new ConsoleLogAdapter()
1818
);
1919
}
2020
}

src/tests/UnitTests/UI/TreeBaseTests.cs

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ void CreateTreeNode(string path, string label, int level, bool isFolder, bool is
5959
bool IsSelectable { get; set; }
6060
bool IsCheckable { get; set; }
6161
string PathSeparator { get; set; }
62+
bool PromoteMetaFiles { get; set; }
6263
}
6364

6465
public class TestTree : TreeBase<TestTreeNode, TestTreeData>
@@ -295,6 +296,18 @@ public override string PathSeparator
295296
TestTreeListener.PathSeparator = value;
296297
}
297298
}
299+
300+
protected override bool PromoteMetaFiles
301+
{
302+
get
303+
{
304+
if (traceLogging)
305+
{
306+
Logger.Trace("Property Get PromoteMetaFiles");
307+
}
308+
return TestTreeListener.PromoteMetaFiles;
309+
}
310+
}
298311
}
299312

300313
[TestFixture]
@@ -548,13 +561,14 @@ public void ShouldPopulateTreeWithSingleEntryWithMetaInPath()
548561
testTreeListener.DisplayRootNode.Returns(true);
549562
testTreeListener.IsSelectable.Returns(false);
550563
testTreeListener.Title.Returns("Test Tree");
564+
testTreeListener.PromoteMetaFiles.Returns(true);
551565

552566
var testTreeData = new[] {
553567
new TestTreeData {
554-
Path = "Folder\\test.txt"
568+
Path = "Folder\\Default Scene.unity"
555569
},
556570
new TestTreeData {
557-
Path = "Folder\\test.txt.meta"
571+
Path = "Folder\\Default Scene.unity.meta"
558572
}
559573
};
560574
testTree.Load(testTreeData);
@@ -578,14 +592,73 @@ public void ShouldPopulateTreeWithSingleEntryWithMetaInPath()
578592
IsFolder = true
579593
},
580594
new TestTreeNode {
581-
Path = "Folder\\test.txt",
582-
Label = "test.txt",
595+
Path = "Folder\\Default Scene.unity",
596+
Label = "Default Scene.unity",
583597
Level = 2,
584-
TreeData = testTreeData[0]
598+
TreeData = testTreeData[0],
599+
IsContainer = true
600+
},
601+
new TestTreeNode {
602+
Path = "Folder\\Default Scene.unity.meta",
603+
Label = "Default Scene.unity.meta",
604+
Level = 3,
605+
TreeData = testTreeData[1]
606+
}
607+
});
608+
}
609+
[Test]
610+
public void ShouldPopulateTreeWithSingleEntryWithNonPromotedMetaInPath()
611+
{
612+
var testTree = new TestTree(true);
613+
var testTreeListener = testTree.TestTreeListener;
614+
615+
testTreeListener.GetCollapsedFolders().Returns(new string[0]);
616+
testTreeListener.SelectedNode.Returns((TestTreeNode)null);
617+
testTreeListener.GetCheckedFiles().Returns(new string[0]);
618+
testTreeListener.Nodes.Returns(new List<TestTreeNode>());
619+
testTreeListener.PathSeparator.Returns(@"\");
620+
testTreeListener.DisplayRootNode.Returns(true);
621+
testTreeListener.IsSelectable.Returns(false);
622+
testTreeListener.Title.Returns("Test Tree");
623+
testTreeListener.PromoteMetaFiles.Returns(true);
624+
625+
var testTreeData = new[] {
626+
new TestTreeData {
627+
Path = "Folder\\Default Scene.unity"
628+
},
629+
new TestTreeData {
630+
Path = "Folder\\Default Scene2.unity.meta"
631+
}
632+
};
633+
testTree.Load(testTreeData);
634+
635+
testTreeListener.Received(1).OnClear();
636+
testTreeListener.Received(1).SelectedNode = null;
637+
638+
testTreeListener.Received(4).CreateTreeNode(Args.String, Args.String, Args.Int, Args.Bool, Args.Bool, Args.Bool, Args.Bool, Args.Bool, Arg.Any<TestTreeData?>());
639+
testTreeListener.Received(4).SetNodeIcon(Arg.Any<TestTreeNode>());
640+
641+
testTree.CreatedTreeNodes.ShouldAllBeEquivalentTo(new[] {
642+
new TestTreeNode {
643+
Path = "Test Tree",
644+
Label = "Test Tree",
645+
IsFolder = true
646+
},
647+
new TestTreeNode {
648+
Path = "Folder",
649+
Label = "Folder",
650+
Level = 1,
651+
IsFolder = true
652+
},
653+
new TestTreeNode {
654+
Path = "Folder\\Default Scene.unity",
655+
Label = "Default Scene.unity",
656+
Level = 2,
657+
TreeData = testTreeData[0],
585658
},
586659
new TestTreeNode {
587-
Path = "Folder\\test.txt.meta",
588-
Label = "test.txt.meta",
660+
Path = "Folder\\Default Scene2.unity.meta",
661+
Label = "Default Scene2.unity.meta",
589662
Level = 2,
590663
TreeData = testTreeData[1]
591664
}

0 commit comments

Comments
 (0)