diff --git a/picard/album.py b/picard/album.py index 4b7875a7c..a4106df81 100644 --- a/picard/album.py +++ b/picard/album.py @@ -586,6 +586,15 @@ class Album(DataObject, Item): self.update(False) + def keep_original_images(self): + self.enable_update_metadata_images(False) + for track in self.tracks: + track.keep_original_images() + for file in list(self.unmatched_files.files): + file.keep_original_images() + self.enable_update_metadata_images(True) + self.update_metadata_images() + class NatAlbum(Album): diff --git a/picard/file.py b/picard/file.py index 8f2dec9dc..49a69476d 100644 --- a/picard/file.py +++ b/picard/file.py @@ -175,6 +175,11 @@ class File(QtCore.QObject, Item): self.metadata["acoustid_id"] = acoustid self.metadata_images_changed.emit() + def keep_original_images(self): + self.metadata.images = self.orig_metadata.images[:] + self.update() + self.metadata_images_changed.emit() + def has_error(self): return self.state == File.ERROR diff --git a/picard/track.py b/picard/track.py index 0684a6263..393d21a40 100644 --- a/picard/track.py +++ b/picard/track.py @@ -228,6 +228,16 @@ class Track(DataObject, Item): def update_orig_metadata_images(self): update_metadata_images(self) + def keep_original_images(self): + for file in self.linked_files: + file.keep_original_images() + if self.linked_files: + self.update_orig_metadata_images() + self.metadata.images = self.orig_metadata.images[:] + else: + self.metadata.images = [] + self.update() + class NonAlbumTrack(Track): diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index af05bbc67..1071735bc 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -21,7 +21,7 @@ import os import sys from functools import partial from PyQt4 import QtCore, QtGui, QtNetwork -from picard import log +from picard import config, log from picard.album import Album from picard.coverart.image import CoverArtImage, CoverArtImageError from picard.track import Track @@ -242,6 +242,14 @@ class CoverArtThumbnail(ActiveLabel): return self.parent().fetch_remote_image(url) +def set_image_replace(obj, coverartimage): + obj.metadata.set_front_image(coverartimage) + + +def set_image_append(obj, coverartimage): + obj.metadata.append_image(coverartimage) + + class CoverArtBox(QtGui.QGroupBox): def __init__(self, parent): @@ -378,14 +386,21 @@ class CoverArtBox(QtGui.QGroupBox): except CoverArtImageError as e: log.warning("Can't load image: %s" % unicode(e)) return + + if config.setting["load_image_behavior"] == 'replace': + set_image = set_image_replace + else: + set_image = set_image_append + if isinstance(self.item, Album): album = self.item album.enable_update_metadata_images(False) + set_image(album, coverartimage) for track in album.tracks: - track.metadata.set_front_image(coverartimage) + set_image(track, coverartimage) track.metadata_images_changed.emit() for file in album.iterfiles(): - file.metadata.set_front_image(coverartimage) + set_image(file, coverartimage) file.metadata_images_changed.emit() file.update() album.enable_update_metadata_images(True) @@ -394,10 +409,10 @@ class CoverArtBox(QtGui.QGroupBox): elif isinstance(self.item, Track): track = self.item track.album.enable_update_metadata_images(False) - track.metadata.set_front_image(coverartimage) + set_image(track, coverartimage) track.metadata_images_changed.emit() for file in track.iterfiles(): - file.metadata.set_front_image(coverartimage) + set_image(file, coverartimage) file.metadata_images_changed.emit() file.update() track.album.enable_update_metadata_images(True) @@ -405,8 +420,43 @@ class CoverArtBox(QtGui.QGroupBox): track.album.update(False) elif isinstance(self.item, File): file = self.item - file.metadata.set_front_image(coverartimage) + set_image(file, coverartimage) file.metadata_images_changed.emit() file.update() self.cover_art.set_metadata(self.item.metadata) self.show() + + def set_load_image_behavior(self, behavior): + config.setting["load_image_behavior"] = behavior + + def contextMenuEvent(self, event): + menu = QtGui.QMenu(self) + if self.show_details_button.isVisible(): + name = _(u'Show more details...') + show_more_details_action = QtGui.QAction(name, self.parent) + show_more_details_action.triggered.connect(self.show_cover_art_info) + menu.addAction(show_more_details_action) + + if self.orig_cover_art.isVisible(): + name = _(u'Keep original cover art') + use_orig_value_action = QtGui.QAction(name, self.parent) + use_orig_value_action.triggered.connect(self.item.keep_original_images) + menu.addAction(use_orig_value_action) + + if not menu.isEmpty(): + menu.addSeparator() + + load_image_behavior_group = QtGui.QActionGroup(self.parent, exclusive=True) + action = load_image_behavior_group.addAction(QtGui.QAction(_(u'Replace front cover art on drop'), self.parent, checkable=True)) + action.triggered.connect(partial(self.set_load_image_behavior, behavior='replace')) + if config.setting["load_image_behavior"] == 'replace': + action.setChecked(True) + menu.addAction(action) + action = load_image_behavior_group.addAction(QtGui.QAction(_(u'Append front cover art on drop'), self.parent, checkable=True)) + action.triggered.connect(partial(self.set_load_image_behavior, behavior='append')) + if config.setting["load_image_behavior"] == 'append': + action.setChecked(True) + menu.addAction(action) + + menu.exec_(event.globalPos()) + event.accept() diff --git a/picard/ui/options/interface.py b/picard/ui/options/interface.py index f890a1024..13ae2c530 100644 --- a/picard/ui/options/interface.py +++ b/picard/ui/options/interface.py @@ -98,6 +98,7 @@ class InterfaceOptionsPage(OptionsPage): config.TextOption("setting", "ui_language", u""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", ""), + config.TextOption("setting", "load_image_behavior", "append"), config.ListOption("setting", "toolbar_layout", [ 'add_directory_action', 'add_files_action',