From d56014655f6d2c763df81efaf6e45386128875c4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 3 Jun 2020 17:20:35 +0530 Subject: [PATCH] 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) --- src/calibre/gui2/viewer/search.py | 17 +++++++++++++++++ src/calibre/gui2/viewer/ui.py | 7 ++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index b4a79093d5..8ae7dcb924 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -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() diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index 4aad74e178..06de60c635 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -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: