From da7aac60095c0661e69f6947a3c44dddd6362dc3 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sat, 20 Jun 2020 14:34:06 +0100 Subject: [PATCH] Enhancement #1884343: Add action to show a tag in the Tag browser when right clicking on a tag in the Book details panel --- src/calibre/ebooks/metadata/book/render.py | 2 +- src/calibre/gui2/book_details.py | 28 +++++++++++++++++++--- src/calibre/gui2/init.py | 8 +++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/render.py b/src/calibre/ebooks/metadata/book/render.py index 8cd3ed8c39..885c47424f 100644 --- a/src/calibre/ebooks/metadata/book/render.py +++ b/src/calibre/ebooks/metadata/book/render.py @@ -242,7 +242,7 @@ def mi_to_html( if not mi.languages: continue names = filter(None, map(calibre_langcode_to_name, mi.languages)) - names = ['%s' % (search_action('languages', n), _( + names = ['%s' % (search_action_with_data('languages', n, book_id), _( 'Search calibre for books with the language: {}').format(n), n) for n in names] ans.append((field, row % (name, u', '.join(names)))) elif field == 'publisher': diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index d33dad7afc..fd5ea78b1a 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -31,7 +31,7 @@ from calibre.gui2.dnd import ( from calibre.gui2.widgets2 import HTMLDisplay from calibre.utils.config import tweaks 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 polyglot.binary import from_hex_bytes from polyglot.builtins import unicode_type @@ -98,6 +98,14 @@ def init_manage_action(ac, field, value): ac.current_fmt = field, value 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'): # {{{ 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): search_internet_added = False + find_action = book_info.find_in_tag_browser_action dt = data['type'] if dt == 'format': 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')) menu.addAction(ac) 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'): menu.sia = sia = create_search_internet_menu(book_info.search_internet, author) menu.addMenu(sia) @@ -267,17 +277,21 @@ def add_item_specific_entries(menu, data, book_info): ac.current_url = value ac.setText(_('&Copy identifier')) menu.addAction(ac) - menu.addAction(book_info.edit_identifiers_action) 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): + init_find_in_tag_browser(menu, find_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.data = (field, remove_value, book_id) ac.setText(_('Remove %s from this book') % value) menu.addAction(ac) return search_internet_added - def details_context_menu_event(view, ev, book_info, add_popup_action=False): url = view.anchorAt(ev.pos()) menu = view.createStandardContextMenu() @@ -553,6 +567,7 @@ class BookInfo(HTMLDisplay): open_fmt_with = pyqtSignal(int, object, object) edit_book = pyqtSignal(int, object) edit_identifiers = pyqtSignal() + find_in_tag_browser = pyqtSignal(object, object) def __init__(self, vertical, parent=None): HTMLDisplay.__init__(self, parent) @@ -563,6 +578,7 @@ class BookInfo(HTMLDisplay): ('restore_format', 'edit-undo.png'), ('copy_link','edit-copy.png'), ('compare_format', 'diff.png'), ('set_cover_format', 'default_cover.png'), + ('find_in_tag_browser', 'search.png') ]: ac = QAction(QIcon(I(icon)), '', self) ac.current_fmt = None @@ -615,6 +631,10 @@ class BookInfo(HTMLDisplay): def copy_link_triggerred(self): 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): if self.manage_action.current_fmt: self.manage_category.emit(*self.manage_action.current_fmt) @@ -767,6 +787,7 @@ class BookDetails(QWidget): # {{{ edit_identifiers = pyqtSignal() open_fmt_with = pyqtSignal(int, object, object) edit_book = pyqtSignal(int, object) + find_in_tag_browser = pyqtSignal(object, object) # Drag 'n drop {{{ @@ -844,6 +865,7 @@ class BookDetails(QWidget): # {{{ self.book_info.compare_format.connect(self.compare_specific_format) self.book_info.copy_link.connect(self.copy_link) 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.setCursor(Qt.PointingHandCursor) diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index b1fca4dec9..4c314ae9c5 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -677,6 +677,7 @@ class LayoutMixin(object): # {{{ self.book_details.view_device_book.connect( self.iactions['View'].view_device_book) 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.compare_specific_format.connect(self.compare_format) @@ -706,6 +707,13 @@ class LayoutMixin(object): # {{{ elif 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): self.library_view.alternate_views.show_view('grid' if show else None) self.sort_sep.setVisible(show)