Refactor project signal proxies

This commit is contained in:
Veronica Berglyd Olsen
2024-11-23 19:56:24 +01:00
parent 1bf42ceb55
commit c1ed0647fe
6 changed files with 48 additions and 47 deletions
+5 -12
View File
@@ -122,7 +122,7 @@ class NWIndex:
self._itemIndex.clear() self._itemIndex.clear()
self._indexChange = 0.0 self._indexChange = 0.0
self._rootChange = {} self._rootChange = {}
SHARED.indexSignalProxy({"event": "clearIndex"}) SHARED.emitIndexCleared(self._project)
return return
def rebuild(self) -> None: def rebuild(self) -> None:
@@ -133,7 +133,7 @@ class NWIndex:
text = self._project.storage.getDocumentText(nwItem.itemHandle) text = self._project.storage.getDocumentText(nwItem.itemHandle)
self.scanText(nwItem.itemHandle, text, blockSignal=True) self.scanText(nwItem.itemHandle, text, blockSignal=True)
self._indexBroken = False self._indexBroken = False
SHARED.indexSignalProxy({"event": "buildIndex"}) SHARED.emitIndexAvailable(self._project)
return return
def deleteHandle(self, tHandle: str) -> None: def deleteHandle(self, tHandle: str) -> None:
@@ -143,10 +143,7 @@ class NWIndex:
for tTag in delTags: for tTag in delTags:
del self._tagsIndex[tTag] del self._tagsIndex[tTag]
del self._itemIndex[tHandle] del self._itemIndex[tHandle]
SHARED.indexSignalProxy({ SHARED.emitIndexChangedTags(self._project, [], delTags)
"event": "updateTags",
"deleted": delTags,
})
return return
def reIndexHandle(self, tHandle: str | None) -> None: def reIndexHandle(self, tHandle: str | None) -> None:
@@ -212,7 +209,7 @@ class NWIndex:
self.reIndexHandle(fHandle) self.reIndexHandle(fHandle)
self._indexChange = time() self._indexChange = time()
SHARED.indexSignalProxy({"event": "buildIndex"}) SHARED.emitIndexAvailable(self._project)
logger.debug("Index loaded in %.3f ms", (time() - tStart)*1000) logger.debug("Index loaded in %.3f ms", (time() - tStart)*1000)
@@ -367,11 +364,7 @@ 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.indexSignalProxy({ SHARED.emitIndexChangedTags(self._project, updated, deleted)
"event": "updateTags",
"updated": updated,
"deleted": deleted,
})
return return
+4 -4
View File
@@ -44,7 +44,7 @@ from novelwriter.core.options import OptionState
from novelwriter.core.projectdata import NWProjectData from novelwriter.core.projectdata import NWProjectData
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
from novelwriter.core.sessions import NWSessionLog from novelwriter.core.sessions import NWSessionLog
from novelwriter.core.status import T_StatusKinds, T_UpdateEntry from novelwriter.core.status import T_StatusKind, T_UpdateEntry
from novelwriter.core.storage import NWStorage, NWStorageOpen from novelwriter.core.storage import NWStorage, NWStorageOpen
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
@@ -532,15 +532,15 @@ class NWProject:
self._data.itemImport.increment(nwItem.itemImport) self._data.itemImport.increment(nwItem.itemImport)
return return
def updateStatus(self, kind: T_StatusKinds, update: T_UpdateEntry) -> None: def updateStatus(self, kind: T_StatusKind, update: T_UpdateEntry) -> None:
"""Update status or import entries.""" """Update status or import entries."""
if kind == "s": if kind == "s":
self._data.itemStatus.update(update) self._data.itemStatus.update(update)
SHARED.projectSignalProxy({"event": "statusLabels", "kind": kind}) SHARED.emitStatusLabelsChanged(self, kind)
self._tree.refreshAllItems() self._tree.refreshAllItems()
elif kind == "i": elif kind == "i":
self._data.itemImport.update(update) self._data.itemImport.update(update)
SHARED.projectSignalProxy({"event": "statusLabels", "kind": kind}) SHARED.emitStatusLabelsChanged(self, kind)
self._tree.refreshAllItems() self._tree.refreshAllItems()
return return
+2 -2
View File
@@ -66,7 +66,7 @@ class StatusEntry:
NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0) NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0)
T_UpdateEntry = list[tuple[str | None, StatusEntry]] T_UpdateEntry = list[tuple[str | None, StatusEntry]]
T_StatusKinds = Literal["s", "i"] T_StatusKind = Literal["s", "i"]
class NWStatus: class NWStatus:
@@ -76,7 +76,7 @@ class NWStatus:
__slots__ = ("_store", "_default", "_prefix", "_height") __slots__ = ("_store", "_default", "_prefix", "_height")
def __init__(self, prefix: T_StatusKinds) -> None: def __init__(self, prefix: T_StatusKind) -> None:
self._store: dict[str, StatusEntry] = {} self._store: dict[str, StatusEntry] = {}
self._default = None self._default = None
self._prefix = prefix[:1] self._prefix = prefix[:1]
+2 -6
View File
@@ -469,13 +469,9 @@ class NWTree:
tHandle = item.itemHandle tHandle = item.itemHandle
logger.debug("Item change: %s -> %s", tHandle, change.name) logger.debug("Item change: %s -> %s", tHandle, change.name)
self._project.setProjectChanged(True) self._project.setProjectChanged(True)
SHARED.projectSignalProxy( SHARED.emitProjectItemChanged(self._project, tHandle, change)
{"event": "itemChanged", "handle": tHandle, "change": change}
)
if item.isRootType(): if item.isRootType():
SHARED.projectSignalProxy( SHARED.emitRootFolderChanged(self._project, tHandle, change)
{"event": "rootChanged", "handle": tHandle, "change": change}
)
return return
def _getTrashNode(self) -> ProjectNode | None: def _getTrashNode(self) -> ProjectNode | None:
+34 -23
View File
@@ -42,6 +42,7 @@ from novelwriter.enum import nwChange, nwItemClass
if TYPE_CHECKING: # pragma: no cover if TYPE_CHECKING: # pragma: no cover
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.status import T_StatusKind
from novelwriter.gui.theme import GuiTheme from novelwriter.gui.theme import GuiTheme
from novelwriter.guimain import GuiMain from novelwriter.guimain import GuiMain
@@ -314,35 +315,45 @@ class SharedData(QObject):
return return
## ##
# Signal Proxy # Signal Proxies
## ##
def indexSignalProxy(self, data: dict) -> None: def emitIndexChangedTags(
"""Emit signals on behalf of the index.""" self, project: NWProject, updated: list[str], deleted: list[str]
event = data.get("event") ) -> None:
logger.debug("Signal Proxy: %s", event) """Emit the indexChangedTags signal."""
if event == "updateTags": if self._project and self._project.data.uuid == project.data.uuid:
self.indexChangedTags.emit(data.get("updated", []), data.get("deleted", [])) self.indexChangedTags.emit(updated, deleted)
elif event == "clearIndex": return
def emitIndexCleared(self, project: NWProject) -> None:
"""Emit the indexCleared signal."""
if self._project and self._project.data.uuid == project.data.uuid:
self.indexCleared.emit() self.indexCleared.emit()
elif event == "buildIndex": return
def emitIndexAvailable(self, project: NWProject) -> None:
"""Emit the indexAvailable signal."""
if self._project and self._project.data.uuid == project.data.uuid:
self.indexAvailable.emit() self.indexAvailable.emit()
return return
def projectSignalProxy(self, data: dict) -> None: def emitStatusLabelsChanged(self, project: NWProject, kind: T_StatusKind) -> None:
"""Emit signals on project data change.""" """Emit the statusLabelsChanged signal."""
event = data.get("event") if self._project and self._project.data.uuid == project.data.uuid:
logger.debug("Signal Proxy: %s", event) self.statusLabelsChanged.emit(kind)
if event == "statusLabels": return
self.statusLabelsChanged.emit(data.get("kind", ""))
elif event == "itemChanged": def emitProjectItemChanged(self, project: NWProject, handle: str, change: nwChange) -> None:
self.projectItemChanged.emit( """Emit the projectItemChanged signal."""
data.get("handle", ""), data.get("change", nwChange.UPDATE) if self._project and self._project.data.uuid == project.data.uuid:
) self.projectItemChanged.emit(handle, change)
elif event == "rootChanged": return
self.rootFolderChanged.emit(
data.get("handle", ""), data.get("change", nwChange.UPDATE) def emitRootFolderChanged(self, project: NWProject, handle: str, change: nwChange) -> None:
) """Emit the rootFolderChanged signal."""
if self._project and self._project.data.uuid == project.data.uuid:
self.rootFolderChanged.emit(handle, change)
return return
## ##
+1
View File
@@ -153,6 +153,7 @@ def testCoreIndex_LoadSave(qtbot, monkeypatch, prjLipsum, mockGUI, tstPaths):
assert "7a992350f3eb6" in index._itemIndex assert "7a992350f3eb6" in index._itemIndex
# Close Project # Close Project
SHARED._project = project # Otherwise the signal is not emitted
with qtbot.waitSignal(SHARED.indexCleared, timeout=1000): with qtbot.waitSignal(SHARED.indexCleared, timeout=1000):
# Regression test for issue #1718 # Regression test for issue #1718
project.closeProject() project.closeProject()