Skip to content

Commit 2e96e65

Browse files
committed
feat: added project
1 parent 5b2207a commit 2e96e65

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1005
-0
lines changed

Editor.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor/Builders.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using TNRD.Items;
6+
using UnityEditor;
7+
using UnityEditor.IMGUI.Controls;
8+
using UnityEngine.Assertions;
9+
using Object = UnityEngine.Object;
10+
11+
namespace TNRD
12+
{
13+
internal sealed class AssetsItemBuilder
14+
{
15+
private readonly HashSet<string> addedItems;
16+
private readonly Dictionary<string, AdvancedDropdownItem> splitToItem;
17+
private readonly Type interfaceType;
18+
19+
public AssetsItemBuilder(Type interfaceType)
20+
{
21+
Assert.IsNotNull(interfaceType);
22+
Assert.IsTrue(interfaceType.IsInterface);
23+
24+
addedItems = new HashSet<string>();
25+
splitToItem = new Dictionary<string, AdvancedDropdownItem>();
26+
this.interfaceType = interfaceType;
27+
}
28+
29+
public AdvancedDropdownItem Build()
30+
{
31+
AdvancedDropdownItem root = new AdvancedDropdownItem("Assets");
32+
splitToItem.Add("Assets/", root); // Needs the trailing slash to be recognized later on
33+
34+
TypeCache.TypeCollection types = TypeCache.GetTypesDerivedFrom(interfaceType);
35+
foreach (Type type in types)
36+
{
37+
if (type.IsAbstract || type.IsInterface) continue;
38+
if (!type.IsSubclassOf(typeof(Object))) continue;
39+
40+
IEnumerable<string> paths = AssetDatabase.FindAssets($"t:{type.Name}")
41+
.Select(AssetDatabase.GUIDToAssetPath);
42+
43+
foreach (string path in paths)
44+
{
45+
CreateItemForPath(root, path);
46+
}
47+
}
48+
49+
return root;
50+
}
51+
52+
private void CreateItemForPath(AdvancedDropdownItem root, string path)
53+
{
54+
if (addedItems.Contains(path))
55+
return;
56+
57+
AdvancedDropdownItem parent = GetOrCreateParentItem(root, path);
58+
parent.AddChild(new AssetDropdownItem(path));
59+
addedItems.Add(path);
60+
}
61+
62+
private AdvancedDropdownItem GetOrCreateParentItem(AdvancedDropdownItem root, string path)
63+
{
64+
string currentPath = string.Empty;
65+
string[] splits = path.Split('/');
66+
67+
AdvancedDropdownItem item = root;
68+
69+
for (int i = 0; i < splits.Length - 1; i++)
70+
{
71+
string split = splits[i];
72+
currentPath += split + '/';
73+
74+
if (splitToItem.TryGetValue(currentPath, out AdvancedDropdownItem foundItem))
75+
{
76+
item = foundItem;
77+
continue;
78+
}
79+
80+
AdvancedDropdownItem advancedDropdownItem = new AdvancedDropdownItem(split)
81+
{
82+
icon = IconUtility.FolderIcon
83+
};
84+
item.AddChild(advancedDropdownItem);
85+
item = advancedDropdownItem;
86+
splitToItem.Add(currentPath, advancedDropdownItem);
87+
}
88+
89+
return item;
90+
}
91+
}
92+
}

