diff --git a/picard/collection.py b/picard/collection.py index 11ba17660..a983a2156 100644 --- a/picard/collection.py +++ b/picard/collection.py @@ -30,6 +30,8 @@ user_collections = {} class Collection(QtCore.QObject): + COLLECTION_ADD = 1 + COLLECTION_REMOVE = 2 def __init__(self, collection_id, name, size): self.id = collection_id @@ -37,66 +39,52 @@ class Collection(QtCore.QObject): self.pending = set() self.size = int(size) self.releases = set() + mb_api = self.tagger.mb_api + self.api_action = { + self.COLLECTION_ADD: mb_api.put_to_collection, + self.COLLECTION_REMOVE: mb_api.delete_from_collection, + } def __repr__(self): return '' % (self.name, self.id) - def add_releases(self, ids, callback): - ids = ids - self.pending + def _modify(self, kind, ids, callback): + ids -= self.pending if ids: - self.pending.update(ids) - self.tagger.mb_api.put_to_collection(self.id, list(ids), - partial(self._add_finished, ids, callback)) + self.pending |= ids + when_done = partial(self._finished, kind, ids, callback) + self.api_action[kind](self.id, list(ids), when_done) + + def add_releases(self, ids, callback): + self._modify(self.COLLECTION_ADD, ids, callback) def remove_releases(self, ids, callback): - ids = ids - self.pending - if ids: - self.pending.update(ids) - self.tagger.mb_api.delete_from_collection(self.id, list(ids), - partial(self._remove_finished, ids, callback)) + self._modify(self.COLLECTION_REMOVE, ids, callback) - def _add_finished(self, ids, callback, document, reply, error): - self.pending.difference_update(ids) + def _finished(self, kind, ids, callback, document, reply, error): + self.pending -= ids if not error: count = len(ids) - self.releases.update(ids) - self.size += count + if kind == self.COLLECTION_ADD: + self.releases |= ids + self.size += count + status_msg = ngettext( + 'Added %(count)i release to collection "%(name)s"', + 'Added %(count)i releases to collection "%(name)s"', + count) + debug_msg = 'Added %(count)i releases to collection "%(name)s"' + else: + self.releases -= ids + self.size -= count + status_msg = ngettext( + 'Removed %(count)i release from collection "%(name)s"', + 'Removed %(count)i releases from collection "%(name)s"', + count) + debug_msg = 'Removed %(count)i releases from collection "%(name)s"' callback() - mparms = { - 'count': count, - 'name': self.name - } - log.debug('Added %(count)i releases to collection "%(name)s"' % mparms) - self.tagger.window.set_statusbar_message( - ngettext('Added %(count)i release to collection "%(name)s"', - 'Added %(count)i releases to collection "%(name)s"', - count), - mparms, - translate=None, - echo=None - ) - - def _remove_finished(self, ids, callback, document, reply, error): - self.pending.difference_update(ids) - if not error: - count = len(ids) - self.releases.difference_update(ids) - self.size -= count - callback() - mparms = { - 'count': count, - 'name': self.name - } - log.debug('Removed %(count)i releases from collection "%(name)s"' % - mparms) - self.tagger.window.set_statusbar_message( - ngettext('Removed %(count)i release from collection "%(name)s"', - 'Removed %(count)i releases from collection "%(name)s"', - count), - mparms, - translate=None, - echo=None - ) + mparms = {'count': count, 'name': self.name} + log.debug(debug_msg % mparms) + self.tagger.window.set_statusbar_message(status_msg, mparms, translate=None, echo=None) def load_user_collections(callback=None):