diff --git a/Editor/Builders/AssetsItemBuilder.cs b/Editor/Builders/AssetsItemBuilder.cs index dd1fe70..6b6c4da 100644 --- a/Editor/Builders/AssetsItemBuilder.cs +++ b/Editor/Builders/AssetsItemBuilder.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; using TNRD.Items; using TNRD.Utilities; using UnityEditor; @@ -46,7 +47,60 @@ public AdvancedDropdownItem Build() } } - return root; + return Collapse(root); + } + + private AdvancedDropdownItem Collapse(AdvancedDropdownItem root) + { + AdvancedDropdownItem[] rootChildren = root.children.ToArray(); + + if (root is IDropdownItem) + { + return root; + } + + if (rootChildren.Length == 0) + { + return null; + } + AdvancedDropdownItem newRoot = new(root.name) + { + icon = root.icon, + enabled = root.enabled, + id = root.id, + }; + + while (rootChildren.Length == 1 && rootChildren[0] is {} singleChild and not IDropdownItem) + { + newRoot = new AdvancedDropdownItem(CollapseName($"{newRoot.name}/{singleChild.name}")) + { + icon = singleChild.icon, + id = singleChild.id, + }; + rootChildren = singleChild.children.ToArray(); + } + bool addedChildren = false; + foreach (var child in rootChildren) + { + AdvancedDropdownItem newChild = Collapse(child); + if (newChild != null) + { + newRoot.AddChild(newChild); + addedChildren = true; + } + } + return addedChildren ? newRoot : null; + } + + private const int MAX_NAME_LENGTH = 90; + private const int HALF_LENGTH = (MAX_NAME_LENGTH - 4) / 2; + private string CollapseName(string name) + { + if (name.Length > MAX_NAME_LENGTH) + { + return $"{name[..HALF_LENGTH]}...{name[^HALF_LENGTH..]}"; + } + return name; } private void CreateItemForPath(AdvancedDropdownItem root, string path) diff --git a/Editor/Builders/ClassesItemBuilder.cs b/Editor/Builders/ClassesItemBuilder.cs index 92bdbf3..c29d98f 100644 --- a/Editor/Builders/ClassesItemBuilder.cs +++ b/Editor/Builders/ClassesItemBuilder.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; using TNRD.Items; using TNRD.Utilities; using UnityEditor; @@ -35,6 +36,10 @@ public AdvancedDropdownItem Build() AdvancedDropdownItem parent = GetOrCreateParentItem(type, root); parent.AddChild(new ClassDropdownItem(type)); } + if (!root.children.Any()) + { + return null; + } return root; } diff --git a/Editor/Builders/SceneItemBuilder.cs b/Editor/Builders/SceneItemBuilder.cs index ac2a4ce..c9f3d7c 100644 --- a/Editor/Builders/SceneItemBuilder.cs +++ b/Editor/Builders/SceneItemBuilder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using TNRD.Items; using TNRD.Utilities; @@ -26,10 +26,7 @@ public AdvancedDropdownItem Build() { if (scene == null || !scene.Value.IsValid()) { - return new AdvancedDropdownItem("Scene") - { - enabled = false - }; + return null; } AdvancedDropdownItem root = new AdvancedDropdownItemWrapper("Scene"); @@ -40,6 +37,10 @@ public AdvancedDropdownItem Build() { CreateItemsRecursive(rootGameObject.transform, root); } + if (!root.children.Any()) + { + return null; + } return root; } diff --git a/Editor/Items/ClassDropdownItem.cs b/Editor/Items/ClassDropdownItem.cs index c6af182..6be4718 100644 --- a/Editor/Items/ClassDropdownItem.cs +++ b/Editor/Items/ClassDropdownItem.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using TNRD.Utilities; using UnityEditor.IMGUI.Controls; @@ -14,7 +14,9 @@ public ClassDropdownItem(Type type) : base(type.Name) { this.type = type; - enabled = type.GetConstructors().Any(x => x.GetParameters().Length == 0); + // Needs a parameterless constructor or be a value type + enabled = type.GetConstructors().Any(x => x.GetParameters().Length == 0) + || type.IsValueType; icon = IconUtility.ScriptIcon; } diff --git a/Editor/Utilities/AdvancedDropdownItemWrapper.cs b/Editor/Utilities/AdvancedDropdownItemWrapper.cs index 930a1b5..c1d568b 100644 --- a/Editor/Utilities/AdvancedDropdownItemWrapper.cs +++ b/Editor/Utilities/AdvancedDropdownItemWrapper.cs @@ -1,4 +1,4 @@ -using UnityEditor.IMGUI.Controls; +using UnityEditor.IMGUI.Controls; namespace TNRD.Utilities { @@ -12,7 +12,10 @@ public AdvancedDropdownItemWrapper(string name) public new AdvancedDropdownItemWrapper AddChild(AdvancedDropdownItem child) { - base.AddChild(child); + if (child != null) + { + base.AddChild(child); + } return this; } diff --git a/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs b/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs index 9442f59..01461a2 100644 --- a/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs +++ b/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Reflection; using TNRD.Builders; @@ -60,10 +60,7 @@ protected override AdvancedDropdownItem BuildRoot() item.AddChild(new SceneItemBuilder(interfaceType, relevantScene).Build()); } - foreach (AdvancedDropdownItem dropdownItem in item.children) - { - dropdownItem.AddChild(new NoneDropdownItem()); - } + item.AddChild(new NoneDropdownItem()); if (canSort) {