Skip to content

Commit 6bcd760

Browse files
committed
Add type search
Add ability to view static fields from type
1 parent b6c78e8 commit 6bcd760

File tree

9 files changed

+182
-35
lines changed

9 files changed

+182
-35
lines changed

UInspectorPlus/ComponentMethodDrawer.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal class ComponentMethodDrawer: IReflectorDrawer {
2222
private MethodPropertyDrawer result;
2323
private Exception thrownException;
2424
private string filter;
25-
private readonly Type ctorType;
25+
private readonly Type ctorType, targetType;
2626
private bool titleFolded = true, paramsFolded = true, resultFolded = true,
2727
drawHeader = true, privateFields = true, obsolete = true;
2828
private MethodMode mode = 0;
@@ -83,9 +83,10 @@ public ComponentMethodDrawer() {
8383
showResultSelector.valueChanged.AddListener(RequireRedraw);
8484
}
8585

86-
public ComponentMethodDrawer(object target)
86+
public ComponentMethodDrawer(object target, Type type = null)
8787
: this() {
8888
component = target;
89+
targetType = type ?? target.GetType();
8990
drawHeader = false;
9091
showMethodSelector.value = true;
9192
InitComponentMethods();
@@ -113,7 +114,8 @@ public void Call() {
113114
return;
114115
switch (mode) {
115116
case MethodMode.Constructor: if (ctorType == null) return; break;
116-
case MethodMode.Method: default: if (component == null) return; break;
117+
case MethodMode.Method: if (component == null && Helper.IsInstanceMember(selectedMember)) return; break;
118+
default: if (component == null) return; break;
117119
}
118120
try {
119121
thrownException = null;
@@ -165,12 +167,10 @@ public void Call() {
165167

166168
public void Draw() {
167169
if (drawHeader) {
168-
EditorGUI.BeginDisabledGroup(component == null);
169-
titleFolded = EditorGUILayout.InspectorTitlebar(titleFolded, component as UnityObject) || component == null;
170-
EditorGUI.EndDisabledGroup();
170+
titleFolded = EditorGUILayout.InspectorTitlebar(titleFolded, component as UnityObject);
171171
}
172172
GUI.changed = false;
173-
if (component == null || titleFolded || !drawHeader) {
173+
if (titleFolded || !drawHeader) {
174174
if (drawHeader) {
175175
EditorGUI.indentLevel++;
176176
EditorGUILayout.BeginVertical();
@@ -179,7 +179,7 @@ public void Draw() {
179179
if (mode != MethodMode.Indexer || result == null)
180180
EditorGUILayout.Space();
181181
if (mode == MethodMode.Constructor ||
182-
(mode == MethodMode.Method && component != null) ||
182+
(mode == MethodMode.Method && (component != null || !Helper.IsInstanceMember(selectedMember))) ||
183183
(mode == MethodMode.Indexer && component != null && result == null)) {
184184
if (GUI.changed) {
185185
InitComponentMethods();
@@ -223,7 +223,9 @@ private bool FilterMemberInfo(MemberInfo m) {
223223
}
224224

225225
private void AddComponentMethod(Type type) {
226-
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
226+
BindingFlags flag = BindingFlags.Static | BindingFlags.Public;
227+
if (component != null)
228+
flag |= BindingFlags.Instance;
227229
if (privateFields)
228230
flag |= BindingFlags.NonPublic;
229231
methods.AddRange(
@@ -245,11 +247,14 @@ where FilterMemberInfo(m) && m.ReturnType == type
245247
);
246248
}
247249

248-
private void AddComponentMethod(object target) {
249-
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
250+
private void AddComponentMethod(object target, Type type = null) {
251+
BindingFlags flag = BindingFlags.Static | BindingFlags.Public;
250252
if (privateFields)
251253
flag |= BindingFlags.NonPublic;
252-
Type type = target.GetType();
254+
if (target != null)
255+
flag |= BindingFlags.Instance;
256+
if (type == null)
257+
type = target.GetType();
253258
methods.AddRange(
254259
from m in type.GetProperties(flag)
255260
where FilterMemberInfo(m) && m.GetIndexParameters().Length > 0
@@ -278,7 +283,7 @@ private void InitComponentMethods(bool resetIndex = true) {
278283
methodNames = methods.Select((m, i) => GetMethodNameFormatted(m, i)).ToArray();
279284
break;
280285
default:
281-
AddComponentMethod(component);
286+
AddComponentMethod(component, targetType);
282287
break;
283288
}
284289
if (drawHeader) {
@@ -406,6 +411,8 @@ private void DrawMethod() {
406411
EditorGUILayout.BeginVertical();
407412
if (mode != MethodMode.Indexer && (selectedMember as MethodInfo).ContainsGenericParameters)
408413
EditorGUILayout.HelpBox("Generic method is not supported.", MessageType.Warning);
414+
if (mode != MethodMode.Indexer && component == null && Helper.IsInstanceMember(selectedMember))
415+
EditorGUILayout.HelpBox("Method requires an exists instance.", MessageType.Warning);
409416
else {
410417
if (parameterInfo.Length == 0)
411418
EditorGUILayout.HelpBox("There is no parameters required for this method.", MessageType.Info);

UInspectorPlus/Helpers.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,21 @@ internal static Rect ScaleRect(Rect source,
162162
);
163163
}
164164

165+
internal static bool IsInstanceMember(MemberInfo member, bool defaultResult = false) {
166+
var field = member as FieldInfo;
167+
if (field != null) return !field.IsStatic;
168+
var method = member as MethodBase;
169+
var property = member as PropertyInfo;
170+
if (method == null && property != null) {
171+
if (property.CanWrite)
172+
method = property.GetSetMethod();
173+
else if(property.CanRead)
174+
method = property.GetGetMethod();
175+
}
176+
if (method != null) return !method.IsStatic;
177+
return defaultResult;
178+
}
179+
165180
internal static string GetMemberName(MemberInfo member, bool simplifed = false, bool appendMemberName = true) {
166181
var ret = new StringBuilder();
167182
var props = new List<string>();

UInspectorPlus/InspectorChildWindow.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using UnityEngine;
22
using UnityEditor;
3+
using System;
4+
using System.Linq;
35

46
namespace UInspectorPlus {
57
internal class InspectorChildWindow: EditorWindow {
@@ -10,12 +12,19 @@ internal class InspectorChildWindow: EditorWindow {
1012
private bool isReadOnly;
1113

1214
public static void Open(object target, bool showProps, bool showPrivate, bool showObsolete, bool showMethods, bool updateProps, MethodPropertyDrawer parent) {
13-
CreateInstance<InspectorChildWindow>().InternalOpen(target, showProps, showPrivate, showObsolete, showMethods, updateProps, parent);
15+
CreateInstance<InspectorChildWindow>()
16+
.InternalOpen(target, target.GetType(), showProps, showPrivate, showObsolete, showMethods, updateProps, parent);
1417
}
1518

16-
private void InternalOpen(object target, bool showProps, bool showPrivate, bool showObsolete, bool showMethods, bool updateProps, MethodPropertyDrawer parent) {
17-
titleContent = new GUIContent(string.Format("{0} - Inspector+", target));
18-
drawer = new InspectorDrawer(target, true, showProps, showPrivate, showObsolete, showMethods);
19+
public static void OpenStatic(Type targetType, bool showProps, bool showPrivate, bool showObsolete, bool showMethods, bool updateProps, MethodPropertyDrawer parent)
20+
{
21+
CreateInstance<InspectorChildWindow>()
22+
.InternalOpen(null, targetType, showProps, showPrivate, showObsolete, showMethods, updateProps, parent);
23+
}
24+
25+
private void InternalOpen(object target, Type targetType, bool showProps, bool showPrivate, bool showObsolete, bool showMethods, bool updateProps, MethodPropertyDrawer parent) {
26+
titleContent = new GUIContent(string.Format("{0} - Inspector+", target ?? targetType));
27+
drawer = new InspectorDrawer(target, targetType, true, showProps, showPrivate, showObsolete, showMethods);
1928
drawer.OnRequireRedraw += Repaint;
2029
this.parent = parent;
2130
this.updateProps = updateProps;
@@ -57,7 +66,6 @@ private void OnGUI() {
5766
}
5867
GUILayout.FlexibleSpace();
5968
GUILayout.EndScrollView();
60-
if (drawer.target == null) Close();
6169
}
6270

6371
private void OnInspectorUpdate() {
@@ -69,5 +77,11 @@ private void OnInspectorUpdate() {
6977
private void UpdateValues() {
7078
drawer.UpdateValues(updateProps);
7179
}
80+
81+
private void IterateDrawers<T>(Action<T> each) where T : IReflectorDrawer
82+
{
83+
foreach (var methodDrawer in drawer.drawer.OfType<T>())
84+
each(methodDrawer);
85+
}
7286
}
7387
}

UInspectorPlus/InspectorDrawer.cs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,20 @@ internal class InspectorDrawer {
2727
private bool allowPrivate;
2828
private readonly bool allowMethods;
2929

30-
public InspectorDrawer(object target, bool shown, bool showProps, bool showPrivateFields, bool showObsolete, bool showMethods) {
30+
public InspectorDrawer(object target, Type targetType, bool shown, bool showProps, bool showPrivateFields, bool showObsolete, bool showMethods) {
3131
this.target = target;
3232
drawer = new List<IReflectorDrawer>();
3333
removingDrawers = new HashSet<IReflectorDrawer>();
34-
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
34+
BindingFlags flag = BindingFlags.Static | BindingFlags.Public;
35+
if (target != null)
36+
flag |= BindingFlags.Instance;
3537
if (allowPrivate = showPrivateFields)
3638
flag |= BindingFlags.NonPublic;
37-
targetType = target.GetType();
39+
this.targetType = targetType;
3840
elementType = Helper.GetGenericListType(targetType);
3941
var fields = targetType.GetFields(flag);
4042
var props = !showProps ? null : targetType.GetProperties(flag).Where(prop => prop.GetIndexParameters().Length == 0).ToArray();
41-
isInternalType = !(target is MonoBehaviour) || Attribute.IsDefined(target.GetType(), typeof(ExecuteInEditMode));
43+
isInternalType = !targetType.IsSubclassOf(typeof(MonoBehaviour)) || Attribute.IsDefined(targetType, typeof(ExecuteInEditMode));
4244
foreach (var field in fields)
4345
try {
4446
if (!showObsolete && Attribute.IsDefined(field, typeof(ObsoleteAttribute)))
@@ -76,32 +78,32 @@ public InspectorDrawer(object target, bool shown, bool showProps, bool showPriva
7678
AddMethodMenu();
7779
foreach (var d in drawer)
7880
d.OnRequireRedraw += RequireRedraw;
79-
this.shown = Helper.GetState(target, shown);
81+
if (target != null)
82+
this.shown = Helper.GetState(target, shown);
8083
}
8184

8285
private void AddMethodMenu() {
8386
ComponentMethodDrawer newDrawer = null;
84-
newDrawer = new ComponentMethodDrawer(target) {
87+
newDrawer = new ComponentMethodDrawer(target, targetType) {
8588
AllowPrivateFields = allowPrivate,
8689
OnClose = () => removingDrawers.Add(newDrawer)
8790
};
8891
drawer.Add(newDrawer);
8992
}
9093

9194
public void Draw(bool drawHeader = true, bool readOnly = false) {
92-
if (target == null) {
93-
EditorGUILayout.InspectorTitlebar(false, null as UnityObject);
94-
return;
95-
}
9695
if (drawHeader) {
9796
shown = EditorGUILayout.InspectorTitlebar(shown, target as UnityObject);
98-
Helper.StoreState(target, shown);
97+
if (target != null)
98+
Helper.StoreState(target, shown);
9999
if (!shown)
100100
return;
101101
}
102102
EditorGUI.indentLevel++;
103103
EditorGUILayout.BeginVertical();
104-
if (elementType != null) {
104+
if (target is Type && GUILayout.Button(string.Format("Inspect Static Members of {0}...", target)))
105+
InspectorChildWindow.OpenStatic(target as Type, true, allowPrivate, false, true, false, null);
106+
else if (target != null && elementType != null) {
105107
if (targetType == typeof(byte[])) {
106108
if (hexEdit == null)
107109
hexEdit = new HexEdit();
@@ -141,8 +143,7 @@ public void Draw(bool drawHeader = true, bool readOnly = false) {
141143
}
142144
}
143145
if (removingDrawers.Count > 0) {
144-
foreach (var d in removingDrawers)
145-
drawer.Remove(d);
146+
drawer.RemoveAll(removingDrawers.Contains);
146147
removingDrawers.Clear();
147148
}
148149
foreach (var item in drawer) {

UInspectorPlus/InspectorPlus.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ internal class InspectorPlus: EditorWindow, IHasCustomMenu {
1111
"Unless you know exactly what you are doing, do not use this plugin " +
1212
"or you may likely to corrupt your project or even crashes the editor!";
1313
private readonly List<InspectorDrawer[]> drawers = new List<InspectorDrawer[]>();
14+
private readonly TypeMatcher typeMatcher = new TypeMatcher();
1415
private string searchText;
16+
private bool shouldSearchTypes;
1517
private Vector2 scrollPos;
1618
private bool initialized;
1719
private bool autoUpdateValues;
@@ -27,6 +29,11 @@ private void OnEnable() {
2729
titleContent = new GUIContent("Inspector+", EditorGUIUtility.FindTexture("UnityEditor.InspectorWindow"));
2830
Initialize();
2931
OnFocus();
32+
typeMatcher.OnRequestRedraw += Repaint;
33+
}
34+
35+
private void OnDisable() {
36+
typeMatcher.OnRequestRedraw -= Repaint;
3037
}
3138

3239
private void Initialize() {
@@ -57,6 +64,8 @@ private void OnGUI() {
5764
if (GUI.changed)
5865
IterateDrawers<ComponentMethodDrawer>(methodDrawer => methodDrawer.Filter = searchText);
5966
GUILayout.Space(8);
67+
if (shouldSearchTypes = GUILayout.Toggle(shouldSearchTypes, EditorGUIUtility.IconContent("d_FilterByType", "Search Types"), EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
68+
typeMatcher.SearchText = searchText;
6069
EditorGUI.BeginDisabledGroup(instanceIds == null || instanceIds.Length == 0);
6170
if (GUILayout.Button(EditorGUIUtility.IconContent("TreeEditor.Trash", "Destroy Selection"),
6271
EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
@@ -70,6 +79,8 @@ private void OnGUI() {
7079
drawer.searchText = searchText;
7180
drawer.Draw();
7281
}
82+
if (shouldSearchTypes)
83+
typeMatcher.Draw();
7384
GUILayout.FlexibleSpace();
7485
GUILayout.Space(EditorGUIUtility.singleLineHeight / 2);
7586
GUILayout.EndScrollView();
@@ -181,7 +192,7 @@ private InspectorDrawer[] CreateDrawers(int instanceID) {
181192
}
182193

183194
private InspectorDrawer CreateDrawer(UnityObject target, bool shown) {
184-
var drawer = new InspectorDrawer(target, shown, showProps, privateFields, showObsolete, showMethods);
195+
var drawer = new InspectorDrawer(target, target.GetType(), shown, showProps, privateFields, showObsolete, showMethods);
185196
drawer.OnRequireRedraw += Repaint;
186197
return drawer;
187198
}

UInspectorPlus/MethodPropertyDrawer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@ public void Draw() {
297297
}
298298

299299
public void Draw(bool readOnly, Rect? rect = null) {
300+
if (target == null && Helper.IsInstanceMember(memberInfo))
301+
return;
300302
readOnly |= isInfoReadonly;
301303
var referenceModeBtn = (!allowReferenceMode && (
302304
currentType == PropertyType.Unknown ||

UInspectorPlus/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// 您可以指定所有的值,或將組建編號或修訂編號設為預設值
3333
//方法是使用 '*',如下所示:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("0.1.0.0")]
36-
[assembly: AssemblyFileVersion("0.1.0.0")]
35+
[assembly: AssemblyVersion("0.2.0.0")]
36+
[assembly: AssemblyFileVersion("0.2.0.0")]

0 commit comments

Comments
 (0)