From bde7f1e79d1a8046c02674358a69cffbafca3d2d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 25 Sep 2014 21:01:09 +0530 Subject: [PATCH] Edit Book: The keyboard shortcuts for searching now trigger saved searches if the saved searches window is open and has input focus --- src/calibre/gui2/tweak_book/boss.py | 24 +++++++++++++++--------- src/calibre/gui2/tweak_book/search.py | 16 ++++++++++++++++ src/calibre/gui2/tweak_book/ui.py | 2 +- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 94e7b8190c..46ce789e2c 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -772,6 +772,21 @@ class Boss(QObject): if text and text.strip(): self.gui.central.pre_fill_search(text) + def search_action_triggered(self, action, overrides=None): + if self.gui.saved_searches.isVisible() and self.gui.saved_searches.has_focus(): + return self.gui.saved_searches.trigger_action(action, overrides=overrides) + self.search(action, overrides) + + def run_saved_searches(self, searches, action): + ed = self.gui.central.current_editor + name = editor_name(ed) + searchable_names = self.gui.file_list.searchable_names + if not searches or not validate_search_request(name, searchable_names, getattr(ed, 'has_marked_text', False), searches[0], self.gui): + return + run_search(searches, action, ed, name, searchable_names, + self.gui, self.show_editor, self.edit_file, self.show_current_diff, self.add_savepoint, self.rewind_savepoint, self.set_modified) + self.gui.saved_searches.setFocus(Qt.OtherFocusReason) + def search(self, action, overrides=None): # Run a search/replace sp = self.gui.central.search_panel @@ -846,15 +861,6 @@ class Boss(QObject): self.gui.saved_searches_dock.show() saved_searches = show_saved_searches - def run_saved_searches(self, searches, action): - ed = self.gui.central.current_editor - name = editor_name(ed) - searchable_names = self.gui.file_list.searchable_names - if not searches or not validate_search_request(name, searchable_names, getattr(ed, 'has_marked_text', False), searches[0], self.gui): - return - run_search(searches, action, ed, name, searchable_names, - self.gui, self.show_editor, self.edit_file, self.show_current_diff, self.add_savepoint, self.rewind_savepoint, self.set_modified) - def create_checkpoint(self): text, ok = QInputDialog.getText(self.gui, _('Choose name'), _( 'Choose a name for the checkpoint.\nYou can later restore the book' diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py index 4dea52a4a0..6c31b6b07c 100644 --- a/src/calibre/gui2/tweak_book/search.py +++ b/src/calibre/gui2/tweak_book/search.py @@ -734,6 +734,17 @@ class SavedSearches(QWidget): self.searches.setFocus(Qt.OtherFocusReason) + def has_focus(self): + if self.hasFocus(): + return True + for child in self.findChildren(QWidget): + if child.hasFocus(): + return True + return False + + def trigger_action(self, action, overrides=None): + self._run_search(action, overrides) + def stack_current_changed(self, index): visible = index == 0 for x in ('eb', 'ab', 'rb', 'upb', 'dnb', 'd2', 'filter_text', 'cft', 'd3', 'ib', 'eb2'): @@ -768,6 +779,9 @@ class SavedSearches(QWidget): self.searches.scrollTo(self.model.index(0)) def run_search(self, action): + return self._run_search(action) + + def _run_search(self, action, overrides=None): searches = [] def fill_in_search(search): @@ -796,6 +810,8 @@ class SavedSearches(QWidget): searches.append(search) if not searches: return + if overrides: + [sc.update(overrides) for sc in searches] self.run_saved_searches.emit(searches, action) @property diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index ad078ed828..9007372cdb 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -399,7 +399,7 @@ class Main(MainWindow): group = _('Search') self.action_find = treg('search.png', _('&Find/Replace'), self.boss.show_find, 'find-replace', ('Ctrl+F',), _('Show the Find/Replace panel')) def sreg(name, text, action, overrides={}, keys=(), description=None, icon=None): - return reg(icon, text, partial(self.boss.search, action, overrides), name, keys, description or text.replace('&', '')) + return reg(icon, text, partial(self.boss.search_action_triggered, action, overrides), name, keys, description or text.replace('&', '')) self.action_find_next = sreg('find-next', _('Find &Next'), 'find', {'direction':'down'}, ('F3', 'Ctrl+G'), _('Find next match')) self.action_find_previous = sreg('find-previous', _('Find &Previous'),