mirror of
https://github.com/fergalmoran/picard.git
synced 2026-02-25 09:03:59 +00:00
Merge pull request #663 from antlarr/cover-art-context-menu
PICARD-1030: Add cover art context menu and "keep original images" option
This commit is contained in:
@@ -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):
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user