From e2e2ca39a69f735d190b01fff2e25149c5089e35 Mon Sep 17 00:00:00 2001 From: Antonio Larrosa Date: Wed, 8 Mar 2017 11:03:03 +0100 Subject: [PATCH] Update album metadata images when Files/Tracks emit signal Add a signal to Files/Tracks that gets emitted when the images change (or might have changed), and update the album's metadata images on such signals instead of each time the album is selected in the user interface. --- picard/album.py | 11 +++++++++++ picard/file.py | 3 +++ picard/track.py | 3 +++ picard/ui/coverartbox.py | 5 +++++ picard/ui/mainwindow.py | 1 - 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/picard/album.py b/picard/album.py index d7151f8e7..81da90d25 100644 --- a/picard/album.py +++ b/picard/album.py @@ -72,6 +72,7 @@ class Album(DataObject, Item): self.errors = [] self.status = None self._album_artists = [] + self.update_metadata_images_enabled = True def __repr__(self): return '' % (self.id, self.metadata[u"album"]) @@ -255,6 +256,7 @@ class Album(DataObject, Item): self._tracks_loaded = True if not self._requests: + self.update_metadata_images_enabled = False # Prepare parser for user's script if config.setting["enable_tagger_scripts"]: for s_pos, s_name, s_enabled, s_text in config.setting["list_of_scripts"]: @@ -276,6 +278,7 @@ class Album(DataObject, Item): self._new_metadata.strip_whitespace() for track in self.tracks: + track.metadata_images_changed.connect(self.update_metadata_images) for file in list(track.linked_files): file.move(self.unmatched_files) self.metadata = self._new_metadata @@ -285,6 +288,7 @@ class Album(DataObject, Item): self.loaded = True self.status = None self.match_files(self.unmatched_files.files) + self.update_metadata_images_enabled = True self.update() self.tagger.window.set_statusbar_message( N_('Album %(id)s loaded: %(artist)s - %(album)s'), @@ -379,14 +383,19 @@ class Album(DataObject, Item): def update(self, update_tracks=True): if self.item: self.item.update(update_tracks) + self.update_metadata_images() def _add_file(self, track, file): self._files += 1 self.update(update_tracks=False) + file.metadata_images_changed.connect(self.update_metadata_images) + self.update_metadata_images() def _remove_file(self, track, file): self._files -= 1 self.update(update_tracks=False) + file.metadata_images_changed.disconnect(self.update_metadata_images) + self.update_metadata_images() def match_files(self, files, use_recordingid=True): """Match files to tracks on this album, based on metadata similarity or recordingid.""" @@ -554,6 +563,8 @@ class Album(DataObject, Item): self.load(priority=True, refresh=True) def update_metadata_images(self): + if not self.update_metadata_images_enabled: + return new_images = [] orig_images = [] diff --git a/picard/file.py b/picard/file.py index cf20ed8cf..d2097259b 100644 --- a/picard/file.py +++ b/picard/file.py @@ -54,6 +54,8 @@ from picard.const import QUERY_LIMIT class File(QtCore.QObject, Item): + metadata_images_changed = QtCore.pyqtSignal() + UNDEFINED = -1 PENDING = 0 NORMAL = 1 @@ -156,6 +158,7 @@ class File(QtCore.QObject, Item): if acoustid: self.metadata["acoustid_id"] = acoustid + 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 3130f3f5f..c1e33d1d4 100644 --- a/picard/track.py +++ b/picard/track.py @@ -19,6 +19,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial +from PyQt4 import QtCore from picard import config, log from picard.metadata import Metadata, run_track_metadata_processors from picard.dataobj import DataObject @@ -44,6 +45,8 @@ class TrackArtist(DataObject): class Track(DataObject, Item): + metadata_images_changed = QtCore.pyqtSignal() + def __init__(self, id, album=None): DataObject.__init__(self, id) self.album = album diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index 80226a4ce..f7e7580b4 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -316,18 +316,23 @@ class CoverArtBox(QtGui.QGroupBox): album.metadata.set_front_image(coverartimage) for track in album.tracks: track.metadata.set_front_image(coverartimage) + track.metadata_images_changed.emit() for file in album.iterfiles(): file.metadata.set_front_image(coverartimage) + file.metadata_images_changed.emit() file.update() elif isinstance(self.item, Track): track = self.item track.metadata.set_front_image(coverartimage) + track.metadata_images_changed.emit() for file in track.iterfiles(): file.metadata.set_front_image(coverartimage) + file.metadata_images_changed.emit() file.update() elif isinstance(self.item, File): file = self.item file.metadata.set_front_image(coverartimage) + file.metadata_images_changed.emit() file.update() self.cover_art.set_metadata(self.item.metadata) self.show() diff --git a/picard/ui/mainwindow.py b/picard/ui/mainwindow.py index 1b4a72ec9..2ae7bf465 100644 --- a/picard/ui/mainwindow.py +++ b/picard/ui/mainwindow.py @@ -956,7 +956,6 @@ class MainWindow(QtGui.QMainWindow): self.set_statusbar_message(msg, mparms, echo=None, history=None) elif isinstance(obj, Album): - obj.update_metadata_images() metadata = obj.metadata orig_metadata = obj.orig_metadata elif obj.can_edit_tags():