mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
commit
e3bcbac8b9
@ -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':
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user