Viewer: Search panel: Add a button to return to the position the book was at before doing a search. Fixes #1879889 [[Enhancement - Viewer] Go back to last reading position after going through search results](https://bugs.launchpad.net/calibre/+bug/1879889)

This commit is contained in:
Kovid Goyal 2020-06-03 17:20:35 +05:30
parent 4d69c20fac
commit d56014655f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 23 additions and 1 deletions

View File

@ -315,6 +315,7 @@ class SearchInput(QWidget): # {{{
do_search = pyqtSignal(object)
cleared = pyqtSignal()
go_back = pyqtSignal()
def __init__(self, parent=None, panel_name='search'):
QWidget.__init__(self, parent)
@ -376,6 +377,12 @@ class SearchInput(QWidget): # {{{
cs.stateChanged.connect(self.save_search_type)
h.addWidget(cs)
self.return_button = rb = QToolButton(self)
rb.setIcon(QIcon(I('back.png')))
rb.setToolTip(_('Go back to where you were before searching'))
rb.clicked.connect(self.go_back)
h.addWidget(rb)
def history_saved(self, new_text, history):
if new_text:
sss = vprefs.get('saved-{}-settings'.format(self.panel_name)) or {}
@ -646,11 +653,13 @@ class SearchPanel(QWidget): # {{{
show_search_result = pyqtSignal(object)
count_changed = pyqtSignal(object)
hide_search_panel = pyqtSignal()
goto_cfi = pyqtSignal(object)
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.last_hidden_text_warning = None
self.current_search = None
self.anchor_cfi = None
self.l = l = QVBoxLayout(self)
l.setContentsMargins(0, 0, 0, 0)
self.search_input = si = SearchInput(self)
@ -659,6 +668,7 @@ class SearchPanel(QWidget): # {{{
self.results_found.connect(self.on_result_found, type=Qt.QueuedConnection)
si.do_search.connect(self.search_requested)
si.cleared.connect(self.search_cleared)
si.go_back.connect(self.go_back)
l.addWidget(si)
self.results = r = Results(self)
r.count_changed.connect(self.count_changed)
@ -674,6 +684,10 @@ class SearchPanel(QWidget): # {{{
la.setVisible(False)
l.addWidget(la)
def go_back(self):
if self.anchor_cfi:
self.goto_cfi.emit(self.anchor_cfi)
def update_hidden_message(self):
self.hidden_message.setVisible(self.results.current_result_is_hidden)
@ -699,6 +713,9 @@ class SearchPanel(QWidget): # {{{
self.last_hidden_text_warning = None
self.search_tasks.put((search_query, current_name))
def set_anchor_cfi(self, pos_data):
self.anchor_cfi = pos_data['cfi']
def run_searches(self):
while True:
x = self.search_tasks.get()

View File

@ -141,6 +141,7 @@ class EbookViewer(MainWindow):
w.search_requested.connect(self.start_search)
w.hide_search_panel.connect(self.search_dock.close)
w.count_changed.connect(self.search_results_count_changed)
w.goto_cfi.connect(self.goto_cfi)
self.search_dock.setWidget(w)
self.search_dock.visibilityChanged.connect(self.search_widget.visibility_changed)
@ -315,6 +316,7 @@ class EbookViewer(MainWindow):
def start_search(self, search_query):
name = self.web_view.current_content_file
if name:
self.web_view.get_current_cfi(self.search_widget.set_anchor_cfi)
self.search_widget.start_search(search_query, name)
self.web_view.setFocus(Qt.OtherFocusReason)
@ -350,9 +352,12 @@ class EbookViewer(MainWindow):
# annotations will be saved in book file on exit
self.save_annotations(in_book_file=False)
def bookmark_activated(self, cfi):
def goto_cfi(self, cfi):
self.web_view.goto_cfi(cfi)
def bookmark_activated(self, cfi):
self.goto_cfi(cfi)
def view_image(self, name):
path = get_path_for_name(name)
if path: