From 91ed569caa6cd1941bf6209f0de5ce5b6c03f6a8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 24 Feb 2011 09:47:57 +0000 Subject: [PATCH] Rename and delete items in user categories after a 'manage X' operation --- src/calibre/gui2/dialogs/tag_list_editor.py | 2 + src/calibre/gui2/tag_view.py | 71 +++++++++++++++------ 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index 6c3ebb22d5..cee9eb42b9 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -58,10 +58,12 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.to_rename = {} self.to_delete = set([]) + self.original_names = {} self.all_tags = {} for k,v in data: self.all_tags[v] = k + self.original_names[k] = v for tag in sorted(self.all_tags.keys(), key=key): item = ListWidgetItem(tag) item.setData(Qt.UserRole, self.all_tags[tag]) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 449a94d011..01cda54afe 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -1207,21 +1207,54 @@ class TagsModel(QAbstractItemModel): # {{{ label=self.db.field_metadata[key]['label']) self.tags_view.tag_item_renamed.emit() item.tag.name = val - # rename the item in any user categories - user_cats = self.db.prefs.get('user_categories', {}) - for k in user_cats.keys(): - new_contents = [] - for tup in user_cats[k]: - if tup[0] == name and tup[1] == key: - new_contents.append([val, key, 0]) - else: - new_contents.append(tup) - user_cats[k] = new_contents - self.db.prefs.set('user_categories', user_cats) + self.rename_item_in_all_user_categories(name, key, val) self.refresh() # Should work, because no categories can have disappeared self.show_item_at_path(path) return True + def rename_item_in_all_user_categories(self, item_name, item_category, new_name): + ''' + Search all user categories for items named item_name with category + item_category and rename them to new_name. The caller must arrange to + redisplay the tree as appropriate (recount or set_new_model) + ''' + user_cats = self.db.prefs.get('user_categories', {}) + for k in user_cats.keys(): + new_contents = [] + for tup in user_cats[k]: + if tup[0] == item_name and tup[1] == item_category: + new_contents.append([new_name, item_category, 0]) + else: + new_contents.append(tup) + user_cats[k] = new_contents + self.db.prefs.set('user_categories', user_cats) + + def delete_item_from_all_user_categories(self, item_name, item_category): + ''' + Search all user categories for items named item_name with category + item_category and delete them. The caller must arrange to redisplay the + tree as appropriate (recount or set_new_model) + ''' + user_cats = self.db.prefs.get('user_categories', {}) + for cat in user_cats.keys(): + self.delete_item_from_user_category(cat, item_name, item_category, + user_categories=user_cats) + self.db.prefs.set('user_categories', user_cats) + + def delete_item_from_user_category(self, category, item_name, item_category, + user_categories=None): + if user_categories is not None: + user_cats = user_categories + else: + user_cats = self.db.prefs.get('user_categories', {}) + new_contents = [] + for tup in user_cats[category]: + if tup[0] != item_name or tup[1] != item_category: + new_contents.append(tup) + user_cats[category] = new_contents + if user_categories is None: + self.db.prefs.set('user_categories', user_cats) + def headerData(self, *args): return NONE @@ -1531,12 +1564,8 @@ class TagBrowserMixin(object): # {{{ _('User category %s does not exist')%user_cat, show=True) return - new_contents = [] - for tup in user_cats[user_cat]: - if tup[0] != item_name or tup[1] != item_category: - new_contents.append(tup) - user_cats[user_cat] = new_contents - db.prefs.set('user_categories', user_cats) + self.tags_view.model().delete_item_from_user_category(user_cat, + item_name, item_category) self.tags_view.recount() def do_add_subcategory(self, on_category_key=None): @@ -1632,6 +1661,8 @@ class TagBrowserMixin(object): # {{{ if d.result() == d.Accepted: to_rename = d.to_rename # dict of new text to old id to_delete = d.to_delete # list of ids + orig_name = d.original_names # dict of id: name + rename_func = None if category == 'tags': rename_func = db.rename_tag @@ -1645,15 +1676,19 @@ class TagBrowserMixin(object): # {{{ else: rename_func = partial(db.rename_custom_item, label=cc_label) delete_func = partial(db.delete_custom_item_using_id, label=cc_label) + m = self.tags_view.model() if rename_func: for item in to_delete: delete_func(item) + m.delete_item_from_all_user_categories(orig_name[item], category) for old_id in to_rename: rename_func(old_id, new_name=unicode(to_rename[old_id])) + m.rename_item_in_all_user_categories(orig_name[old_id], + category, unicode(to_rename[old_id])) # Clean up the library view self.do_tag_item_renamed() - self.tags_view.set_new_model() + self.tags_view.recount() def do_tag_item_renamed(self): # Clean up library view and search