@@ -302,11 +302,26 @@ def load(self, ifile, configuration):
302302 members_list = app_init_fnc .__dict__ .values ()
303303 for m in members_list :
304304 if inspect .isfunction (m ) and m .__name__ not in ['__init__' , 'main' , 'idle' ]:
305- setattr (self , m .__name__ , self .fakeListenerFunc )
306- return app_init_fnc .construct_ui (self )
307-
308- def fakeListenerFunc (* args ):
309- pass
305+ #setattr(self, m.__name__, self.fakeListenerFunc)
306+ import types
307+ setattr (self , m .__name__ , types .MethodType ( m , self ))
308+ root_widget = app_init_fnc .construct_ui (self )
309+ self .create_callback_copy (root_widget )
310+ return root_widget
311+
312+ def create_callback_copy (self , widget ):
313+ if not hasattr ( widget , 'children' ):
314+ return #no nested code
315+ #for all the methods of this widget
316+ for (setOnEventListenerFuncname ,setOnEventListenerFunc ) in inspect .getmembers (widget ):
317+ #if the member is decorated by decorate_set_on_listener
318+ if hasattr (setOnEventListenerFunc , '_event_info' ):
319+ #if there is a callback
320+ if getattr (widget , setOnEventListenerFuncname ).callback :
321+ getattr (widget , setOnEventListenerFuncname ).callback_copy = getattr (widget , setOnEventListenerFuncname ).callback
322+ getattr (widget , setOnEventListenerFuncname ).connect (None )
323+ for w in widget .children .values ():
324+ self .create_callback_copy (w )
310325
311326 def check_pending_listeners (self , widget , widgetVarName , force = False ):
312327 code_nested_listener = ''
@@ -378,19 +393,18 @@ def repr_widget_for_editor(self, widget): #widgetVarName is the name with which
378393 #if the member is decorated by decorate_set_on_listener
379394 if hasattr (setOnEventListenerFunc , '_event_info' ):
380395 #if there is a callback
381- if getattr (widget , setOnEventListenerFuncname ). callback :
396+ if hasattr ( getattr (widget , setOnEventListenerFuncname ), 'callback_copy' ) :
382397 listenerPrototype = setOnEventListenerFunc ._event_info ['prototype' ]
383- listener = getattr (widget , setOnEventListenerFuncname ).callback .__self__
384-
385- if getattr (widget , setOnEventListenerFuncname ) == widget .onclick :
386- if widget .backup_onclick_listener == None :
387- continue
388- listener = widget .backup_onclick_listener .__self__
398+ listener = getattr (widget , setOnEventListenerFuncname ).callback_copy .__self__
389399
390400 listenerFunctionName = setOnEventListenerFunc ._event_info ['name' ] + "_" + widget .attributes ['editor_varname' ]
391-
401+
392402 listenerClassFunction = prototypes .proto_code_function % {'funcname' : listenerFunctionName ,
393403 'parameters' : listenerPrototype }
404+ #override, if already implemented, we use this code
405+ if hasattr (listener , listenerFunctionName ):
406+ listenerClassFunction = inspect .getsource (getattr (listener , listenerFunctionName ))
407+
394408 self .pending_listener_registration .append ({'done' :False ,
395409 'eventsource' :widget ,
396410 'eventlistener' :listener ,
@@ -638,7 +652,6 @@ def configure_widget_for_editing(self, widget):
638652
639653 if not 'editor_varname' in widget .attributes :
640654 return
641- widget .backup_onclick_listener = widget .onclick .callback
642655 widget .onclick .connect (self .on_widget_selection )
643656
644657 #setup of the on_dropped function of the widget in order to manage the dragNdrop
0 commit comments