diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index be7144fc0e..70a08590f5 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -705,9 +705,9 @@ class ActionTweakEpub(InterfaceActionBase): name = 'Tweak ePub' actual_plugin = 'calibre.gui2.actions.tweak_epub:TweakEpubAction' -class ActionMoveSelection(InterfaceActionBase): - name = 'Edit Metadata' - actual_plugin = 'calibre.gui2.actions.move_selection:MoveSelectionAction' +class ActionNextMatch(InterfaceActionBase): + name = 'Next Match' + actual_plugin = 'calibre.gui2.actions.next_match:NextMatchAction' plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, ActionConvert, ActionDelete, ActionEditMetadata, ActionView, @@ -715,7 +715,7 @@ plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, ActionRestart, ActionOpenFolder, ActionConnectShare, ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks, ActionAddToLibrary, ActionEditCollections, ActionChooseLibrary, - ActionCopyToLibrary, ActionTweakEpub, ActionMoveSelection] + ActionCopyToLibrary, ActionTweakEpub, ActionNextMatch] # }}} diff --git a/src/calibre/gui2/actions/__init__.py b/src/calibre/gui2/actions/__init__.py index b54d346904..8801777953 100644 --- a/src/calibre/gui2/actions/__init__.py +++ b/src/calibre/gui2/actions/__init__.py @@ -111,7 +111,10 @@ class InterfaceAction(QObject): action.setWhatsThis(text) action.setAutoRepeat(False) if shortcut: - action.setShortcut(shortcut) + if isinstance(shortcut, list): + action.setShortcuts(shortcut) + else: + action.setShortcut(shortcut) setattr(self, attr, action) return action @@ -170,6 +173,14 @@ class InterfaceAction(QObject): ''' pass + def gui_layout_complete(self): + ''' + Called once per action when the layout of the main GUI is + completed. If your action needs to make changes to the layout, they + should be done here, rather than in :meth:`initialization_complete`. + ''' + pass + def initialization_complete(self): ''' Called once per action when the initialization of the main GUI is diff --git a/src/calibre/gui2/actions/move_selection.py b/src/calibre/gui2/actions/next_match.py similarity index 65% rename from src/calibre/gui2/actions/move_selection.py rename to src/calibre/gui2/actions/next_match.py index e49803fcd6..79de6a2d9b 100644 --- a/src/calibre/gui2/actions/move_selection.py +++ b/src/calibre/gui2/actions/next_match.py @@ -7,10 +7,10 @@ __docformat__ = 'restructuredtext en' from calibre.gui2.actions import InterfaceAction -class MoveSelectionAction(InterfaceAction): - name = 'Move selection in library' - action_spec = (_('Move to next item'), 'arrow-down.png', - _('Move to next highlighted item'), 'n') +class NextMatchAction(InterfaceAction): + name = 'Move to next highlighted book' + action_spec = (_('Move to next match'), 'arrow-down.png', + _('Move to next highlighted match'), [_('N'), _('F3')]) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) action_type = 'current' @@ -23,21 +23,34 @@ class MoveSelectionAction(InterfaceAction): self.can_move = None self.qaction.triggered.connect(self.move_forward) self.create_action(spec=(_('Move to previous item'), 'arrow-up.png', - _('Move to previous highlighted item'), 'F3'), attr='p_action') + _('Move to previous highlighted item'), [_('Shift+N'), + _('Shift+F3')]), attr='p_action') self.gui.addAction(self.p_action) self.p_action.triggered.connect(self.move_backward) + def gui_layout_complete(self): + self.gui.search_highlight_only.setVisible(True) + def location_selected(self, loc): self.can_move = loc == 'library' + try: + self.gui.search_highlight_only.setVisible(self.can_move) + except: + import traceback + traceback.print_exc() def move_forward(self): if self.can_move is None: self.can_move = self.gui.current_view() is self.gui.library_view + self.gui.search_highlight_only.setVisible(self.can_move) + if self.can_move: self.gui.current_view().move_highlighted_row(forward=True) def move_backward(self): if self.can_move is None: self.can_move = self.gui.current_view() is self.gui.library_view + self.gui.search_highlight_only.setVisible(self.can_move) + if self.can_move: - self.gui.current_view().move_highlighted_row(forward=False) \ No newline at end of file + self.gui.current_view().move_highlighted_row(forward=False) diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index 2edf19d0c4..c1d9498075 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -196,9 +196,11 @@ class SearchBar(QWidget): # {{{ x = parent.search_highlight_only = QCheckBox() x.setText(_('&Highlight')) - x.setToolTip(_('Highlight matched books in the book list, instead ' - 'of restricting the book list to the matches.')) + x.setToolTip('

'+_('When searching, highlight matched books, instead ' + 'of restricting the book list to the matches.

You can use the ' + 'N or F3 keys to go to the next match.')) l.addWidget(x) + x.setVisible(False) x = parent.saved_search = SavedSearchBox(self) x.setMaximumSize(QSize(150, 16777215)) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index c8b5cb001e..aaca398e44 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -34,6 +34,9 @@ path_to_ebook to the database. help=_('Log debugging information to console')) parser.add_option('--no-update-check', default=False, action='store_true', help=_('Do not check for updates')) + parser.add_option('--ignore-plugins', default=False, action='store_true', + help=_('Ignore custom plugins, useful if you installed a plugin' + ' that is preventing calibre from starting')) return parser def init_qt(args): diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 01d3180778..8c92fec0d7 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -103,6 +103,8 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.gui_debug = gui_debug acmap = OrderedDict() for action in interface_actions(): + if opts.ignore_plugins and action.plugin_path is not None: + continue try: ac = action.load_actual_plugin(self) except: @@ -256,6 +258,14 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.height()) self.resize(self.width(), self._calculated_available_height) + for ac in self.iactions.values(): + try: + ac.gui_layout_complete() + except: + import traceback + traceback.print_exc() + if ac.plugin_path is None: + raise if config['autolaunch_server']: self.start_content_server() diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index 28fd0307d3..9a65d80384 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -478,6 +478,10 @@ Calibre has several keyboard shortcuts to save you time and mouse movement. Thes - Focus the search bar * - :kbd:`Shift+Ctrl+F` - Open the advanced search dialog + * - :kbd:`N or F3` + - Find the next book that matches the current search (only works if the highlight checkbox next to the search bar is checked) + * - :kbd:`Shift+N or Shift+F3` + - Find the next book that matches the current search (only works if the highlight checkbox next to the search bar is checked) * - :kbd:`Ctrl+D` - Download metadata and shortcuts * - :kbd:`Ctrl+R`