diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index bce38f79d0..7919f4e4b0 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 deleted from all books. Are you sure?') + %orig_name, + skip_dialog_name='tag_item_delete', + skip_dialog_msg=_('Show this confirmation again')): + return + db = self.current_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..f2e1513f18 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,12 @@ class TagsView(QTreeView): # {{{ _('Rename %s')%display_name(tag), partial(self.context_menu_handler, action='edit_item', index=index)) + 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', + key=key, index=tag)) if key == 'authors': self.context_menu.addAction(_('Edit sort for %s')%display_name(tag), partial(self.context_menu_handler,