Editor/Builders/AssetsItemBuilder.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using TNRD.Items;
5+
using UnityEditor;
6+
using UnityEditor.IMGUI.Controls;
7+
using UnityEngine.Assertions;
8+
9+
namespace TNRD
10+
{
11+
internal sealed class ClassesItemBuilder
12+
{
13+
private readonly Dictionary<string, AdvancedDropdownItem> splitToItem;
14+
private readonly Type interfaceType;
15+
16+
public ClassesItemBuilder(Type interfaceType)
17+
{
18+
Assert.IsNotNull(interfaceType);
19+
Assert.IsTrue(interfaceType.IsInterface);
20+
21+
splitToItem = new Dictionary<string, AdvancedDropdownItem>();
22+
this.interfaceType = interfaceType;
23+
}
24+
25+
public AdvancedDropdownItem Build()
26+
{
27+
AdvancedDropdownItem root = new AdvancedDropdownItem("Classes");
28+
29+
TypeCache.TypeCollection types = TypeCache.GetTypesDerivedFrom(interfaceType);
30+
foreach (Type type in types)
31+
{
32+
if (type.IsAbstract || type.IsInterface) continue;
33+
if (type.IsSubclassOf(typeof(UnityEngine.Object))) continue;
34+
35+
AdvancedDropdownItem parent = GetOrCreateParentItem(type, root);
36+
parent.AddChild(new ClassDropdownItem(type));
37+
}
38+
39+
return root;
40+
}
41+
42+
private AdvancedDropdownItem GetOrCreateParentItem(Type type, AdvancedDropdownItem root)
43+
{
44+
Assert.IsNotNull(type);
45+
Assert.IsNotNull(root);
46+
Assert.IsNotNull(splitToItem);
47+
48+
if (string.IsNullOrEmpty(type.Namespace))
49+
return root;
50+
51+
string[] splits = type.Namespace.Split('.');
52+
53+
AdvancedDropdownItem splitItem = root;
54+
55+
string currentPath = string.Empty;
56+
foreach (string split in splits)
57+
{
58+
currentPath += split + '.';
59+
60+
if (splitToItem.TryGetValue(currentPath, out AdvancedDropdownItem foundItem))
61+
{
62+
splitItem = foundItem;
63+
continue;
64+
}
65+
66+
AdvancedDropdownItem newSplitItem = new AdvancedDropdownItem(split)
67+
{
68+
icon = IconUtility.FolderIcon
69+
};
70+
splitToItem.Add(currentPath, newSplitItem);
71+
splitItem.AddChild(newSplitItem);
72+
splitItem = newSplitItem;
73+
}
74+
75+
return splitItem;
76+
}
77+
}
78+
}

Editor/Builders/ClassesItemBuilder.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System;
2+
using System.Linq;
3+
using TNRD.Items;
4+
using UnityEditor.IMGUI.Controls;
5+
using UnityEngine;
6+
using UnityEngine.Assertions;
7+
using UnityEngine.SceneManagement;
8+
9+
namespace TNRD
10+
{
11+
internal sealed class SceneItemBuilder
12+
{
13+
private readonly Type interfaceType;
14+
private readonly Scene? scene;
15+
16+
public SceneItemBuilder(Type interfaceType, Scene? scene)
17+
{
18+
Assert.IsNotNull(interfaceType);
19+
20+
this.interfaceType = interfaceType;
21+
this.scene = scene;
22+
}
23+
24+
public AdvancedDropdownItem Build()
25+
{
26+
if (scene == null)
27+
{
28+
return new AdvancedDropdownItem("Scene")
29+
{
30+
enabled = false
31+
};
32+
}
33+
34+
AdvancedDropdownItem root = new AdvancedDropdownItemWrapper("Scene");
35+
36+
GameObject[] rootGameObjects = scene.Value.GetRootGameObjects();
37+
38+
foreach (GameObject rootGameObject in rootGameObjects)
39+
{
40+
CreateItemsRecursive(rootGameObject.transform, root);
41+
}
42+
43+
return root;
44+
}
45+
46+
private void CreateItemsRecursive(Transform transform, AdvancedDropdownItem parent)
47+
{
48+
AdvancedDropdownItem advancedDropdownItem = new AdvancedDropdownItem(transform.name)
49+
{
50+
icon = IconUtility.GameObjectIcon
51+
};
52+
53+
Component[] components = transform.GetComponents(interfaceType);
54+
55+
foreach (Component component in components)
56+
{
57+
advancedDropdownItem.AddChild(new SceneDropdownItem(component));
58+
}
59+
60+
foreach (Transform child in transform)
61+
{
62+
CreateItemsRecursive(child, advancedDropdownItem);
63+
}
64+
65+
if (advancedDropdownItem.children.Any())
66+
parent.AddChild(advancedDropdownItem);
67+
}
68+
}
69+
}

Editor/Builders/SceneItemBuilder.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor/Items.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor/Items/AssetDropdownItem.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.IO;
2+
using UnityEditor;
3+
using UnityEditor.IMGUI.Controls;
4+
using UnityEngine;
5+
6+
namespace TNRD.Items
7+
{
8+
internal sealed class AssetDropdownItem : AdvancedDropdownItem, IDropdownItem
9+
{
10+
private readonly string path;
11+
12+
/// <inheritdoc />
13+
public AssetDropdownItem(string path)
14+
: base(Path.GetFileNameWithoutExtension(path))
15+
{
16+
this.path = path;
17+
icon = IconUtility.GetIconForObject(path);
18+
}
19+
20+
/// <inheritdoc />
21+
ReferenceMode IDropdownItem.Mode => ReferenceMode.Unity;
22+
23+
/// <inheritdoc />
24+
object IDropdownItem.GetValue()
25+
{
26+
return AssetDatabase.LoadAssetAtPath<Object>(path);
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)