Skip to content

Commit 40bfff0

Browse files
committed
Add support for get/set indexer properties (via method dropdown at the bottom)
1 parent cab2a4d commit 40bfff0

File tree

5 files changed

+186
-90
lines changed

5 files changed

+186
-90
lines changed

UInspectorPlus/ComponentMethodDrawer.cs

Lines changed: 89 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ class ComponentMethodDrawer: IReflectorDrawer {
1717
string[] methodNames;
1818
int selectedMethodIndex;
1919
MemberInfo selectedMember;
20-
//ConstructorInfo selectedCtor { get { return selectedMember as ConstructorInfo; } }
21-
//MethodInfo selectedMethod { get { return selectedMember as MethodInfo; } }
22-
//PropertyInfo selectedIndexer { get { return selectedMember as PropertyInfo; } }
2320
ParameterInfo[] parameterInfo;
2421
MethodPropertyDrawer[] parameters;
2522
MethodPropertyDrawer result;
@@ -30,8 +27,12 @@ class ComponentMethodDrawer: IReflectorDrawer {
3027
drawHeader = true, privateFields = true, obsolete = true;
3128
MethodMode mode = 0;
3229

30+
public bool execButton = true;
31+
3332
public event Action OnRequireRedraw;
3433

34+
public GenericMenu.MenuFunction OnClose;
35+
3536
public bool ShouldDrawHeader {
3637
get { return drawHeader; }
3738
set {
@@ -98,7 +99,7 @@ public ComponentMethodDrawer(object target)
9899

99100
public ComponentMethodDrawer(Type type)
100101
: this() {
101-
mode = MethodMode.Constructor; ;
102+
mode = MethodMode.Constructor;
102103
ctorType = type;
103104
drawHeader = false;
104105
showMethodSelector.value = true;
@@ -135,13 +136,15 @@ public void Call() {
135136
obsolete);
136137
break;
137138
case MethodMode.Indexer:
138-
returnData = (selectedMember as PropertyInfo).GetValue(component, requestData);
139139
result = new MethodPropertyDrawer(
140-
(selectedMember as PropertyInfo).PropertyType,
141-
Helper.JoinStringList(null, requestData.Select(o => o.ToString()), ", ").ToString(),
142-
returnData,
143-
privateFields,
144-
obsolete);
140+
selectedMember as PropertyInfo,
141+
component, privateFields, obsolete, true,
142+
requestData) {
143+
OnEdit = () => {
144+
result = null;
145+
},
146+
OnClose = OnClose,
147+
};
145148
break;
146149
case MethodMode.Method:
147150
default:
@@ -181,7 +184,11 @@ public void Draw() {
181184
EditorGUILayout.BeginVertical();
182185
component = EditorGUILayout.ObjectField("Target", component as UnityObject, typeof(UnityObject), true);
183186
}
184-
if (component != null || mode == MethodMode.Constructor) {
187+
if (mode != MethodMode.Indexer || result == null)
188+
EditorGUILayout.Space();
189+
if (mode == MethodMode.Constructor ||
190+
(mode == MethodMode.Method && component != null) ||
191+
(mode == MethodMode.Indexer && component != null && result == null)) {
185192
if (GUI.changed) {
186193
InitComponentMethods();
187194
GUI.changed = false;
@@ -200,9 +207,23 @@ public void Draw() {
200207
EditorGUILayout.EndVertical();
201208
EditorGUI.indentLevel--;
202209
}
210+
if (execButton)
211+
DrawExecButton();
203212
}
204213
}
205214

215+
public bool UpdateIfChanged() {
216+
if (mode == MethodMode.Indexer && result != null)
217+
return result.UpdateIfChanged();
218+
return false;
219+
}
220+
221+
public bool UpdateValue() {
222+
if (mode == MethodMode.Indexer && result != null)
223+
return result.UpdateValue();
224+
return false;
225+
}
226+
206227
void AddComponentMethod(Type type) {
207228
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
208229
if (privateFields)
@@ -216,16 +237,6 @@ void AddComponentMethod(Type type) {
216237
mode = MethodMode.Constructor,
217238
})
218239
);
219-
methods.AddRange(
220-
type.GetProperties(flag)
221-
.Where(t => obsolete || !Attribute.IsDefined(t, typeof(ObsoleteAttribute)))
222-
.Where(t => t.GetIndexParameters().Length > 0)
223-
.Where(t => string.IsNullOrEmpty(filter) || t.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
224-
.Select(m => new ComponentMethod {
225-
member = m,
226-
mode = MethodMode.Indexer
227-
})
228-
);
229240
flag &= ~BindingFlags.Instance;
230241
methods.AddRange(
231242
type.GetMethods(flag)
@@ -243,8 +254,20 @@ void AddComponentMethod(object target) {
243254
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
244255
if (privateFields)
245256
flag |= BindingFlags.NonPublic;
257+
Type type = target.GetType();
246258
methods.AddRange(
247-
target.GetType().GetMethods(flag)
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 {
264+
member = m,
265+
target = target,
266+
mode = MethodMode.Indexer
267+
})
268+
);
269+
methods.AddRange(
270+
type.GetMethods(flag)
248271
.Where(t => obsolete || !Attribute.IsDefined(t, typeof(ObsoleteAttribute)))
249272
.Where(t => string.IsNullOrEmpty(filter) || t.Name.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
250273
.Select(m => new ComponentMethod {
@@ -296,12 +319,12 @@ void InitComponentMethods(bool resetIndex = true) {
296319
string GetMethodNameFormatted(ComponentMethod m, int i) {
297320
string name, formatStr;
298321
ParameterInfo[] parameters;
299-
switch(m.mode) {
322+
switch (m.mode) {
300323
case MethodMode.Constructor:
301-
name = "[Constructor]";
324+
name = "[[Constructor]]";
302325
break;
303326
case MethodMode.Indexer:
304-
name = m.member.DeclaringType.Name;
327+
name = null;
305328
break;
306329
case MethodMode.Method:
307330
default:
@@ -311,7 +334,7 @@ string GetMethodNameFormatted(ComponentMethod m, int i) {
311334
switch (m.mode) {
312335
case MethodMode.Indexer:
313336
parameters = (m.member as PropertyInfo).GetIndexParameters();
314-
formatStr = "{0} [{1}]";
337+
formatStr = "[{1}]";
315338
break;
316339
case MethodMode.Constructor:
317340
case MethodMode.Method:
@@ -325,7 +348,7 @@ string GetMethodNameFormatted(ComponentMethod m, int i) {
325348

326349
void InitMethodParams() {
327350
selectedMember = methods[selectedMethodIndex].member;
328-
switch (methods[selectedMethodIndex].mode) {
351+
switch (mode = methods[selectedMethodIndex].mode) {
329352
case MethodMode.Constructor:
330353
component = null;
331354
parameterInfo = (selectedMember as ConstructorInfo).GetParameters();
@@ -351,13 +374,13 @@ void InitMethodParams() {
351374
}
352375

353376
void DrawComponent() {
354-
switch (mode) {
355-
case MethodMode.Constructor:
356-
selectedMethodIndex = EditorGUILayout.Popup("Constructor", selectedMethodIndex, methodNames);
357-
break;
358-
case MethodMode.Method:
359-
selectedMethodIndex = EditorGUILayout.Popup("Method", selectedMethodIndex, methodNames);
360-
break;
377+
if (OnClose != null)
378+
EditorGUILayout.BeginHorizontal();
379+
selectedMethodIndex = EditorGUILayout.Popup(mode.ToString(), selectedMethodIndex, methodNames);
380+
if (OnClose != null) {
381+
if (GUILayout.Button("-", EditorStyles.miniButton, GUILayout.ExpandWidth(false)))
382+
OnClose();
383+
EditorGUILayout.EndHorizontal();
361384
}
362385
if (selectedMethodIndex >= 0) {
363386
if (GUI.changed) {
@@ -373,16 +396,17 @@ void DrawComponent() {
373396
}
374397

375398
void DrawMethod() {
376-
switch(mode) {
399+
switch (mode) {
377400
case MethodMode.Constructor:
378401
paramsFolded = EditorGUILayout.Foldout(paramsFolded, "Constructor");
379402
break;
403+
case MethodMode.Indexer:
404+
paramsFolded = EditorGUILayout.Foldout(paramsFolded, "Indexer");
405+
break;
380406
case MethodMode.Method:
407+
default:
381408
paramsFolded = EditorGUILayout.Foldout(paramsFolded, selectedMember.Name);
382409
break;
383-
case MethodMode.Indexer:
384-
paramsFolded = EditorGUILayout.Foldout(paramsFolded, selectedMember.DeclaringType.Name);
385-
break;
386410
}
387411
if (paramsFolded) {
388412
GUI.changed = false;
@@ -402,19 +426,22 @@ void DrawMethod() {
402426
}
403427

404428
void DrawResult() {
405-
if (resultFolded = EditorGUILayout.Foldout(resultFolded, "Result")) {
429+
if (mode == MethodMode.Indexer) {
430+
if (result != null)
431+
result.Draw(false);
432+
if (thrownException != null)
433+
EditorGUILayout.HelpBox(thrownException.Message, MessageType.Error);
434+
} else if (resultFolded = EditorGUILayout.Foldout(resultFolded, "Result")) {
406435
GUI.changed = false;
407436
EditorGUI.indentLevel++;
408437
EditorGUILayout.BeginVertical();
409438
switch (mode) {
410439
case MethodMode.Constructor: break;
411440
case MethodMode.Method:
441+
default:
412442
if (result != null)
413443
result.Draw(true);
414444
break;
415-
case MethodMode.Indexer:
416-
// TODO: Indxer Handling
417-
break;
418445
}
419446
if (thrownException != null)
420447
EditorGUILayout.HelpBox(thrownException.Message, MessageType.Error);
@@ -423,6 +450,26 @@ void DrawResult() {
423450
}
424451
}
425452

453+
void DrawExecButton() {
454+
if (selectedMember == null) return;
455+
bool execute = false;
456+
switch (mode) {
457+
case MethodMode.Constructor:
458+
execute = GUILayout.Button("Construct");
459+
break;
460+
case MethodMode.Indexer:
461+
if (result != null) return;
462+
execute = GUILayout.Button("Create Property");
463+
break;
464+
case MethodMode.Method:
465+
default:
466+
execute = GUILayout.Button("Execute " + selectedMember.Name);
467+
break;
468+
}
469+
if (execute)
470+
Call();
471+
}
472+
426473
void RequireRedraw() {
427474
if (OnRequireRedraw != null)
428475
OnRequireRedraw();

UInspectorPlus/Helpers.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ enum PropertyType {
3333
Vector3Int,
3434
RectInt,
3535
}
36-
36+
3737
enum MethodMode {
3838
Method,
3939
Constructor,
@@ -54,6 +54,8 @@ struct ComponentFields {
5454

5555
interface IReflectorDrawer {
5656
void Draw();
57+
bool UpdateIfChanged();
58+
bool UpdateValue();
5759
bool AllowPrivateFields { get; set; }
5860
bool AllowObsolete { get; set; }
5961
bool Changed { get; }
@@ -153,7 +155,7 @@ internal static Rect ScaleRect(Rect source,
153155
);
154156
}
155157

156-
internal static string GetMemberName(MemberInfo member, bool simplifed = false) {
158+
internal static string GetMemberName(MemberInfo member, bool simplifed = false, bool appendMemberName = true) {
157159
var ret = new StringBuilder();
158160
var props = new List<string>();
159161
var field = member as FieldInfo;
@@ -198,7 +200,8 @@ internal static string GetMemberName(MemberInfo member, bool simplifed = false)
198200
JoinStringList(ret, props, simplifed ? "" : ", ");
199201
if (props.Count > 0)
200202
ret.Append(") ");
201-
ret.Append(member.Name);
203+
if (appendMemberName)
204+
ret.Append(member.Name);
202205
return ret.ToString();
203206
}
204207

@@ -434,14 +437,14 @@ static int CountLines(string str) {
434437
return Math.Max(1, count);
435438
}
436439

437-
internal static bool AssignValue(MemberInfo info, object target, object value) {
440+
internal static bool AssignValue(MemberInfo info, object target, object value, params object[] index) {
438441
try {
439442
var fieldInfo = info as FieldInfo;
440443
var propertyInfo = info as PropertyInfo;
441444
if (fieldInfo != null && !fieldInfo.IsInitOnly && !fieldInfo.IsLiteral)
442445
fieldInfo.SetValue(target, value);
443446
else if (propertyInfo != null && propertyInfo.CanWrite)
444-
propertyInfo.SetValue(target, value, null);
447+
propertyInfo.SetValue(target, value, index);
445448
else
446449
return false;
447450
} catch {
@@ -460,15 +463,15 @@ internal static bool IsReadOnly(MemberInfo info) {
460463
return false;
461464
}
462465

463-
internal static bool FetchValue(MemberInfo info, object target, out object value) {
466+
internal static bool FetchValue(MemberInfo info, object target, out object value, params object[] index) {
464467
value = null;
465468
try {
466469
var fieldInfo = info as FieldInfo;
467470
var propertyInfo = info as PropertyInfo;
468471
if (fieldInfo != null)
469472
value = fieldInfo.GetValue(target);
470473
else if (propertyInfo != null && propertyInfo.CanRead)
471-
value = propertyInfo.GetValue(target, null);
474+
value = propertyInfo.GetValue(target, index);
472475
else
473476
return false;
474477
} catch (Exception ex) {
@@ -493,7 +496,7 @@ internal static bool IsInterface(Type type, Type interfaceType) {
493496
return true;
494497
return false;
495498
}
496-
499+
497500
internal static Type GetGenericListType(Type targetType) {
498501
if (targetType.IsArray)
499502
return targetType.GetElementType();

UInspectorPlus/InspectorChildWindow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void OnGUI() {
4949
drawer.changed = false;
5050
if (parent != null && !parent.IsReadOnly &&
5151
((parent.requiredType != null && parent.requiredType.IsValueType) || parent.Value != drawer.target))
52-
if(!Helper.AssignValue(parent.Info, parent.Target, drawer.target)) {
52+
if (!Helper.AssignValue(parent.Info, parent.Target, drawer.target)) {
5353
object reverted;
5454
if (Helper.FetchValue(parent.Info, parent.Target, out reverted))
5555
drawer.target = reverted;

0 commit comments

Comments
 (0)