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) screen.load([self.screen.current_record.id]) def callback(result): if result: screen.current_record.save() # Force a reload on next display self.screen.current_record.cancel() # Force a display to clear the CellCache self.screen.display() WinForm(screen, callback)
def response(self, win, response_id): res = None if response_id == gtk.RESPONSE_OK: res = [r.id for r in self.screen.selected_records] elif response_id == gtk.RESPONSE_APPLY: self.screen.search_filter(self.screen.screen_container.get_text()) return elif response_id == gtk.RESPONSE_ACCEPT: screen = Screen(self.model_name, domain=self.domain, context=self.context, mode=['form']) def callback(result): if result and screen.save_current(): record = screen.current_record res = [(record.id, record.value.get('rec_name', ''))] self.callback(res) else: self.callback(None) self.destroy() WinForm(screen, callback, new=True, title=self.title) return if res: group = self.screen.group res = [(id_, group.get(id_).value.get('rec_name', '')) for id_ in res] self.callback(res) self.destroy()
def response(self, win, response_id): res = None if response_id == Gtk.ResponseType.OK: res = [r.id for r in self.screen.selected_records] elif response_id == Gtk.ResponseType.APPLY: self.screen.search_filter(self.screen.screen_container.get_text()) return elif response_id == Gtk.ResponseType.ACCEPT: # Remove first tree view as mode if form only view_ids = self.view_ids[1:] screen = Screen(self.model_name, domain=self.domain, context=self.context, order=self.order, mode=['form'], view_ids=view_ids, views_preload=self.views_preload, exclude_field=self.exclude_field) def callback(result): if result: record = screen.current_record res = [(record.id, record.value.get('rec_name', ''))] self.callback(res) else: self.callback(None) self.destroy() WinForm( screen, callback, new=True, save_current=True, title=self.title) return if res: group = self.screen.group res = [(id_, group.get(id_).value.get('rec_name', '')) for id_ in res] self.callback(res) self.destroy()
def get_screen(self): domain = self.field.domain_get(self.record) context = self.field.context_get(self.record) return Screen(self.get_model(), domain=domain, context=context, mode=['form'], view_ids=self.attrs.get('view_ids', '').split(','), views_preload=self.attrs.get('views', {}), readonly=self._readonly, exclude_field=self.attrs.get('relation_field'))
def open_remote(self, record, create=True, changed=False, text=None, callback=None): group = record.value[self.attrs['name']] field = record.group.fields[self.attrs['name']] relation = field.attrs['relation'] context = field.get_context(record) access = common.MODELACCESS[relation] if not access['read']: return screen = Screen(relation, mode=['tree', 'form'], view_ids=self.attrs.get('view_ids', '').split(','), exclude_field=field.attrs.get('relation_field')) screen.pre_validate = bool(int(self.attrs.get('pre_validate', 0))) screen.group = group def open_callback(result): if callback: callback() WinForm(screen, open_callback, view_type='tree', context=context, title=field.attrs.get('string'))
def open_remote(self, record, create=True, changed=False, text=None, callback=None): group = record.value[self.attrs['name']] field = record.group.fields[self.attrs['name']] relation = field.attrs['relation'] context = field.get_context(record) domain = field.domain_get(record) screen = Screen(relation, mode=['tree', 'form'], view_ids=self.attrs.get('view_ids', '').split(','), exclude_field=field.attrs.get('relation_field')) screen.group = group def open_callback(result): if callback: callback() WinForm(screen, open_callback, view_type='tree', domain=domain, context=context, title=field.attrs.get('string'))
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()
def update(self, view, defaults, buttons): for button in buttons: self._get_button(button) self.screen = Screen(view['model'], mode=[], context=self.context) self.screen.add_view(view) self.screen.switch_view() self.screen.widget.show() self.screen.signal_connect(self, 'group-changed', self._record_changed) title = gtk.Label() title.modify_font(pango.FontDescription("bold 14")) title.set_label(self.name) title.set_padding(20, 4) title.set_alignment(0.0, 0.5) title.set_size_request(0, -1) # Allow overflow title.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#000000")) title.show() hbox = gtk.HBox() hbox.pack_start(title, expand=True, fill=True) hbox.show() frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_ETCHED_IN) frame.add(hbox) frame.show() eb = gtk.EventBox() eb.add(frame) eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#ffffff")) eb.show() self.widget.pack_start(eb, expand=False, fill=True, padding=3) if self.toolbar_box: self.widget.pack_start(self.toolbar_box, False, True) viewport = gtk.Viewport() viewport.set_shadow_type(gtk.SHADOW_NONE) viewport.add(self.screen.widget) viewport.show() self.scrolledwindow = gtk.ScrolledWindow() self.scrolledwindow.set_shadow_type(gtk.SHADOW_NONE) self.scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolledwindow.add(viewport) self.scrolledwindow.show() self.widget.pack_start(self.scrolledwindow, expand=True, fill=True) self.create_info_bar() self.widget.pack_start(self.info_bar, False, True) self.screen.new(default=False) self.screen.current_record.set_default(defaults) self.update_buttons(self.screen.current_record) self.screen.set_cursor()
def update(self, view, buttons): tooltips = common.Tooltips() for button in buttons: self._get_button(button) self.screen = Screen(view['model'], mode=[], context=self.context) self.screen.add_view(view) self.screen.switch_view() self.screen.widget.show() self.screen.signal_connect(self, 'group-changed', self._record_changed) title = Gtk.Label(label=common.ellipsize(self.name, 80), halign=Gtk.Align.START, margin=5, ellipsize=Pango.EllipsizeMode.END) tooltips.set_tip(title, self.name) title.set_size_request(0, -1) # Allow overflow title.show() hbox = Gtk.HBox() hbox.pack_start(title, expand=True, fill=True, padding=0) hbox.show() frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN) widget_class(frame, 'wizard-title', True) frame.add(hbox) frame.show() self.widget.pack_start(frame, expand=False, fill=True, padding=3) if self.toolbar_box: self.widget.pack_start(self.toolbar_box, expand=False, fill=True, padding=0) viewport = Gtk.Viewport() viewport.set_shadow_type(Gtk.ShadowType.NONE) viewport.add(self.screen.widget) viewport.show() self.scrolledwindow = Gtk.ScrolledWindow() self.scrolledwindow.set_shadow_type(Gtk.ShadowType.NONE) self.scrolledwindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.scrolledwindow.add(viewport) self.scrolledwindow.show() self.widget.pack_start(self.scrolledwindow, expand=True, fill=True, padding=0) self.create_info_bar() self.widget.pack_start(self.info_bar, expand=False, fill=True, padding=0)
def open_remote(self, record, create=True, changed=False, text=None, callback=None): field = record.group.fields[self.attrs['name']] relation = field.attrs['relation'] access = common.MODELACCESS[relation] if (create and not (self.attrs.get('create', True) and access['create'])): return elif not access['read']: return domain = field.domain_get(record) context = field.get_context(record) if create: obj_id = None elif not changed: obj_id = field.get(record) else: self.search_remote(record, relation, text, domain=domain, context=context, callback=callback).show() return screen = Screen(relation, domain=domain, context=context, mode=['form'], view_ids=self.attrs.get('view_ids', '').split(','), exclude_field=field.attrs.get('relation_field')) def open_callback(result): if result: value = (screen.current_record.id, screen.current_record.rec_name()) field.set_client(record, value, force_change=True) if callback: callback() if obj_id: screen.load([obj_id]) WinForm(screen, open_callback, save_current=True, title=field.attrs.get('string')) else: WinForm(screen, open_callback, new=True, save_current=True, title=field.attrs.get('string'), rec_name=text)
def get_screen(self): domain = self.field.domain_get(self.record) context = self.field.get_context(self.record) # Remove first tree view as mode is form only view_ids = self.attrs.get('view_ids', '').split(',')[1:] return Screen(self.get_model(), domain=domain, context=context, mode=['form'], view_ids=view_ids, views_preload=self.attrs.get('views', {}), readonly=self._readonly, exclude_field=self.attrs.get('relation_field'))
def __init__(self, record, callback=None): self.resource = '%s,%s' % (record.model_name, record.id) self.attachment_callback = callback title = _('Attachments (%s)') % (record.rec_name()) screen = Screen('ir.attachment', domain=[ ('resource', '=', self.resource), ], mode=['tree', 'form'], exclude_field='resource') super(Attachment, self).__init__(screen, self.callback, view_type='tree', title=title) screen.search_filter()
def __init__(self, record, callback=None): self.resource = '%s,%s' % (record.model_name, record.id) self.attachment_callback = callback context = record.context_get() context['resource'] = self.resource screen = Screen('ir.attachment', domain=[ ('resource', '=', self.resource), ], mode=['tree', 'form'], context=context, exclude_field='resource') super(Attachment, self).__init__(screen, self.callback, view_type='tree') screen.search_filter()
def open_remote(self, record, create=True, changed=False, text=None, callback=None): field = record.group.fields[self.field_name] relation = field.attrs['relation'] access = common.MODELACCESS[relation] if create and not access['create']: return elif not access['read']: return domain = field.domain_get(record) context = field.context_get(record) if create: obj_id = None elif not changed: obj_id = field.get(record) else: if text: dom = [('rec_name', 'ilike', '%' + text + '%'), domain] else: dom = domain try: ids = RPCExecute('model', relation, 'search', dom, 0, None, None, context=context) except RPCException: field.set_client(record, False) if callback: callback() return if len(ids) == 1: field.set_client(record, ids[0]) if callback: callback() return self.search_remote(record, relation, ids, domain=domain, context=context, callback=callback) return screen = Screen(relation, domain=domain, context=context, mode=['form']) def open_callback(result): if result: value = (screen.current_record.id, screen.current_record.rec_name()) field.set_client(record, value, force_change=True) if callback: callback() if obj_id: screen.load([obj_id]) WinForm(screen, open_callback, save_current=True) else: WinForm(screen, open_callback, new=True, save_current=True)
def _get_screen_form(self): 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.get_context(self.record) # Remove the first tree view as mode is form only view_ids = self.attrs.get('view_ids', '').split(',')[1:] return Screen(self.attrs['relation'], domain=domain, view_ids=view_ids, mode=['form'], views_preload=self.attrs.get('views', {}), context=context)
def __init__(self, record, callback=None): self.resource = '%s,%s' % (record.model_name, record.id) self.note_callback = callback context = record.context_get() context['resource'] = self.resource screen = Screen('ir.note', domain=[ ('resource', '=', self.resource), ], mode=['tree', 'form'], context=context, exclude_field='resource') super(Note, self).__init__(screen, self.callback, view_type='tree') screen.search_filter() # Set parent after to be allowed to call search_filter screen.parent = record
def open_remote(self, record, create=True, changed=False, text=None, callback=None): field = record.group.fields[self.attrs['name']] model = self.get_model(record, field) access = common.MODELACCESS[model] if (create and not (self.attrs.get('create', True) and access['create'])): return elif not access['read']: return domain = field.domain_get(record) context = field.get_context(record) if not create and changed: self.search_remote(record, field, text, callback=callback).show() return target_id = self.id_from_value(field.get(record)) breadcrumb = list(self.view.screen.breadcrumb) breadcrumb.append( field.attrs.get('string') or common.MODELNAME.get(model)) screen = Screen(model, domain=domain, context=context, mode=['form'], view_ids=self.attrs.get('view_ids', '').split(','), exclude_field=field.attrs.get('relation_field'), breadcrumb=breadcrumb) def open_callback(result): if result: value = self.value_from_id(model, screen.current_record.id, screen.current_record.rec_name()) field.set_client(record, value, force_change=True) if callback: callback() if target_id and target_id >= 0: screen.load([target_id]) WinForm(screen, open_callback, save_current=True) else: WinForm(screen, open_callback, new=True, save_current=True, rec_name=text)
def _attachment_preview_widget(self): vbox = Gtk.VBox(homogeneous=False, spacing=2) vbox.set_margin_start(4) hbox = Gtk.HBox(homogeneous=False, spacing=0) hbox.set_halign(Gtk.Align.CENTER) vbox.pack_start(hbox, expand=False, fill=True, padding=0) hbox.set_border_width(2) tooltips = common.Tooltips() but_prev = Gtk.Button() tooltips.set_tip(but_prev, _("Previous")) but_prev.add( common.IconFactory.get_image('tryton-back', Gtk.IconSize.SMALL_TOOLBAR)) but_prev.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(but_prev, expand=False, fill=False, padding=0) label = Gtk.Label(label='(0,0)') hbox.pack_start(label, expand=False, fill=False, padding=0) but_next = Gtk.Button() tooltips.set_tip(but_next, _("Next")) but_next.add( common.IconFactory.get_image('tryton-forward', Gtk.IconSize.SMALL_TOOLBAR)) but_next.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(but_next, expand=False, fill=False, padding=0) vbox.show_all() self.attachment_screen = screen = Screen('ir.attachment', readonly=True, mode=['form'], context={ 'preview': True, }) screen.widget.show() but_prev.connect('clicked', lambda *a: screen.display_prev()) but_next.connect('clicked', lambda *a: screen.display_next()) class Preview(): def record_message(self, position, length, *args): label.set_text('(%s/%s)' % (position or '_', length)) but_prev.set_sensitive(position and position > 1) but_next.set_sensitive(position and position < length) screen.windows.append(Preview()) vbox.pack_start(screen.widget, expand=True, fill=True, padding=0) return vbox
def __init__(self, record, callback=None): self.resource = '%s,%s' % (record.model_name, record.id) self.note_callback = callback title = _('Notes (%s)') % (record.rec_name()) screen = Screen('ir.note', domain=[ ('resource', '=', self.resource), ], mode=['tree', 'form']) super(Note, self).__init__(screen, self.callback, view_type='tree', title=title) screen.search_filter()
def _get_screen_form(self): 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.get_context(self.record) # Remove the first tree view as mode is form only view_ids = self.attrs.get('view_ids', '').split(',')[1:] model = self.attrs['relation'] breadcrumb = list(self.view.screen.breadcrumb) breadcrumb.append( self.attrs.get('string') or common.MODELNAME.get(model)) return Screen(model, domain=domain, view_ids=view_ids, mode=['form'], views_preload=self.attrs.get('views', {}), context=context, breadcrumb=breadcrumb)
def get_screen(self, search=False): domain = self.field.domain_get(self.record) if search: context = self.field.get_search_context(self.record) else: context = self.field.get_context(self.record) # Remove first tree view as mode is form only view_ids = self.attrs.get('view_ids', '').split(',')[1:] model = self.get_model() breadcrumb = list(self.view.screen.breadcrumb) breadcrumb.append( self.attrs.get('string') or common.MODELNAME.get(model)) return Screen(model, domain=domain, context=context, mode=['form'], view_ids=view_ids, views_preload=self.attrs.get('views', {}), readonly=self._readonly, exclude_field=self.attrs.get('relation_field'), breadcrumb=breadcrumb)
def __init__(self, model, res_id=None, name='', **attributes): super(Form, self).__init__(**attributes) self.model = model self.res_id = res_id self.mode = attributes.get('mode') self.view_ids = attributes.get('view_ids') self.dialogs = [] if not name: name = common.MODELNAME.get(model) self.name = name self.screen = Screen(self.model, breadcrumb=[self.name], **attributes) self.screen.widget.show() self.create_tabcontent() self.set_buttons_sensitive() self.screen.signal_connect(self, 'record-message', self._record_message) self.screen.signal_connect( self, 'record-modified', lambda *a: GLib.idle_add(self._record_modified, *a)) self.screen.signal_connect(self, 'record-saved', self._record_saved) self.screen.signal_connect( self, 'resources', lambda screen, resources: self.update_resources(resources)) self.attachment_screen = None if res_id not in (None, False): if isinstance(res_id, int): res_id = [res_id] self.screen.load(res_id) else: if self.screen.current_view.view_type == 'form': self.sig_new(None, autosave=False) if self.screen.current_view.view_type \ in ('tree', 'graph', 'calendar'): self.screen.search_filter() self.update_revision() self.activate_save()
def __init__(self, model, res_id=None, name='', **attributes): super(Form, self).__init__() self.model = model self.res_id = res_id self.mode = attributes.get('mode') self.view_ids = attributes.get('view_ids') self.dialogs = [] self.screen = Screen(self.model, **attributes) self.screen.widget.show() self.name = name self.create_tabcontent() self.set_buttons_sensitive() self.screen.signal_connect(self, 'record-message', self._record_message) self.screen.signal_connect( self, 'record-modified', lambda *a: gobject.idle_add(self._record_modified, *a)) self.screen.signal_connect(self, 'record-saved', self._record_saved) self.screen.signal_connect(self, 'attachment-count', self._attachment_count) self.screen.signal_connect(self, 'unread-note', self._unread_note) if res_id not in (None, False): if isinstance(res_id, (int, long)): res_id = [res_id] self.screen.load(res_id) else: if self.screen.current_view.view_type == 'form': self.sig_new(None, autosave=False) if self.screen.current_view.view_type \ in ('tree', 'graph', 'calendar'): self.screen.search_filter() self.update_revision()
def _completion_action_activated(self, completion, index): if index == 0: self._sig_add(win_search=True) self.wid_text.grab_focus() elif index == 1: model = self.attrs['relation'] domain = self.field.domain_get(self.record) context = self.field.context_get(self.record) screen = Screen(model, domain, context=context, mode=['form']) def callback(result): self.focus_out = True if result: record = screen.current_record self.screen.load([record.id], modified=True) self.wid_text.set_text('') self.wid_text.grab_focus() self.focus_out = False WinForm(screen, callback, new=True, save_current=True)
def __init__(self, model, res_id=None, name='', **attributes): super(Form, self).__init__(**attributes) self.model = model self.res_id = res_id self.mode = attributes.get('mode') self.view_ids = attributes.get('view_ids') self.dialogs = [] if not name: name = common.MODELNAME.get(model) self.name = name loading_ids = res_id not in (None, False) if loading_ids: attributes.pop('tab_domain', None) self.screen = Screen(self.model, breadcrumb=[self.name], **attributes) self.screen.widget.show() self.screen.windows.append(self) self.create_tabcontent() self.set_buttons_sensitive() self.attachment_screen = None if loading_ids: if isinstance(res_id, int): res_id = [res_id] self.screen.load(res_id) else: if self.screen.current_view.view_type == 'form': self.sig_new(None, autosave=False) if self.screen.current_view.view_type \ in ('tree', 'graph', 'calendar'): self.screen.search_filter() self.update_revision() self.activate_save()
def response(self, win, response_id): res = None if response_id == gtk.RESPONSE_OK: res = [r.id for r in self.screen.selected_records] elif response_id == gtk.RESPONSE_APPLY: self.screen.search_filter(self.screen.screen_container.get_text()) return elif response_id == gtk.RESPONSE_ACCEPT: # Remove first tree view as mode if form only view_ids = self.view_ids[1:] screen = Screen(self.model_name, domain=self.domain, context=self.context, mode=['form'], view_ids=view_ids, views_preload=self.views_preload) def callback(result): # JMO : TODO : see if that diff from tryton is needed if result and screen.save_current(): record = screen.current_record res = [(record.id, record.value.get('rec_name', ''))] self.callback(res) else: self.callback(None) self.destroy() WinForm(screen, callback, new=True, save_current=True, title=self.title) return if res: group = self.screen.group res = [(id_, group.get(id_).value.get('rec_name', '')) for id_ in res] self.callback(res) self.destroy()
def _sig_new(self): 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', {}), context=context) def callback(result): self.focus_out = True if result: record = screen.current_record self.screen.load([record.id], modified=True) self.wid_text.set_text('') self.wid_text.grab_focus() self.focus_out = False WinForm(screen, callback, new=True, save_current=True)
def __init__(self, view, attrs): super(One2Many, self).__init__(view, attrs) self.widget = gtk.Frame() self.widget.set_shadow_type(gtk.SHADOW_NONE) self.widget.get_accessible().set_name(attrs.get('string', '')) vbox = gtk.VBox(homogeneous=False, spacing=2) self.widget.add(vbox) self._readonly = True self._required = False self._position = 0 self._length = 0 self.title_box = hbox = gtk.HBox(homogeneous=False, spacing=0) hbox.set_border_width(2) self.title = gtk.Label(attrs.get('string', '')) self.title.set_alignment(0.0, 0.5) hbox.pack_start(self.title, expand=True, fill=True) hbox.pack_start(gtk.VSeparator(), expand=False, fill=True) tooltips = common.Tooltips() self.focus_out = True self.wid_completion = None if attrs.get('add_remove'): self.wid_text = PlaceholderEntry() self.wid_text.set_placeholder_text(_('Search')) self.wid_text.set_property('width_chars', 13) self.wid_text.connect('focus-out-event', lambda *a: self._focus_out()) hbox.pack_start(self.wid_text, expand=True, fill=True) if int(self.attrs.get('completion', 1)): access = common.MODELACCESS[attrs['relation']] self.wid_completion = get_completion( search=access['read'] and access['write'], create=attrs.get('create', True) and access['create']) self.wid_completion.connect('match-selected', self._completion_match_selected) self.wid_completion.connect('action-activated', self._completion_action_activated) self.wid_text.set_completion(self.wid_completion) self.wid_text.connect('changed', self._update_completion) self.but_add = gtk.Button() tooltips.set_tip(self.but_add, _('Add existing record')) self.but_add.connect('clicked', self._sig_add) img_add = gtk.Image() img_add.set_from_stock('tryton-list-add', gtk.ICON_SIZE_SMALL_TOOLBAR) img_add.set_alignment(0.5, 0.5) self.but_add.add(img_add) self.but_add.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_add, expand=False, fill=False) self.but_remove = gtk.Button() tooltips.set_tip(self.but_remove, _('Remove selected record')) self.but_remove.connect('clicked', self._sig_remove, True) img_remove = gtk.Image() img_remove.set_from_stock('tryton-list-remove', gtk.ICON_SIZE_SMALL_TOOLBAR) img_remove.set_alignment(0.5, 0.5) self.but_remove.add(img_remove) self.but_remove.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_remove, expand=False, fill=False) hbox.pack_start(gtk.VSeparator(), expand=False, fill=True) self.but_new = gtk.Button() tooltips.set_tip(self.but_new, _('Create a new record <F3>')) self.but_new.connect('clicked', self._sig_new) img_new = gtk.Image() img_new.set_from_stock('tryton-new', gtk.ICON_SIZE_SMALL_TOOLBAR) img_new.set_alignment(0.5, 0.5) self.but_new.add(img_new) self.but_new.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_new, expand=False, fill=False) self.but_open = gtk.Button() tooltips.set_tip(self.but_open, _('Edit selected record <F2>')) self.but_open.connect('clicked', self._sig_edit) img_open = gtk.Image() img_open.set_from_stock('tryton-open', gtk.ICON_SIZE_SMALL_TOOLBAR) img_open.set_alignment(0.5, 0.5) self.but_open.add(img_open) self.but_open.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_open, expand=False, fill=False) self.but_del = gtk.Button() tooltips.set_tip(self.but_del, _('Delete selected record <Del>')) self.but_del.connect('clicked', self._sig_remove, False) img_del = gtk.Image() img_del.set_from_stock('tryton-delete', gtk.ICON_SIZE_SMALL_TOOLBAR) img_del.set_alignment(0.5, 0.5) self.but_del.add(img_del) self.but_del.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_del, expand=False, fill=False) self.but_undel = gtk.Button() tooltips.set_tip(self.but_undel, _('Undelete selected record <Ins>')) self.but_undel.connect('clicked', self._sig_undelete) img_undel = gtk.Image() img_undel.set_from_stock('tryton-undo', gtk.ICON_SIZE_SMALL_TOOLBAR) img_undel.set_alignment(0.5, 0.5) self.but_undel.add(img_undel) self.but_undel.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_undel, expand=False, fill=False) hbox.pack_start(gtk.VSeparator(), expand=False, fill=True) self.but_pre = gtk.Button() tooltips.set_tip(self.but_pre, _('Previous')) self.but_pre.connect('clicked', self._sig_previous) img_pre = gtk.Image() img_pre.set_from_stock('tryton-go-previous', gtk.ICON_SIZE_SMALL_TOOLBAR) img_pre.set_alignment(0.5, 0.5) self.but_pre.add(img_pre) self.but_pre.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_pre, expand=False, fill=False) self.label = gtk.Label('(0,0)') hbox.pack_start(self.label, expand=False, fill=False) self.but_next = gtk.Button() tooltips.set_tip(self.but_next, _('Next')) self.but_next.connect('clicked', self._sig_next) img_next = gtk.Image() img_next.set_from_stock('tryton-go-next', gtk.ICON_SIZE_SMALL_TOOLBAR) img_next.set_alignment(0.5, 0.5) self.but_next.add(img_next) self.but_next.set_relief(gtk.RELIEF_NONE) hbox.pack_start(self.but_next, expand=False, fill=False) hbox.pack_start(gtk.VSeparator(), expand=False, fill=True) but_switch = gtk.Button() tooltips.set_tip(but_switch, _('Switch')) but_switch.connect('clicked', self.switch_view) img_switch = gtk.Image() img_switch.set_from_stock('tryton-fullscreen', gtk.ICON_SIZE_SMALL_TOOLBAR) img_switch.set_alignment(0.5, 0.5) but_switch.add(img_switch) but_switch.set_relief(gtk.RELIEF_NONE) hbox.pack_start(but_switch, expand=False, fill=False) if attrs.get('add_remove'): hbox.set_focus_chain([self.wid_text]) else: hbox.set_focus_chain([]) tooltips.enable() frame = gtk.Frame() frame.add(hbox) frame.set_shadow_type(gtk.SHADOW_OUT) vbox.pack_start(frame, expand=False, fill=True) self.screen = Screen(attrs['relation'], mode=attrs.get('mode', 'tree,form').split(','), view_ids=attrs.get('view_ids', '').split(','), views_preload=attrs.get('views', {}), row_activate=self._on_activate, exclude_field=attrs.get('relation_field', None)) self.screen.pre_validate = bool(int(attrs.get('pre_validate', 0))) self.screen.signal_connect(self, 'record-message', self._sig_label) vbox.pack_start(self.screen.widget, expand=True, fill=True) self.screen.widget.connect('key_press_event', self.on_keypress) if self.attrs.get('add_remove'): self.wid_text.connect('key_press_event', self.on_keypress) but_switch.props.sensitive = self.screen.number_of_views > 1
def __init__(self, attrs=None, context=None): super(Action, self).__init__() self.name = attrs['name'] self.context = context or {} try: self.action = RPCExecute('model', 'ir.action.act_window', 'get', self.name) except RPCException: raise view_ids = None self.action['view_mode'] = None if self.action.get('views', []): view_ids = [x[0] for x in self.action['views']] self.action['view_mode'] = [x[1] for x in self.action['views']] elif self.action.get('view_id', False): view_ids = [self.action['view_id'][0]] if 'view_mode' in attrs: self.action['view_mode'] = attrs['view_mode'] self.action.setdefault('pyson_domain', '[]') self.context.update(rpc.CONTEXT) self.context['_user'] = rpc._USER self.context.update( PYSONDecoder(self.context).decode( self.action.get('pyson_context', '{}'))) eval_ctx = self.context.copy() self.context.update( PYSONDecoder(eval_ctx).decode( self.action.get('pyson_context', '{}'))) self.domain = [] self.update_domain([]) search_context = self.context.copy() search_context['context'] = self.context search_context['_user'] = rpc._USER search_value = PYSONDecoder(search_context).decode( self.action['pyson_search_value'] or '{}') self.widget = gtk.Frame() self.widget.set_border_width(0) vbox = gtk.VBox(homogeneous=False, spacing=3) self.widget.add(vbox) self.title = gtk.Label() self.widget.set_label_widget(self.title) self.widget.set_label_align(0.0, 0.5) self.widget.show_all() self.screen = Screen(self.action['res_model'], mode=self.action['view_mode'], context=self.context, view_ids=view_ids, domain=self.domain, search_value=search_value, row_activate=self.row_activate) vbox.pack_start(self.screen.widget, expand=True, fill=True) self.screen.signal_connect(self, 'record-message', self._active_changed) if attrs.get('string'): self.title.set_text(attrs['string']) else: self.title.set_text(self.action['name']) self.widget.set_size_request(int(attrs.get('width', -1)), int(attrs.get('height', -1))) self.screen.search_filter()
def __init__(self, view, attrs): super(One2Many, self).__init__(view, attrs) self.widget = Gtk.Frame() self.widget.set_shadow_type(Gtk.ShadowType.NONE) self.widget.get_accessible().set_name(attrs.get('string', '')) vbox = Gtk.VBox(homogeneous=False, spacing=2) self.widget.add(vbox) self._readonly = True self._required = False self._position = 0 self._length = 0 self.title_box = hbox = Gtk.HBox(homogeneous=False, spacing=0) hbox.set_border_width(2) self.title = Gtk.Label(label=set_underline(attrs.get('string', '')), use_underline=True, halign=Gtk.Align.START) hbox.pack_start(self.title, expand=True, fill=True, padding=0) hbox.pack_start(Gtk.VSeparator(), expand=False, fill=True, padding=0) tooltips = common.Tooltips() but_switch = Gtk.Button(can_focus=False) tooltips.set_tip(but_switch, _('Switch')) but_switch.connect('clicked', self.switch_view) but_switch.add( common.IconFactory.get_image('tryton-switch', Gtk.IconSize.SMALL_TOOLBAR)) but_switch.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(but_switch, expand=False, fill=False, padding=0) self.but_pre = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_pre, _('Previous')) self.but_pre.connect('clicked', self._sig_previous) self.but_pre.add( common.IconFactory.get_image('tryton-back', Gtk.IconSize.SMALL_TOOLBAR)) self.but_pre.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_pre, expand=False, fill=False, padding=0) self.label = Gtk.Label(label='(0,0)') hbox.pack_start(self.label, expand=False, fill=False, padding=0) self.but_next = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_next, _('Next')) self.but_next.connect('clicked', self._sig_next) self.but_next.add( common.IconFactory.get_image('tryton-forward', Gtk.IconSize.SMALL_TOOLBAR)) self.but_next.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_next, expand=False, fill=False, padding=0) hbox.pack_start(Gtk.VSeparator(), expand=False, fill=True, padding=0) self.focus_out = True self.wid_completion = None if attrs.get('add_remove'): self.wid_text = Gtk.Entry() self.wid_text.set_placeholder_text(_('Search')) self.wid_text.set_property('width_chars', 13) self.wid_text.connect('focus-out-event', self._focus_out) hbox.pack_start(self.wid_text, expand=True, fill=True, padding=0) if int(self.attrs.get('completion', 1)): self.wid_completion = get_completion(search=self.read_access, create=self.create_access) self.wid_completion.connect('match-selected', self._completion_match_selected) self.wid_completion.connect('action-activated', self._completion_action_activated) self.wid_text.set_completion(self.wid_completion) self.wid_text.connect('changed', self._update_completion) self.but_add = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_add, _('Add existing record')) self.but_add.connect('clicked', self._sig_add) self.but_add.add( common.IconFactory.get_image('tryton-add', Gtk.IconSize.SMALL_TOOLBAR)) self.but_add.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_add, expand=False, fill=False, padding=0) self.but_remove = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_remove, _('Remove selected record')) self.but_remove.connect('clicked', self._sig_remove, True) self.but_remove.add( common.IconFactory.get_image('tryton-remove', Gtk.IconSize.SMALL_TOOLBAR)) self.but_remove.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_remove, expand=False, fill=False, padding=0) hbox.pack_start(Gtk.VSeparator(), expand=False, fill=True, padding=0) self.but_new = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_new, _('Create a new record')) self.but_new.connect('clicked', self._sig_new) self.but_new.add( common.IconFactory.get_image('tryton-create', Gtk.IconSize.SMALL_TOOLBAR)) self.but_new.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_new, expand=False, fill=False, padding=0) self.but_open = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_open, _('Edit selected record')) self.but_open.connect('clicked', self._sig_edit) self.but_open.add( common.IconFactory.get_image('tryton-open', Gtk.IconSize.SMALL_TOOLBAR)) self.but_open.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_open, expand=False, fill=False, padding=0) self.but_del = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_del, _('Delete selected record')) self.but_del.connect('clicked', self._sig_remove, False) self.but_del.add( common.IconFactory.get_image('tryton-delete', Gtk.IconSize.SMALL_TOOLBAR)) self.but_del.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_del, expand=False, fill=False, padding=0) self.but_undel = Gtk.Button(can_focus=False) tooltips.set_tip(self.but_undel, _('Undelete selected record <Ins>')) self.but_undel.connect('clicked', self._sig_undelete) self.but_undel.add( common.IconFactory.get_image('tryton-undo', Gtk.IconSize.SMALL_TOOLBAR)) self.but_undel.set_relief(Gtk.ReliefStyle.NONE) hbox.pack_start(self.but_undel, expand=False, fill=False, padding=0) tooltips.enable() frame = Gtk.Frame() frame.add(hbox) frame.set_shadow_type(Gtk.ShadowType.OUT) vbox.pack_start(frame, expand=False, fill=True, padding=0) model = attrs['relation'] breadcrumb = list(self.view.screen.breadcrumb) breadcrumb.append(attrs.get('string') or common.MODELNAME.get(model)) self.screen = Screen(model, mode=attrs.get('mode', 'tree,form').split(','), view_ids=attrs.get('view_ids', '').split(','), views_preload=attrs.get('views', {}), order=attrs.get('order'), row_activate=self._on_activate, exclude_field=attrs.get('relation_field', None), limit=None, breadcrumb=breadcrumb) self.screen.pre_validate = bool(int(attrs.get('pre_validate', 0))) self.screen.windows.append(self) vbox.pack_start(self.screen.widget, expand=True, fill=True, padding=0) self.title.set_mnemonic_widget( self.screen.current_view.mnemonic_widget) self.screen.widget.connect('key_press_event', self.on_keypress) if self.attrs.get('add_remove'): self.wid_text.connect('key_press_event', self.on_keypress) but_switch.props.sensitive = self.screen.number_of_views > 1