Skip to content

Commit a8efbe2

Browse files
committed
Code tidy up
Fix exception thrown while trying to expand array list editor
1 parent 9397ee0 commit a8efbe2

File tree

5 files changed

+83
-62
lines changed

5 files changed

+83
-62
lines changed

UInspectorPlus/ComponentMethodDrawer.cs

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -51,29 +51,23 @@ public object Value {
5151
}
5252

5353
public bool AllowPrivateFields {
54-
get {
55-
return privateFields;
56-
}
54+
get { return privateFields; }
5755
set {
5856
privateFields = value;
5957
InitComponentMethods(false);
6058
}
6159
}
6260

6361
public bool AllowObsolete {
64-
get {
65-
return obsolete;
66-
}
62+
get { return obsolete; }
6763
set {
6864
obsolete = value;
6965
InitComponentMethods(false);
7066
}
7167
}
7268

7369
public MemberInfo Info {
74-
get {
75-
return selectedMember;
76-
}
70+
get { return selectedMember; }
7771
}
7872

7973
public bool IsComponentNull() {
@@ -140,9 +134,7 @@ public void Call() {
140134
selectedMember as PropertyInfo,
141135
component, privateFields, obsolete, true,
142136
requestData) {
143-
OnEdit = () => {
144-
result = null;
145-
},
137+
OnEdit = () => result = null,
146138
OnClose = OnClose,
147139
};
148140
break;
@@ -224,29 +216,32 @@ public bool UpdateValue() {
224216
return false;
225217
}
226218

219+
private bool FilterMemberInfo(MemberInfo m) {
220+
return (obsolete || !Attribute.IsDefined(m, typeof(ObsoleteAttribute))) &&
221+
(string.IsNullOrEmpty(filter) ||
222+
m.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0);
223+
}
224+
227225
private void AddComponentMethod(Type type) {
228226
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
229227
if (privateFields)
230228
flag |= BindingFlags.NonPublic;
231229
methods.AddRange(
232-
type.GetConstructors(flag)
233-
.Where(t => obsolete || !Attribute.IsDefined(t, typeof(ObsoleteAttribute)))
234-
.Where(t => string.IsNullOrEmpty(filter) || t.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
235-
.Select(m => new ComponentMethod {
230+
from m in type.GetConstructors(flag)
231+
where FilterMemberInfo(m)
232+
select new ComponentMethod {
236233
member = m,
237234
mode = MethodMode.Constructor,
238-
})
235+
}
239236
);
240237
flag &= ~BindingFlags.Instance;
241238
methods.AddRange(
242-
type.GetMethods(flag)
243-
.Where(t => obsolete || !Attribute.IsDefined(t, typeof(ObsoleteAttribute)))
244-
.Where(t => t.ReturnType == type)
245-
.Where(t => string.IsNullOrEmpty(filter) || t.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
246-
.Select(m => new ComponentMethod {
239+
from m in type.GetMethods(flag)
240+
where FilterMemberInfo(m) && m.ReturnType == type
241+
select new ComponentMethod {
247242
member = m,
248-
mode = MethodMode.Method
249-
})
243+
mode = MethodMode.Method,
244+
}
250245
);
251246
}
252247

@@ -256,25 +251,22 @@ private void AddComponentMethod(object target) {
256251
flag |= BindingFlags.NonPublic;
257252
Type type = target.GetType();
258253
methods.AddRange(
259-
type.GetProperties(flag)
260-
.Where(t => obsolete || !Attribute.IsDefined(t, typeof(ObsoleteAttribute)))
261-
.Where(t => t.GetIndexParameters().Length > 0)
262-
.Where(t => string.IsNullOrEmpty(filter) || t.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
263-
.Select(m => new ComponentMethod {
254+
from m in type.GetProperties(flag)
255+
where FilterMemberInfo(m) && m.GetIndexParameters().Length > 0
256+
select new ComponentMethod {
264257
member = m,
265258
target = target,
266-
mode = MethodMode.Indexer
267-
})
259+
mode = MethodMode.Indexer,
260+
}
268261
);
269262
methods.AddRange(
270-
type.GetMethods(flag)
271-
.Where(t => obsolete || !Attribute.IsDefined(t, typeof(ObsoleteAttribute)))
272-
.Where(t => string.IsNullOrEmpty(filter) || t.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
273-
.Select(m => new ComponentMethod {
263+
from m in type.GetMethods(flag)
264+
where FilterMemberInfo(m)
265+
select new ComponentMethod {
274266
member = m,
275267
target = target,
276268
mode = MethodMode.Method,
277-
})
269+
}
278270
);
279271
}
280272

UInspectorPlus/Helpers.cs

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,14 @@ public static class Helper {
7272

7373
// Delegate hacks to access the internal methods
7474
private delegate Gradient DoGradientField(GUIContent guiContent, Rect rect, Gradient gradient);
75-
private static readonly DoGradientField doGradientField =
76-
GetDelegate<DoGradientField>(typeof(EditorGUI), "GradientField");
75+
private static readonly DoGradientField doGradientField = GetDelegate<EditorGUI, DoGradientField>("GradientField");
7776

7877
private delegate Gradient DoLayoutGradientField(GUIContent guiContent, Gradient gradient, params GUILayoutOption[] options);
79-
private static readonly DoLayoutGradientField doLayoutGradiantField =
80-
GetDelegate<DoLayoutGradientField>(typeof(EditorGUILayout), "GradientField");
78+
private static readonly DoLayoutGradientField doLayoutGradiantField = GetDelegate<EditorGUILayout, DoLayoutGradientField>("GradientField");
8179

8280
private static readonly Hashtable storedState = new Hashtable();
8381

84-
internal static void InitPropertyTypeMapper() {
85-
if (propertyTypeMapper.Count > 0)
86-
return;
82+
static Helper() {
8783
AddPropertyTypeMap("System.String", PropertyType.String);
8884
AddPropertyTypeMap("System.Boolean", PropertyType.Bool);
8985
AddPropertyTypeMap("System.Byte", PropertyType.Integer);
@@ -537,24 +533,60 @@ internal static GUIStyle GetGUIStyle(string styleName) {
537533
return value == null ? defaultValue : (T)value;
538534
}
539535

540-
internal static T GetDelegate<T>(Type fromType, string methodName) where T : class {
541-
Type t = typeof(T);
542-
if (!t.IsSubclassOf(typeof(Delegate)))
543-
throw new ArgumentException(string.Format("{0} is not delegate.", t.Name));
544-
MethodInfo invokeMethod = t.GetMethod("Invoke");
536+
internal static TDelegate GetDelegate<TDelegate>(string fromTypeName, string methodName, object target = null) where TDelegate : class {
537+
if (fromTypeName == null)
538+
throw new ArgumentNullException("fromTypeName");
539+
Type fromType = Type.GetType(fromTypeName, false);
540+
if (fromType == null) return null;
541+
return GetDelegate<TDelegate>(fromType, methodName, target);
542+
}
543+
544+
internal static TDelegate GetDelegate<TDelegate>(Type fromType, string methodName, object target = null) where TDelegate : class {
545+
if (fromType == null)
546+
throw new ArgumentNullException("fromType");
547+
if (methodName == null)
548+
throw new ArgumentNullException("methodName");
549+
Type delegateType = typeof(TDelegate);
550+
MethodInfo method = FindMethod(fromType, methodName, delegateType);
551+
if (method == null)
552+
return null;
553+
if (method.IsStatic)
554+
return Delegate.CreateDelegate(delegateType, method, false) as TDelegate;
555+
if (target == null && fromType.IsValueType)
556+
target = Activator.CreateInstance(fromType);
557+
return Delegate.CreateDelegate(delegateType, target, method, false) as TDelegate;
558+
}
559+
560+
internal static TDelegate GetDelegate<TFrom, TDelegate>(string methodName, TFrom target = default(TFrom)) where TDelegate : class {
561+
if (methodName == null)
562+
throw new ArgumentNullException("methodName");
563+
Type delegateType = typeof(TDelegate);
564+
MethodInfo method = FindMethod(typeof(TFrom), methodName, delegateType);
565+
if (method == null)
566+
return null;
567+
if (method.IsStatic)
568+
return Delegate.CreateDelegate(delegateType, method, false) as TDelegate;
569+
return Delegate.CreateDelegate(delegateType, target, method, false) as TDelegate;
570+
}
571+
572+
private static MethodInfo FindMethod(Type fromType, string methodName, Type delegateType) {
573+
const string NotADelegateMsg = "{0} is not a delegate.";
574+
const string MissingInvokeMsg =
575+
"Cannot determine what parameters does {0} have, " +
576+
"as no Invoke(...) signature found. " +
577+
"Perhaps this is not a valid delegate.";
578+
if (!delegateType.IsSubclassOf(typeof(Delegate)))
579+
throw new ArgumentException(string.Format(NotADelegateMsg, delegateType.Name));
580+
MethodInfo invokeMethod = delegateType.GetMethod("Invoke");
545581
if (invokeMethod == null)
546-
throw new ArgumentException(string.Format(
547-
"Cannot determine what parameters does {0} have, as no Invoke(...) signature found. Perhaps this is not a valid delegate.",
548-
t.Name
549-
));
550-
MethodInfo method = fromType.GetMethod(
582+
throw new ArgumentException(string.Format(MissingInvokeMsg, delegateType.Name));
583+
return fromType.GetMethod(
551584
methodName,
552-
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static,
585+
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance,
553586
null, CallingConventions.Any,
554587
Array.ConvertAll(invokeMethod.GetParameters(), p => p.ParameterType),
555588
null
556589
);
557-
return method == null ? null : Delegate.CreateDelegate(t, method) as T;
558590
}
559591

560592
[MenuItem("Window/Inspector+")]

UInspectorPlus/HexEdit.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
using System;
22
using System.Globalization;
3-
using System.Collections.Generic;
4-
using System.Linq;
5-
using System.Text;
63
using UnityEngine;
74
using UnityEditor;
85

@@ -70,7 +67,7 @@ public void Draw(Rect viewport) {
7067
if (GUI.changed) {
7168
GUI.changed = false;
7269
changed = true;
73-
data[col] = unchecked((byte)newStr[0]);
70+
data[col] = newStr.Length > 0 ? unchecked((byte)newStr[0]) : (byte)0;
7471
}
7572
}
7673
GUI.changed = changed;
@@ -79,7 +76,8 @@ public void Draw(Rect viewport) {
7976
}
8077

8178
private static string Byte2String(byte b) {
82-
if (b < 32 || b >= 127) return ".";
79+
if (b < 32) return ((char)(b | 0x2400)).ToString();
80+
if (b >= 127) return ".";
8381
return ((char)b).ToString();
8482
}
8583
}

UInspectorPlus/InspectorDrawer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ public void Draw(bool drawHeader = true, bool readOnly = false) {
126126
},
127127
drawHeaderCallback = r => GUI.Label(r, target.ToString(), EditorStyles.miniBoldLabel),
128128
onCanAddCallback = l => target != null && !(target as IList).IsFixedSize,
129-
onCanRemoveCallback = arrayHandler.onCanAddCallback.Invoke,
130129
onAddCallback = l => {
131130
ReorderableList.defaultBehaviours.DoAddButton(l);
132131
ListAddItem();
@@ -136,6 +135,7 @@ public void Draw(bool drawHeader = true, bool readOnly = false) {
136135
arrayContentDrawer.RemoveAt(0);
137136
}
138137
};
138+
arrayHandler.onCanRemoveCallback = arrayHandler.onCanAddCallback.Invoke;
139139
}
140140
arrayHandler.DoLayoutList();
141141
}

UInspectorPlus/MethodPropertyDrawer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,6 @@ public MethodPropertyDrawer(Type type, string name, object defaultValue, bool al
257257
}
258258

259259
private void InitType() {
260-
Helper.InitPropertyTypeMapper();
261260
if (requiredType.IsArray) {
262261
castableTypes.Add(PropertyType.Array);
263262
currentType = PropertyType.Array;

0 commit comments

Comments
 (0)