diff --git a/picard/album.py b/picard/album.py index 8b99a5970..3dc685ed9 100644 --- a/picard/album.py +++ b/picard/album.py @@ -113,6 +113,7 @@ class AlbumArtist(DataObject): class Album(DataObject, Item): + metadata_images_changed = QtCore.pyqtSignal() release_group_loaded = QtCore.pyqtSignal() def __init__(self, album_id, discid=None): @@ -131,6 +132,7 @@ class Album(DataObject, Item): self._discids.add(discid) self._after_load_callbacks = [] self.unmatched_files = Cluster(_("Unmatched Files"), special=True, related_album=self, hide_if_empty=True) + self.unmatched_files.metadata_images_changed.connect(self.update_metadata_images) self.status = None self._album_artists = [] self.update_metadata_images_enabled = True @@ -376,6 +378,7 @@ class Album(DataObject, Item): self.enable_update_metadata_images(False) for track in self._new_tracks: track.orig_metadata.copy(track.metadata) + track.metadata_images_changed.connect(self.update_metadata_images) # Prepare parser for user's script for s_name, s_text in enabled_tagger_scripts_texts(): @@ -396,7 +399,6 @@ 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 @@ -513,12 +515,10 @@ class Album(DataObject, Item): self._files += 1 self.update(update_tracks=False) add_metadata_images(self, [file]) - file.metadata_images_changed.connect(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) remove_metadata_images(self, [file]) def _match_files(self, files, threshold=0): @@ -719,8 +719,8 @@ class Album(DataObject, Item): return update_metadata_images(self) - self.update(False) + self.metadata_images_changed.emit() def keep_original_images(self): self.enable_update_metadata_images(False) diff --git a/picard/cluster.py b/picard/cluster.py index 480d527c4..6280f0396 100644 --- a/picard/cluster.py +++ b/picard/cluster.py @@ -72,6 +72,8 @@ from picard.ui.item import Item class FileList(QtCore.QObject, Item): + metadata_images_changed = QtCore.pyqtSignal() + def __init__(self, files=None): QtCore.QObject.__init__(self) self.metadata = Metadata() @@ -81,7 +83,8 @@ class FileList(QtCore.QObject, Item): for file in self.files: if self.can_show_coverart: file.metadata_images_changed.connect(self.update_metadata_images) - update_metadata_images(self) + if self.files: + update_metadata_images(self) def iterfiles(self, save=False): for file in self.files: @@ -100,6 +103,7 @@ class FileList(QtCore.QObject, Item): def update_metadata_images(self): if self.update_metadata_images_enabled and self.can_show_coverart: update_metadata_images(self) + self.metadata_images_changed.emit() def keep_original_images(self): self.enable_update_metadata_images(False) diff --git a/picard/track.py b/picard/track.py index 2dfcf8b18..6f17e22ae 100644 --- a/picard/track.py +++ b/picard/track.py @@ -350,6 +350,7 @@ class Track(DataObject, Item): def update_orig_metadata_images(self): update_metadata_images(self) + self.metadata_images_changed.emit() def keep_original_images(self): for file in self.linked_files: diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index d0738d4ee..279f42b58 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -347,17 +347,29 @@ class CoverArtBox(QtWidgets.QGroupBox): self.cover_art_label.setText(_('New Cover Art')) self.orig_cover_art_label.setText(_('Original Cover Art')) - def show(self): - self.update_display(True) - super().show() + def set_item(self, item): + if not item.can_show_coverart: + return + + if self.item and hasattr(self.item, 'metadata_images_changed'): + self.item.metadata_images_changed.disconnect(self.update_metadata) + self.item = item + if hasattr(self.item, 'metadata_images_changed'): + self.item.metadata_images_changed.connect(self.update_metadata) + self.update_metadata() + + def update_metadata(self): + if not self.item: + return + + metadata = self.item.metadata + orig_metadata = self.item.orig_metadata - def set_metadata(self, metadata, orig_metadata, item): if not metadata or not metadata.images: self.cover_art.set_metadata(orig_metadata) else: self.cover_art.set_metadata(metadata) self.orig_cover_art.set_metadata(orig_metadata) - self.item = item self.update_display() def fetch_remote_image(self, url, fallback_data=None): @@ -461,7 +473,6 @@ class CoverArtBox(QtWidgets.QGroupBox): set_image = set_image_append debug_info = "Appending dropped %r to %r" - update = True if isinstance(self.item, Album): album = self.item album.enable_update_metadata_images(False) @@ -507,14 +518,9 @@ class CoverArtBox(QtWidgets.QGroupBox): file.update() else: debug_info = "Dropping %r to %r is not handled" - update = False log.debug(debug_info, coverartimage, self.item) - if update: - self.cover_art.set_metadata(self.item.metadata) - self.show() - def choose_local_file(self): file_chooser = QtWidgets.QFileDialog(self) file_chooser.setNameFilters([ diff --git a/picard/ui/mainwindow.py b/picard/ui/mainwindow.py index 3d0d1aae6..09a365ae5 100644 --- a/picard/ui/mainwindow.py +++ b/picard/ui/mainwindow.py @@ -1168,8 +1168,6 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): self.update_actions() - metadata = None - orig_metadata = None obj = None # Clear any existing status bar messages @@ -1181,8 +1179,6 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): if len(objects) == 1: obj = list(objects)[0] if isinstance(obj, File): - metadata = obj.metadata - orig_metadata = obj.orig_metadata if obj.state == obj.ERROR: msg = N_("%(filename)s (error: %(error)s)") mparms = { @@ -1196,10 +1192,8 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): } self.set_statusbar_message(msg, mparms, echo=None, history=None) elif isinstance(obj, Track): - metadata = obj.metadata if obj.num_linked_files == 1: file = obj.linked_files[0] - orig_metadata = file.orig_metadata if file.has_error(): msg = N_("%(filename)s (%(similarity)d%%) (error: %(error)s)") mparms = { @@ -1215,22 +1209,15 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): } self.set_statusbar_message(msg, mparms, echo=None, history=None) - elif isinstance(obj, Album): - metadata = obj.metadata - orig_metadata = obj.orig_metadata - elif obj.can_show_coverart: - metadata = obj.metadata - else: + elif new_selection: # Create a temporary file list which allows changing cover art for all selected files files = self.tagger.get_files_from_objects(objects) obj = FileList(files) - metadata = obj.metadata - orig_metadata = obj.orig_metadata if new_selection: self.metadata_box.selection_dirty = True + self.cover_art_box.set_item(obj) self.metadata_box.update(drop_album_caches=drop_album_caches) - self.cover_art_box.set_metadata(metadata, orig_metadata, obj) self.selection_updated.emit(objects) def refresh_metadatabox(self):