From 4b331503befcff22a7456c345ffed8b80de5ee2a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 15 Mar 2026 19:56:58 +0530 Subject: [PATCH] FTS Dialog: Add shortcuts to focus the search box --- src/calibre/gui2/fts/dialog.py | 1 + src/calibre/gui2/fts/search.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/calibre/gui2/fts/dialog.py b/src/calibre/gui2/fts/dialog.py index 5d3df6b505..ca467a18aa 100644 --- a/src/calibre/gui2/fts/dialog.py +++ b/src/calibre/gui2/fts/dialog.py @@ -64,6 +64,7 @@ class FTSDialog(Dialog): self.addAction(self.results_panel.mark_all_books_action) self.addAction(self.results_panel.select_all_books_action) self.addAction(self.results_panel.mark_select_all_books_action) + self.addAction(self.results_panel.focus_search_action) def show_fat_details(self): warning_dialog(self, _('Library on a FAT drive'), _( diff --git a/src/calibre/gui2/fts/search.py b/src/calibre/gui2/fts/search.py index fdeacb52ba..d50ff79ff8 100644 --- a/src/calibre/gui2/fts/search.py +++ b/src/calibre/gui2/fts/search.py @@ -652,6 +652,10 @@ class SearchInputPanel(QWidget): def matches_found(self, num): self.summary.set_num_of_matches_found(num) + def focus_self(self): + self.search_box.setFocus(Qt.FocusReason.OtherFocusReason) + self.search_box.selectAll() + class ResultDetails(QWidget): @@ -907,6 +911,8 @@ class ResultsPanel(QWidget): self.mark_select_all_books_action = ac = QAction(_('Mark and select all matched books in the library'), self) ac.triggered.connect(partial(self.mark_books, 'mark-select')) ac.setShortcut(QKeySequence('Ctrl+Alt+B', QKeySequence.SequenceFormat.PortableText)) + self.focus_search_action = ac = QAction(self) + ac.setShortcuts([QKeySequence('Ctrl+F', QKeySequence.SequenceFormat.PortableText), QKeySequence('/', QKeySequence.SequenceFormat.PortableText)]) if isinstance(parent, QDialog): parent.finished.connect(self.shutdown) self.results_model = m = ResultsModel(self) @@ -919,6 +925,7 @@ class ResultsPanel(QWidget): sip.search_signal.connect(self.search) sip.clear_search.connect(self.clear_results) sip.visualisation_changed.connect(self.set_view_mode) + self.focus_search_action.triggered.connect(sip.focus_self) self.split_view = sv = SplitView(self.results_model, self) sv.show_in_viewer.connect(self.show_in_viewer) sv.remove_book_from_results.connect(self.remove_book_from_results)