diff --git a/src/calibre/gui2/fts/search.py b/src/calibre/gui2/fts/search.py
index f494a1d608..f9758e2d3c 100644
--- a/src/calibre/gui2/fts/search.py
+++ b/src/calibre/gui2/fts/search.py
@@ -10,8 +10,8 @@ from contextlib import suppress
from itertools import count
from qt.core import (
QAbstractItemModel, QAbstractItemView, QCheckBox, QDialog, QDialogButtonBox,
- QFont, QHBoxLayout, QIcon, QModelIndex, QPushButton, QSize, QSplitter, Qt,
- QTreeView, QVBoxLayout, QWidget, pyqtSignal
+ QFont, QHBoxLayout, QIcon, QLabel, QModelIndex, QPushButton, QSize, QSplitter,
+ Qt, QTreeView, QVBoxLayout, QWidget, pyqtSignal
)
from threading import Event, Thread
@@ -86,6 +86,7 @@ class ResultsModel(QAbstractItemModel):
result_found = pyqtSignal(int, object)
all_results_found = pyqtSignal(int)
search_started = pyqtSignal()
+ matches_found = pyqtSignal(int)
search_complete = pyqtSignal()
def __init__(self, parent=None):
@@ -122,12 +123,14 @@ class ResultsModel(QAbstractItemModel):
self.current_thread_abort.set()
self.current_search_key = sk
self.search_started.emit()
+ self.matches_found.emit(-1)
self.beginResetModel()
db.fts_search(
fts_engine_query, use_stemming=use_stemming, highlight_start='\x1d', highlight_end='\x1d', snippet_size=64,
restrict_to_book_ids=restrict_to_book_ids, result_type=construct, return_text=False
)
self.endResetModel()
+ self.matches_found.emit(len(self.results))
self.current_query_id = next(self.query_id_counter)
self.current_thread_abort = Event()
self.current_thread = Thread(
@@ -239,6 +242,7 @@ class ResultsModel(QAbstractItemModel):
class ResultsView(QTreeView):
search_started = pyqtSignal()
+ matches_found = pyqtSignal(int)
search_complete = pyqtSignal()
def __init__(self, parent=None):
@@ -248,6 +252,7 @@ class ResultsView(QTreeView):
self.m = ResultsModel(self)
self.m.search_complete.connect(self.search_complete)
self.m.search_started.connect(self.search_started)
+ self.m.matches_found.connect(self.matches_found)
self.setModel(self.m)
self.delegate = SearchDelegate(self)
self.setItemDelegate(self.delegate)
@@ -303,7 +308,8 @@ class SearchInputPanel(QWidget):
' example, in the English language: correction matches correcting and corrected as well'))
rw.setChecked(gprefs['fts_library_use_stemmer'])
rw.stateChanged.connect(lambda state: gprefs.set('fts_library_use_stemmer', state != Qt.CheckState.Unchecked))
- h1.addWidget(r), h1.addWidget(rw), h1.addStretch()
+ self.summary = s = QLabel(self)
+ h1.addWidget(r), h1.addWidget(rw), h1.addWidget(s), h1.addStretch()
self.search_button = sb = QPushButton(QIcon.ic('search.png'), _('&Search'), self)
sb.clicked.connect(self.search_requested)
@@ -324,6 +330,12 @@ class SearchInputPanel(QWidget):
text = self.search_box.text().strip()
self.search_signal.emit(text)
+ def matches_found(self, num):
+ if num < 0:
+ self.summary.setText('')
+ else:
+ self.summary.setText(ngettext('One book matched', '{num} books matched', num).format(num=num))
+
class DetailsPanel(QWidget):
@@ -351,6 +363,7 @@ class ResultsPanel(QWidget):
rv.selectionModel().selectionChanged.connect(self.selection_changed)
self.search = rv.search
rv.search_started.connect(self.sip.start)
+ rv.matches_found.connect(self.sip.matches_found)
rv.search_complete.connect(self.sip.stop)
sip.search_signal.connect(self.search)