@@ -16,14 +16,16 @@ class ComponentMethodDrawer:IReflectorDrawer {
1616 AnimBool showResultSelector ;
1717 string [ ] methodNames ;
1818 int selectedMethodIndex ;
19+ ConstructorInfo selectedCtor ;
1920 MethodInfo selectedMethod ;
2021 ParameterInfo [ ] parameterInfo ;
2122 MethodPropertyDrawer [ ] parameters ;
2223 MethodPropertyDrawer result ;
2324 Exception thrownException ;
2425 string filter ;
26+ Type ctorType ;
2527 bool titleFolded = true , paramsFolded = true , resultFolded = true ,
26- drawHeader = true , privateFields = true , obsolete = true ;
28+ drawHeader = true , privateFields = true , obsolete = true , ctorMode = false ;
2729
2830 public event Action OnRequireRedraw ;
2931
@@ -65,7 +67,7 @@ public bool AllowObsolete {
6567 }
6668
6769 public MemberInfo Info {
68- get { return selectedMethod as MemberInfo ; }
70+ get { return ctorMode ? selectedCtor as MemberInfo : selectedMethod as MemberInfo ; }
6971 }
7072
7173 public bool IsComponentNull ( ) {
@@ -89,6 +91,15 @@ public ComponentMethodDrawer(object target)
8991 InitComponentMethods ( ) ;
9092 }
9193
94+ public ComponentMethodDrawer ( Type type )
95+ : this ( ) {
96+ ctorMode = true ;
97+ ctorType = type ;
98+ drawHeader = false ;
99+ showMethodSelector . value = true ;
100+ InitComponentMethods ( ) ;
101+ }
102+
92103 public string Filter {
93104 get { return filter ; }
94105 set {
@@ -98,15 +109,20 @@ public string Filter {
98109 }
99110
100111 public void Call ( ) {
101- if ( selectedMethod == null || component == null || parameters == null )
112+ if ( selectedMethod == null || ctorMode ? ctorType == null : component == null || parameters == null )
102113 return ;
103114 try {
104115 thrownException = null ;
105116 var requestData = parameters . Select ( d => d . Value ) . ToArray ( ) ;
106- var returnData = selectedMethod . Invoke ( component , requestData ) ;
107- result = selectedMethod . ReturnType == typeof ( void ) ?
117+ if ( ctorMode ) {
118+ var returnData = selectedCtor . Invoke ( requestData ) ;
119+ result = new MethodPropertyDrawer ( selectedCtor . ReflectedType , "Constructed object" , returnData , privateFields , obsolete ) ;
120+ } else {
121+ var returnData = selectedMethod . Invoke ( component , requestData ) ;
122+ result = selectedMethod . ReturnType == typeof ( void ) ?
108123 null :
109124 new MethodPropertyDrawer ( selectedMethod . ReturnType , "Return data" , returnData , privateFields , obsolete ) ;
125+ }
110126 for ( int i = 0 ; i < Math . Min ( parameters . Length , requestData . Length ) ; i ++ ) {
111127 parameters [ i ] . Value = requestData [ i ] ;
112128 if ( parameters [ i ] . ReferenceMode )
@@ -132,7 +148,7 @@ public void Draw() {
132148 EditorGUILayout . BeginVertical ( ) ;
133149 component = EditorGUILayout . ObjectField ( "Target" , component as UnityEngine . Object , typeof ( UnityEngine . Object ) , true ) ;
134150 }
135- if ( component != null ) {
151+ if ( component != null || ctorMode ) {
136152 if ( GUI . changed ) {
137153 InitComponentMethods ( ) ;
138154 GUI . changed = false ;
@@ -143,7 +159,7 @@ public void Draw() {
143159 if ( EditorGUILayout . BeginFadeGroup ( showMethodSelector . faded ) )
144160 DrawComponent ( ) ;
145161 EditorGUILayout . EndFadeGroup ( ) ;
146- showResultSelector . target = result != null || thrownException != null ;
162+ showResultSelector . target = ( ! ctorMode && result != null ) || thrownException != null ;
147163 if ( EditorGUILayout . BeginFadeGroup ( showResultSelector . faded ) )
148164 DrawResult ( ) ;
149165 EditorGUILayout . EndFadeGroup ( ) ;
@@ -154,6 +170,20 @@ public void Draw() {
154170 }
155171 }
156172
173+ void AddComponentMethod ( Type type ) {
174+ BindingFlags flag = BindingFlags . Instance | BindingFlags . Static | BindingFlags . Public ;
175+ if ( privateFields )
176+ flag |= BindingFlags . NonPublic ;
177+ methods . AddRange (
178+ type . GetConstructors ( flag )
179+ . Where ( t => obsolete || ! Attribute . IsDefined ( t , typeof ( ObsoleteAttribute ) ) )
180+ . Where ( t => string . IsNullOrEmpty ( filter ) || t . Name . IndexOf ( filter , StringComparison . CurrentCultureIgnoreCase ) >= 0 )
181+ . Select ( m => new ComponentMethod {
182+ ctorInfo = m
183+ } )
184+ ) ;
185+ }
186+
157187 void AddComponentMethod ( object target ) {
158188 BindingFlags flag = BindingFlags . Instance | BindingFlags . Static | BindingFlags . Public ;
159189 if ( privateFields )
@@ -171,8 +201,16 @@ void AddComponentMethod(object target) {
171201
172202 void InitComponentMethods ( bool resetIndex = true ) {
173203 methods . Clear ( ) ;
174- AddComponentMethod ( component ) ;
175- if ( drawHeader ) {
204+ if ( ctorMode )
205+ AddComponentMethod ( ctorType ) ;
206+ else
207+ AddComponentMethod ( component ) ;
208+ if ( ctorMode )
209+ methodNames = methods . Select ( m => string . Format (
210+ "Constructor ({0} parameters)" ,
211+ m . ctorInfo . GetParameters ( ) . Length
212+ ) ) . ToArray ( ) ;
213+ else if ( drawHeader ) {
176214 var gameObject = component as GameObject ;
177215 if ( gameObject != null )
178216 foreach ( var c in gameObject . GetComponents ( typeof ( Component ) ) )
@@ -198,16 +236,23 @@ void InitComponentMethods(bool resetIndex = true) {
198236 }
199237 selectedMethodIndex = - 1 ;
200238 selectedMethod = null ;
239+ selectedCtor = null ;
201240 parameterInfo = null ;
202241 parameters = null ;
203242 result = null ;
204243 thrownException = null ;
205244 }
206245
207246 void InitMethodParams ( ) {
208- selectedMethod = methods [ selectedMethodIndex ] . method ;
209- component = methods [ selectedMethodIndex ] . target ;
210- parameterInfo = selectedMethod . GetParameters ( ) ;
247+ if ( ctorMode ) {
248+ selectedCtor = methods [ selectedMethodIndex ] . ctorInfo ;
249+ component = null ;
250+ parameterInfo = selectedCtor . GetParameters ( ) ;
251+ } else {
252+ selectedMethod = methods [ selectedMethodIndex ] . method ;
253+ component = methods [ selectedMethodIndex ] . target ;
254+ parameterInfo = selectedMethod . GetParameters ( ) ;
255+ }
211256 parameters = new MethodPropertyDrawer [ parameterInfo . Length ] ;
212257 for ( int i = 0 ; i < parameterInfo . Length ; i ++ ) {
213258 var info = parameterInfo [ i ] ;
@@ -219,7 +264,7 @@ void InitMethodParams() {
219264 }
220265
221266 void DrawComponent ( ) {
222- selectedMethodIndex = EditorGUILayout . Popup ( "Method" , selectedMethodIndex , methodNames ) ;
267+ selectedMethodIndex = EditorGUILayout . Popup ( ctorMode ? "Constructor" : "Method" , selectedMethodIndex , methodNames ) ;
223268 if ( selectedMethodIndex >= 0 ) {
224269 if ( GUI . changed ) {
225270 InitMethodParams ( ) ;
@@ -234,11 +279,11 @@ void DrawComponent() {
234279 }
235280
236281 void DrawMethod ( ) {
237- if ( paramsFolded = EditorGUILayout . Foldout ( paramsFolded , selectedMethod . Name ) ) {
282+ if ( paramsFolded = EditorGUILayout . Foldout ( paramsFolded , ctorMode ? "Constructor" : selectedMethod . Name ) ) {
238283 GUI . changed = false ;
239284 EditorGUI . indentLevel ++ ;
240285 EditorGUILayout . BeginVertical ( ) ;
241- if ( selectedMethod . ContainsGenericParameters )
286+ if ( ctorMode ? selectedCtor . ContainsGenericParameters : selectedMethod . ContainsGenericParameters )
242287 EditorGUILayout . HelpBox ( "Generic method is not supported." , MessageType . Warning ) ;
243288 else {
244289 if ( parameterInfo . Length == 0 )
@@ -256,7 +301,7 @@ void DrawResult() {
256301 GUI . changed = false ;
257302 EditorGUI . indentLevel ++ ;
258303 EditorGUILayout . BeginVertical ( ) ;
259- if ( result != null )
304+ if ( result != null && ! ctorMode )
260305 result . Draw ( true ) ;
261306 if ( thrownException != null )
262307 EditorGUILayout . HelpBox ( thrownException . Message , MessageType . Error ) ;
0 commit comments