Fixes #1923365 [Enhancement Request: Tag browser: Delete identifiers in context menu](https://bugs.launchpad.net/calibre/+bug/1923365)
This commit is contained in:
Kovid Goyal 2021-04-12 21:47:28 +05:30
commit 263427884e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 50 additions and 1 deletions

View File

@ -6,7 +6,7 @@ __license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import textwrap import copy, textwrap
from functools import partial from functools import partial
from qt.core import ( from qt.core import (
@ -87,6 +87,7 @@ class TagBrowserMixin(object): # {{{
self.tags_view.restriction_error.connect(self.do_restriction_error, self.tags_view.restriction_error.connect(self.do_restriction_error,
type=Qt.ConnectionType.QueuedConnection) type=Qt.ConnectionType.QueuedConnection)
self.tags_view.tag_item_delete.connect(self.do_tag_item_delete) self.tags_view.tag_item_delete.connect(self.do_tag_item_delete)
self.tags_view.tag_identifier_delete.connect(self.delete_identifier)
self.tags_view.apply_tag_to_selected.connect(self.apply_tag_to_selected) self.tags_view.apply_tag_to_selected.connect(self.apply_tag_to_selected)
self.populate_tb_manage_menu(db) self.populate_tb_manage_menu(db)
self.tags_view.model().user_categories_edited.connect(self.user_categories_edited, self.tags_view.model().user_categories_edited.connect(self.user_categories_edited,
@ -380,6 +381,33 @@ class TagBrowserMixin(object): # {{{
self.library_view.model().refresh_ids(set(changes), current_row=self.library_view.currentIndex().row()) self.library_view.model().refresh_ids(set(changes), current_row=self.library_view.currentIndex().row())
self.tags_view.recount_with_position_based_index() self.tags_view.recount_with_position_based_index()
def delete_identifier(self, name, in_vl):
d = self.current_db.new_api
changed = False
books_to_use = self.tags_view.model().get_book_ids_to_use() if in_vl else d.all_book_ids()
ids = d.all_field_for('identifiers', books_to_use)
new_ids = {}
for id_ in ids:
for identifier_type in ids[id_]:
if identifier_type == name:
new_ids[id_] = copy.copy(ids[id_])
new_ids[id_].pop(name)
changed = True
if changed:
if in_vl:
msg = _('The identifier %s will be deleted from books in the '
'current virtual library. Are you sure?')%name
else:
msg= _('The identifier %s will be deleted from all books. Are you sure?')%name
if not question_dialog(self,
title=_('Delete identifier'),
msg=msg,
skip_dialog_name='tag_browser_delete_identifiers',
skip_dialog_msg=_('Show this confirmation again')):
return
d.set_field('identifiers', new_ids)
self.tags_view.recount_with_position_based_index()
def edit_enum_values(self, parent, db, key): def edit_enum_values(self, parent, db, key):
from calibre.gui2.dialogs.enum_values_edit import EnumValuesEdit from calibre.gui2.dialogs.enum_values_edit import EnumValuesEdit
d = EnumValuesEdit(parent, db, key) d = EnumValuesEdit(parent, db, key)

View File

@ -174,6 +174,7 @@ class TagsView(QTreeView): # {{{
drag_drop_finished = pyqtSignal(object) drag_drop_finished = pyqtSignal(object)
restriction_error = pyqtSignal() restriction_error = pyqtSignal()
tag_item_delete = pyqtSignal(object, object, object, object, object) tag_item_delete = pyqtSignal(object, object, object, object, object)
tag_identifier_delete = pyqtSignal(object, object)
apply_tag_to_selected = pyqtSignal(object, object, object) apply_tag_to_selected = pyqtSignal(object, object, object)
edit_enum_values = pyqtSignal(object, object, object) edit_enum_values = pyqtSignal(object, object, object)
@ -530,6 +531,12 @@ class TagsView(QTreeView): # {{{
self.tag_item_delete.emit(key, id_, tag.original_name, self.tag_item_delete.emit(key, id_, tag.original_name,
None, children) None, children)
return return
if action == 'delete_identifier':
self.tag_identifier_delete.emit(index.tag.name, False)
return
if action == 'delete_identifier_in_vl':
self.tag_identifier_delete.emit(index.tag.name, True)
return
if action == 'open_editor': if action == 'open_editor':
self.tags_list_edit.emit(category, key, is_first_letter) self.tags_list_edit.emit(category, key, is_first_letter)
return return
@ -766,6 +773,20 @@ class TagsView(QTreeView): # {{{
_('Delete Saved search %s')%display_name(tag), _('Delete Saved search %s')%display_name(tag),
partial(self.context_menu_handler, partial(self.context_menu_handler,
action='delete_search', key=tag.original_name)) action='delete_search', key=tag.original_name))
elif key == 'identifiers':
if self.model().get_in_vl():
self.context_menu.addAction(self.delete_icon,
_('Delete %s in Virtual Library')%display_name(tag),
partial(self.context_menu_handler,
action='delete_identifier_in_vl',
key=key, index=tag_item))
else:
self.context_menu.addAction(self.delete_icon,
_('Delete %s')%display_name(tag),
partial(self.context_menu_handler,
action='delete_identifier',
key=key, index=tag_item))
if key.startswith('@') and not item.is_gst: if key.startswith('@') and not item.is_gst:
self.context_menu.addAction(self.user_category_icon, self.context_menu.addAction(self.user_category_icon,
_('Remove %(item)s from category %(cat)s')% _('Remove %(item)s from category %(cat)s')%