diff --git a/picard/ui/mainwindow.py b/picard/ui/mainwindow.py index 7e4e58e49..e1a9dda8e 100644 --- a/picard/ui/mainwindow.py +++ b/picard/ui/mainwindow.py @@ -1178,7 +1178,7 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): if new_selection: self.metadata_box.selection_dirty = True - self.metadata_box.update() + self.metadata_box.update() self.cover_art_box.set_metadata(metadata, orig_metadata, obj) self.selection_updated.emit(objects) diff --git a/picard/ui/metadatabox.py b/picard/ui/metadatabox.py index c11d41115..9562de31c 100644 --- a/picard/ui/metadatabox.py +++ b/picard/ui/metadatabox.py @@ -232,6 +232,8 @@ class MetadataBox(QtWidgets.QTableWidget): # TR: Keyboard shortcut for "Remove" (tag) self.remove_tag_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(_("Alt+Shift+R")), self, self.remove_selected_tags) self.preserved_tags = PreservedTags() + self._single_file_album = False + self._single_track_album = False def get_file_lookup(self): """Return a FileLookup object.""" @@ -303,7 +305,7 @@ class MetadataBox(QtWidgets.QTableWidget): else: self.set_tag_values(tag, new) self.editing = None - self.update() + self.update(drop_album_caches=tag == 'album') @staticmethod def _get_editor_value(editor): @@ -400,7 +402,6 @@ class MetadataBox(QtWidgets.QTableWidget): for obj in objects: obj.metadata[tag] = values obj.update() - self.update() self.parent.ignore_selection_changes = False def remove_tag(self, tag): @@ -450,15 +451,16 @@ class MetadataBox(QtWidgets.QTableWidget): self.selection_mutex.unlock() @throttle(100) - def update(self): + def update(self, drop_album_caches=False): if self.editing: return + new_selection = self.selection_dirty if self.selection_dirty: self._update_selection() - thread.run_task(self._update_tags, self._update_items, + thread.run_task(partial(self._update_tags, new_selection, drop_album_caches), self._update_items, thread_pool=self.tagger.priority_thread_pool) - def _update_tags(self): + def _update_tags(self, new_selection=True, drop_album_caches=False): self.selection_mutex.lock() files = self.files tracks = self.tracks @@ -467,6 +469,24 @@ class MetadataBox(QtWidgets.QTableWidget): if not (files or tracks): return None + if new_selection or drop_album_caches: + self._single_file_album = len(set([file.metadata["album"] for file in files])) == 1 + self._single_track_album = len(set([track.metadata["album"] for track in tracks])) == 1 + + while not new_selection: # Just an if with multiple exit points + # If we are dealing with the same selection + # skip updates unless it we are dealing with a single file/track + if len(files) == 1: + break + if len(tracks) == 1: + break + # Or if we are dealing with a single cluster/album + if self._single_file_album: + break + if self._single_track_album: + break + return self.tag_diff + self.colors = { TagStatus.NOCHANGE: self.palette().color(QtGui.QPalette.Text), TagStatus.REMOVED: QtGui.QBrush(interface_colors.get_qcolor('tagstatus_removed')),