mirror of
https://github.com/fergalmoran/picard.git
synced 2026-02-24 08:33:59 +00:00
Merge branch 'master' of github.com:musicbrainz/picard
This commit is contained in:
1
NEWS.txt
1
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,
|
||||
|
||||
@@ -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'] = self.filename
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user