Book details panel: When right clicking on tags/authors/etc. allow finding them in the Tag browser easily. Fixes #1884343 [[Enhancement] Add action to show a tag in the Tag browser when right clicking on a tag in the Book details panel](https://bugs.launchpad.net/calibre/+bug/1884343)

Merge branch 'master' of https://github.com/cbhaley/calibre
This commit is contained in:
Kovid Goyal 2020-06-20 19:35:04 +05:30
commit e3bcbac8b9
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 34 additions and 4 deletions

View File

@ -242,7 +242,7 @@ def mi_to_html(
if not mi.languages: if not mi.languages:
continue continue
names = filter(None, map(calibre_langcode_to_name, mi.languages)) names = filter(None, map(calibre_langcode_to_name, mi.languages))
names = ['<a href="%s" title="%s">%s</a>' % (search_action('languages', n), _( names = ['<a href="%s" title="%s">%s</a>' % (search_action_with_data('languages', n, book_id), _(
'Search calibre for books with the language: {}').format(n), n) for n in names] 'Search calibre for books with the language: {}').format(n), n) for n in names]
ans.append((field, row % (name, u', '.join(names)))) ans.append((field, row % (name, u', '.join(names))))
elif field == 'publisher': elif field == 'publisher':

View File

@ -31,7 +31,7 @@ from calibre.gui2.dnd import (
from calibre.gui2.widgets2 import HTMLDisplay from calibre.gui2.widgets2 import HTMLDisplay
from calibre.utils.config import tweaks from calibre.utils.config import tweaks
from calibre.utils.img import blend_image, image_from_x from calibre.utils.img import blend_image, image_from_x
from calibre.utils.localization import is_rtl from calibre.utils.localization import is_rtl, langnames_to_langcodes
from calibre.utils.serialize import json_loads from calibre.utils.serialize import json_loads
from polyglot.binary import from_hex_bytes from polyglot.binary import from_hex_bytes
from polyglot.builtins import unicode_type from polyglot.builtins import unicode_type
@ -98,6 +98,14 @@ def init_manage_action(ac, field, value):
ac.current_fmt = field, value ac.current_fmt = field, value
return ac return ac
def init_find_in_tag_browser(menu, ac, field, value):
from calibre.gui2.ui import get_gui
hidden_cats = get_gui().tags_view.model().hidden_categories
if field not in hidden_cats:
ac.setIcon(QIcon(I('search.png')))
ac.setText(_('Find %s in Tag browser') % value)
ac.current_fmt = field, value
menu.addAction(ac)
def render_html(mi, vertical, widget, all_fields=False, render_data_func=None, pref_name='book_display_fields'): # {{{ def render_html(mi, vertical, widget, all_fields=False, render_data_func=None, pref_name='book_display_fields'): # {{{
func = render_data_func or render_data func = render_data_func or render_data
@ -230,6 +238,7 @@ def add_format_entries(menu, data, book_info):
def add_item_specific_entries(menu, data, book_info): def add_item_specific_entries(menu, data, book_info):
search_internet_added = False search_internet_added = False
find_action = book_info.find_in_tag_browser_action
dt = data['type'] dt = data['type']
if dt == 'format': if dt == 'format':
add_format_entries(menu, data, book_info) add_format_entries(menu, data, book_info)
@ -241,6 +250,7 @@ def add_item_specific_entries(menu, data, book_info):
ac.setText(_('&Copy author link')) ac.setText(_('&Copy author link'))
menu.addAction(ac) menu.addAction(ac)
menu.addAction(init_manage_action(book_info.manage_action, 'authors', author)) menu.addAction(init_manage_action(book_info.manage_action, 'authors', author))
init_find_in_tag_browser(menu, find_action, 'authors', author)
if hasattr(book_info, 'search_internet'): if hasattr(book_info, 'search_internet'):
menu.sia = sia = create_search_internet_menu(book_info.search_internet, author) menu.sia = sia = create_search_internet_menu(book_info.search_internet, author)
menu.addMenu(sia) menu.addMenu(sia)
@ -267,17 +277,21 @@ def add_item_specific_entries(menu, data, book_info):
ac.current_url = value ac.current_url = value
ac.setText(_('&Copy identifier')) ac.setText(_('&Copy identifier'))
menu.addAction(ac) menu.addAction(ac)
menu.addAction(book_info.edit_identifiers_action)
remove_value = data['id_type'] remove_value = data['id_type']
init_find_in_tag_browser(menu, find_action, field, remove_value)
menu.addAction(book_info.edit_identifiers_action)
elif field in ('tags', 'series', 'publisher') or is_category(field): elif field in ('tags', 'series', 'publisher') or is_category(field):
init_find_in_tag_browser(menu, find_action, field, value)
menu.addAction(init_manage_action(book_info.manage_action, field, value)) menu.addAction(init_manage_action(book_info.manage_action, field, value))
elif field == 'languages':
remove_value = langnames_to_langcodes((value,)).get(value, 'Unknown')
init_find_in_tag_browser(menu, find_action, field, value)
ac = book_info.remove_item_action ac = book_info.remove_item_action
ac.data = (field, remove_value, book_id) ac.data = (field, remove_value, book_id)
ac.setText(_('Remove %s from this book') % value) ac.setText(_('Remove %s from this book') % value)
menu.addAction(ac) menu.addAction(ac)
return search_internet_added return search_internet_added
def details_context_menu_event(view, ev, book_info, add_popup_action=False): def details_context_menu_event(view, ev, book_info, add_popup_action=False):
url = view.anchorAt(ev.pos()) url = view.anchorAt(ev.pos())
menu = view.createStandardContextMenu() menu = view.createStandardContextMenu()
@ -553,6 +567,7 @@ class BookInfo(HTMLDisplay):
open_fmt_with = pyqtSignal(int, object, object) open_fmt_with = pyqtSignal(int, object, object)
edit_book = pyqtSignal(int, object) edit_book = pyqtSignal(int, object)
edit_identifiers = pyqtSignal() edit_identifiers = pyqtSignal()
find_in_tag_browser = pyqtSignal(object, object)
def __init__(self, vertical, parent=None): def __init__(self, vertical, parent=None):
HTMLDisplay.__init__(self, parent) HTMLDisplay.__init__(self, parent)
@ -563,6 +578,7 @@ class BookInfo(HTMLDisplay):
('restore_format', 'edit-undo.png'), ('copy_link','edit-copy.png'), ('restore_format', 'edit-undo.png'), ('copy_link','edit-copy.png'),
('compare_format', 'diff.png'), ('compare_format', 'diff.png'),
('set_cover_format', 'default_cover.png'), ('set_cover_format', 'default_cover.png'),
('find_in_tag_browser', 'search.png')
]: ]:
ac = QAction(QIcon(I(icon)), '', self) ac = QAction(QIcon(I(icon)), '', self)
ac.current_fmt = None ac.current_fmt = None
@ -615,6 +631,10 @@ class BookInfo(HTMLDisplay):
def copy_link_triggerred(self): def copy_link_triggerred(self):
self.context_action_triggered('copy_link') self.context_action_triggered('copy_link')
def find_in_tag_browser_triggerred(self):
if self.find_in_tag_browser_action.current_fmt:
self.find_in_tag_browser.emit(*self.find_in_tag_browser_action.current_fmt)
def manage_action_triggered(self): def manage_action_triggered(self):
if self.manage_action.current_fmt: if self.manage_action.current_fmt:
self.manage_category.emit(*self.manage_action.current_fmt) self.manage_category.emit(*self.manage_action.current_fmt)
@ -767,6 +787,7 @@ class BookDetails(QWidget): # {{{
edit_identifiers = pyqtSignal() edit_identifiers = pyqtSignal()
open_fmt_with = pyqtSignal(int, object, object) open_fmt_with = pyqtSignal(int, object, object)
edit_book = pyqtSignal(int, object) edit_book = pyqtSignal(int, object)
find_in_tag_browser = pyqtSignal(object, object)
# Drag 'n drop {{{ # Drag 'n drop {{{
@ -844,6 +865,7 @@ class BookDetails(QWidget): # {{{
self.book_info.compare_format.connect(self.compare_specific_format) self.book_info.compare_format.connect(self.compare_specific_format)
self.book_info.copy_link.connect(self.copy_link) self.book_info.copy_link.connect(self.copy_link)
self.book_info.manage_category.connect(self.manage_category) self.book_info.manage_category.connect(self.manage_category)
self.book_info.find_in_tag_browser.connect(self.find_in_tag_browser)
self.book_info.edit_identifiers.connect(self.edit_identifiers) self.book_info.edit_identifiers.connect(self.edit_identifiers)
self.setCursor(Qt.PointingHandCursor) self.setCursor(Qt.PointingHandCursor)

