From bf1067a346314cd7d6b900b0fe4f1dce62772b2c Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 6 Jun 2025 19:07:32 +0200 Subject: [PATCH] Make sure project items in inactive classes are removed from the index (#2387) --- novelwriter/core/index.py | 16 ++++++++++------ novelwriter/core/item.py | 2 +- tests/test_core/test_core_index.py | 29 ++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index fb357842..ee108ad3 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -131,12 +131,6 @@ class Index: self._novelExtra = extra return - def setItemClass(self, tHandle: str, itemClass: nwItemClass) -> None: - """Update the class for all tags of a handle.""" - logger.info("Updating class for '%s'", tHandle) - self._tagsIndex.updateClass(tHandle, itemClass.name) - return - ## # Public Methods ## @@ -183,6 +177,16 @@ class Index: self.scanText(tHandle, self._project.storage.getDocumentText(tHandle)) return + def refreshHandle(self, tHandle: str) -> None: + """Update the class for all tags of a handle.""" + if item := self._project.tree[tHandle]: + logger.info("Updating class for '%s'", tHandle) + if item.isInactiveClass(): + self.deleteHandle(tHandle) + else: + self._tagsIndex.updateClass(tHandle, item.itemClass.name) + return + def indexChangedSince(self, checkTime: int | float) -> bool: """Check if the index has changed since a given time.""" return self._indexChange > float(checkTime) diff --git a/novelwriter/core/item.py b/novelwriter/core/item.py index a8f2fbbd..a6b92734 100644 --- a/novelwriter/core/item.py +++ b/novelwriter/core/item.py @@ -439,7 +439,7 @@ class NWItem: self.setClass(itemClass) if self._type == nwItemType.FILE: # Notify the index of the class change - self._project.index.setItemClass(self._handle, itemClass) + self._project.index.refreshHandle(self._handle) if self._layout == nwItemLayout.NO_LAYOUT: # If no layout is set, pick one diff --git a/tests/test_core/test_core_index.py b/tests/test_core/test_core_index.py index 990a2206..bc9bef2c 100644 --- a/tests/test_core/test_core_index.py +++ b/tests/test_core/test_core_index.py @@ -95,12 +95,35 @@ def testCoreIndex_LoadSave(qtbot, monkeypatch, prjLipsum, nwGUI, tstPaths): tagIndex = str(index._tagsIndex.packData()) itemsIndex = str(index._itemIndex.packData()) + # Update item class + bHandle = "4c4f28287af27" + bItem = project.tree[bHandle] + assert bItem is not None + + tagsBod = index._tagsIndex["Bod"] + assert tagsBod is not None + assert tagsBod["handle"] == bHandle + assert tagsBod["class"] == "CHARACTER" + + bItem.setClass(nwItemClass.CUSTOM) + index.refreshHandle(bHandle) + assert tagsBod is not None + assert tagsBod["handle"] == bHandle + assert tagsBod["class"] == "CUSTOM" + + # Update item class to inactive + bItem.setClass(nwItemClass.TRASH) + index.refreshHandle(bHandle) + assert "Bod" not in index._tagsIndex + bItem.setClass(nwItemClass.CHARACTER) + index.reIndexHandle(bHandle) + # Delete a handle assert index._tagsIndex["Bod"] is not None - assert index._itemIndex["4c4f28287af27"] is not None - index.deleteHandle("4c4f28287af27") + assert index._itemIndex[bHandle] is not None + index.deleteHandle(bHandle) assert index._tagsIndex["Bod"] is None - assert index._itemIndex["4c4f28287af27"] is None + assert index._itemIndex[bHandle] is None # Clear the index index.clear()