From b4a2bd3d2aab46c7b5e5e7aa2cd687f0af34eb7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Sun, 25 Mar 2007 13:34:54 +0200 Subject: [PATCH] Optimized album updating in the view. --- picard/album.py | 4 ++-- picard/puidmanager.py | 9 ++++++++- picard/ui/itemviews.py | 43 ++++++++++++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/picard/album.py b/picard/album.py index 325717f4c..0ea94c7e9 100644 --- a/picard/album.py +++ b/picard/album.py @@ -162,9 +162,9 @@ class Album(DataObject, Item): self._new_tracks = [] self._requests = 1 if self.config.setting['release_ars'] or self.config.setting['track_ars']: - inc = ('tracks', 'artist', 'release-events', 'artist-rels') + inc = ('tracks', 'puids', 'artist', 'release-events', 'artist-rels') else: - inc = ('tracks', 'artist', 'release-events') + inc = ('tracks', 'puids', 'artist', 'release-events') self.tagger.xmlws.get_release_by_id(self.id, self._release_request_finished, inc=inc) def update(self, update_tracks=True): diff --git a/picard/puidmanager.py b/picard/puidmanager.py index ddd44aba0..0a461dea5 100644 --- a/picard/puidmanager.py +++ b/picard/puidmanager.py @@ -25,9 +25,10 @@ class PUIDManager(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self.__puids = {} + self.__matches = {} def add(self, puid, trackid): - """Add the PUID to the manager.""" + """Add a PUID to the manager.""" if puid: self.__puids[puid] = [trackid, trackid] self.__check_unsubmitted() @@ -69,3 +70,9 @@ class PUIDManager(QtCore.QObject): except KeyError: pass self.__check_unsubmitted() + + def add_match(self, puid, trackid): + self.__matches.setdefault(puid, []).append(trackid) + + def lookup(self, puid): + return self.__matches.get(puid, []) diff --git a/picard/ui/itemviews.py b/picard/ui/itemviews.py index f8f173883..e174543ec 100644 --- a/picard/ui/itemviews.py +++ b/picard/ui/itemviews.py @@ -114,6 +114,13 @@ class MainPanel(QtGui.QSplitter): self._object_to_item[obj] = item self._item_to_object[item] = obj + def update_object(self, obj, item): + oldobj = self._item_to_object[item] + if oldobj != obj: + self._object_to_item[obj] = item + self._item_to_object[item] = obj + del self._object_to_item[oldobj] + def unregister_object(self, obj=None, item=None): if obj is None and item is not None: obj = self.object_from_item(item) @@ -157,19 +164,17 @@ class MainPanel(QtGui.QSplitter): item.setText(i, cluster.column(column[1])) def add_file_to_cluster(self, cluster, file): - # http://chatlogs.musicbrainz.org/2007/2007-03/2007-03-24.html#T08-44-16-602562 - assert isinstance(cluster, Cluster) try: cluster_item = self.item_from_object(cluster) except KeyError: self.log.debug("Item for %r not found", cluster) return + if cluster.special == 2 and cluster.files: + cluster_item.setHidden(False) + self.update_cluster(cluster, cluster_item) item = QtGui.QTreeWidgetItem(cluster_item) self.register_object(file, item) self.update_file(file, item) - self.update_cluster(cluster, cluster_item) - if cluster.special == 2 and cluster.files: - cluster_item.setHidden(False) def remove_file_from_cluster(self, cluster, file, index): try: @@ -460,14 +465,28 @@ class AlbumTreeView(BaseTreeView): for i, column in enumerate(self.columns): album_item.setText(i, album.column(column[1])) if update_tracks: - items = album_item.takeChildren() - for item in items: - self.panel.unregister_object(item=item) - for track in album.tracks: - item = QtGui.QTreeWidgetItem(album_item) - self.panel.register_object(track, item) + oldnum = album_item.childCount() - 1 + newnum = len(album.tracks) + # remove old items + if oldnum > newnum: + for i in range(oldnum - newnum): + item = album_item.takeChild(newnum - 1) + self.panel.unregister_object(item=item) + oldnum = newnum + # update existing items + item = None + for i in range(oldnum): + item = album_item.child(i) + track = album.tracks[i] + self.panel.update_object(track, item) self.update_track(track, item) - self.add_cluster(album.unmatched_files, album_item) + # add new items + if newnum > oldnum: + for i in range(oldnum, newnum): + item = QtGui.QTreeWidgetItem(album_item, item) + track = album.tracks[i] + self.panel.register_object(track, item) + self.update_track(track, item) def remove_album(self, album, index): self.panel.unregister_object(album)