mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 10:14:46 -04:00
Implement searching and clicking in the ToC
This commit is contained in:
parent
02d8563efc
commit
08081eaebb
@ -40,6 +40,7 @@ class TOCView(QTreeView):
|
||||
|
||||
def __init__(self, *args):
|
||||
QTreeView.__init__(self, *args)
|
||||
self.setFocusPolicy(Qt.NoFocus)
|
||||
self.delegate = Delegate(self)
|
||||
self.setItemDelegate(self.delegate)
|
||||
self.setMinimumWidth(80)
|
||||
@ -123,6 +124,7 @@ class TOCSearch(QWidget):
|
||||
return
|
||||
index = self.toc_view.model().search(text)
|
||||
if index.isValid():
|
||||
self.toc_view.scrollTo(index)
|
||||
self.toc_view.searched.emit(index)
|
||||
else:
|
||||
error_dialog(self.toc_view, _('No matches found'), _(
|
||||
|
@ -11,7 +11,7 @@ from collections import defaultdict
|
||||
from hashlib import sha256
|
||||
from threading import Thread
|
||||
|
||||
from PyQt5.Qt import QDockWidget, Qt, QVBoxLayout, QWidget, pyqtSignal
|
||||
from PyQt5.Qt import QDockWidget, QModelIndex, Qt, QVBoxLayout, QWidget, pyqtSignal
|
||||
|
||||
from calibre import prints
|
||||
from calibre.constants import config_dir
|
||||
@ -61,6 +61,8 @@ class EbookViewer(MainWindow):
|
||||
self.toc_container = w = QWidget(self)
|
||||
w.l = QVBoxLayout(w)
|
||||
self.toc = TOCView(w)
|
||||
self.toc.pressed[QModelIndex].connect(self.toc_clicked)
|
||||
self.toc.searched.connect(self.toc_searched)
|
||||
self.toc_search = TOCSearch(self.toc, parent=w)
|
||||
w.l.addWidget(self.toc), w.l.addWidget(self.toc_search), w.l.setContentsMargins(0, 0, 0, 0)
|
||||
self.toc_dock.setWidget(w)
|
||||
@ -96,6 +98,14 @@ class EbookViewer(MainWindow):
|
||||
else:
|
||||
self.toc_dock.setVisible(True)
|
||||
|
||||
def toc_clicked(self, index):
|
||||
item = self.toc_model.itemFromIndex(index)
|
||||
self.web_view.goto_toc_node(item.node_id)
|
||||
|
||||
def toc_searched(self, index):
|
||||
item = self.toc_model.itemFromIndex(index)
|
||||
self.web_view.goto_toc_node(item.node_id)
|
||||
|
||||
def load_ebook(self, pathtoebook, open_at=None, reload_book=False):
|
||||
# TODO: Implement open_at
|
||||
self.web_view.show_preparing_message()
|
||||
|
@ -8,7 +8,7 @@ import os
|
||||
import sys
|
||||
|
||||
from PyQt5.Qt import (
|
||||
QApplication, QBuffer, QByteArray, QHBoxLayout, QSize, QTimer, QUrl, QWidget,
|
||||
QApplication, QBuffer, QByteArray, QHBoxLayout, QSize, Qt, QTimer, QUrl, QWidget,
|
||||
pyqtSignal
|
||||
)
|
||||
from PyQt5.QtWebEngineCore import QWebEngineUrlSchemeHandler
|
||||
@ -174,6 +174,7 @@ class ViewerBridge(Bridge):
|
||||
create_view = to_js()
|
||||
show_preparing_message = to_js()
|
||||
start_book_load = to_js()
|
||||
goto_toc_node = to_js()
|
||||
|
||||
|
||||
class WebPage(QWebEnginePage):
|
||||
@ -301,6 +302,7 @@ class WebView(RestartingWebEngineView):
|
||||
child = event.child()
|
||||
if 'HostView' in child.metaObject().className():
|
||||
self._host_widget = child
|
||||
self._host_widget.setFocus(Qt.OtherFocusReason)
|
||||
return QWebEngineView.event(self, event)
|
||||
|
||||
def sizeHint(self):
|
||||
@ -335,6 +337,9 @@ class WebView(RestartingWebEngineView):
|
||||
msg = _('Preparing book for first read, please wait…')
|
||||
self.execute_when_ready('show_preparing_message', msg)
|
||||
|
||||
def goto_toc_node(self, node_id):
|
||||
self.execute_when_ready('goto_toc_node', node_id)
|
||||
|
||||
def set_session_data(self, key, val):
|
||||
if key == '*' and val is None:
|
||||
vprefs['session_data'] = {}
|
||||
|
@ -472,6 +472,18 @@ class View:
|
||||
return
|
||||
self.show_name(name, initial_position={'type':'anchor', 'anchor':frag, 'replace_history':False})
|
||||
|
||||
def goto_toc_node(self, node_id):
|
||||
toc = self.book.manifest.toc
|
||||
|
||||
def process_node(x):
|
||||
if x.id is node_id:
|
||||
self.goto_named_destination(x.dest or '', x.frag or '')
|
||||
return
|
||||
for c in x.children:
|
||||
process_node(c)
|
||||
if toc:
|
||||
process_node(toc)
|
||||
|
||||
def on_next_spine_item(self, data):
|
||||
spine = self.book.manifest.spine
|
||||
idx = spine.indexOf(self.currently_showing.name)
|
||||
|
@ -193,6 +193,11 @@ def start_book_load(key, initial_cfi):
|
||||
xhr.send()
|
||||
|
||||
|
||||
@from_python
|
||||
def goto_toc_node(node_id):
|
||||
view.goto_toc_node(node_id)
|
||||
|
||||
|
||||
def onerror(msg, script_url, line_number, column_number, error_object):
|
||||
if not error_object:
|
||||
# cross domain error
|
||||
|
Loading…
x
Reference in New Issue
Block a user