Rewrite and improve the index event signal feature

This commit is contained in:
Veronica Berglyd Olsen
2023-11-16 19:12:01 +01:00
parent 844240b5b8
commit 123d9df170
4 changed files with 70 additions and 49 deletions
+27 -13
View File
@@ -113,6 +113,7 @@ class NWIndex:
self._itemIndex.clear() self._itemIndex.clear()
self._indexChange = 0.0 self._indexChange = 0.0
self._rootChange = {} self._rootChange = {}
SHARED.indexCallBack({"event": "clearIndex"})
return return
def rebuildIndex(self) -> None: def rebuildIndex(self) -> None:
@@ -122,16 +123,22 @@ class NWIndex:
if nwItem.isFileType(): if nwItem.isFileType():
tHandle = nwItem.itemHandle tHandle = nwItem.itemHandle
theDoc = self._project.storage.getDocument(tHandle) theDoc = self._project.storage.getDocument(tHandle)
self.scanText(tHandle, theDoc.readDocument() or "") self.scanText(tHandle, theDoc.readDocument() or "", blockSignal=True)
self._indexBroken = False self._indexBroken = False
SHARED.indexCallBack({"event": "buildIndex"})
return return
def deleteHandle(self, tHandle: str) -> None: def deleteHandle(self, tHandle: str) -> None:
"""Delete all entries of a given document handle.""" """Delete all entries of a given document handle."""
logger.debug("Removing item '%s' from the index", tHandle) logger.debug("Removing item '%s' from the index", tHandle)
for tTag in self._itemIndex.allItemTags(tHandle): delTags = self._itemIndex.allItemTags(tHandle)
for tTag in delTags:
del self._tagsIndex[tTag] del self._tagsIndex[tTag]
del self._itemIndex[tHandle] del self._itemIndex[tHandle]
SHARED.indexCallBack({
"event": "updateTags",
"deleted": delTags,
})
return return
def reIndexHandle(self, tHandle: str | None) -> bool: def reIndexHandle(self, tHandle: str | None) -> bool:
@@ -139,14 +146,12 @@ class NWIndex:
moved from the archive or trash folders back into the active moved from the archive or trash folders back into the active
project. project.
""" """
if tHandle is None or not self._project.tree.checkType(tHandle, nwItemType.FILE): if tHandle and self._project.tree.checkType(tHandle, nwItemType.FILE):
return False logger.debug("Re-indexing item '%s'", tHandle)
theDoc = self._project.storage.getDocument(tHandle)
logger.debug("Re-indexing item '%s'", tHandle) self.scanText(tHandle, theDoc.readDocument() or "")
theDoc = self._project.storage.getDocument(tHandle) return True
self.scanText(tHandle, theDoc.readDocument() or "") return False
return True
def indexChangedSince(self, checkTime: int | float) -> bool: def indexChangedSince(self, checkTime: int | float) -> bool:
"""Check if the index has changed since a given time.""" """Check if the index has changed since a given time."""
@@ -201,6 +206,7 @@ class NWIndex:
self.reIndexHandle(fHandle) self.reIndexHandle(fHandle)
self._indexChange = time() self._indexChange = time()
SHARED.indexCallBack({"event": "buildIndex"})
logger.debug("Index loaded in %.3f ms", (time() - tStart)*1000) logger.debug("Index loaded in %.3f ms", (time() - tStart)*1000)
@@ -239,7 +245,7 @@ class NWIndex:
# Index Building # Index Building
## ##
def scanText(self, tHandle: str, text: str) -> bool: def scanText(self, tHandle: str, text: str, blockSignal: bool = False) -> bool:
"""Scan a piece of text associated with a handle. This will """Scan a piece of text associated with a handle. This will
update the indices accordingly. This function takes the handle update the indices accordingly. This function takes the handle
and text as separate inputs as we want to primarily scan the and text as separate inputs as we want to primarily scan the
@@ -283,7 +289,11 @@ class NWIndex:
nowTime = time() nowTime = time()
self._indexChange = nowTime self._indexChange = nowTime
self._rootChange[tItem.itemRoot] = nowTime self._rootChange[tItem.itemRoot] = nowTime
SHARED.indexDocumentScanned(tHandle) if not blockSignal:
SHARED.indexCallBack({
"event": "scanText",
"handle": tHandle,
})
return True return True
@@ -358,7 +368,11 @@ class NWIndex:
del self._tagsIndex[tTag] del self._tagsIndex[tTag]
deleted.append(tTag) deleted.append(tTag)
if updated or deleted: if updated or deleted:
SHARED.indexUpdatedTags(updated, deleted) SHARED.indexCallBack({
"event": "updateTags",
"updated": updated,
"deleted": deleted,
})
return return
+23 -21
View File
@@ -103,30 +103,27 @@ class GuiDocViewerPanel(QWidget):
return return
def openProjectTasks(self) -> None: ##
"""Run open project tasks.""" # Public Slots
self.clearClassTabs() ##
for key, name, tClass, iItem, hItem in SHARED.project.index.getTagsData():
if tClass in self.kwTabs and iItem and hItem:
self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem)
self._updateTabVisibility()
return
def closeProjectTasks(self) -> None: @pyqtSlot()
"""Run closing project tasks.""" def indexWasCleared(self) -> None:
self.tabBackRefs.refreshContent(None) """Handle event when the index has been cleared of content."""
self.clearClassTabs() self.tabBackRefs.clearContent()
return
def clearClassTabs(self) -> None:
"""Clear all the class tabs"""
for cTab in self.kwTabs.values(): for cTab in self.kwTabs.values():
cTab.clearContent() cTab.clearContent()
return return
## @pyqtSlot()
# Public Slots def indexHasAppeared(self) -> None:
## """Handle event when the index has appeared."""
for key, name, tClass, iItem, hItem in SHARED.project.index.getTagsData():
if tClass in self.kwTabs and iItem and hItem:
self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem)
self._updateTabVisibility()
self.updateHandle(self._lastHandle)
return
@pyqtSlot(str) @pyqtSlot(str)
def projectItemChanged(self, tHandle: str) -> None: def projectItemChanged(self, tHandle: str) -> None:
@@ -218,10 +215,15 @@ class _ViewPanelBackRefs(QTreeWidget):
return return
def refreshContent(self, dHandle: str | None) -> None: def clearContent(self) -> None:
"""Update the content.""" """Clear the widget."""
self.clear() self.clear()
self._treeMap = {} self._treeMap = {}
return
def refreshContent(self, dHandle: str | None) -> None:
"""Update the content."""
self.clearContent()
if dHandle: if dHandle:
refs = SHARED.project.index.getBackReferenceList(dHandle) refs = SHARED.project.index.getBackReferenceList(dHandle)
for tHandle, (sTitle, hItem) in refs.items(): for tHandle, (sTitle, hItem) in refs.items():
+5 -6
View File
@@ -244,9 +244,11 @@ class GuiMain(QMainWindow):
SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage) SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage)
SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage) SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage)
SHARED.indexChangedTags.connect(self.docViewerPanel.updateChangedTags) SHARED.indexChangedTags.connect(self.docViewerPanel.updateChangedTags)
SHARED.indexScannedDocument.connect(self.docViewerPanel.projectItemChanged) SHARED.indexScannedText.connect(self.docViewerPanel.projectItemChanged)
SHARED.indexScannedDocument.connect(self.projView.updateItemValues) SHARED.indexScannedText.connect(self.projView.updateItemValues)
SHARED.indexScannedDocument.connect(self.itemDetails.updateViewBox) SHARED.indexScannedText.connect(self.itemDetails.updateViewBox)
SHARED.indexCleared.connect(self.docViewerPanel.indexWasCleared)
SHARED.indexAvailable.connect(self.docViewerPanel.indexHasAppeared)
self.mainMenu.requestDocAction.connect(self._passDocumentAction) self.mainMenu.requestDocAction.connect(self._passDocumentAction)
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert) self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
@@ -448,7 +450,6 @@ class GuiMain(QMainWindow):
self.docViewer.clearNavHistory() self.docViewer.clearNavHistory()
self.closeDocViewer(byUser=False) self.closeDocViewer(byUser=False)
self.docViewerPanel.closeProjectTasks()
self.outlineView.closeProjectTasks() self.outlineView.closeProjectTasks()
self.novelView.closeProjectTasks() self.novelView.closeProjectTasks()
self.projView.clearProjectView() self.projView.clearProjectView()
@@ -522,7 +523,6 @@ class GuiMain(QMainWindow):
self.projView.openProjectTasks() self.projView.openProjectTasks()
self.novelView.openProjectTasks() self.novelView.openProjectTasks()
self.outlineView.openProjectTasks() self.outlineView.openProjectTasks()
self.docViewerPanel.openProjectTasks()
self._updateStatusWordCount() self._updateStatusWordCount()
# Restore previously open documents, if any # Restore previously open documents, if any
@@ -816,7 +816,6 @@ class GuiMain(QMainWindow):
tStart = time() tStart = time()
self.projView.saveProjectTasks() self.projView.saveProjectTasks()
self.docViewerPanel.clearClassTabs()
SHARED.project.index.rebuildIndex() SHARED.project.index.rebuildIndex()
self.projView.populateTree() self.projView.populateTree()
self.novelView.refreshTree() self.novelView.refreshTree()
+15 -9
View File
@@ -52,8 +52,10 @@ class SharedData(QObject):
projectStatusChanged = pyqtSignal(bool) projectStatusChanged = pyqtSignal(bool)
projectStatusMessage = pyqtSignal(str) projectStatusMessage = pyqtSignal(str)
spellLanguageChanged = pyqtSignal(str, str) spellLanguageChanged = pyqtSignal(str, str)
indexScannedDocument = pyqtSignal(str) indexScannedText = pyqtSignal(str)
indexChangedTags = pyqtSignal(list, list) indexChangedTags = pyqtSignal(list, list)
indexCleared = pyqtSignal()
indexAvailable = pyqtSignal()
def __init__(self) -> None: def __init__(self) -> None:
super().__init__() super().__init__()
@@ -216,14 +218,18 @@ class SharedData(QObject):
# Call-Back Functions # Call-Back Functions
## ##
def indexUpdatedTags(self, updated: list[str], deleted: list[str]) -> None: def indexCallBack(self, data: dict) -> None:
"""Emit the index changed tags signal.""" """Emit signals on behalf of the index."""
self.indexChangedTags.emit(updated, deleted) event = data.get("event")
return logger.debug("Received '%s' event from the index", event)
if event == "updateTags":
def indexDocumentScanned(self, tHandle: str) -> None: self.indexChangedTags.emit(data.get("updated", []), data.get("deleted", []))
"""Emit the index scanned document signal.""" elif event == "scanText":
self.indexScannedDocument.emit(tHandle) self.indexScannedText.emit(data.get("handle", ""))
elif event == "clearIndex":
self.indexCleared.emit()
elif event == "buildIndex":
self.indexAvailable.emit()
return return
## ##