Implement new on_change behavior

This commit is contained in:
Cédric Krier
2008-02-26 17:51:31 +01:00
parent ec1e9d8562
commit f971deebcc
8 changed files with 12 additions and 39 deletions
+2 -2
View File
@@ -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):
+8 -16
View File
@@ -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):
+2 -2
View File
@@ -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()
@@ -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)
@@ -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
@@ -106,5 +106,4 @@ class Selection(WidgetInterface):
def sig_changed(self, *args):
if self.changed:
super(Selection, self).sig_changed()
self._focus_out()
-4
View File
@@ -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():
@@ -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]