@@ -315,11 +315,26 @@ def load(self, ifile, configuration):
315315 members_list = app_init_fnc .__dict__ .values ()
316316 for m in members_list :
317317 if inspect .isfunction (m ) and m .__name__ not in ['__init__' , 'main' , 'idle' ]:
318- setattr (self , m .__name__ , self .fakeListenerFunc )
319- return app_init_fnc .construct_ui (self )
320-
321- def fakeListenerFunc (* args ):
322- pass
318+ #setattr(self, m.__name__, self.fakeListenerFunc)
319+ import types
320+ setattr (self , m .__name__ , types .MethodType ( m , self ))
321+ root_widget = app_init_fnc .construct_ui (self )
322+ self .create_callback_copy (root_widget )
323+ return root_widget
324+
325+ def create_callback_copy (self , widget ):
326+ if not hasattr ( widget , 'children' ):
327+ return #no nested code
328+ #for all the methods of this widget
329+ for (setOnEventListenerFuncname ,setOnEventListenerFunc ) in inspect .getmembers (widget ):
330+ #if the member is decorated by decorate_set_on_listener
331+ if hasattr (setOnEventListenerFunc , '_event_info' ):
332+ #if there is a callback
333+ if getattr (widget , setOnEventListenerFuncname ).callback :
334+ getattr (widget , setOnEventListenerFuncname ).callback_copy = getattr (widget , setOnEventListenerFuncname ).callback
335+ getattr (widget , setOnEventListenerFuncname ).connect (None )
336+ for w in widget .children .values ():
337+ self .create_callback_copy (w )
323338
324339 def check_pending_listeners (self , widget , widgetVarName , force = False ):
325340 code_nested_listener = ''
@@ -391,19 +406,18 @@ def repr_widget_for_editor(self, widget): #widgetVarName is the name with which
391406 #if the member is decorated by decorate_set_on_listener
392407 if hasattr (setOnEventListenerFunc , '_event_info' ):
393408 #if there is a callback
394- if getattr (widget , setOnEventListenerFuncname ). callback :
409+ if hasattr ( getattr (widget , setOnEventListenerFuncname ), 'callback_copy' ) :
395410 listenerPrototype = setOnEventListenerFunc ._event_info ['prototype' ]
396- listener = getattr (widget , setOnEventListenerFuncname ).callback .__self__
397-
398- if getattr (widget , setOnEventListenerFuncname ) == widget .onclick :
399- if widget .backup_onclick_listener == None :
400- continue
401- listener = widget .backup_onclick_listener .__self__
411+ listener = getattr (widget , setOnEventListenerFuncname ).callback_copy .__self__
402412
403413 listenerFunctionName = setOnEventListenerFunc ._event_info ['name' ] + "_" + widget .attributes ['editor_varname' ]
404-
414+
405415 listenerClassFunction = prototypes .proto_code_function % {'funcname' : listenerFunctionName ,
406416 'parameters' : listenerPrototype }
417+ #override, if already implemented, we use this code
418+ if hasattr (listener , listenerFunctionName ):
419+ listenerClassFunction = inspect .getsource (getattr (listener , listenerFunctionName ))
420+
407421 self .pending_listener_registration .append ({'done' :False ,
408422 'eventsource' :widget ,
409423 'eventlistener' :listener ,
@@ -651,7 +665,6 @@ def configure_widget_for_editing(self, widget):
651665
652666 if not 'editor_varname' in widget .attributes :
653667 return
654- widget .backup_onclick_listener = widget .onclick .callback
655668 widget .onclick .connect (self .on_widget_selection )
656669
657670 #setup of the on_dropped function of the widget in order to manage the dragNdrop
0 commit comments