@@ -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 ( ) ;
0 commit comments