Skip to content

Commit 42ebcc2

Browse files
committed
Merge branch 'editor_improvements' into development
2 parents 9cd5b12 + 7cde806 commit 42ebcc2

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
@@ -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

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)