Rewrite and improve the index event signal feature
This commit is contained in:
+27
-13
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|||||||
Reference in New Issue
Block a user