Skip to content

Commit 7cde806

Browse files
committed
Already implemented listeners remains unchanged when restoring and saving again a project.
1 parent 942d460 commit 7cde806

2 files changed

Lines changed: 32 additions & 30 deletions

File tree

editor/editor.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

editor/editor_widgets.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,27 +138,22 @@ def __init__(self, widget, listenersList, eventConnectionFuncName, eventConnecti
138138
ddi = gui.DropDownItem(w.attributes['editor_varname'])
139139
ddi.listenerInstance = w
140140
self.dropdown.append(ddi)
141-
if self.eventConnectionFunc.callback: #if the callback is not None, and so there is a listener
142-
connectedListenerName = eventConnectionFunc.callback.__self__.attributes['editor_varname']
141+
if hasattr(self.eventConnectionFunc, 'callback_copy'): #if the callback is not None, and so there is a listener
142+
connectedListenerName = eventConnectionFunc.callback_copy.__self__.attributes['editor_varname']
143143
self.dropdown.set_value( connectedListenerName )
144144

145145
def on_connection(self, widget, dropDownValue):
146-
if self.eventConnectionFuncName == 'onclick':
147-
back = self.refWidget.onclick.callback
148-
self.refWidget.onclick.callback = self.refWidget.backup_onclick_listener
149-
150146
if self.dropdown.get_value()=='None':
151147
self.eventConnectionFunc.connect(None)
152148
else:
153149
listener = self.dropdown._selected_item.listenerInstance
154150
listener.attributes['editor_newclass'] = "True"
155151
print("Event: " + self.eventConnectionFuncName + " signal connection to: " + listener.attributes['editor_varname'] + " from:" + self.refWidget.attributes['editor_varname'])
152+
back_callback = getattr(self.refWidget, self.eventConnectionFuncName).callback
156153
listener.__class__.fakeListenerFunc = fakeListenerFunc
157154
getattr(self.refWidget, self.eventConnectionFuncName).connect(listener.fakeListenerFunc)
158-
159-
if self.eventConnectionFuncName == 'onclick':
160-
self.refWidget.backup_onclick_listener = self.refWidget.onclick.callback
161-
self.refWidget.onclick.callback = back
155+
getattr(self.refWidget, self.eventConnectionFuncName).callback_copy = getattr(self.refWidget, self.eventConnectionFuncName).callback
156+
getattr(self.refWidget, self.eventConnectionFuncName).callback = back_callback
162157

163158

164159
def fakeListenerFunc(self,*args):
@@ -204,17 +199,11 @@ def update(self, widget, widget_tree):
204199
for (setOnEventListenerFuncname,setOnEventListenerFunc) in inspect.getmembers(widget):
205200
#if the member is decorated by decorate_set_on_listener and the function is referred to this event
206201
if hasattr(setOnEventListenerFunc, '_event_info'):
207-
if setOnEventListenerFuncname == "onclick":
208-
backup_editor_onclick = widget.onclick.callback
209-
widget.onclick.callback = widget.backup_onclick_listener
210-
setOnEventListenerFunc = widget.onclick
211202
self.container.append( SignalConnection(widget,
212203
self.listeners_list,
213204
setOnEventListenerFuncname,
214205
setOnEventListenerFunc,
215206
width='100%') )
216-
if setOnEventListenerFuncname == "onclick":
217-
widget.onclick.callback = backup_editor_onclick
218207

219208

220209
class ProjectConfigurationDialog(gui.GenericDialog, gui.EventSource):

0 commit comments

Comments
 (0)