コード例 #1
0
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)
コード例 #2
0
 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()
コード例 #3
0
ファイル: tageditor.py プロジェクト: lalinsky/picard
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)
コード例 #4
0
 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)
コード例 #5
0
ファイル: edittagdialog.py プロジェクト: Rawrpwnzl/picard
 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)
コード例 #6
0
ファイル: edittagdialog.py プロジェクト: Jormangeud/picard
 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()
コード例 #7
0
 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)
コード例 #8
0
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()
コード例 #9
0
ファイル: edittagdialog.py プロジェクト: Rawrpwnzl/picard
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)
コード例 #10
0
ファイル: edittagdialog.py プロジェクト: webiis/picard
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()
コード例 #11
0
ファイル: edittagdialog.py プロジェクト: betoth2001/picard
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)
コード例 #12
0
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)