Update search result on document change

This commit is contained in:
Veronica Berglyd Olsen
2024-03-28 13:40:52 +01:00
parent 536e828cc6
commit 7149e363b1
3 changed files with 36 additions and 11 deletions
+8 -6
View File
@@ -92,6 +92,7 @@ class GuiDocEditor(QPlainTextEdit):
# Custom Signals # Custom Signals
statusMessage = pyqtSignal(str) statusMessage = pyqtSignal(str)
docCountsChanged = pyqtSignal(str, int, int, int) docCountsChanged = pyqtSignal(str, int, int, int)
docTextChanged = pyqtSignal(str, float)
editedStatusChanged = pyqtSignal(bool) editedStatusChanged = pyqtSignal(bool)
loadDocumentTagRequest = pyqtSignal(str, Enum) loadDocumentTagRequest = pyqtSignal(str, Enum)
novelStructureChanged = pyqtSignal() novelStructureChanged = pyqtSignal()
@@ -1193,18 +1194,19 @@ class GuiDocEditor(QPlainTextEdit):
if self._docHandle is None: if self._docHandle is None:
return return
if self.wCounterDoc.isRunning():
logger.debug("Word counter is busy")
return
if time() - self._lastEdit < 25.0: if time() - self._lastEdit < 25.0:
logger.debug("Running word counter") logger.debug("Running document tasks")
SHARED.runInThreadPool(self.wCounterDoc) if not self.wCounterDoc.isRunning():
SHARED.runInThreadPool(self.wCounterDoc)
self.docHeader.setOutline({ self.docHeader.setOutline({
block.blockNumber(): block.text() block.blockNumber(): block.text()
for block in self._qDocument.iterBlockByType(BLOCK_TITLE, maxCount=30) for block in self._qDocument.iterBlockByType(BLOCK_TITLE, maxCount=30)
}) })
if self._docChanged:
self.docTextChanged.emit(self._docHandle, self._lastEdit)
return return
@pyqtSlot(int, int, int) @pyqtSlot(int, int, int)
+27 -5
View File
@@ -66,6 +66,7 @@ class GuiProjectSearch(QWidget):
self._time = time() self._time = time()
self._search = DocSearch() self._search = DocSearch()
self._blocked = False self._blocked = False
self._map: dict[str, tuple[int, float]] = {}
# Header # Header
self.viewLabel = QLabel(self.tr("Project Search")) self.viewLabel = QLabel(self.tr("Project Search"))
@@ -197,6 +198,7 @@ class GuiProjectSearch(QWidget):
def closeProjectTasks(self) -> None: def closeProjectTasks(self) -> None:
"""Run close project tasks.""" """Run close project tasks."""
self._map = {}
self.searchText.clear() self.searchText.clear()
self.searchResult.clear() self.searchResult.clear()
return return
@@ -228,6 +230,20 @@ class GuiProjectSearch(QWidget):
super().keyPressEvent(event) super().keyPressEvent(event)
return return
##
# Public Slots
##
@pyqtSlot(str, float)
def textChanged(self, tHandle: str, timeStamp: float) -> None:
"""Update search result for a specific document."""
if timeStamp > self._map.get(tHandle, (0, 0.0))[1]:
start = time()
results, capped = self._search.searchText(SHARED.mainGui.docEditor.getText())
self._displayResultSet(SHARED.project.tree[tHandle], results, capped)
logger.debug("Updated search for '%s' in %.3f ms", tHandle, 1000*(time() - start))
return
## ##
# Private Slots # Private Slots
## ##
@@ -238,14 +254,16 @@ class GuiProjectSearch(QWidget):
if not self._blocked: if not self._blocked:
qApp.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) qApp.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor))
start = time() start = time()
SHARED.mainGui.saveDocument()
self._blocked = True self._blocked = True
self._map = {}
self.searchResult.clear() self.searchResult.clear()
if text := self.searchText.text(): if text := self.searchText.text():
self._search.setUserRegEx(self.toggleRegEx.isChecked()) self._search.setUserRegEx(self.toggleRegEx.isChecked())
self._search.setCaseSensitive(self.toggleCase.isChecked()) self._search.setCaseSensitive(self.toggleCase.isChecked())
self._search.setWholeWords(self.toggleWord.isChecked()) self._search.setWholeWords(self.toggleWord.isChecked())
for item, results, capped in self._search.iterSearch(SHARED.project, text): for item, results, capped in self._search.iterSearch(SHARED.project, text):
self._appendResultSet(item, results, capped) self._displayResultSet(item, results, capped)
logger.debug("Search took %.3f ms", 1000*(time() - start)) logger.debug("Search took %.3f ms", 1000*(time() - start))
self._time = time() self._time = time()
qApp.restoreOverrideCursor() qApp.restoreOverrideCursor()
@@ -293,11 +311,11 @@ class GuiProjectSearch(QWidget):
# Internal Functions # Internal Functions
## ##
def _appendResultSet( def _displayResultSet(
self, nwItem: NWItem, results: list[tuple[int, int, str]], capped: bool self, nwItem: NWItem | None, results: list[tuple[int, int, str]], capped: bool
) -> None: ) -> None:
"""Populate the result tree.""" """Populate the result tree."""
if results: if results and nwItem:
tHandle = nwItem.itemHandle tHandle = nwItem.itemHandle
docIcon = SHARED.theme.getItemIcon( docIcon = SHARED.theme.getItemIcon(
nwItem.itemType, nwItem.itemClass, nwItem.itemType, nwItem.itemClass,
@@ -312,7 +330,11 @@ class GuiProjectSearch(QWidget):
tItem.setText(self.C_COUNT, f"({len(results):n}{ext})") tItem.setText(self.C_COUNT, f"({len(results):n}{ext})")
tItem.setTextAlignment(self.C_COUNT, Qt.AlignmentFlag.AlignRight) tItem.setTextAlignment(self.C_COUNT, Qt.AlignmentFlag.AlignRight)
tItem.setForeground(self.C_COUNT, self.palette().highlight()) tItem.setForeground(self.C_COUNT, self.palette().highlight())
self.searchResult.addTopLevelItem(tItem)
index = self._map.get(tHandle, (self.searchResult.topLevelItemCount(), 0.0))[0]
self.searchResult.takeTopLevelItem(index)
self.searchResult.insertTopLevelItem(index, tItem)
self._map[tHandle] = (index, time())
rItems = [] rItems = []
for start, length, context in results: for start, length, context in results:
+1
View File
@@ -262,6 +262,7 @@ class GuiMain(QMainWindow):
self.docEditor.requestProjectItemSelected.connect(self.projView.setSelectedHandle) self.docEditor.requestProjectItemSelected.connect(self.projView.setSelectedHandle)
self.docEditor.requestProjectItemRenamed.connect(self.projView.renameTreeItem) self.docEditor.requestProjectItemRenamed.connect(self.projView.renameTreeItem)
self.docEditor.requestNewNoteCreation.connect(self.projView.createNewNote) self.docEditor.requestNewNoteCreation.connect(self.projView.createNewNote)
self.docEditor.docTextChanged.connect(self.projSearch.textChanged)
self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle) self.docViewer.documentLoaded.connect(self.docViewerPanel.updateHandle)
self.docViewer.loadDocumentTagRequest.connect(self._followTag) self.docViewer.loadDocumentTagRequest.connect(self._followTag)