diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 9930257f7a..2f59932ec6 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -27,7 +27,7 @@ class CharField(object): if self.get_state_attrs(model).get('readonly', False): return if self.attrs.get('on_change', False): - model.on_change(self.attrs['on_change']) + model.on_change(self.name, self.attrs['on_change']) if self.attrs.get('change_default', False): model.cond_default(self.attrs['name'], self.get(model)) @@ -78,7 +78,7 @@ class CharField(object): def set_default(self, model, value): res = self.set(model, value) if self.attrs.get('on_change', False): - model.on_change(self.attrs['on_change']) + model.on_change(self.name, self.attrs['on_change']) return res def get_default(self, model): diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index 356bb838f5..800284c68f 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -213,23 +213,15 @@ class ModelRecord(SignalEvent): val = eval(dom, ctx) return val - #XXX Shoud use changes of attributes (ro, ...) - def on_change(self, callback): - match = re.match('^(.*?)\((.*)\)$', callback) - if not match: - raise Exception, 'ERROR: Wrong on_change trigger: %s' % callback - func_name = match.group(1) - arg_names = [n.strip() for n in match.group(2).split(',')] - args = [self.expr_eval(arg) for arg in arg_names] + def on_change(self, field, attr): + args = {} + for arg in attr: + args[arg] = self.expr_eval(arg) ids = self.id and [self.id] or [] - response = getattr(self.rpc, func_name)(ids, *args) - if response: - self.set(response.get('value', {}), modified=True) - if 'domain' in response: - for fieldname, value in response['domain'].items(): - if fieldname not in self.mgroup.mfields: - continue - self.mgroup.mfields[fieldname].attrs['domain'] = value + res = getattr(self.rpc, 'on_change_' + field)(ids, args, + rpc.session.context) + if res: + self.set(res, modified=True) self.signal('record-changed') def cond_default(self, field_name, value): diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index e17f7d755f..3aa49ad44e 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -477,6 +477,6 @@ class Screen(SignalEvent): self.models.clear() self.current_model = None - def on_change(self, callback): - self.current_model.on_change(callback) + def on_change(self, fieldname, attr): + self.current_model.on_change(fieldname, attr) self.display() diff --git a/tryton/gui/window/view_form/view/form_gtk/checkbox.py b/tryton/gui/window/view_form/view/form_gtk/checkbox.py index 6296772de4..25a8a75456 100644 --- a/tryton/gui/window/view_form/view/form_gtk/checkbox.py +++ b/tryton/gui/window/view_form/view/form_gtk/checkbox.py @@ -8,7 +8,6 @@ class CheckBox(WidgetInterface): self.widget = gtk.CheckButton() self.widget.connect('focus-in-event', lambda x, y: self._focus_in()) self.widget.connect('focus-out-event', lambda x, y: self._focus_out()) - self.widget.connect('toggled', lambda x: self.sig_changed()) def _readonly_set(self, value): super(CheckBox, self)._readonly_set(value) diff --git a/tryton/gui/window/view_form/view/form_gtk/interface.py b/tryton/gui/window/view_form/view/form_gtk/interface.py index ff177ff3ee..603e216008 100644 --- a/tryton/gui/window/view_form/view/form_gtk/interface.py +++ b/tryton/gui/window/view_form/view/form_gtk/interface.py @@ -191,9 +191,5 @@ class WidgetInterface(object): self.invisible_set(modelfield.get_state_attrs(model).\ get('invisible', False)) - def sig_changed(self): - if self.attrs.get('on_change', False): - self._view.view_form.screen.on_change(self.attrs['on_change']) - def set_value(self, model, model_field): pass diff --git a/tryton/gui/window/view_form/view/form_gtk/selection.py b/tryton/gui/window/view_form/view/form_gtk/selection.py index 0896b6b1ea..ff7ba29240 100644 --- a/tryton/gui/window/view_form/view/form_gtk/selection.py +++ b/tryton/gui/window/view_form/view/form_gtk/selection.py @@ -106,5 +106,4 @@ class Selection(WidgetInterface): def sig_changed(self, *args): if self.changed: - super(Selection, self).sig_changed() self._focus_out() diff --git a/tryton/gui/window/view_form/view/list.py b/tryton/gui/window/view_form/view/list.py index c3d2a6dcbc..bdc2fc4d29 100644 --- a/tryton/gui/window/view_form/view/list.py +++ b/tryton/gui/window/view_form/view/list.py @@ -335,10 +335,6 @@ class ViewList(ParserView): sel.selected_foreach(_func_sel_get, models) return models - def on_change(self, callback): - self.set_value() - self.screen.on_change(callback) - def unset_editable(self): self.widget_tree.editable = False for col in self.widget_tree.get_columns(): diff --git a/tryton/gui/window/view_form/view/list_gtk/editabletree.py b/tryton/gui/window/view_form/view/list_gtk/editabletree.py index 6f2ad54008..9dfa5ca5c3 100644 --- a/tryton/gui/window/view_form/view/list_gtk/editabletree.py +++ b/tryton/gui/window/view_form/view/list_gtk/editabletree.py @@ -32,15 +32,6 @@ class EditableTreeView(gtk.TreeView): except parser.UnsettableColumn: return - # And now the on_change stuff ... only 3 lines are enough. - #callback = modelfield.attrs.get('on_change', '') - #if callback: - # current_model.on_change(callback) - - # And finally the conditional default - #if modelfield.attrs.get('change_default', False): - # current_model.cond_default(fieldname, real_value) - def on_open_remote(self, current_model, fieldname, create, value): modelfield = current_model[fieldname] cell = self.cells[fieldname]