From eb41f94dcd2fada2163760a4e461b3716eb3a077 Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 14:28:11 +0200 Subject: [PATCH 1/7] Only add "None" to dropdown root to avoid needless nesting --- Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs b/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs index 9442f59..8a7d125 100644 --- a/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs +++ b/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs @@ -59,11 +59,7 @@ protected override AdvancedDropdownItem BuildRoot() item.AddChild(new AssetsItemBuilder(interfaceType).Build()); item.AddChild(new SceneItemBuilder(interfaceType, relevantScene).Build()); } - - foreach (AdvancedDropdownItem dropdownItem in item.children) - { - dropdownItem.AddChild(new NoneDropdownItem()); - } + item.AddChild(new NoneDropdownItem()); if (canSort) { From 10f468611970db624ff0c6458d3310c88f3d5ffc Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 15:55:02 +0200 Subject: [PATCH 2/7] Fix disabled class item if type struct --- Editor/Items/ClassDropdownItem.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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; } From afa0935cb8aab84af5d286f6a1cb7a27e6b92855 Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 15:55:46 +0200 Subject: [PATCH 3/7] Allow null return from Build and add NoneDropdownItem to main dropdown --- Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs b/Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs index 8a7d125..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; @@ -59,6 +59,7 @@ protected override AdvancedDropdownItem BuildRoot() item.AddChild(new AssetsItemBuilder(interfaceType).Build()); item.AddChild(new SceneItemBuilder(interfaceType, relevantScene).Build()); } + item.AddChild(new NoneDropdownItem()); if (canSort) From b29e0665c29a7f874903546e225eba7cd185e967 Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 15:56:56 +0200 Subject: [PATCH 4/7] Implement Collapse method for AdvancedDropdownItem Added a Collapse method to simplify the structure of AdvancedDropdownItem by merging single item folders --- Editor/Builders/AssetsItemBuilder.cs | 58 +++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) 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) From ed70a7bc3c6fe3a0af3ede5a834533d2bcfb73ce Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 15:57:36 +0200 Subject: [PATCH 5/7] ClassesItemBuilder.Build return null when empty --- Editor/Builders/ClassesItemBuilder.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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; } From 117c34eef876bbe46fb08218527ee43fc191590e Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 15:58:19 +0200 Subject: [PATCH 6/7] SceneItemBuilder.Build return null when empty --- Editor/Builders/SceneItemBuilder.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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; } From cdd5495ae8080710cb256ab1ef5caf865c6fec79 Mon Sep 17 00:00:00 2001 From: Lou Garczynski Date: Thu, 18 Sep 2025 16:03:36 +0200 Subject: [PATCH 7/7] Fixed null exception --- Editor/Utilities/AdvancedDropdownItemWrapper.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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; }