mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 10:44:09 -04:00
Wire up the next and previous search controls
This commit is contained in:
parent
f3ab071c9b
commit
5149c43ce2
@ -275,17 +275,35 @@ class ResultsDelegate(QStyledItemDelegate): # {{{
|
|||||||
|
|
||||||
class Results(QListWidget): # {{{
|
class Results(QListWidget): # {{{
|
||||||
|
|
||||||
|
show_search_result = pyqtSignal(object)
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QListWidget.__init__(self, parent)
|
QListWidget.__init__(self, parent)
|
||||||
self.setFocusPolicy(Qt.NoFocus)
|
self.setFocusPolicy(Qt.NoFocus)
|
||||||
self.setSpacing(2)
|
self.setSpacing(2)
|
||||||
self.delegate = ResultsDelegate(self)
|
self.delegate = ResultsDelegate(self)
|
||||||
self.setItemDelegate(self.delegate)
|
self.setItemDelegate(self.delegate)
|
||||||
|
self.itemClicked.connect(self.item_activated)
|
||||||
|
|
||||||
def add_result(self, result):
|
def add_result(self, result):
|
||||||
i = QListWidgetItem(' ', self)
|
i = QListWidgetItem(' ', self)
|
||||||
i.setData(Qt.UserRole, result)
|
i.setData(Qt.UserRole, result)
|
||||||
return self.count()
|
return self.count()
|
||||||
|
|
||||||
|
def item_activated(self):
|
||||||
|
i = self.currentItem()
|
||||||
|
if i:
|
||||||
|
sr = i.data(Qt.UserRole)
|
||||||
|
self.show_search_result.emit(sr)
|
||||||
|
|
||||||
|
def find_next(self, previous):
|
||||||
|
if self.count() < 1:
|
||||||
|
return
|
||||||
|
i = self.currentRow()
|
||||||
|
i += -1 if previous else 1
|
||||||
|
i %= self.count()
|
||||||
|
self.setCurrentRow(i)
|
||||||
|
self.item_activated()
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
@ -315,13 +333,13 @@ class SearchPanel(QWidget): # {{{
|
|||||||
|
|
||||||
def start_search(self, search_query, current_name):
|
def start_search(self, search_query, current_name):
|
||||||
if self.current_search is not None and search_query == self.current_search:
|
if self.current_search is not None and search_query == self.current_search:
|
||||||
# TODO: go to next or previous result as required
|
self.find_next_requested(search_query.backwards)
|
||||||
return
|
return
|
||||||
if self.searcher is None:
|
if self.searcher is None:
|
||||||
self.searcher = Thread(name='Searcher', target=self.run_searches)
|
self.searcher = Thread(name='Searcher', target=self.run_searches)
|
||||||
self.searcher.daemon = True
|
self.searcher.daemon = True
|
||||||
self.searcher.start()
|
self.searcher.start()
|
||||||
# TODO: Clear the current search results
|
self.results.clear()
|
||||||
self.spinner.start()
|
self.spinner.start()
|
||||||
self.current_search = search_query
|
self.current_search = search_query
|
||||||
self.search_tasks.put((search_query, current_name))
|
self.search_tasks.put((search_query, current_name))
|
||||||
@ -364,7 +382,10 @@ class SearchPanel(QWidget): # {{{
|
|||||||
if isinstance(result, SearchFinished):
|
if isinstance(result, SearchFinished):
|
||||||
self.spinner.stop()
|
self.spinner.stop()
|
||||||
return
|
return
|
||||||
self.results.add_result(result)
|
if self.results.add_result(result) == 1:
|
||||||
|
# first result
|
||||||
|
self.results.setCurrentRow(0)
|
||||||
|
self.results.item_activated()
|
||||||
|
|
||||||
def clear_searches(self):
|
def clear_searches(self):
|
||||||
self.current_search = None
|
self.current_search = None
|
||||||
@ -377,4 +398,7 @@ class SearchPanel(QWidget): # {{{
|
|||||||
self.spinner.stop()
|
self.spinner.stop()
|
||||||
self.current_search = None
|
self.current_search = None
|
||||||
self.searcher = None
|
self.searcher = None
|
||||||
|
|
||||||
|
def find_next_requested(self, previous):
|
||||||
|
self.results.find_next(previous)
|
||||||
# }}}
|
# }}}
|
||||||
|
@ -158,6 +158,7 @@ class EbookViewer(MainWindow):
|
|||||||
self.web_view.reload_book.connect(self.reload_book)
|
self.web_view.reload_book.connect(self.reload_book)
|
||||||
self.web_view.toggle_toc.connect(self.toggle_toc)
|
self.web_view.toggle_toc.connect(self.toggle_toc)
|
||||||
self.web_view.show_search.connect(self.show_search)
|
self.web_view.show_search.connect(self.show_search)
|
||||||
|
self.web_view.find_next.connect(self.search_widget.find_next_requested)
|
||||||
self.web_view.toggle_bookmarks.connect(self.toggle_bookmarks)
|
self.web_view.toggle_bookmarks.connect(self.toggle_bookmarks)
|
||||||
self.web_view.toggle_inspector.connect(self.toggle_inspector)
|
self.web_view.toggle_inspector.connect(self.toggle_inspector)
|
||||||
self.web_view.toggle_lookup.connect(self.toggle_lookup)
|
self.web_view.toggle_lookup.connect(self.toggle_lookup)
|
||||||
@ -252,6 +253,7 @@ class EbookViewer(MainWindow):
|
|||||||
name = self.web_view.current_content_file
|
name = self.web_view.current_content_file
|
||||||
if name:
|
if name:
|
||||||
self.search_widget.start_search(search_query, name)
|
self.search_widget.start_search(search_query, name)
|
||||||
|
self.web_view.setFocus(Qt.OtherFocusReason)
|
||||||
|
|
||||||
def toggle_bookmarks(self):
|
def toggle_bookmarks(self):
|
||||||
is_visible = self.bookmarks_dock.isVisible()
|
is_visible = self.bookmarks_dock.isVisible()
|
||||||
|
@ -249,6 +249,7 @@ class ViewerBridge(Bridge):
|
|||||||
toggle_inspector = from_js()
|
toggle_inspector = from_js()
|
||||||
toggle_lookup = from_js()
|
toggle_lookup = from_js()
|
||||||
show_search = from_js()
|
show_search = from_js()
|
||||||
|
find_next = from_js(object)
|
||||||
quit = from_js()
|
quit = from_js()
|
||||||
update_current_toc_nodes = from_js(object, object)
|
update_current_toc_nodes = from_js(object, object)
|
||||||
toggle_full_screen = from_js()
|
toggle_full_screen = from_js()
|
||||||
@ -418,6 +419,7 @@ class WebView(RestartingWebEngineView):
|
|||||||
reload_book = pyqtSignal()
|
reload_book = pyqtSignal()
|
||||||
toggle_toc = pyqtSignal()
|
toggle_toc = pyqtSignal()
|
||||||
show_search = pyqtSignal()
|
show_search = pyqtSignal()
|
||||||
|
find_next = pyqtSignal(object)
|
||||||
toggle_bookmarks = pyqtSignal()
|
toggle_bookmarks = pyqtSignal()
|
||||||
toggle_inspector = pyqtSignal()
|
toggle_inspector = pyqtSignal()
|
||||||
toggle_lookup = pyqtSignal()
|
toggle_lookup = pyqtSignal()
|
||||||
@ -462,6 +464,7 @@ class WebView(RestartingWebEngineView):
|
|||||||
self.bridge.reload_book.connect(self.reload_book)
|
self.bridge.reload_book.connect(self.reload_book)
|
||||||
self.bridge.toggle_toc.connect(self.toggle_toc)
|
self.bridge.toggle_toc.connect(self.toggle_toc)
|
||||||
self.bridge.show_search.connect(self.show_search)
|
self.bridge.show_search.connect(self.show_search)
|
||||||
|
self.bridge.find_next.connect(self.find_next)
|
||||||
self.bridge.toggle_bookmarks.connect(self.toggle_bookmarks)
|
self.bridge.toggle_bookmarks.connect(self.toggle_bookmarks)
|
||||||
self.bridge.toggle_inspector.connect(self.toggle_inspector)
|
self.bridge.toggle_inspector.connect(self.toggle_inspector)
|
||||||
self.bridge.toggle_lookup.connect(self.toggle_lookup)
|
self.bridge.toggle_lookup.connect(self.toggle_lookup)
|
||||||
|
@ -89,10 +89,16 @@ class SearchOverlay:
|
|||||||
self.view.find(text, backwards)
|
self.view.find(text, backwards)
|
||||||
|
|
||||||
def find_next(self):
|
def find_next(self):
|
||||||
self.find(self.search_text, False)
|
if ui_operations.find_next:
|
||||||
|
ui_operations.find_next(False)
|
||||||
|
else:
|
||||||
|
self.find(self.search_text, False)
|
||||||
|
|
||||||
def find_previous(self):
|
def find_previous(self):
|
||||||
self.find(self.search_text, True)
|
if ui_operations.find_next:
|
||||||
|
ui_operations.find_next(True)
|
||||||
|
else:
|
||||||
|
self.find(self.search_text, True)
|
||||||
|
|
||||||
|
|
||||||
def find_in_serialized_html(data, text):
|
def find_in_serialized_html(data, text):
|
||||||
|
@ -341,6 +341,8 @@ if window is window.top:
|
|||||||
to_python.content_file_changed(name)
|
to_python.content_file_changed(name)
|
||||||
ui_operations.show_search = def():
|
ui_operations.show_search = def():
|
||||||
to_python.show_search()
|
to_python.show_search()
|
||||||
|
ui_operations.find_next = def(previous):
|
||||||
|
to_python.find_next(previous)
|
||||||
ui_operations.reset_interface = def():
|
ui_operations.reset_interface = def():
|
||||||
sd = get_session_data()
|
sd = get_session_data()
|
||||||
defaults = session_defaults()
|
defaults = session_defaults()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user