Skip to content

Commit df2ec99

Browse files
committed
Update search bar behavior
1 parent a3b7d79 commit df2ec99

File tree

6 files changed

+91
-36
lines changed

6 files changed

+91
-36
lines changed

UInspectorPlus/ComponentMethodDrawer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public ComponentMethodDrawer(Type type)
104104
public string Filter {
105105
get { return filter; }
106106
set {
107+
if(filter == value) return;
107108
filter = value;
108109
InitComponentMethods(false);
109110
}

UInspectorPlus/Helpers.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,16 @@ public static class Helper {
7373
// Delegate hacks to access the internal methods
7474
private delegate Gradient DoGradientField(GUIContent guiContent, Rect rect, Gradient gradient);
7575
private static readonly DoGradientField doGradientField = GetDelegate<EditorGUI, DoGradientField>("GradientField");
76-
7776
private delegate Gradient DoLayoutGradientField(GUIContent guiContent, Gradient gradient, params GUILayoutOption[] options);
7877
private static readonly DoLayoutGradientField doLayoutGradiantField = GetDelegate<EditorGUILayout, DoLayoutGradientField>("GradientField");
7978

79+
80+
private delegate string DoToolbarSearchField(string text, params GUILayoutOption[] options);
81+
private static readonly DoToolbarSearchField doToolbarSearchField = GetDelegate<EditorGUILayout, DoToolbarSearchField>("ToolbarSearchField");
82+
83+
private delegate string DoToolbarDropDownSearchField(string text, string[] searchModes, ref int searchMode, params GUILayoutOption[] options);
84+
private static readonly DoToolbarDropDownSearchField doToolbarDropDownSearchField = GetDelegate<EditorGUILayout, DoToolbarDropDownSearchField>("ToolbarSearchField");
85+
8086
private static readonly Hashtable storedState = new Hashtable();
8187

8288
static Helper() {
@@ -433,6 +439,14 @@ internal static Gradient GradientField(GUIContent label, Gradient value, params
433439
return doLayoutGradiantField(label, value, options);
434440
}
435441

442+
internal static string ToolbarSearchField(string text, params GUILayoutOption[] options) {
443+
return doToolbarSearchField(text, options);
444+
}
445+
446+
internal static string ToolbarSearchField(string text, string[] searchModes, ref int searchMode, params GUILayoutOption[] options) {
447+
return doToolbarDropDownSearchField(text, searchModes, ref searchMode, options);
448+
}
449+
436450
private static void ClickObject(UnityObject obj) {
437451
var newClickTime = EditorApplication.timeSinceStartup;
438452
if(newClickTime - clickTime < 0.3 && obj != null)

UInspectorPlus/InspectorChildWindow.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,7 @@ private void OnGUI() {
3636
GUILayout.BeginHorizontal(EditorStyles.toolbar);
3737
updateProps = GUILayout.Toggle(updateProps, "Update Props", EditorStyles.toolbarButton);
3838
GUILayout.Space(8);
39-
drawer.searchText = EditorGUILayout.TextField(drawer.searchText, Helper.GetGUIStyle("ToolbarSeachTextField"));
40-
if(GUILayout.Button(
41-
GUIContent.none,
42-
Helper.GetGUIStyle(
43-
string.IsNullOrEmpty(drawer.searchText) ?
44-
"ToolbarSeachCancelButtonEmpty" :
45-
"ToolbarSeachCancelButton"
46-
)
47-
)) {
48-
drawer.searchText = string.Empty;
49-
GUI.FocusControl(null);
50-
}
39+
drawer.searchText = Helper.ToolbarSearchField(drawer.searchText);
5140
GUILayout.FlexibleSpace();
5241
GUILayout.EndHorizontal();
5342
scrollPos = GUILayout.BeginScrollView(scrollPos);

UInspectorPlus/InspectorDrawer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ public void Draw(bool drawHeader = true, bool readOnly = false) {
154154
EditorGUILayout.BeginHorizontal();
155155
EditorGUILayout.LabelField(GUIContent.none, GUILayout.Width(EditorGUIUtility.singleLineHeight));
156156
EditorGUILayout.BeginVertical();
157+
methodDrawer.Filter = searchText;
157158
methodDrawer.Draw();
158159
EditorGUILayout.EndVertical();
159160
EditorGUILayout.EndHorizontal();

UInspectorPlus/InspectorPlus.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ internal class InspectorPlus: EditorWindow, IHasCustomMenu {
1212
"or you may likely to corrupt your project or even crashes the editor!";
1313
private readonly List<InspectorDrawer[]> drawers = new List<InspectorDrawer[]>();
1414
private readonly TypeMatcher typeMatcher = new TypeMatcher();
15+
private static readonly string[] searchModes = new[] { "Selected Component Members", "Types" };
1516
private string searchText;
16-
private bool shouldSearchTypes;
17+
private int searchMode = 0;
1718
private Vector2 scrollPos;
1819
private bool initialized;
1920
private bool autoUpdateValues;
@@ -36,6 +37,10 @@ private void OnDisable() {
3637
typeMatcher.OnRequestRedraw -= Repaint;
3738
}
3839

40+
private void OnDestroy() {
41+
typeMatcher.Dispose();
42+
}
43+
3944
private void Initialize() {
4045
if(initialized) return;
4146
autoUpdateValues = EditorPrefs.GetBool("inspectorplus_autoupdate", true);
@@ -56,17 +61,9 @@ private void OnGUI() {
5661
GUILayout.BeginHorizontal(EditorStyles.toolbar);
5762
GUI.changed = false;
5863
GUILayout.Space(8);
59-
searchText = EditorGUILayout.TextField(searchText, Helper.GetGUIStyle("ToolbarSeachTextField"));
60-
if(GUILayout.Button(GUIContent.none, Helper.GetGUIStyle(string.IsNullOrEmpty(searchText) ? "ToolbarSeachCancelButtonEmpty" : "ToolbarSeachCancelButton"))) {
61-
searchText = string.Empty;
62-
GUI.FocusControl(null);
63-
}
64-
if(GUI.changed)
65-
IterateDrawers<ComponentMethodDrawer>(methodDrawer => methodDrawer.Filter = searchText);
64+
searchText = Helper.ToolbarSearchField(searchText, searchModes, ref searchMode);
6665
GUILayout.Space(8);
67-
if(shouldSearchTypes = GUILayout.Toggle(shouldSearchTypes, EditorGUIUtility.IconContent("d_FilterByType", "Search Types"), EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
68-
typeMatcher.SearchText = searchText;
69-
EditorGUI.BeginDisabledGroup(instanceIds == null || instanceIds.Length == 0);
66+
EditorGUI.BeginDisabledGroup(instanceIds == null || instanceIds.Length == 0 || searchMode != 0);
7067
if(GUILayout.Button(EditorGUIUtility.IconContent("TreeEditor.Trash", "Destroy Selection"),
7168
EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
7269
DestroyAll();
@@ -75,12 +72,18 @@ private void OnGUI() {
7572
GUI.changed = false;
7673
scrollPos = GUILayout.BeginScrollView(scrollPos);
7774
EditorGUILayout.HelpBox(description, MessageType.Warning);
78-
foreach(var drawer in drawers.SelectMany(drawer => drawer)) {
79-
drawer.searchText = searchText;
80-
drawer.Draw();
75+
switch(searchMode) {
76+
case 0:
77+
foreach(var drawer in drawers.SelectMany(drawer => drawer)) {
78+
drawer.searchText = searchText;
79+
drawer.Draw();
80+
}
81+
break;
82+
case 1:
83+
typeMatcher.SearchText = searchText;
84+
typeMatcher.Draw();
85+
break;
8186
}
82-
if(shouldSearchTypes)
83-
typeMatcher.Draw();
8487
GUILayout.FlexibleSpace();
8588
GUILayout.Space(EditorGUIUtility.singleLineHeight / 2);
8689
GUILayout.EndScrollView();

UInspectorPlus/TypeMatcher.cs

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
using System;
2+
using System.Reflection;
23
using System.Collections.Generic;
34
using System.Linq;
45
using UnityEngine;
56
using UnityEditor;
67
using System.Threading;
78

89
namespace UInspectorPlus {
9-
internal class TypeMatcher {
10+
internal class TypeMatcher: IDisposable {
1011
public Thread bgWorker;
1112
public event Action OnRequestRedraw;
1213
private readonly HashSet<Type> searchedTypes = new HashSet<Type>();
14+
private readonly List<Assembly> pendingAssemblies = new List<Assembly>();
15+
private AppDomain currentDomain;
1316
private string searchText = string.Empty;
1417
private Type[] searchTypeResult = null;
1518

@@ -55,12 +58,37 @@ public void Draw() {
5558
}
5659

5760
private void InitSearch() {
58-
if(searchedTypes.Count > 0) return;
59-
searchedTypes.UnionWith(
60-
from assembly in AppDomain.CurrentDomain.GetAssemblies()
61-
from type in Helper.LooseGetTypes(assembly)
62-
select type
63-
);
61+
if(currentDomain == null) {
62+
currentDomain = AppDomain.CurrentDomain;
63+
searchedTypes.UnionWith(
64+
from assembly in currentDomain.GetAssemblies()
65+
from type in Helper.LooseGetTypes(assembly)
66+
select type
67+
);
68+
currentDomain.AssemblyLoad += OnAssemblyLoad;
69+
currentDomain.DomainUnload += OnAppDomainUnload;
70+
}
71+
if(pendingAssemblies.Count > 0) {
72+
var buffer = pendingAssemblies.ToArray();
73+
pendingAssemblies.Clear();
74+
searchedTypes.UnionWith(
75+
from assembly in buffer
76+
from type in Helper.LooseGetTypes(assembly)
77+
select type
78+
);
79+
}
80+
}
81+
82+
private void OnAssemblyLoad(object sender, AssemblyLoadEventArgs e) {
83+
pendingAssemblies.Add(e.LoadedAssembly);
84+
}
85+
86+
private void OnAppDomainUnload(object sender, EventArgs e) {
87+
currentDomain = null;
88+
}
89+
90+
~TypeMatcher() {
91+
Dispose();
6492
}
6593

6694
private void DoSearch() {
@@ -95,5 +123,24 @@ private void RequestRedraw() {
95123
EditorApplication.update -= RequestRedraw;
96124
if(OnRequestRedraw != null) OnRequestRedraw.Invoke();
97125
}
126+
127+
public void Dispose() {
128+
try {
129+
if(currentDomain != null) {
130+
currentDomain.AssemblyLoad -= OnAssemblyLoad;
131+
currentDomain.DomainUnload -= OnAppDomainUnload;
132+
}
133+
} catch {
134+
} finally {
135+
currentDomain = null;
136+
}
137+
try {
138+
if(bgWorker != null && bgWorker.IsAlive)
139+
bgWorker.Abort();
140+
} catch {
141+
} finally {
142+
bgWorker = null;
143+
}
144+
}
98145
}
99146
}

0 commit comments

Comments
 (0)