Use record and field properties of widget instead of method arguments

issue8020
review58491002
This commit is contained in:
Nicolas Évrard committed 2019-01-23 16:58:11 +01:00
1 parent 3fcef1f985
commit c975fd890c
23 files changed
+154 -152

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Use record and field properties of widget instead of method arguments
* Reduce offset when no search result
* Ensure URL scheme of bus (issue7792)
* Add drag & drop support on binary widget
+2 -3
View File
@@ -480,13 +480,12 @@ class ViewForm(View):
if record:
for name, widgets in self.widgets.items():
if name in record.group.fields:
field = record.group.fields[name]
for widget in widgets:
if (not focused_widget
or widget.widget.is_focus()
or (isinstance(widget.widget, gtk.Container)
and widget.widget.get_focus_child())):
widget.set_value(record, field)
widget.set_value()
@property
def selected_records(self):
@@ -534,7 +533,7 @@ class ViewForm(View):
if field:
field.state_set(record)
for widget in widgets:
widget.display(record, field)
widget.display()
for widget in self.state_widgets:
widget.state_set(record)
if focused_widget:
@@ -195,22 +195,22 @@ class Binary(BinaryMixin, Widget):
if icon_pos == gtk.ENTRY_ICON_PRIMARY:
self.open_()
def display(self, record, field):
super(Binary, self).display(record, field)
if not field:
def display(self):
super(Binary, self).display()
if not self.field:
if self.wid_text:
self.wid_text.set_text('')
self.wid_size.set_text('')
self.but_save_as.hide()
return False
if hasattr(field, 'get_size'):
size = field.get_size(record)
if hasattr(self.field, 'get_size'):
size = self.field.get_size(self.record)
else:
size = len(field.get(record))
size = len(self.field.get(self.record))
self.wid_size.set_text(common.humanize(size or 0))
reset_position(self.wid_size)
if self.wid_text:
self.wid_text.set_text(self.filename_field.get(record) or '')
self.wid_text.set_text(self.filename_field.get(self.record) or '')
reset_position(self.wid_text)
if size:
icon, tooltip = 'tryton-open', _("Open...")
@@ -227,7 +227,7 @@ class Binary(BinaryMixin, Widget):
self.update_buttons(bool(size))
return True
def set_value(self, record, field):
def set_value(self):
if self.wid_text:
self.filename_field.set_client(self.record,
self.wid_text.get_text() or False)
@@ -62,28 +62,28 @@ class Date(Widget):
def sig_key_press(self, widget, event):
self.send_modified()
def set_value(self, record, field):
field.set_client(record, self.get_value())
def set_value(self):
self.field.set_client(self.record, self.get_value())
def get_value(self):
return self.entry.props.value
def set_format(self, record, field):
if field and record:
format_ = field.date_format(record)
def set_format(self):
if self.field and self.record:
format_ = self.field.date_format(self.record)
else:
format_ = common.date_format(
self.view.screen.context.get('date_format'))
self.entry.props.format = format_
def display(self, record, field):
super(Date, self).display(record, field)
if field and record:
value = field.get_client(record)
def display(self):
super(Date, self).display()
if self.field and self.record:
value = self.field.get_client(self.record)
else:
value = ''
self.entry.props.value = value
self.set_format(record, field)
self.set_format()
class Time(Date):
@@ -105,12 +105,12 @@ class Time(Date):
def real_entry(self):
return self.entry.get_child()
def display(self, record, field):
super(Time, self).display(record, field)
def display(self):
super(Time, self).display()
def set_format(self, record, field):
if field and record:
format_ = field.time_format(record)
def set_format(self):
if self.field and self.record:
format_ = self.field.time_format(self.record)
else:
format_ = '%X'
self.entry.props.format = format_
@@ -155,10 +155,10 @@ class DateTime(Date):
elif isinstance(child, gtk.ComboBoxEntry):
child.set_sensitive(value)
def set_format(self, record, field):
if field and record:
date_format = field.date_format(record)
time_format = field.time_format(record)
def set_format(self):
if self.field and self.record:
date_format = self.field.date_format(self.record)
time_format = self.field.time_format(self.record)
else:
date_format = common.date_format(
self.view.screen.context.get('date_format'))
@@ -83,33 +83,33 @@ class Char(Widget, TranslateMixin, PopdownMixin):
@property
def modified(self):
if self.record and self.field:
value = self.get_client_value(self.record, self.field)
value = self.get_client_value()
return value != self.get_value()
return False
def set_value(self, record, field):
def set_value(self):
entry = self.entry.get_child() if self.autocomplete else self.entry
value = entry.get_text() or ''
return field.set_client(record, value)
return self.field.set_client(self.record, value)
def get_value(self):
entry = self.entry.get_child() if self.autocomplete else self.entry
return entry.get_text()
def get_client_value(self, record, field):
if not field:
def get_client_value(self):
if not self.field:
value = ''
else:
value = field.get_client(record)
value = self.field.get_client(self.record)
return value
def display(self, record, field):
super(Char, self).display(record, field)
def display(self):
super(Char, self).display()
if self.autocomplete:
if record:
if self.field_name not in record.autocompletion:
record.do_autocomplete(self.field_name)
selection = record.autocompletion.get(self.field_name, [])
if self.record:
if self.field_name not in self.record.autocompletion:
self.record.do_autocomplete(self.field_name)
selection = self.record.autocompletion.get(self.field_name, [])
else:
selection = []
self.set_popdown([(x, x) for x in selection], self.entry)
@@ -119,15 +119,15 @@ class Char(Widget, TranslateMixin, PopdownMixin):
size_entry = self.entry.get_child()
else:
size_entry = self.entry
if record:
field_size = record.expr_eval(self.attrs.get('size'))
if self.record:
field_size = self.record.expr_eval(self.attrs.get('size'))
size_entry.set_width_chars(field_size or -1)
size_entry.set_max_length(field_size or 0)
else:
size_entry.set_width_chars(-1)
size_entry.set_max_length(0)
value = self.get_client_value(record, field)
value = self.get_client_value()
if not self.autocomplete:
self.entry.set_text(value)
reset_position(self.entry)
@@ -20,12 +20,12 @@ class CheckBox(Widget):
# TODO find a better solution to accept focus
self.widget.set_sensitive(not value)
def set_value(self, record, field):
field.set_client(record, self.widget.get_active())
def set_value(self):
self.field.set_client(self.record, self.widget.get_active())
def display(self, record, field):
super(CheckBox, self).display(record, field)
if not field:
def display(self):
super(CheckBox, self).display()
if not self.field:
self.widget.set_active(False)
return False
self.widget.set_active(bool(field.get(record)))
self.widget.set_active(bool(self.field.get(self.record)))
@@ -424,10 +424,10 @@ class DictWidget(Widget):
del self.rows[key]
if modified:
self.send_modified()
self.set_value(self.record, self.field)
self.set_value()
def set_value(self, record, field):
field.set_client(record, self.get_value())
def set_value(self):
self.field.set_client(self.record, self.get_value())
def get_value(self):
return dict((key, widget.get_value())
@@ -496,25 +496,25 @@ class DictWidget(Widget):
self.rows[key] = [label, alignment, remove_but]
self.buttons[key] = remove_but
def display(self, record, field):
super(DictWidget, self).display(record, field)
def display(self):
super(DictWidget, self).display()
if field is None:
if self.field is None:
return
record_id = record.id if record else None
record_id = self.record.id if self.record else None
if record_id != self._record_id:
for key in list(self.fields.keys()):
self._sig_remove(None, key, modified=False)
self._record_id = record_id
value = field.get_client(record) if field else {}
new_key_names = set(value.keys()) - set(field.keys)
value = self.field.get_client(self.record) if self.field else {}
new_key_names = set(value.keys()) - set(self.field.keys)
if new_key_names:
field.add_keys(list(new_key_names), self.record)
self.field.add_keys(list(new_key_names), self.record)
decoder = PYSONDecoder()
for key, val in sorted(value.items()):
if key not in field.keys:
if key not in self.field.keys:
continue
if key not in self.fields:
self.add_line(key)
@@ -12,10 +12,10 @@ class Float(Integer):
super(Float, self).__init__(view, attrs)
self.entry.connect('key-press-event', self.key_press_event)
def display(self, record, field):
super(Float, self).display(record, field)
if field:
digits = field.digits(record, factor=self.factor)
def display(self):
super(Float, self).display()
if self.field:
digits = self.field.digits(self.record, factor=self.factor)
if digits:
self.entry.set_width_chars(sum(digits))
else:
@@ -107,7 +107,7 @@ class Image(BinaryMixin, Widget):
self.image.set_from_pixbuf(pixbuf)
return bool(value)
def display(self, record, field):
super(Image, self).display(record, field)
def display(self):
super(Image, self).display()
value = self.update_img()
self.update_buttons(bool(value))
@@ -19,15 +19,15 @@ class Integer(Char):
self.entry.connect('insert_text', self.sig_insert_text)
self.factor = float(attrs.get('factor', 1))
def set_value(self, record, field):
return field.set_client(record, self.entry.get_text(),
def set_value(self):
return self.field.set_client(self.record, self.entry.get_text(),
factor=self.factor)
def get_client_value(self, record, field):
if not field:
def get_client_value(self):
if not self.field:
value = ''
else:
value = field.get_client(record, factor=self.factor)
value = self.field.get_client(self.record, factor=self.factor)
return value
def sig_insert_text(self, entry, new_text, new_text_length, position):
@@ -253,21 +253,21 @@ class Many2Many(Widget):
self._position = signal_data[0]
self._set_button_sensitive()
def display(self, record, field):
super(Many2Many, self).display(record, field)
if field is None:
def display(self):
super(Many2Many, self).display()
if self.field is None:
self.screen.new_group()
self.screen.current_record = None
self.screen.parent = None
self.screen.display()
return False
new_group = field.get_client(record)
new_group = self.field.get_client(self.record)
if id(self.screen.group) != id(new_group):
self.screen.group = new_group
self.screen.display()
return True
def set_value(self, record, field):
def set_value(self):
self.screen.current_view.set_value()
return True
@@ -278,9 +278,9 @@ class Many2One(Widget):
def get_value(self):
return self.wid_text.get_text()
def set_value(self, record, field):
if field.get_client(record) != self.wid_text.get_text():
field.set_client(record, self.value_from_id(None, ''))
def set_value(self):
if self.field.get_client(self.record) != self.wid_text.get_text():
self.field.set_client(self.record, self.value_from_id(None, ''))
self.set_text('')
def set_text(self, value):
@@ -289,19 +289,19 @@ class Many2One(Widget):
self.wid_text.set_text(value)
reset_position(self.wid_text)
def display(self, record, field):
def display(self):
self.changed = False
super(Many2One, self).display(record, field)
super(Many2One, self).display()
self._set_button_sensitive()
self._set_completion()
if not field:
if not self.field:
self.set_text('')
self.changed = True
return False
self.set_text(field.get_client(record))
if self.has_target(field.get(record)):
self.set_text(self.field.get_client(self.record))
if self.has_target(self.field.get(self.record)):
icon1, tooltip1 = 'tryton-open', _('Open the record <F2>')
icon2, tooltip2 = 'tryton-clear', _('Clear the field <Del>')
else:
@@ -66,31 +66,31 @@ class MultiSelection(Widget, SelectionMixin):
model, paths = self.tree.get_selection().get_selected_rows()
return [model[path][0] for path in paths]
def set_value(self, record, field):
field.set_client(record, self.get_value())
def set_value(self):
self.field.set_client(self.record, self.get_value())
def display(self, record, field):
def display(self):
selection = self.tree.get_selection()
selection.handler_block_by_func(self.changed)
try:
# Remove select_function to allow update,
# it will be set back in the super call
selection.set_select_function(lambda *a: True)
self.update_selection(record, field)
self.update_selection(self.record, self.field)
self.model.clear()
if field is None:
if self.field is None:
return
id2path = {}
for idx, (value, name) in enumerate(self.selection):
self.model.append((value, name))
id2path[value] = idx
selection.unselect_all()
group = field.get_client(record)
group = self.field.get_client(self.record)
for element in group:
if (element not in group.record_removed
and element not in group.record_deleted
and element.id in id2path):
selection.select_path(id2path[element.id])
super(MultiSelection, self).display(record, field)
super(MultiSelection, self).display()
finally:
selection.handler_unblock_by_func(self.changed)
@@ -486,18 +486,18 @@ class One2Many(Widget):
self.label.set_text(line)
self._set_button_sensitive()
def display(self, record, field):
super(One2Many, self).display(record, field)
def display(self):
super(One2Many, self).display()
self._set_button_sensitive()
if field is None:
if self.field is None:
self.screen.new_group()
self.screen.current_record = None
self.screen.parent = None
self.screen.display()
return False
new_group = field.get_client(record)
new_group = self.field.get_client(self.record)
if id(self.screen.group) != id(new_group):
self.screen.group = new_group
@@ -506,9 +506,9 @@ class One2Many(Widget):
self.screen.current_record = None
domain = []
size_limit = None
if record:
domain = field.domain_get(record)
size_limit = record.expr_eval(self.attrs.get('size'))
if self.record:
domain = self.field.domain_get(self.record)
size_limit = self.record.expr_eval(self.attrs.get('size'))
if self._readonly:
if size_limit is None:
size_limit = len(self.screen.group)
@@ -520,11 +520,11 @@ class One2Many(Widget):
self.screen.display()
return True
def set_value(self, record, field):
def set_value(self):
self.screen.current_view.set_value()
if self.screen.modified(): # TODO check if required
record.modified_fields.setdefault(field.name)
record.signal('record-modified')
self.record.modified_fields.setdefault(self.field.name)
self.record.signal('record-modified')
return True
def _completion_match_selected(self, completion, model, iter_):
@@ -24,15 +24,15 @@ class ProgressBar(Widget):
'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT)
self.widget.set_orientation(orientation)
def display(self, record, field):
super(ProgressBar, self).display(record, field)
if not field:
def display(self):
super(ProgressBar, self).display()
if not self.field:
self.widget.set_text('')
self.widget.set_fraction(0.0)
return False
text = field.get_client(record, factor=100)
text = self.field.get_client(self.record, factor=100)
if text:
text = _('%s%%') % text
self.widget.set_text(text)
value = field.get(record) or 0.0
value = self.field.get(self.record) or 0.0
self.widget.set_fraction(value)
@@ -24,18 +24,18 @@ class PYSON(Char):
except Exception:
return None
def set_value(self, record, field):
def set_value(self):
# avoid modification because different encoding
value = self.get_encoded_value()
previous = field.get_client(record)
previous = self.field.get_client(self.record)
if (previous
and value == self.encoder.encode(
self.decoder.decode(previous))):
value = previous
field.set_client(record, value)
self.field.set_client(self.record, value)
def get_client_value(self, record, field):
value = super(PYSON, self).get_client_value(record, field)
def get_client_value(self):
value = super(PYSON, self).get_client_value()
if value:
value = repr(self.decoder.decode(value))
return value
@@ -110,22 +110,22 @@ class Reference(Many2One, SelectionMixin, PopdownMixin):
value = ('', '')
self.field.set_client(self.record, value)
def set_value(self, record, field):
def set_value(self):
if not self.get_model():
value = self.wid_text.get_text()
if not value:
field.set_client(record, None)
self.field.set_client(self.record, None)
else:
field.set_client(record, ('', value))
self.field.set_client(self.record, ('', value))
return
else:
try:
model, name = field.get_client(record)
model, name = self.field.get_client(self.record)
except (ValueError, TypeError):
model, name = self.get_empty_value()
if (model != self.get_model()
or name != self.wid_text.get_text()):
field.set_client(record, None)
self.field.set_client(self.record, None)
self.set_text('')
def set_text(self, value):
@@ -142,7 +142,7 @@ class Reference(Many2One, SelectionMixin, PopdownMixin):
self.set_popdown_value(self.widget_combo, value)
self.widget_combo.handler_unblock_by_func(self.sig_changed_combo)
def display(self, record, field):
self.update_selection(record, field)
def display(self):
self.update_selection(self.record, self.field)
self.set_popdown(self.selection, self.widget_combo)
super(Reference, self).display(record, field)
super(Reference, self).display()
@@ -125,13 +125,13 @@ class RichTextBox(TextBox):
tool = toolbar.get_nth_item(n)
tool.set_sensitive(not value)
def set_value(self, record, field):
def set_value(self):
# avoid modification of not normalized value
value = self.get_value()
prev_value = field.get_client(record) or ''
prev_value = self.field.get_client(self.record) or ''
if value == normalize_markup(prev_value):
value = prev_value
field.set_client(record, value)
self.field.set_client(self.record, value)
@property
def modified(self):
@@ -68,22 +68,22 @@ class Selection(Widget, SelectionMixin, PopdownMixin):
return self.field.get(self.record) != self.get_value()
return False
def set_value(self, record, field):
def set_value(self):
value = self.get_value()
if 'relation' in self.attrs and value:
value = (value, self.get_popdown_text(self.entry))
field.set_client(record, value)
self.field.set_client(self.record, value)
def display(self, record, field):
self.update_selection(record, field)
def display(self):
self.update_selection(self.record, self.field)
self.set_popdown(self.selection, self.entry)
if not field:
if not self.field:
self.entry.set_active(-1)
# When setting no item GTK doesn't clear the entry
self.entry.get_child().set_text('')
return
super(Selection, self).display(record, field)
value = field.get(record)
super(Selection, self).display()
value = self.field.get(self.record)
if isinstance(value, (list, tuple)):
# Compatibility with Many2One
value = value[0]
@@ -98,8 +98,8 @@ class TextBox(Widget, TranslateMixin):
def get_value(self):
return self.get_buffer(self.textview)
def set_value(self, record, field):
field.set_client(record, self.get_value())
def set_value(self):
self.field.set_client(self.record, self.get_value())
def set_buffer(self, value, textview):
buf = textview.get_buffer()
@@ -113,9 +113,9 @@ class TextBox(Widget, TranslateMixin):
iter_end = buf.get_end_iter()
return buf.get_text(iter_start, iter_end, False)
def display(self, record, field):
super(TextBox, self).display(record, field)
value = field and field.get(record)
def display(self):
super(TextBox, self).display()
value = self.field and self.field.get(self.record)
if not value:
value = ''
self.set_buffer(value, self.textview)
@@ -29,19 +29,19 @@ class TimeDelta(Widget):
return self.field.get_client(self.record) != value
return False
def set_value(self, record, field):
def set_value(self):
value = self.entry.get_text()
return field.set_client(record, value)
return self.field.set_client(self.record, value)
def get_value(self):
return self.entry.get_text()
def display(self, record, field):
super(TimeDelta, self).display(record, field)
if not field:
def display(self):
super(TimeDelta, self).display()
if not self.field:
value = ''
else:
value = field.get_client(record)
value = self.field.get_client(self.record)
self.entry.set_text(value)
reset_position(self.entry)
@@ -23,13 +23,14 @@ class URL(Char):
self.widget.pack_start(self.button, expand=False, fill=False)
self.widget.set_focus_chain([self.entry])
def display(self, record, field):
super(URL, self).display(record, field)
def display(self):
super(URL, self).display()
self.set_tooltips()
if record and 'icon' in self.attrs:
if self.record and 'icon' in self.attrs:
icon = self.attrs['icon']
if icon in record.group.fields:
value = record[icon].get_client(record) or 'tryton-public'
if icon in self.record.group.fields:
value = self.record[icon].get_client(self.record)
value = value if value else 'tryton-public'
else:
value = icon
self.button.set_image(common.IconFactory.get_image(
@@ -43,6 +43,7 @@ class Widget(object):
def field(self):
if self.record:
return self.record.group.fields[self.field_name]
return None
def destroy(self):
pass
@@ -101,15 +102,15 @@ class Widget(object):
return False
if not self.visible:
return False
self.set_value(self.record, self.field)
self.set_value()
def display(self, record, field):
if not field:
def display(self):
if not self.field:
self._readonly_set(self.attrs.get('readonly', True))
self.invisible_set(self.attrs.get('invisible', False))
self._required_set(False)
return
states = field.get_state_attrs(record)
states = self.field.get_state_attrs(self.record)
readonly = self.attrs.get('readonly', states.get('readonly', False))
if self.view.screen.readonly:
readonly = True
@@ -124,7 +125,7 @@ class Widget(object):
self.invisible_set(self.attrs.get(
'invisible', states.get('invisible', False)))
def set_value(self, record, field):
def set_value(self):
pass