From e1e490b66e24637910a3436b9415c5ec3b58bb85 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 Jun 2022 13:29:16 +0530 Subject: [PATCH] Add a dedicated icon for FTS --- imgsrc/fts.svg | 68 ++++++++++++++++++++++++++++++++ manual/gui.rst | 17 ++++---- manual/images/fts-button.png | Bin 0 -> 7988 bytes resources/images/fts.png | Bin 0 -> 3193 bytes src/calibre/gui2/actions/fts.py | 2 +- src/calibre/gui2/fts/dialog.py | 3 +- src/calibre/gui2/layout.py | 2 +- 7 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 imgsrc/fts.svg create mode 100644 manual/images/fts-button.png create mode 100644 resources/images/fts.png diff --git a/imgsrc/fts.svg b/imgsrc/fts.svg new file mode 100644 index 0000000000..7f488edf87 --- /dev/null +++ b/imgsrc/fts.svg @@ -0,0 +1,68 @@ + + + + + + + + + F + T + + diff --git a/manual/gui.rst b/manual/gui.rst index cbdb970bb8..f7d95beed1 100644 --- a/manual/gui.rst +++ b/manual/gui.rst @@ -549,15 +549,16 @@ Now you can access your saved search in the Tag browser under :guilabel:`Saved s Searching the full text of all books --------------------------------------- -calibre can *optionally* index the full text of books in the library to allow -for instant searching of words inside any book. To enable this functionality -go to :guilabel:`Preferences->Toolbars & menus->The main toolbar` and add the -:guilabel:`Search full text` button to the toolbar. +.. |ftsb| image:: images/fts-button.png + :class: float-right-img -Click the newly added button to show the full text search window. Enable -indexing for the current library. Once indexing is complete you can search all -the text in the full library. When you add new books to the library, they will -be automatically indexed in the background. +|ftsb| calibre can *optionally* index the full text of books in the library to allow +for instant searching of words inside any book. To use this functionality +click the :guilabel:`FT` button at the left edge of the search bar. + +Then, enable indexing for the current library. Once indexing is complete you can +search all the text in the full library. When you add new books to the library, +they will be automatically indexed in the background. Virtual libraries ------------------- diff --git a/manual/images/fts-button.png b/manual/images/fts-button.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2afada1c8f468f6bbe072f51481686c4c3ce25 GIT binary patch literal 7988 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 literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/actions/fts.py b/src/calibre/gui2/actions/fts.py index 4a48af3f8d..e67f47f2da 100644 --- a/src/calibre/gui2/actions/fts.py +++ b/src/calibre/gui2/actions/fts.py @@ -8,7 +8,7 @@ from calibre.gui2.actions import InterfaceAction class FullTextSearchAction(InterfaceAction): name = 'Full Text Search' - action_spec = (_('Search full text'), 'search.png', + action_spec = (_('Search full text'), 'fts.png', _('Search the full text of all books in the calibre library'), ('Ctrl+/', 'Ctrl+Alt+F')) dont_add_to = frozenset(('context-menu-device',)) action_type = 'current' diff --git a/src/calibre/gui2/fts/dialog.py b/src/calibre/gui2/fts/dialog.py index 0b22ca76ce..d282c3cc2e 100644 --- a/src/calibre/gui2/fts/dialog.py +++ b/src/calibre/gui2/fts/dialog.py @@ -5,7 +5,7 @@ import os from qt.core import ( - QDialogButtonBox, QHBoxLayout, QLabel, QSize, QStackedWidget, QVBoxLayout + QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QSize, QStackedWidget, QVBoxLayout ) from calibre.gui2.fts.scan import ScanStatus @@ -19,6 +19,7 @@ class FTSDialog(Dialog): def __init__(self, parent=None): super().__init__(_('Search the text of all books in the library'), 'library-fts-dialog-2', default_buttons=QDialogButtonBox.StandardButton.Close) + self.setWindowIcon(QIcon.ic('fts.png')) def setup_ui(self): l = QVBoxLayout(self) diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index d93c370312..e5fba14e8a 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -232,7 +232,7 @@ class SearchBar(QFrame): # {{{ x.setMinimumContentsLength(10) l.addWidget(x) - parent.full_text_search_action = ac = parent.search.add_action('lt.png', QLineEdit.ActionPosition.LeadingPosition) + parent.full_text_search_action = ac = parent.search.add_action('fts.png', QLineEdit.ActionPosition.LeadingPosition) ac.setToolTip('

' + _('Search the full text of all books in the library, not just their metadata')) ac.triggered.connect(self.do_fts)