def _setup_relations_list(self): self.relations_list = ListContainer(self.get_columns(), Gtk.Orientation.HORIZONTAL) self.relations_list._vbox.padding = 0 self.model_vbox.pack_start(self.relations_list, True, True, 0) self.relations_list.set_list_type(ListType.UNADDABLE) self.relations_list.connect('remove-item', self._on_remove_item__clicked) self.relations_list.connect('edit-item', self._on_edit_item__clicked) self.relations_list.show()
def _setup_relations_list(self): self.relations_list = ListContainer(self.get_columns(), gtk.ORIENTATION_HORIZONTAL) self.relations_list._vbox.padding = 0 self.model_vbox.pack_start(self.relations_list) self.relations_list.set_list_type(ListType.UNADDABLE) self.relations_list.connect('remove-item', self._on_remove_item__clicked) self.relations_list.connect('edit-item', self._on_edit_item__clicked) self.relations_list.show()
def __init__(self, mo, alarms = None, parent_model = None, event_ui=None): self.mo = mo self.alarms = alarms self.parent_model = parent_model self.event_ui = event_ui self.factory = Factory() columns = [ Column("offsetformat", title='Offset'), Column("type", title='Type') ] self.listcontainer_alarms = ListContainer(columns) self.listcontainer_alarms.add_items(alarms) self.listcontainer_alarms.connect('add-item', self.listcontainer__add_item) self.listcontainer_alarms.connect('remove-item', self.listcontainer__remove_item) self.listcontainer_alarms.connect('edit-item', self.listcontainer__edit_item)
class BaseRelationshipEditorSlave(GladeSlaveDelegate): """An editor for relationships between objects BaseRelationshipEditor provides an easy way to edit (add/remove) relations between objects. It doesn't allow creations of new objects, only linking between them. (the linking might require new objects, though) For example, you could edit suppliers for a product (or produts supplied by an supplier). Subclasses must implement get_targets, get_columns, get_relations, and create_model. """ gladefile = 'RelationshipEditor' target_name = None model_type = None editor = None def __init__(self, store, parent=None, visual_mode=False): self._parent = parent self.store = store self.visual_mode = visual_mode GladeSlaveDelegate.__init__(self, gladefile=self.gladefile) self._setup_widgets() def _setup_relations_list(self): self.relations_list = ListContainer(self.get_columns(), gtk.ORIENTATION_HORIZONTAL) self.relations_list._vbox.padding = 0 self.model_vbox.pack_start(self.relations_list) self.relations_list.set_list_type(ListType.UNADDABLE) self.relations_list.connect('remove-item', self._on_remove_item__clicked) self.relations_list.connect('edit-item', self._on_edit_item__clicked) self.relations_list.show() def _setup_widgets(self): self.model_name_label.set_label(self.target_name + ':') targets = self.get_targets() self.target_combo.prefill(targets) self._setup_relations_list() size_group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) size_group.add_widget(self.add_button) size_group.add_widget(self.relations_list.edit_button) size_group.add_widget(self.relations_list.remove_button) self.add_button.set_sensitive(False) if not self.editor: self.relations_list.edit_button.set_sensitive(False) self.relations_list.add_items(self.get_relations()) if self.visual_mode: self.target_combo.set_sensitive(False) self.add_button.set_sensitive(False) self.relations_list.set_list_type(ListType.READONLY) def get_targets(self): """Returns a list of valid taret objects. for instance, if suppliers for a product are being edited, then this should return a list fo suppliers. """ raise NotImplementedError def get_columns(self): """Columns to display""" raise NotImplementedError def get_relations(self): """Returns the already existing relations. This may be entries from a maping table or entries from the target table itself, depending on the type of relationship """ raise NotImplementedError def create_model(self): """This method should create the model when adding a new relationship. If the addition is canceled. It will automatically be removed. """ raise NotImplementedError def add(self): model = self.create_model() if not model: return False if not self.editor: return model res = run_dialog(self.editor, self._parent, self.store, model) if not res: self.model_type.delete(id=model.id, store=self.store) return res def edit(self, model): return run_dialog(self.editor, self._parent, self.store, model) def remove(self, model): self.model_type.delete(model.id, store=self.store) return True def _run_editor(self, model=None): """Runs an editor for the relationship (if necessary). An editor may be necessary only if there is an mapping table and and extra information in this table. """ if model is None: res = self.add() else: res = self.edit(model) return res def on_add_button__clicked(self, widget): result = self._run_editor() if result: self.relations_list.add_item(result) def on_target_combo__content_changed(self, widget): has_selected = self.target_combo.read() is not None self.add_button.set_sensitive(has_selected and not self.visual_mode) def _on_edit_item__clicked(self, list, item): if not self.editor: return result = self._run_editor(item) if result: self.relations_list.update_item(result) def _on_remove_item__clicked(self, list, item): if self.remove(item): self.relations_list.remove_item(item)
class BaseRelationshipEditorSlave(GladeSlaveDelegate): """An editor for relationships between objects BaseRelationshipEditor provides an easy way to edit (add/remove) relations between objects. It doesn't allow creations of new objects, only linking between them. (the linking might require new objects, though) For example, you could edit suppliers for a product (or produts supplied by an supplier). Subclasses must implement get_targets, get_columns, get_relations, and create_model. """ domain = 'stoq' gladefile = 'RelationshipEditor' target_name = None model_type = None editor = None def __init__(self, store, parent=None, visual_mode=False): self._parent = parent self.store = store self.visual_mode = visual_mode GladeSlaveDelegate.__init__(self, gladefile=self.gladefile) self._setup_widgets() def _setup_relations_list(self): self.relations_list = ListContainer(self.get_columns(), Gtk.Orientation.HORIZONTAL) self.relations_list._vbox.padding = 0 self.model_vbox.pack_start(self.relations_list, True, True, 0) self.relations_list.set_list_type(ListType.UNADDABLE) self.relations_list.connect('remove-item', self._on_remove_item__clicked) self.relations_list.connect('edit-item', self._on_edit_item__clicked) self.relations_list.show() def _setup_widgets(self): self.model_name_label.set_label(self.target_name + ':') targets = self.get_targets() self.target_combo.prefill(targets) self._setup_relations_list() size_group = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL) size_group.add_widget(self.add_button) size_group.add_widget(self.relations_list.edit_button) size_group.add_widget(self.relations_list.remove_button) self.add_button.set_sensitive(False) if not self.editor: self.relations_list.edit_button.set_sensitive(False) self.relations_list.add_items(self.get_relations()) if self.visual_mode: self.target_combo.set_sensitive(False) self.add_button.set_sensitive(False) self.relations_list.set_list_type(ListType.READONLY) def get_targets(self): """Returns a list of valid taret objects. for instance, if suppliers for a product are being edited, then this should return a list fo suppliers. """ raise NotImplementedError def get_columns(self): """Columns to display""" raise NotImplementedError def get_relations(self): """Returns the already existing relations. This may be entries from a maping table or entries from the target table itself, depending on the type of relationship """ raise NotImplementedError def create_model(self): """This method should create the model when adding a new relationship. If the addition is canceled. It will automatically be removed. """ raise NotImplementedError def add(self): model = self.create_model() if not model: return False if not self.editor: return model res = run_dialog(self.editor, self._parent, self.store, model) if not res: self.model_type.delete(id=model.id, store=self.store) return res def edit(self, model): return run_dialog(self.editor, self._parent, self.store, model) def remove(self, model): self.model_type.delete(model.id, store=self.store) return True def _run_editor(self, model=None): """Runs an editor for the relationship (if necessary). An editor may be necessary only if there is an mapping table and and extra information in this table. """ if model is None: res = self.add() else: res = self.edit(model) return res def on_add_button__clicked(self, widget): result = self._run_editor() if result: self.relations_list.add_item(result) def on_target_combo__content_changed(self, widget): has_selected = self.target_combo.read() is not None self.add_button.set_sensitive(has_selected and not self.visual_mode) def _on_edit_item__clicked(self, list, item): if not self.editor: return result = self._run_editor(item) if result: self.relations_list.update_item(result) def _on_remove_item__clicked(self, list, item): if self.remove(item): self.relations_list.remove_item(item)
class AlarmsEditUI(ListContainer): def __init__(self, mo, alarms = None, parent_model = None, event_ui=None): self.mo = mo self.alarms = alarms self.parent_model = parent_model self.event_ui = event_ui self.factory = Factory() columns = [ Column("offsetformat", title='Offset'), Column("type", title='Type') ] self.listcontainer_alarms = ListContainer(columns) self.listcontainer_alarms.add_items(alarms) self.listcontainer_alarms.connect('add-item', self.listcontainer__add_item) self.listcontainer_alarms.connect('remove-item', self.listcontainer__remove_item) self.listcontainer_alarms.connect('edit-item', self.listcontainer__edit_item) def listcontainer__add_item(self, *args): start_time = self.event_ui.dateedit_start.dt delta = datetime.timedelta() alarm = self.factory.alarm(delta, self.parent_model) alarm = miniorganizer.ui.AlarmEditUI(self.mo, alarm, start_time).run() if alarm: self.alarms.append(alarm) self.listcontainer_alarms.add_item(alarm) def listcontainer__remove_item(self, listcontainer, alarm): self.alarms.remove(alarm) self.listcontainer_alarms.remove_item(alarm) def listcontainer__edit_item(self, listcontainer, alarm): start_time = self.event_ui.dateedit_start.dt x = miniorganizer.ui.AlarmEditUI(self.mo, alarm, start_time) alarm = x.run() if alarm: self.listcontainer_alarms.update_item(alarm) def set_sensitive(self, state): self.listcontainer_alarms.set_sensitive(state)