From 8be2a0eb13229bb3824c04ab58fe975d8a4c7df1 Mon Sep 17 00:00:00 2001 From: Michael Wiencek Date: Tue, 22 May 2012 19:34:55 -0500 Subject: [PATCH] Disable removing non-green tags when clear_existing_tags is false This was misleading, because removing the tag in this case wouldn't have any effect (as could be seen by reloading the file). This disables the menu option, and clearing the text-field manually. Another bug is fixed: removing a green tag should remove it from the metadatabox. --- picard/ui/metadatabox.py | 52 +++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/picard/ui/metadatabox.py b/picard/ui/metadatabox.py index 317879ae1..158bbc904 100644 --- a/picard/ui/metadatabox.py +++ b/picard/ui/metadatabox.py @@ -95,7 +95,6 @@ class MetadataBox(QtGui.QTableWidget): self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) self.setStyleSheet("QTableWidget {border: none;}") self.itemChanged.connect(self.item_changed) - self._item_signals = True self.colors = { "default": self.palette().color(QtGui.QPalette.Text), "removed": QtGui.QBrush(QtGui.QColor("red")), @@ -159,7 +158,7 @@ class MetadataBox(QtGui.QTableWidget): if tag != "~length": column = item.column() if column == 1: - if self.tag_status(tag) == "changed" and tag not in self.new_tags.different: + if self.tag_status(tag) in ("changed", "removed") and tag not in self.new_tags.different: copy_to_new_action = QtGui.QAction(_(u"Copy to New Value"), self.parent) copy_to_new_action.triggered.connect(partial(self.copy_to_new, tag)) menu.addAction(copy_to_new_action) @@ -168,7 +167,7 @@ class MetadataBox(QtGui.QTableWidget): edit_tag_action = QtGui.QAction(_(u"Edit..."), self.parent) edit_tag_action.triggered.connect(partial(self.edit_tag, tag)) menu.addAction(edit_tag_action) - if self.tag_status(tag) != "removed": + if self.tag_is_removable(tag): remove_tag_action = QtGui.QAction(_(u"Remove"), self.parent) remove_tag_action.triggered.connect(partial(self.remove_tag, tag)) menu.addAction(remove_tag_action) @@ -188,11 +187,19 @@ class MetadataBox(QtGui.QTableWidget): def set_tag_values(self, tag, values): self.parent.ignore_selection_changes = True - self.new_tags[tag] = values - self.new_tags.different.discard(tag) - for obj in self.objects: - obj.metadata._items[tag] = values - obj.update() + empty = values == [""] + if not empty or self.tag_is_removable(tag): + if empty: + self.new_tags.pop(tag, None) + else: + self.new_tags[tag] = values + self.new_tags.different.discard(tag) + for obj in self.objects: + if empty: + obj.metadata.pop(tag) + else: + obj.metadata._items[tag] = values + obj.update() self.update() self.parent.ignore_selection_changes = False @@ -202,6 +209,10 @@ class MetadataBox(QtGui.QTableWidget): def remove_tag(self, tag): self.set_tag_values(tag, [""]) + def tag_is_removable(self, tag): + tag_status = self.tag_status(tag) + return tag_status != "removed" and self.config.setting["clear_existing_tags"] or tag_status == "added" + def update_selection(self): self.selection_mutex.lock() self.selection_dirty = True @@ -302,7 +313,7 @@ class MetadataBox(QtGui.QTableWidget): self.update() return - self._item_signals = False + self.itemChanged.disconnect(self.item_changed) self.setRowCount(len(self.tag_names)) flags = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled @@ -330,7 +341,7 @@ class MetadataBox(QtGui.QTableWidget): self.set_item_value(new_item, self.new_tags, name) self.set_row_colors(i) - self._item_signals = True + self.itemChanged.connect(self.item_changed) self.updating = False if self.update_pending: self.update() @@ -366,26 +377,7 @@ class MetadataBox(QtGui.QTableWidget): return "default" def item_changed(self, item): - if not self._item_signals: - return - self._item_signals = False - tag = self.tag_names[item.row()] - value = unicode(item.text()) - value = [value] if value else [] - self.new_tags[tag] = value - self.new_tags.different.discard(tag) - font = item.font() - font.setItalic(False) - item.setFont(font) - self.set_row_colors(item.row()) - self.parent.ignore_selection_changes = True - for obj in self.objects: - obj.metadata._items[tag] = value - obj.update() - if self.config.persist["show_changes_first"]: - self.update() - self.parent.ignore_selection_changes = False - self._item_signals = True + self.set_tag_values(self.tag_names[item.row()], [unicode(item.text())]) def restore_state(self): sizes = self.config.persist["metadata_box_sizes"].split(" ")