def __init__(self, *args): super(Selection, self).__init__(*args) self.renderer = CellRendererCombo() self.renderer.connect('editing-started', self.editing_started) self.init_selection() self.renderer.set_property('model', self.get_model(self.selection)) self.renderer.set_property('text-column', 0)
class Selection(Char, SelectionMixin): def __init__(self, *args): super(Selection, self).__init__(*args) self.renderer = CellRendererCombo() self.renderer.connect('editing-started', self.editing_started) self.init_selection() self.renderer.set_property('model', self.get_model(self.selection)) self.renderer.set_property('text-column', 0) def get_model(self, selection): model = gtk.ListStore(gobject.TYPE_STRING) self._selection = {} lst = [] for (value, name) in selection: name = str(name) lst.append(name) self._selection[name] = value i = model.append() model.set(i, 0, name) return model def get_textual_value(self, record): field = record[self.field_name] self.update_selection(record, field) value = record[self.field_name].get(record) text = dict(self.selection).get(value, '') if value and not text: text = self.get_inactive_selection(value) return text def value_from_text(self, record, text, callback=None): field = record[self.field_name] field.set_client(record, self._selection.get(text, False)) if callback: callback() def editing_started(self, cell, editable, path): super(Selection, self).editing_started(cell, editable, path) store = self.treeview.get_model() record = store.get_value(store.get_iter(path), 0) field = record[self.field_name] self.update_selection(record, field) model = self.get_model(self.selection) editable.set_model(model) # GTK 2.24 and above use a ComboBox instead of a ComboBoxEntry if hasattr(editable, 'set_text_column'): editable.set_text_column(0) completion = gtk.EntryCompletion() #Only available in PyGTK 2.6 and above. if hasattr(completion, 'set_inline_selection'): completion.set_inline_selection(True) completion.set_model(model) editable.get_child().set_completion(completion) completion.set_text_column(0) return False
def __init__(self, *args): super(Selection, self).__init__(*args) self.renderer = CellRendererCombo() self.renderer.connect('editing-started', self.editing_started) self._last_domain = None self._domain_cache = {} selection = self.attrs.get('selection', [])[:] if not isinstance(selection, (list, tuple)): try: selection = RPCExecute('model', self.model_name, selection) except RPCException: selection = [] self.selection = selection[:] if self.attrs.get('sort', True): selection.sort(key=operator.itemgetter(1)) self.renderer.set_property('model', self.get_model(selection)) self.renderer.set_property('text-column', 0)
class Selection(GenericText, SelectionMixin, PopdownMixin): def __init__(self, *args): super(Selection, self).__init__(*args) self.renderer = CellRendererCombo() self.renderer.connect('editing-started', self.editing_started) self.init_selection() self.renderer.set_property('model', self.get_popdown_model(self.selection)[0]) self.renderer.set_property('text-column', 0) def get_textual_value(self, record): field = record[self.attrs['name']] self.update_selection(record, field) value = field.get(record) text = dict(self.selection).get(value, '') if value and not text: text = self.get_inactive_selection(value) return text def value_from_text(self, record, text, callback=None): if callback: callback() def editing_started(self, cell, editable, path): super(Selection, self).editing_started(cell, editable, path) store = self.view.treeview.get_model() record = store.get_value(store.get_iter(path), 0) field = record[self.attrs['name']] set_value = lambda *a: self.set_value(editable, record, field) editable.child.connect('activate', set_value) editable.child.connect('focus-out-event', set_value) editable.connect('changed', set_value) self.update_selection(record, field) self.set_popdown(self.selection, editable) value = field.get(record) if not self.set_popdown_value(editable, value): self.get_inactive_selection(value) self.set_popdown_value(editable, value) return False def set_value(self, editable, record, field): value = self.get_popdown_value(editable) if 'relation' in self.attrs and value: value = (value, editable.get_active_text()) field.set_client(record, value) return False
class Selection(Char): def __init__(self, *args): super(Selection, self).__init__(*args) self.renderer = CellRendererCombo() self.renderer.connect('editing-started', self.editing_started) self._last_domain = None self._domain_cache = {} selection = self.attrs.get('selection', [])[:] if not isinstance(selection, (list, tuple)): try: selection = RPCExecute('model', self.model_name, selection) except RPCException: selection = [] self.selection = selection[:] if self.attrs.get('sort', True): selection.sort(key=operator.itemgetter(1)) self.renderer.set_property('model', self.get_model(selection)) self.renderer.set_property('text-column', 0) def get_model(self, selection): model = gtk.ListStore(gobject.TYPE_STRING) self._selection = {} lst = [] for (value, name) in selection: name = str(name) lst.append(name) self._selection[name] = value i = model.append() model.set(i, 0, name) return model def get_textual_value(self, record): self.update_selection(record) value = record[self.field_name].get(record) return dict(self.selection).get(value, '') def value_from_text(self, record, text, callback=None): field = record[self.field_name] field.set_client(record, self._selection.get(text, False)) if callback: callback() def editing_started(self, cell, editable, path): super(Selection, self).editing_started(cell, editable, path) store = self.treeview.get_model() record = store.get_value(store.get_iter(path), 0) self.update_selection(record) model = self.get_model(self.selection) editable.set_model(model) # GTK 2.24 and above use a ComboBox instead of a ComboBoxEntry if hasattr(editable, 'set_text_column'): editable.set_text_column(0) completion = gtk.EntryCompletion() #Only available in PyGTK 2.6 and above. if hasattr(completion, 'set_inline_selection'): completion.set_inline_selection(True) completion.set_model(model) editable.get_child().set_completion(completion) completion.set_text_column(0) return False def update_selection(self, record): if 'relation' not in self.attrs: return field = record[self.field_name] domain = field.domain_get(record) if str(domain) in self._domain_cache: self.selection = self._domain_cache[str(domain)] self._last_domain = domain if domain != self._last_domain: try: result = RPCExecute('model', self.attrs['relation'], 'search_read', domain, 0, None, None, ['rec_name']) except RPCException: result = None if isinstance(result, list): selection = [(x['id'], x['rec_name']) for x in result] selection.append((False, '')) self._last_domain = domain self._domain_cache[str(domain)] = selection else: selection = [] self._last_domain = None else: selection = self.selection self.selection = selection[:]