View File

@ -677,6 +677,7 @@ class LayoutMixin(object): # {{{
self.book_details.view_device_book.connect( self.book_details.view_device_book.connect(
self.iactions['View'].view_device_book) self.iactions['View'].view_device_book)
self.book_details.manage_category.connect(self.manage_category_triggerred) self.book_details.manage_category.connect(self.manage_category_triggerred)
self.book_details.find_in_tag_browser.connect(self.find_in_tag_browser_triggered)
self.book_details.edit_identifiers.connect(self.edit_identifiers_triggerred) self.book_details.edit_identifiers.connect(self.edit_identifiers_triggerred)
self.book_details.compare_specific_format.connect(self.compare_format) self.book_details.compare_specific_format.connect(self.compare_format)
@ -706,6 +707,13 @@ class LayoutMixin(object): # {{{
elif field: elif field:
self.do_tags_list_edit(value, field) self.do_tags_list_edit(value, field)
def find_in_tag_browser_triggered(self, field, value):
if field and value:
tb = self.stack.tb_widget
tb.set_focus_to_find_box()
tb.item_search.lineEdit().setText(field + ':=' + value)
tb.do_find()
def toggle_grid_view(self, show): def toggle_grid_view(self, show):
self.library_view.alternate_views.show_view('grid' if show else None) self.library_view.alternate_views.show_view('grid' if show else None)
self.sort_sep.setVisible(show) self.sort_sep.setVisible(show)