From db3d1fff46d82b6e6a9c984930b267427ef91ee1 Mon Sep 17 00:00:00 2001 From: Wieland Hoffmann Date: Thu, 6 Dec 2012 23:18:41 +0100 Subject: [PATCH 1/3] Fix missing 'filename' variable --- picard/file.py | 1 + 1 file changed, 1 insertion(+) diff --git a/picard/file.py b/picard/file.py index 9dcb0904e..a9e23ae94 100644 --- a/picard/file.py +++ b/picard/file.py @@ -109,6 +109,7 @@ class File(QtCore.QObject, Item): return self def _copy_loaded_metadata(self, metadata): + filename, _ = os.path.splitext(self.base_filename) metadata['~length'] = format_time(metadata.length) if 'title' not in metadata: metadata['title'] = filename From 6fa84e2842d77c8b5a393a532f9e168fa2eb284f Mon Sep 17 00:00:00 2001 From: Michael Wiencek Date: Wed, 12 Dec 2012 21:09:23 -0600 Subject: [PATCH 2/3] Allow adding custom tags in EditTagDialog (PICARD-349) --- NEWS.txt | 1 + picard/ui/edittagdialog.py | 72 +++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/NEWS.txt b/NEWS.txt index 5b92b5898..ed9778c7f 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -2,6 +2,7 @@ Version 1.2 - XXXX-XX-XX * Picard now requires at least Python 2.6 * Removed support for AmpliFIND/PUIDs * It's now possible to download cover images without any plugin. Cover Art Archive images can be downloaded by image type + * Allow adding custom tags in the tag editing dialog (PICARD-349) Version 1.1 - 2012-09-03 * Always show basic tags in metadata comparison box, even if empty (title, diff --git a/picard/ui/edittagdialog.py b/picard/ui/edittagdialog.py index 7c5847552..ef2035cbc 100644 --- a/picard/ui/edittagdialog.py +++ b/picard/ui/edittagdialog.py @@ -38,7 +38,11 @@ class EditTagDialog(QtGui.QDialog): 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("~")]) + 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) @@ -79,39 +83,51 @@ class EditTagDialog(QtGui.QDialog): 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) + 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: - 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: - new_tags = self.metadata_box.tag_diff.new - display_value, different = new_tags.display_value(self.tag) - if different: - values = [display_value] - self.different = True - self.ui.add_value.setEnabled(False) - else: - values = new_tags[self.tag] - self._add_value_items(values, italic=self.different) - self.value_list.setCurrentItem(self.value_list.item(0), QtGui.QItemSelectionModel.SelectCurrent) + 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, italic=False): + 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(italic) + font.setItalic(self.different) item.setFont(font) self.value_list.addItem(item) @@ -127,6 +143,12 @@ class EditTagDialog(QtGui.QDialog): 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 From 173d425be5f4354f63b709a1afb55e4b372e24d5 Mon Sep 17 00:00:00 2001 From: Michael Wiencek Date: Wed, 12 Dec 2012 22:32:51 -0600 Subject: [PATCH 3/3] Save both primary and secondary release types (PICARD-240) --- picard/mbxml.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/picard/mbxml.py b/picard/mbxml.py index 296315ea0..74802a712 100644 --- a/picard/mbxml.py +++ b/picard/mbxml.py @@ -309,8 +309,6 @@ def release_to_metadata(node, m, config, album=None): def release_group_to_metadata(node, m, config, release_group=None): """Make metadata dict from a XML 'release-group' node taken from inside a 'release' node.""" m['musicbrainz_releasegroupid'] = node.attribs['id'] - if 'type' in node.attribs: - m['releasetype'] = node.type.lower() for name, nodes in node.children.iteritems(): if not nodes: continue @@ -320,6 +318,17 @@ def release_group_to_metadata(node, m, config, release_group=None): add_folksonomy_tags(nodes[0], release_group) elif name == 'user_tag_list': add_user_folksonomy_tags(nodes[0], release_group) + elif name == 'primary_type': + m['~primaryreleasetype'] = nodes[0].text.lower() + elif name == 'secondary_type_list': + add_secondary_release_types(nodes[0], m) + m['releasetype'] = m.getall('~primaryreleasetype') + m.getall('~secondaryreleasetype') + + +def add_secondary_release_types(node, m): + if 'secondary_type' in node.children: + for secondary_type in node.secondary_type: + m.add_unique('~secondaryreleasetype', secondary_type.text.lower()) def add_folksonomy_tags(node, obj):