Book details panel: Allow right click to search the internet for the current book

This commit is contained in:
Kovid Goyal 2017-05-08 20:21:05 +05:30
parent 382cadf297
commit 8ada28488c
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -21,6 +21,7 @@ from calibre.gui2.dnd import (dnd_has_image, dnd_get_image, dnd_get_files,
from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS
from calibre.ebooks.metadata.book.base import (field_metadata, Metadata) from calibre.ebooks.metadata.book.base import (field_metadata, Metadata)
from calibre.ebooks.metadata.book.render import mi_to_html from calibre.ebooks.metadata.book.render import mi_to_html
from calibre.ebooks.metadata.search_internet import url_for_book_search, NAMES, BOOK_SEARCHES
from calibre.gui2 import (config, open_url, pixmap_to_data, gprefs, rating_font, NO_URL_FORMATTING, default_author_link) from calibre.gui2 import (config, open_url, pixmap_to_data, gprefs, rating_font, NO_URL_FORMATTING, default_author_link)
from calibre.utils.config import tweaks from calibre.utils.config import tweaks
from calibre.utils.img import image_from_x, blend_image from calibre.utils.img import image_from_x, blend_image
@ -48,6 +49,13 @@ def copy_all(web_view):
c.setMimeData(md) c.setMimeData(md)
def create_search_internet_menu(callback):
m = QMenu(_('Search the internet for this book…'))
for k in sorted(BOOK_SEARCHES, key=lambda k: NAMES[k].lower()):
m.addAction(NAMES[k], partial(callback, k))
return m
def render_html(mi, css, vertical, widget, all_fields=False, render_data_func=None): # {{{ def render_html(mi, css, vertical, widget, all_fields=False, render_data_func=None): # {{{
table, comment_fields = (render_data_func or render_data)(mi, all_fields=all_fields, table, comment_fields = (render_data_func or render_data)(mi, all_fields=all_fields,
use_roman_numbers=config['use_roman_numerals_for_series_number']) use_roman_numbers=config['use_roman_numerals_for_series_number'])
@ -222,6 +230,10 @@ def details_context_menu_event(view, ev, book_info): # {{{
ac.setText(_('Remove %s from this book') % value) ac.setText(_('Remove %s from this book') % value)
menu.addAction(ac) menu.addAction(ac)
if hasattr(book_info, 'search_internet'):
menu.addSeparator()
menu.si = m = create_search_internet_menu(book_info.search_internet)
menu.addMenu(m)
if len(menu.actions()) > 0: if len(menu.actions()) > 0:
menu.exec_(ev.globalPos()) menu.exec_(ev.globalPos())
# }}} # }}}
@ -232,6 +244,7 @@ class CoverView(QWidget): # {{{
cover_changed = pyqtSignal(object, object) cover_changed = pyqtSignal(object, object)
cover_removed = pyqtSignal(object) cover_removed = pyqtSignal(object)
open_cover_with = pyqtSignal(object, object) open_cover_with = pyqtSignal(object, object)
search_internet = pyqtSignal(object)
def __init__(self, vertical, parent=None): def __init__(self, vertical, parent=None):
QWidget.__init__(self, parent) QWidget.__init__(self, parent)
@ -339,6 +352,7 @@ class CoverView(QWidget): # {{{
copy = cm.addAction(_('Copy Cover')) copy = cm.addAction(_('Copy Cover'))
remove = cm.addAction(_('Remove Cover')) remove = cm.addAction(_('Remove Cover'))
gc = cm.addAction(_('Generate Cover from metadata')) gc = cm.addAction(_('Generate Cover from metadata'))
cm.addSeparator()
if not QApplication.instance().clipboard().mimeData().hasImage(): if not QApplication.instance().clipboard().mimeData().hasImage():
paste.setEnabled(False) paste.setEnabled(False)
copy.triggered.connect(self.copy_to_clipboard) copy.triggered.connect(self.copy_to_clipboard)
@ -355,6 +369,8 @@ class CoverView(QWidget): # {{{
m.addAction(_('Add another application to open cover...'), self.choose_open_with) m.addAction(_('Add another application to open cover...'), self.choose_open_with)
m.addAction(_('Edit Open With applications...'), partial(edit_programs, 'cover_image', self)) m.addAction(_('Edit Open With applications...'), partial(edit_programs, 'cover_image', self))
cm.addMenu(m) cm.addMenu(m)
cm.si = m = create_search_internet_menu(self.search_internet.emit)
cm.addMenu(m)
cm.exec_(ev.globalPos()) cm.exec_(ev.globalPos())
def open_with(self, entry): def open_with(self, entry):
@ -708,17 +724,20 @@ class BookDetails(QWidget): # {{{
def __init__(self, vertical, parent=None): def __init__(self, vertical, parent=None):
QWidget.__init__(self, parent) QWidget.__init__(self, parent)
self.last_data = {}
self.setAcceptDrops(True) self.setAcceptDrops(True)
self._layout = DetailsLayout(vertical, self) self._layout = DetailsLayout(vertical, self)
self.setLayout(self._layout) self.setLayout(self._layout)
self.current_path = '' self.current_path = ''
self.cover_view = CoverView(vertical, self) self.cover_view = CoverView(vertical, self)
self.cover_view.search_internet.connect(self.search_internet)
self.cover_view.cover_changed.connect(self.cover_changed.emit) self.cover_view.cover_changed.connect(self.cover_changed.emit)
self.cover_view.open_cover_with.connect(self.open_cover_with.emit) self.cover_view.open_cover_with.connect(self.open_cover_with.emit)
self.cover_view.cover_removed.connect(self.cover_removed.emit) self.cover_view.cover_removed.connect(self.cover_removed.emit)
self._layout.addWidget(self.cover_view) self._layout.addWidget(self.cover_view)
self.book_info = BookInfo(vertical, self) self.book_info = BookInfo(vertical, self)
self.book_info.search_internet = self.search_internet
self._layout.addWidget(self.book_info) self._layout.addWidget(self.book_info)
self.book_info.link_clicked.connect(self.handle_click) self.book_info.link_clicked.connect(self.handle_click)
self.book_info.remove_format.connect(self.remove_specific_format) self.book_info.remove_format.connect(self.remove_specific_format)
@ -732,6 +751,11 @@ class BookDetails(QWidget): # {{{
self.book_info.manage_author.connect(self.manage_author) self.book_info.manage_author.connect(self.manage_author)
self.setCursor(Qt.PointingHandCursor) self.setCursor(Qt.PointingHandCursor)
def search_internet(self, where):
if self.last_data:
url = url_for_book_search(where, title=self.last_data['title'], author=self.last_data['authors'][0])
open_url(url)
def handle_click(self, link): def handle_click(self, link):
typ, val = link.partition(':')[0::2] typ, val = link.partition(':')[0::2]
if typ == 'path': if typ == 'path':
@ -755,6 +779,10 @@ class BookDetails(QWidget): # {{{
self.show_book_info.emit() self.show_book_info.emit()
def show_data(self, data): def show_data(self, data):
try:
self.last_data = {'title':data.title, 'authors':data.authors}
except Exception:
self.last_data = {}
self.book_info.show_data(data) self.book_info.show_data(data)
self.cover_view.show_data(data) self.cover_view.show_data(data)
self.current_path = getattr(data, u'path', u'') self.current_path = getattr(data, u'path', u'')