本文整理汇总了Python中tryton.gui.window.view_form.screen.Screen.display方法的典型用法代码示例。如果您正苦于以下问题:Python Screen.display方法的具体用法?Python Screen.display怎么用?Python Screen.display使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类tryton.gui.window.view_form.screen.Screen
的用法示例。
在下文中一共展示了Screen.display方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: One2Many
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
)
self.but_del.set_sensitive(
bool(not self._readonly and self.attrs.get("delete", True) and self._position and access["delete"])
)
self.but_undel.set_sensitive(bool(not self._readonly and not size_limit and self._position))
self.but_open.set_sensitive(bool(self._position and access["read"] and has_form))
self.but_next.set_sensitive(bool(self._position and self._position < self._length))
self.but_pre.set_sensitive(bool(self._position and self._position > 1))
if self.attrs.get("add_remove"):
self.but_add.set_sensitive(
bool(not self._readonly and not size_limit and access["write"] and access["read"])
)
self.but_remove.set_sensitive(
bool(not self._readonly and self._position and access["write"] and access["read"])
)
self.wid_text.set_sensitive(self.but_add.get_sensitive())
# New button must be added to focus chain to allow keyboard only
# creation when there is no existing record on form view.
focus_chain = self.title_box.get_focus_chain() or []
if o2m_size == 0 and self.screen.current_view.view_type == "form":
if self.but_new not in focus_chain:
focus_chain.append(self.but_new)
else:
if self.but_new in focus_chain:
focus_chain.remove(self.but_new)
self.title_box.set_focus_chain(focus_chain)
def _validate(self):
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display(set_cursor=True)
return False
if self.screen.pre_validate and not record.pre_validate():
return False
return True
def _sig_new(self, *args):
if not common.MODELACCESS[self.screen.model_name]["create"]:
return
if not self._validate():
return
if self.attrs.get("product"):
self._new_product()
else:
self._new_single()
def _new_single(self):
ctx = {}
ctx.update(self.field.context_get(self.record))
sequence = None
for view in self.screen.views:
if view.view_type == "tree":
sequence = view.attributes.get("sequence")
if sequence:
break
def update_sequence():
if sequence:
self.screen.group.set_sequence(field=sequence)
for widget in [self] + self.view.widgets[self.field_name]:
if (
示例2: Many2Many
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
self._sig_add()
self.wid_text.grab_focus()
return False
def destroy(self):
self.screen.destroy()
def color_set(self, name):
super(Many2Many, self).color_set(name)
widget = self._color_widget()
# if the style to apply is different from readonly then insensitive
# cellrenderers should use the default insensitive color
if name != 'readonly':
widget.modify_text(gtk.STATE_INSENSITIVE,
self.colors['text_color_insensitive'])
def _sig_add(self, *args):
if not self.focus_out:
return
domain = self.field.domain_get(self.record)
add_remove = self.record.expr_eval(self.attrs.get('add_remove'))
if add_remove:
domain = [domain, add_remove]
context = self.field.context_get(self.record)
value = self.wid_text.get_text().decode('utf-8')
self.focus_out = False
def callback(result):
self.focus_out = True
if result:
ids = [x[0] for x in result]
self.screen.load(ids, modified=True)
self.screen.display(res_id=ids[0])
self.screen.set_cursor()
self.wid_text.set_text('')
win = WinSearch(self.attrs['relation'], callback, sel_multi=True,
context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
views_preload=self.attrs.get('views', {}),
new=self.attrs.get('create', True))
win.screen.search_filter(quote(value))
win.show()
def _sig_remove(self, *args):
self.screen.remove(remove=True)
def _on_activate(self):
self._sig_edit()
def _sig_edit(self):
if not self.screen.current_record:
return
# Create a new screen that is not linked to the parent otherwise on the
# save of the record will trigger the save of the parent
domain = self.field.domain_get(self.record)
add_remove = self.record.expr_eval(self.attrs.get('add_remove'))
if add_remove:
domain = [domain, add_remove]
context = self.field.context_get(self.record)
screen = Screen(self.attrs['relation'], domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
mode=['form'], views_preload=self.attrs.get('views', {}),
readonly=self.attrs.get('readonly', False),
context=context)
示例3: Form
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
message_str += _('Model:') + ' ' + self.model
message(message_str)
return True
def revision(self, widget=None):
if not self.modified_save():
return
current_id = (self.screen.current_record.id
if self.screen.current_record else None)
try:
revisions = RPCExecute('model', self.model, 'history_revisions',
[r.id for r in self.screen.selected_records])
except RPCException:
return
revision = self.screen.context.get('_datetime')
format_ = self.screen.context.get('date_format', '%x')
format_ += ' %X.%f'
revision = Revision(revisions, revision, format_).run()
# Prevent too old revision in form view
if (self.screen.current_view.view_type == 'form'
and revision
and revision < revisions[-1][0]):
revision = revisions[-1][0]
if revision != self.screen.context.get('_datetime'):
self.screen.clear()
# Update root group context that will be propagated
self.screen.group._context['_datetime'] = revision
if self.screen.current_view.view_type != 'form':
self.screen.search_filter(
self.screen.screen_container.get_text())
else:
# Test if record exist in revisions
self.screen.load([current_id])
self.screen.display(set_cursor=True)
self.update_revision()
def update_revision(self):
revision = self.screen.context.get('_datetime')
if revision:
format_ = self.screen.context.get('date_format', '%x')
format_ += ' %X.%f'
revision = datetime_strftime(revision, format_)
self.title.set_label('%s @ %s' % (self.name, revision))
else:
self.title.set_label(self.name)
self.set_buttons_sensitive(revision)
def set_buttons_sensitive(self, revision=None):
if not revision:
access = common.MODELACCESS[self.model]
self.buttons['new'].props.sensitive = access['create']
self.buttons['save'].props.sensitive = (
access['create'] or access['write'])
else:
for button in ['new', 'save']:
self.buttons[button].props.sensitive = False
def sig_remove(self, widget=None):
if not common.MODELACCESS[self.model]['delete']:
return
if self.screen.current_view.view_type == 'form':
msg = _('Are you sure to remove this record?')
else:
msg = _('Are you sure to remove those records?')
if sur(msg):
if not self.screen.remove(delete=True, force_remove=True):
示例4: Many2Many
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
def color_set(self, name):
super(Many2Many, self).color_set(name)
widget = self._color_widget()
# if the style to apply is different from readonly then insensitive
# cellrenderers should use the default insensitive color
if name != 'readonly':
widget.modify_text(gtk.STATE_INSENSITIVE,
self.colors['text_color_insensitive'])
def _sig_add(self, *args, **kwargs):
if not self.focus_out:
return
domain = self.field.domain_get(self.record)
context = self.field.context_get(self.record)
value = self.wid_text.get_text()
self.focus_out = False
try:
if value:
dom = [('rec_name', 'ilike', '%' + value + '%'), domain]
else:
dom = domain
ids = RPCExecute('model', self.attrs['relation'], 'search',
dom, 0, CONFIG['client.limit'], None, context=context)
except RPCException:
self.focus_out = True
return False
def callback(result):
self.focus_out = True
if result:
ids = [x[0] for x in result]
self.screen.load(ids, modified=True)
self.screen.display(res_id=ids[0])
self.screen.set_cursor()
self.wid_text.set_text('')
if len(ids) != 1 or not value or kwargs.get('win_search', False):
WinSearch(self.attrs['relation'], callback, sel_multi=True,
ids=ids, context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
views_preload=self.attrs.get('views', {}),
new=self.attrs.get('create', True))
else:
callback([(i, None) for i in ids])
def _sig_remove(self, *args):
self.screen.remove(remove=True)
def _on_activate(self):
self._sig_edit()
def _sig_edit(self):
if self.screen.current_record:
def callback(result):
if result:
self.screen.current_record.save()
else:
self.screen.current_record.cancel()
WinForm(self.screen, callback)
def _readonly_set(self, value):
self._readonly = value
self._set_button_sensitive()
def _set_button_sensitive(self):
if self.record and self.field:
示例5: One2Many
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
def switch_view(self, widget):
self.screen.switch_view()
self.color_set(self.color_name)
@property
def modified(self):
return self.screen.current_view.modified
def color_set(self, name):
super(One2Many, self).color_set(name)
widget = self._color_widget()
# if the style to apply is different from readonly then insensitive
# cellrenderers should use the default insensitive color
if name != 'readonly':
widget.modify_text(gtk.STATE_INSENSITIVE,
self.colors['text_color_insensitive'])
def _readonly_set(self, value):
self._readonly = value
self.but_new.set_sensitive(not value)
self.but_del.set_sensitive(not value)
self.but_undel.set_sensitive(not value)
if self.attrs.get('add_remove'):
self.wid_text.set_sensitive(not value)
self.but_add.set_sensitive(not value)
self.but_remove.set_sensitive(not value)
def _sig_new(self, widget):
self.view.set_value()
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display()
return
ctx = {}
ctx.update(self.field.context_get(self.record))
sequence = None
if self.screen.current_view.view_type == 'tree':
sequence = self.screen.current_view.widget_tree.sequence
def update_sequence():
if sequence:
self.screen.group.set_sequence(field=sequence)
if (self.screen.current_view.view_type == 'form') \
or self.screen.editable_get():
self.screen.new(context=ctx)
self.screen.current_view.widget.set_sensitive(True)
update_sequence()
else:
WinForm(self.screen, lambda a: update_sequence(), new=True,
many=True, context=ctx)
def _sig_edit(self, widget=None):
self.view.set_value()
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display()
return
WinForm(self.screen, lambda a: None)
def _sig_next(self, widget):
self.view.set_value()
示例6: Preference
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
class Preference(NoModal):
"Preference window"
def __init__(self, user, callback):
NoModal.__init__(self)
self.callback = callback
self.win = gtk.Dialog(_('Preferences'), self.parent,
gtk.DIALOG_DESTROY_WITH_PARENT)
self.win.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
self.win.set_has_separator(False)
self.win.set_icon(TRYTON_ICON)
self.accel_group = gtk.AccelGroup()
self.win.add_accel_group(self.accel_group)
self.but_cancel = self.win.add_button(gtk.STOCK_CANCEL,
gtk.RESPONSE_CANCEL)
self.but_ok = self.win.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
self.but_ok.add_accelerator('clicked', self.accel_group,
gtk.keysyms.Return, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
self.win.set_default_response(gtk.RESPONSE_OK)
self.win.connect('response', self.response)
try:
view = RPCExecute('model', 'res.user',
'get_preferences_fields_view')
except RPCException:
self.win.destroy()
self.win = None
return
title = gtk.Label(_('Edit User Preferences'))
title.show()
self.win.vbox.pack_start(title, expand=False, fill=True)
self.screen = Screen('res.user', mode=[])
# Reset readonly set automaticly by MODELACCESS
self.screen.readonly = False
self.screen.group.readonly = False
self.screen.group.skip_model_access = True
self.screen.add_view(view)
self.screen.switch_view()
self.screen.new(default=False)
try:
preferences = RPCExecute('model', 'res.user', 'get_preferences',
False)
except RPCException:
self.win.destroy()
self.win = None
return
self.screen.current_record.set(preferences)
self.screen.current_record.id = rpc._USER
self.screen.current_record.validate(softvalidation=True)
self.screen.display(set_cursor=True)
self.screen.widget.show()
self.win.vbox.pack_start(self.screen.widget)
self.win.set_title(_('Preference'))
width, height = self.parent.get_size()
self.win.set_default_size(int(width * 0.9), int(height * 0.9))
self.register()
self.win.show()
def response(self, win, response_id):
if response_id == gtk.RESPONSE_OK:
if self.screen.current_record.validate():
vals = copy.copy(self.screen.get())
if 'password' in vals:
password = common.ask(_('Current Password:'),
visibility=False)
if not password:
return
else:
password = False
try:
RPCExecute('model', 'res.user', 'set_preferences',
vals, password)
except RPCException:
return
self.parent.present()
self.destroy()
self.callback()
def destroy(self):
self.screen.destroy()
self.win.destroy()
NoModal.destroy(self)
示例7: Preference
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
class Preference(object):
"Preference window"
def __init__(self, user):
self.parent = common.get_toplevel_window()
self.win = gtk.Dialog(_("Preferences"), self.parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
self.win.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
self.win.set_has_separator(False)
self.win.set_icon(TRYTON_ICON)
self.accel_group = gtk.AccelGroup()
self.win.add_accel_group(self.accel_group)
self.but_cancel = self.win.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
self.but_ok = self.win.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
self.but_ok.add_accelerator(
"clicked", self.accel_group, gtk.keysyms.Return, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE
)
self.win.set_default_response(gtk.RESPONSE_OK)
try:
view = RPCExecute("model", "res.user", "get_preferences_fields_view")
except RPCException:
self.win.destroy()
self.win = None
return
title = gtk.Label(_("Edit User Preferences"))
title.show()
self.win.vbox.pack_start(title, expand=False, fill=True)
self.screen = Screen("res.user", mode=[])
self.screen.add_view(view)
self.screen.new(default=False)
try:
preferences = RPCExecute("model", "res.user", "get_preferences", False)
except RPCException:
self.win.destroy()
self.win = None
return
self.screen.current_record.set(preferences)
self.screen.current_record.validate(softvalidation=True)
self.screen.screen_container.set(self.screen.current_view.widget)
self.screen.display(set_cursor=True)
self.screen.widget.show()
self.win.vbox.pack_start(self.screen.widget)
self.win.set_title(_("Preference"))
width, height = self.parent.get_size()
self.win.set_default_size(int(width * 0.9), int(height * 0.9))
self.win.show()
def run(self):
"Run the window"
if not self.win:
return False
res = False
while True:
if self.win.run() == gtk.RESPONSE_OK:
if self.screen.current_record.validate():
vals = copy.copy(self.screen.get(get_modifiedonly=True))
if "password" in vals:
password = common.ask(_("Current Password:"), visibility=False)
if not password:
break
else:
password = False
try:
RPCExecute("model", "res.user", "set_preferences", vals, password)
except RPCException:
continue
res = True
break
else:
break
self.parent.present()
self.win.destroy()
return res
示例8: Many2ManySelection
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
class Many2ManySelection(Widget, SelectionMixin):
expand = True
def __init__(self, view, attrs):
super(Many2ManySelection, self).__init__(view, attrs)
self.widget = gtk.VBox(homogeneous=False, spacing=5)
hbox = gtk.HBox(homogeneous=False, spacing=0)
hbox.set_border_width(2)
label = gtk.Label(attrs.get("string", ""))
label.set_alignment(0.0, 0.5)
hbox.pack_start(label, expand=True, fill=True)
frame = gtk.Frame()
frame.add(hbox)
frame.set_shadow_type(gtk.SHADOW_OUT)
self.widget.pack_start(frame, expand=False, fill=True)
self.screen = Screen(
attrs["relation"],
view_ids=attrs.get("view_ids", "").split(","),
mode=["tree"],
views_preload=attrs.get("views", {}),
)
self.screen.new_group()
self.treeview = self.screen.current_view.treeview
self.treeview.get_selection().connect("changed", self.changed)
self.treeview.connect("focus-out-event", lambda *a: self._focus_out())
self.treeview.connect("button-press-event", self.button_press_event)
self.treeview.connect("key-press-event", self.key_press_event)
self.widget.pack_start(self.screen.widget, expand=True, fill=True)
self.nullable_widget = False
self.init_selection()
@property
def modified(self):
if self.record and self.field:
group = set(r.id for r in self.field.get_client(self.record))
value = set(self.get_value())
return value != group
return False
def changed(self, selection):
def focus_out():
if self.widget.props.window:
self._focus_out()
# Must be deferred because it triggers a display of the form
gobject.idle_add(focus_out)
def button_press_event(self, treeview, event):
# grab focus because it doesn't whith CONTROL MASK
treeview.grab_focus()
if event.button == 1:
event.state ^= gtk.gdk.CONTROL_MASK
def key_press_event(self, treeview, event):
if event.keyval in MOVEMENT_KEYS:
event.state ^= gtk.gdk.CONTROL_MASK
def get_value(self):
return [r.id for r in self.screen.selected_records]
def set_value(self, record, field):
field.set_client(record, self.get_value())
def display(self, record, field):
selection = self.treeview.get_selection()
selection.handler_block_by_func(self.changed)
try:
self.update_selection(record, field)
super(Many2ManySelection, self).display(record, field)
if field is None:
self.screen.clear()
self.screen.current_record = None
self.screen.parent = None
else:
self.screen.parent = record
current_ids = [r.id for r in self.screen.group]
new_ids = [s[0] for s in self.selection]
if current_ids != new_ids:
self.screen.clear()
self.screen.load(new_ids)
group = field.get_client(record)
nodes = [[r.id] for r in group if r not in group.record_removed and r not in group.record_deleted]
selection.unselect_all()
self.screen.current_view.select_nodes(nodes)
self.screen.display()
finally:
selection.handler_unblock_by_func(self.changed)
示例9: One2Many
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
self.but_pre.set_sensitive(bool(
self._position
and self._position > 1))
if self.attrs.get('add_remove'):
self.but_add.set_sensitive(bool(
not self._readonly
and not size_limit
and access['write']
and access['read']))
self.but_remove.set_sensitive(bool(
not self._readonly
and self._position
and access['write']
and access['read']))
self.wid_text.set_sensitive(self.but_add.get_sensitive())
# New button must be added to focus chain to allow keyboard only
# creation when there is no existing record on form view.
focus_chain = self.title_box.get_focus_chain() or []
if o2m_size == 0 and self.screen.current_view.view_type == 'form':
if self.but_new not in focus_chain:
focus_chain.append(self.but_new)
else:
if self.but_new in focus_chain:
focus_chain.remove(self.but_new)
self.title_box.set_focus_chain(focus_chain)
def _validate(self):
self.view.set_value()
record = self.screen.current_record
if record:
fields = self.screen.current_view.get_fields()
if not record.validate(fields):
self.screen.display(set_cursor=True)
return False
if self.screen.pre_validate and not record.pre_validate():
return False
return True
def _sig_new(self, *args):
if not common.MODELACCESS[self.screen.model_name]['create']:
return
if not self._validate():
return
if self.attrs.get('product'):
self._new_product()
else:
self._new_single()
def _new_single(self):
ctx = {}
ctx.update(self.field.context_get(self.record))
sequence = None
for view in self.screen.views:
if view.view_type == 'tree':
sequence = view.attributes.get('sequence')
if sequence:
break
def update_sequence():
if sequence:
self.screen.group.set_sequence(field=sequence)
if self.screen.current_view.editable:
self.screen.new()
示例10: Form
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
self.buttons['attach'].props.sensitive = bool(
record_id >= 0 and record_id is not False)
def sig_switch(self, widget=None):
if not self.modified_save():
return
self.screen.switch_view()
def sig_logs(self, widget=None):
obj_id = self.id_get()
if obj_id < 0 or obj_id is False:
self.message_info(_('You have to select one record!'))
return False
fields = [
('id', _('ID:')),
('create_uid.rec_name', _('Creation User:')),
('create_date', _('Creation Date:')),
('write_uid.rec_name', _('Latest Modification by:')),
('write_date', _('Latest Modification Date:')),
]
try:
res = RPCExecute('model', self.model, 'read', [obj_id],
[x[0] for x in fields], context=self.context)
except RPCException:
return
message_str = ''
for line in res:
for (key, val) in fields:
value = str(line.get(key, False) or '/')
if line.get(key, False) \
and key in ('create_date', 'write_date'):
display_format = date_format() + ' %H:%M:%S'
date = timezoned_date(line[key])
value = common.datetime_strftime(date, display_format)
message_str += val + ' ' + value + '\n'
message_str += _('Model:') + ' ' + self.model
message(message_str)
return True
def sig_remove(self, widget=None):
if not common.MODELACCESS[self.model]['delete']:
return
if self.screen.current_view.view_type == 'form':
msg = _('Are you sure to remove this record?')
else:
msg = _('Are you sure to remove those records?')
if sur(msg):
if not self.screen.remove(delete=True, force_remove=True):
self.message_info(_('Records not removed!'))
else:
self.message_info(_('Records removed!'), 'green')
def sig_import(self, widget=None):
while(self.screen.view_to_load):
self.screen.load_view_to_load()
fields = {}
for name, field in self.screen.group.fields.iteritems():
fields[name] = field.attrs
WinImport(self.model)
def sig_save_as(self, widget=None):
while self.screen.view_to_load:
self.screen.load_view_to_load()
fields = {}
示例11: Many2Many
# 需要导入模块: from tryton.gui.window.view_form.screen import Screen [as 别名]
# 或者: from tryton.gui.window.view_form.screen.Screen import display [as 别名]
#.........这里部分代码省略.........
del self.widget
def color_set(self, name):
super(Many2Many, self).color_set(name)
widget = self._color_widget()
# if the style to apply is different from readonly then insensitive
# cellrenderers should use the default insensitive color
if name != 'readonly':
widget.modify_text(gtk.STATE_INSENSITIVE,
self.colors['text_color_insensitive'])
def _focus_out(self, *args):
if self.wid_text.get_text():
self._sig_add()
def _sig_add(self, *args):
if not self.focus_out:
return
domain = self.field.domain_get(self.record)
context = self.field.context_get(self.record)
value = self.wid_text.get_text()
self.focus_out = False
try:
if value:
dom = [('rec_name', 'ilike', '%' + value + '%'), domain]
else:
dom = domain
ids = RPCExecute('model', self.attrs['relation'], 'search',
dom, 0, CONFIG['client.limit'], None, context=context)
except RPCException:
self.focus_out = True
return False
def callback(result):
self.focus_out = True
if result:
ids = [x[0] for x in result]
self.screen.load(ids, modified=True)
self.screen.display(res_id=ids[0])
self.screen.set_cursor()
self.wid_text.set_text('')
if len(ids) != 1 or not value:
WinSearch(self.attrs['relation'], callback, sel_multi=True,
ids=ids, context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
views_preload=self.attrs.get('views', {}))
else:
callback([(i, None) for i in ids])
def _sig_remove(self, *args):
self.screen.remove(remove=True)
def _sig_activate(self, *args):
self._sig_add()
self.wid_text.grab_focus()
def _on_activate(self):
self._sig_edit()
def _sig_edit(self):
if self.screen.current_record:
def callback(result):
if result:
self.screen.current_record.save()
else:
self.screen.current_record.cancel()
WinForm(self.screen, callback)
def _readonly_set(self, value):
self._readonly = value
self.wid_text.set_editable(not value)
self.wid_text.set_sensitive(not value)
self.but_remove.set_sensitive(not value)
self.but_add.set_sensitive(not value)
def _sig_label(self, screen, signal_data):
if signal_data[0] >= 1:
self.but_remove.set_sensitive(not self._readonly)
else:
self.but_remove.set_sensitive(False)
def display(self, record, field):
super(Many2Many, self).display(record, field)
if field is None:
self.screen.new_group()
self.screen.current_record = None
self.screen.parent = True
self.screen.display()
return False
new_group = field.get_client(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):
self.screen.save_tree_state()
self.screen.current_view.set_value()
return True