class EditTagDialog(QtGui.QDialog): """Single tag editor.""" def __init__(self, name, value, parent=None): QtGui.QDialog.__init__(self, parent) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.ui.buttonbox.addButton(StandardButton(StandardButton.OK), QtGui.QDialogButtonBox.AcceptRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtGui.QDialogButtonBox.RejectRole) self.connect(self.ui.buttonbox, QtCore.SIGNAL('accepted()'), self, QtCore.SLOT('accept()')) self.connect(self.ui.buttonbox, QtCore.SIGNAL('rejected()'), self, QtCore.SLOT('reject()')) self.ui.name.addItems(sorted(tag_names.keys())) if name: self.ui.name.setEditText(name) if value: self.ui.value.document().setPlainText(value) self.ui.value.selectAll() self.ui.value.setFocus(QtCore.Qt.OtherFocusReason) else: self.ui.name.lineEdit().selectAll() def accept(self): self.name = unicode(self.ui.name.currentText()) self.value = self.ui.value.document().toPlainText() QtGui.QDialog.accept(self)
def __init__(self, window, tag): super().__init__(window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted( set(list(TAG_NAMES.keys()) + self.metadata_box.tag_diff.tag_names)) if len(self.metadata_box.files) == 1: current_file = list(self.metadata_box.files)[0] self.default_tags = list( filter(current_file.supports_tag, self.default_tags)) tag_names = self.ui.tag_names tag_names.addItem("") visible_tags = [ tn for tn in self.default_tags if not tn.startswith("~") ] tag_names.addItems(visible_tags) self.completer = QtWidgets.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.value_list.model().rowsInserted.connect(self.on_rows_inserted) self.value_list.model().rowsRemoved.connect(self.on_rows_removed) self.value_list.setItemDelegate(TagEditorDelegate(self)) self.tag_changed(tag) self.value_selection_changed() self.restore_geometry()
def __init__(self, window, tag): PicardDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted( set(TAG_NAMES.keys() + self.metadata_box.tag_diff.tag_names)) if len(self.metadata_box.files) == 1: current_file = list(self.metadata_box.files)[0] self.default_tags = filter(lambda x: current_file.supports_tag(x), self.default_tags) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") visible_tags = [ tn for tn in self.default_tags if not tn.startswith("~") ] tag_names.addItems(visible_tags) self.completer = QtGui.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect( self.value_selection_changed)
def __init__(self, window, tag): QtGui.QDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted(set(TAG_NAMES.keys() + self.metadata_box.tag_names)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") visible_tags = [tn for tn in self.default_tags if not tn.startswith("~")] tag_names.addItems(visible_tags) self.completer = QtGui.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed)
def __init__(self, window, tag): super().__init__(window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted( set(list(TAG_NAMES.keys()) + self.metadata_box.tag_diff.tag_names)) if len(self.metadata_box.files) == 1: current_file = list(self.metadata_box.files)[0] self.default_tags = list(filter(current_file.supports_tag, self.default_tags)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") visible_tags = [tn for tn in self.default_tags if not tn.startswith("~")] tag_names.addItems(visible_tags) self.completer = QtWidgets.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed) self.restore_geometry()
def __init__(self, window, tag): QtGui.QDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted(set(TAG_NAMES.keys() + self.metadata_box.tag_names)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") tag_names.addItems([tn for tn in self.default_tags if not tn.startswith("~")]) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed)
class EditTagDialog(PicardDialog): autorestore = False def __init__(self, window, tag): super().__init__(window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted( set(list(TAG_NAMES.keys()) + self.metadata_box.tag_diff.tag_names)) if len(self.metadata_box.files) == 1: current_file = list(self.metadata_box.files)[0] self.default_tags = list( filter(current_file.supports_tag, self.default_tags)) tag_names = self.ui.tag_names tag_names.addItem("") visible_tags = [ tn for tn in self.default_tags if not tn.startswith("~") ] tag_names.addItems(visible_tags) self.completer = QtWidgets.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.value_list.model().rowsInserted.connect(self.on_rows_inserted) self.value_list.model().rowsRemoved.connect(self.on_rows_removed) self.value_list.setItemDelegate(TagEditorDelegate(self)) self.tag_changed(tag) self.value_selection_changed() self.restore_geometry() def keyPressEvent(self, event): if event.modifiers() == QtCore.Qt.NoModifier and event.key() in ( QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return): self.add_or_edit_value() event.accept() elif event.matches(QtGui.QKeySequence.Delete): self.remove_value() elif event.key() == QtCore.Qt.Key_Insert: self.add_value() else: super().keyPressEvent(event) def tag_selected(self, index): self.add_or_edit_value() def edit_value(self): item = self.value_list.currentItem() if item and not self.value_list.isPersistentEditorOpen(item): self.value_list.editItem(item) def add_value(self): item = QtWidgets.QListWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) self.value_list.addItem(item) self.value_list.setCurrentItem(item) self.value_list.editItem(item) def add_or_edit_value(self): last_item = self.value_list.item(self.value_list.count() - 1) # Edit the last item, if it is empty, or add a new empty item if last_item and not last_item.text(): self.value_list.setCurrentItem(last_item) self.edit_value() else: self.add_value() def remove_value(self): value_list = self.value_list row = value_list.currentRow() if row == 0 and self.different: self.different = False self.ui.add_value.setEnabled(True) value_list.takeItem(row) def on_rows_inserted(self, parent, first, last): for row in range(first, last + 1): item = self.value_list.item(row) self._modified_tag().insert(row, item.text()) def on_rows_removed(self, parent, first, last): for row in range(first, last + 1): del self._modified_tag()[row] def move_row_up(self): row = self.value_list.currentRow() if row > 0: self._move_row(row, -1) def move_row_down(self): row = self.value_list.currentRow() if row + 1 < self.value_list.count(): self._move_row(row, 1) def _move_row(self, row, direction): value_list = self.value_list item = value_list.takeItem(row) new_row = row + direction value_list.insertItem(new_row, item) value_list.setCurrentRow(new_row) def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, tag): tag_names = self.ui.tag_names tag_names.editTextChanged.disconnect(self.tag_changed) line_edit = tag_names.lineEdit() cursor_pos = line_edit.cursorPosition() flags = QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive # if the previous tag was new and has no value, remove it from the QComboBox. # e.g. typing "XYZ" should not leave "X" or "XY" in the QComboBox. if self.tag and self.tag not in self.default_tags and self._modified_tag( ) == [""]: tag_names.removeItem(tag_names.findText(self.tag, flags)) row = tag_names.findText(tag, flags) self.tag = tag if row <= 0: if tag: # add custom tags to the QComboBox immediately tag_names.addItem(tag) tag_names.model().sort(0) row = tag_names.findText(tag, flags) else: # the QLineEdit is empty, disable everything self.disable_all() tag_names.setCurrentIndex(0) tag_names.editTextChanged.connect(self.tag_changed) return self.enable_all() tag_names.setCurrentIndex(row) line_edit.setCursorPosition(cursor_pos) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: new_tags = self.metadata_box.tag_diff.new display_value, self.different = new_tags.display_value(self.tag) values = [display_value] if self.different else new_tags[self.tag] self.ui.add_value.setEnabled(not self.different) self.value_list.model().rowsInserted.disconnect(self.on_rows_inserted) self._add_value_items(values) self.value_list.model().rowsInserted.connect(self.on_rows_inserted) self.value_list.setCurrentItem( self.value_list.item(0), QtCore.QItemSelectionModel.SelectCurrent) tag_names.editTextChanged.connect(self.tag_changed) def _add_value_items(self, values): values = [v for v in values if v] or [""] for value in values: item = QtWidgets.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsDragEnabled) font = item.font() font.setItalic(self.different) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) value = item.text() if row == 0 and self.different: self.modified_tags[self.tag] = [value] self.different = False font = item.font() font.setItalic(False) item.setFont(font) self.ui.add_value.setEnabled(True) else: self._modified_tag()[row] = value # add tags to the completer model once they get values cm = self.completer.model() if self.tag not in cm.stringList(): cm.insertRows(0, 1) cm.setData(cm.index(0, 0), self.tag) cm.sort(0) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) self.ui.move_value_up.setEnabled(selection) self.ui.move_value_down.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault( self.tag, list(self.metadata_box.tag_diff.new[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: for tag, values in modified_tags: obj.metadata[tag] = list(values) obj.update() self.window.ignore_selection_changes = False self.window.update_selection() super().accept()
class EditTagDialog(QtGui.QDialog): def __init__(self, window, tag): QtGui.QDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted(set(TAG_NAMES.keys() + self.metadata_box.tag_names)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") visible_tags = [tn for tn in self.default_tags if not tn.startswith("~")] tag_names.addItems(visible_tags) self.completer = QtGui.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed) def edit_value(self): item = self.value_list.currentItem() if item: self.value_list.editItem(item) def add_value(self): self._modified_tag().append("") item = QtGui.QListWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) self.value_list.addItem(item) self.value_list.editItem(item) def remove_value(self): value_list = self.value_list row = value_list.row(value_list.currentItem()) if row == 0 and self.different: self.different = False self.ui.add_value.setEnabled(True) value_list.takeItem(row) del self._modified_tag()[row] def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, tag): tag_names = self.ui.tag_names tag_names.editTextChanged.disconnect(self.tag_changed) flags = QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive # if the previous tag was new and has no value, remove it from the QComboBox. # e.g. typing "XYZ" should not leave "X" or "XY" in the QComboBox. if self.tag and self.tag not in self.default_tags and self._modified_tag() == [""]: tag_names.removeItem(tag_names.findText(self.tag, flags)) row = tag_names.findText(tag, flags) self.tag = unicode(tag) if row <= 0: if tag: # add custom tags to the QComboBox immediately tag_names.addItem(tag) tag_names.model().sort(0) row = tag_names.findText(tag, flags) else: # the QLineEdit is empty, disable everything self.disable_all() tag_names.setCurrentIndex(0) tag_names.editTextChanged.connect(self.tag_changed) return self.enable_all() tag_names.setCurrentIndex(row) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: new_tags = self.metadata_box.tag_diff.new display_value, self.different = new_tags.display_value(self.tag) values = [display_value] if self.different else new_tags[self.tag] self.ui.add_value.setEnabled(not self.different) self._add_value_items(values) self.value_list.setCurrentItem(self.value_list.item(0), QtGui.QItemSelectionModel.SelectCurrent) tag_names.editTextChanged.connect(self.tag_changed) def _add_value_items(self, values): values = [v for v in values if v] or [""] for value in values: item = QtGui.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) font = item.font() font.setItalic(self.different) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) value = unicode(item.text()) if row == 0 and self.different: self.modified_tags[self.tag] = [value] self.different = False font = item.font() font.setItalic(False) item.setFont(font) self.ui.add_value.setEnabled(True) else: self._modified_tag()[row] = value # add tags to the completer model once they get values cm = self.completer.model() if not cm.stringList().contains(self.tag): cm.insertRows(0, 1) cm.setData(cm.index(0, 0), self.tag) cm.sort(0) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault(self.tag, list(self.metadata_box.tag_diff.new[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: for tag, values in modified_tags: obj.metadata[tag] = list(values) obj.update() self.window.ignore_selection_changes = False self.window.update_selection() QtGui.QDialog.accept(self)
class EditTagDialog(PicardDialog): defaultsize = None autorestore = False def __init__(self, window, tag): super().__init__(window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted( set(list(TAG_NAMES.keys()) + self.metadata_box.tag_diff.tag_names)) if len(self.metadata_box.files) == 1: current_file = list(self.metadata_box.files)[0] self.default_tags = list( filter(current_file.supports_tag, self.default_tags)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") visible_tags = [ tn for tn in self.default_tags if not tn.startswith("~") ] tag_names.addItems(visible_tags) self.completer = QtWidgets.QCompleter(visible_tags, tag_names) self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) tag_names.setCompleter(self.completer) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect( self.value_selection_changed) self.restore_geometry() def edit_value(self): item = self.value_list.currentItem() if item: self.value_list.editItem(item) def add_value(self): self._modified_tag().append("") item = QtWidgets.QListWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) self.value_list.addItem(item) self.value_list.editItem(item) def remove_value(self): value_list = self.value_list row = value_list.row(value_list.currentItem()) if row == 0 and self.different: self.different = False self.ui.add_value.setEnabled(True) value_list.takeItem(row) del self._modified_tag()[row] def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, tag): tag_names = self.ui.tag_names tag_names.editTextChanged.disconnect(self.tag_changed) flags = QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive # if the previous tag was new and has no value, remove it from the QComboBox. # e.g. typing "XYZ" should not leave "X" or "XY" in the QComboBox. if self.tag and self.tag not in self.default_tags and self._modified_tag( ) == [""]: tag_names.removeItem(tag_names.findText(self.tag, flags)) row = tag_names.findText(tag, flags) self.tag = tag if row <= 0: if tag: # add custom tags to the QComboBox immediately tag_names.addItem(tag) tag_names.model().sort(0) row = tag_names.findText(tag, flags) else: # the QLineEdit is empty, disable everything self.disable_all() tag_names.setCurrentIndex(0) tag_names.editTextChanged.connect(self.tag_changed) return self.enable_all() tag_names.setCurrentIndex(row) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: new_tags = self.metadata_box.tag_diff.new display_value, self.different = new_tags.display_value(self.tag) values = [display_value] if self.different else new_tags[self.tag] self.ui.add_value.setEnabled(not self.different) self._add_value_items(values) self.value_list.setCurrentItem( self.value_list.item(0), QtCore.QItemSelectionModel.SelectCurrent) tag_names.editTextChanged.connect(self.tag_changed) def _add_value_items(self, values): values = [v for v in values if v] or [""] for value in values: item = QtWidgets.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) font = item.font() font.setItalic(self.different) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) value = item.text() if row == 0 and self.different: self.modified_tags[self.tag] = [value] self.different = False font = item.font() font.setItalic(False) item.setFont(font) self.ui.add_value.setEnabled(True) else: self._modified_tag()[row] = value # add tags to the completer model once they get values cm = self.completer.model() if self.tag not in cm.stringList(): cm.insertRows(0, 1) cm.setData(cm.index(0, 0), self.tag) cm.sort(0) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault( self.tag, list(self.metadata_box.tag_diff.new[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: for tag, values in modified_tags: obj.metadata[tag] = list(values) obj.update() self.window.ignore_selection_changes = False self.window.update_selection() super().accept()
class EditTagDialog(QtGui.QDialog): def __init__(self, window, tag): QtGui.QDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted(set(TAG_NAMES.keys() + self.metadata_box.tag_names)) tag_names = self.ui.tag_names completer = QtGui.QCompleter(self.default_tags, tag_names) completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) tag_names.setCompleter(completer) tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") tag_names.addItems([tn for tn in self.default_tags if not tn.startswith("~")]) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed) def edit_value(self): item = self.value_list.currentItem() if item: self.value_list.editItem(item) def add_value(self): self._modified_tag().append("") item = QtGui.QListWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) self.value_list.addItem(item) self.value_list.editItem(item) def remove_value(self): value_list = self.value_list row = value_list.row(value_list.currentItem()) if row == 0 and self.different: self.different = False value_list.takeItem(row) del self._modified_tag()[row] def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, text): tag_names = self.ui.tag_names tag_names.editTextChanged.disconnect(self.tag_changed) if self.value_list.count() == 0 and self.tag and self.tag not in self.default_tags: tag_names.removeItem(tag_names.findText(self.tag, QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive)) self.tag = unicode(text) row = tag_names.findText(text, QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive) if row == -1: tag_names.addItem(text) tag_names.setCurrentIndex(tag_names.count() - 1) tag_names.model().sort(0) else: tag_names.setCurrentIndex(row) self.disable_all() if row == 0 else self.enable_all() tag_names.editTextChanged.connect(self.tag_changed) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: different = self.metadata_box.new_tags.different_placeholder(self.tag) if different: self.different = True self._add_value_items([different], italic=True) return values = self.metadata_box.new_tags[self.tag] self._add_value_items(values) self.value_list.setCurrentItem(self.value_list.item(0), QtGui.QItemSelectionModel.SelectCurrent) def _add_value_items(self, values, italic=False): values = [v for v in values if v] or [""] for value in values: item = QtGui.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) font = item.font() font.setItalic(italic) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) self._modified_tag()[row] = unicode(item.text()) if row == 0 and self.different: self.different = False font = item.font() font.setItalic(False) item.setFont(font) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault(self.tag, list(self.metadata_box.new_tags[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: m = obj.metadata._items for tag, values in modified_tags: if self.different: m.setdefault(tag, []).extend(values) else: m[tag] = list(values) obj.update() self.window.ignore_selection_changes = False self.window.update_selection() QtGui.QDialog.accept(self)
class EditTagDialog(QtGui.QDialog): def __init__(self, window, tag): QtGui.QDialog.__init__(self, window) self.ui = Ui_EditTagDialog() self.ui.setupUi(self) self.window = window self.value_list = self.ui.value_list self.metadata_box = window.metadata_box self.tag = tag self.modified_tags = {} self.different = False self.default_tags = sorted(set(TAG_NAMES.keys() + self.metadata_box.tag_names)) tag_names = self.ui.tag_names tag_names.editTextChanged.connect(self.tag_changed) tag_names.addItem("") tag_names.addItems([tn for tn in self.default_tags if not tn.startswith("~")]) self.tag_changed(tag) self.value_selection_changed() self.ui.edit_value.clicked.connect(self.edit_value) self.ui.add_value.clicked.connect(self.add_value) self.ui.remove_value.clicked.connect(self.remove_value) self.value_list.itemChanged.connect(self.value_edited) self.value_list.itemSelectionChanged.connect(self.value_selection_changed) def edit_value(self): item = self.value_list.currentItem() if item: self.value_list.editItem(item) def add_value(self): self._modified_tag().append("") item = QtGui.QListWidgetItem() item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) self.value_list.addItem(item) self.value_list.editItem(item) def remove_value(self): value_list = self.value_list row = value_list.row(value_list.currentItem()) if row == 0 and self.different: self.different = False self.ui.add_value.setEnabled(True) value_list.takeItem(row) del self._modified_tag()[row] def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, tag): tag_names = self.ui.tag_names row = tag_names.findText(tag, QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive) tag_names.editTextChanged.disconnect(self.tag_changed) if row <= 0: self.disable_all() tag_names.setCurrentIndex(0) tag_names.setEditText(tag) self.tag = "" else: self.enable_all() tag_names.setCurrentIndex(row) self.tag = unicode(tag) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: different = self.metadata_box.new_tags.different_placeholder(self.tag) if different: self.different = True self._add_value_items([different], italic=True) self.ui.add_value.setEnabled(False) return values = self.metadata_box.new_tags[self.tag] self._add_value_items(values) self.value_list.setCurrentItem(self.value_list.item(0), QtGui.QItemSelectionModel.SelectCurrent) tag_names.editTextChanged.connect(self.tag_changed) def _add_value_items(self, values, italic=False): values = [v for v in values if v] or [""] for value in values: item = QtGui.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) font = item.font() font.setItalic(italic) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) self._modified_tag()[row] = unicode(item.text()) if row == 0 and self.different: self.different = False font = item.font() font.setItalic(False) item.setFont(font) self.ui.add_value.setEnabled(True) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault(self.tag, list(self.metadata_box.new_tags[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: for tag, values in modified_tags: obj.metadata._items[tag] = list(values) or [""] obj.update() self.window.ignore_selection_changes = False self.window.update_selection() QtGui.QDialog.accept(self)