From e3e63e5b004e7542c2a878ffa96a63eff7c44920 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Feb 2012 11:10:21 +0100 Subject: [PATCH 1/2] Add 'delete' for appropriate items to the context menu of the tag browser. Fix a bug where adding hierarchical items to user categories did not recurse. --- src/calibre/gui2/tag_browser/ui.py | 35 +++++++++++++++++++++++++++- src/calibre/gui2/tag_browser/view.py | 14 ++++++++--- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index bce38f79d0..93d33caa8a 100644 --- a/src/calibre/gui2/tag_browser/ui.py +++ b/src/calibre/gui2/tag_browser/ui.py @@ -29,7 +29,7 @@ class TagBrowserMixin(object): # {{{ self.library_view.model().count_changed_signal.connect(self.tags_view.recount) self.tags_view.set_database(db, self.tag_match, self.sort_by) self.tags_view.tags_marked.connect(self.search.set_search_string) - self.tags_view.tag_list_edit.connect(self.do_tags_list_edit) + self.tags_view.tags_list_edit.connect(self.do_tags_list_edit) self.tags_view.edit_user_category.connect(self.do_edit_user_categories) self.tags_view.delete_user_category.connect(self.do_delete_user_category) self.tags_view.del_item_from_user_cat.connect(self.do_del_item_from_user_cat) @@ -43,6 +43,7 @@ class TagBrowserMixin(object): # {{{ self.tags_view.drag_drop_finished.connect(self.drag_drop_finished) self.tags_view.restriction_error.connect(self.do_restriction_error, type=Qt.QueuedConnection) + self.tags_view.tag_item_delete.connect(self.do_tag_item_delete) for text, func, args, cat_name in ( (_('Manage Authors'), @@ -244,6 +245,38 @@ class TagBrowserMixin(object): # {{{ self.do_tag_item_renamed() self.tags_view.recount() + def do_tag_item_delete(self, category, item_id, orig_name): + ''' + Delete an item from some category. + ''' + if not question_dialog(self.tags_view, + title=_('Delete item'), + msg=_('%s will be permanently deleted. Do you really ' + 'want to do this?')%orig_name, + skip_dialog_name='tag_item_delete', + skip_dialog_msg=_('Show this message again')): + return + return + db=self.library_view.model().db + + if category == 'tags': + delete_func = db.delete_tag_using_id + elif category == 'series': + delete_func = db.delete_series_using_id + elif category == 'publisher': + delete_func = db.delete_publisher_using_id + else: # must be custom + cc_label = db.field_metadata[category]['label'] + delete_func = partial(db.delete_custom_item_using_id, label=cc_label) + m = self.tags_view.model() + if delete_func: + delete_func(item_id) + m.delete_item_from_all_user_categories(orig_name, category) + + # Clean up the library view + self.do_tag_item_renamed() + self.tags_view.recount() + def do_tag_item_renamed(self): # Clean up library view and search # get information to redo the selection diff --git a/src/calibre/gui2/tag_browser/view.py b/src/calibre/gui2/tag_browser/view.py index 98dbd7f51a..a03d16283c 100644 --- a/src/calibre/gui2/tag_browser/view.py +++ b/src/calibre/gui2/tag_browser/view.py @@ -63,7 +63,7 @@ class TagsView(QTreeView): # {{{ del_item_from_user_cat = pyqtSignal(object, object, object) add_item_to_user_cat = pyqtSignal(object, object, object) add_subcategory = pyqtSignal(object) - tag_list_edit = pyqtSignal(object, object) + tags_list_edit = pyqtSignal(object, object) saved_search_edit = pyqtSignal(object) rebuild_saved_searches = pyqtSignal() author_sort_edit = pyqtSignal(object, object, object, object) @@ -71,6 +71,7 @@ class TagsView(QTreeView): # {{{ search_item_renamed = pyqtSignal() drag_drop_finished = pyqtSignal(object) restriction_error = pyqtSignal() + tag_item_delete = pyqtSignal(object, object, object) def __init__(self, parent=None): QTreeView.__init__(self, parent=None) @@ -234,8 +235,11 @@ class TagsView(QTreeView): # {{{ if action == 'edit_item': self.edit(index) return + if action == 'delete_item': + self.tag_item_delete.emit(key, index.id, index.original_name) + return if action == 'open_editor': - self.tag_list_edit.emit(category, key) + self.tags_list_edit.emit(category, key) return if action == 'manage_categories': self.edit_user_category.emit(category) @@ -246,7 +250,7 @@ class TagsView(QTreeView): # {{{ if action == 'add_to_category': tag = index.tag if len(index.children) > 0: - for c in index.children: + for c in index.all_children(): self.add_item_to_user_cat.emit(category, c.tag.original_name, c.tag.category) self.add_item_to_user_cat.emit(category, tag.original_name, @@ -345,6 +349,10 @@ class TagsView(QTreeView): # {{{ _('Rename %s')%display_name(tag), partial(self.context_menu_handler, action='edit_item', index=index)) + self.context_menu.addAction(self.delete_icon, + _('Delete %s')%display_name(tag), + partial(self.context_menu_handler, action='delete_item', + key=key, index=tag)) if key == 'authors': self.context_menu.addAction(_('Edit sort for %s')%display_name(tag), partial(self.context_menu_handler, From 6f02c4939282efec7077c1fc655082d95a2b777f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Feb 2012 11:19:30 +0100 Subject: [PATCH 2/2] Don't offer delete on categories that require special processing, such as authors. --- src/calibre/gui2/tag_browser/view.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/tag_browser/view.py b/src/calibre/gui2/tag_browser/view.py index a03d16283c..f2e1513f18 100644 --- a/src/calibre/gui2/tag_browser/view.py +++ b/src/calibre/gui2/tag_browser/view.py @@ -349,9 +349,11 @@ class TagsView(QTreeView): # {{{ _('Rename %s')%display_name(tag), partial(self.context_menu_handler, action='edit_item', index=index)) - self.context_menu.addAction(self.delete_icon, + if key in ('tags', 'series', 'publisher') or \ + self._model.db.field_metadata.is_custom_field(key): + self.context_menu.addAction(self.delete_icon, _('Delete %s')%display_name(tag), - partial(self.context_menu_handler, action='delete_item', + partial(self.context_menu_handler, action='delete_item', key=key, index=tag)) if key == 'authors': self.context_menu.addAction(_('Edit sort for %s')%display_name(tag),