PICARD-2028: Update cover art box only on changes

Use signalling to update the cover art box when cover art actually changed. Avoid cover art box update on selection changes.
This commit is contained in:
Philipp Wolfer
2020-12-01 08:54:15 +01:00
parent e43cb44b2d
commit f83044a5d0
5 changed files with 29 additions and 31 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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([

View File

@@ -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):