diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index 40936c3c..f58145f9 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -517,28 +517,28 @@ class NWIndex: return None def novelStructure( - self, rootHandle: str | None = None, skipExcl: bool = True + self, rootHandle: str | None = None, activeOnly: bool = True ) -> Iterator[tuple[str, str, str, IndexHeading]]: """Iterate over all titles in the novel, in the correct order as they appear in the tree view and in the respective document files, but skipping all note files. """ - structure = self._itemIndex.iterNovelStructure(rHandle=rootHandle, skipExcl=skipExcl) + structure = self._itemIndex.iterNovelStructure(rHandle=rootHandle, activeOnly=activeOnly) for tHandle, sTitle, hItem in structure: yield f"{tHandle}:{sTitle}", tHandle, sTitle, hItem return - def getNovelWordCount(self, skipExcl: bool = True) -> int: + def getNovelWordCount(self, activeOnly: bool = True) -> int: """Count the number of words in the novel project.""" wCount = 0 - for _, _, hItem in self._itemIndex.iterNovelStructure(skipExcl=skipExcl): + for _, _, hItem in self._itemIndex.iterNovelStructure(activeOnly=activeOnly): wCount += hItem.wordCount return wCount - def getNovelTitleCounts(self, skipExcl: bool = True) -> list[int]: + def getNovelTitleCounts(self, activeOnly: bool = True) -> list[int]: """Count the number of titles in the novel project.""" hCount = [0, 0, 0, 0, 0] - for _, _, hItem in self._itemIndex.iterNovelStructure(skipExcl=skipExcl): + for _, _, hItem in self._itemIndex.iterNovelStructure(activeOnly=activeOnly): iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) hCount[iLevel] += 1 return hCount @@ -551,14 +551,14 @@ class NWIndex: return 0 def getTableOfContents( - self, rHandle: str | None, maxDepth: int, skipExcl: bool = True + self, rHandle: str | None, maxDepth: int, activeOnly: bool = True ) -> list[tuple[str, int, str, int]]: """Generate a table of contents up to a maximum depth.""" tOrder = [] tData = {} pKey = None for tHandle, sTitle, hItem in self._itemIndex.iterNovelStructure( - rHandle=rHandle, skipExcl=skipExcl + rHandle=rHandle, activeOnly=activeOnly ): tKey = f"{tHandle}:{sTitle}" iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) @@ -646,12 +646,15 @@ class NWIndex: """Return all tags based on itemClass.""" return self._tagsIndex.filterTagNames(itemClass.name) - def getTagsData(self) -> Iterator[tuple[str, str, str, IndexItem | None, IndexHeading | None]]: + def getTagsData( + self, activeOnly: bool = True + ) -> Iterator[tuple[str, str, str, IndexItem | None, IndexHeading | None]]: """Return all known tags.""" for tag, data in self._tagsIndex.items(): iItem = self._itemIndex[data.get("handle")] hItem = None if iItem is None else iItem[data.get("heading")] - yield tag, data.get("name", ""), data.get("class", ""), iItem, hItem + if not activeOnly or (iItem and iItem.item.isActive): + yield tag, data.get("name", ""), data.get("class", ""), iItem, hItem return def getSingleTag(self, tagKey: str) -> tuple[str, str, IndexItem | None, IndexHeading | None]: @@ -848,7 +851,7 @@ class ItemIndex: return def iterNovelStructure( - self, rHandle: str | None = None, skipExcl: bool = False + self, rHandle: str | None = None, activeOnly: bool = False ) -> Iterable[tuple[str, str, IndexHeading]]: """Iterate over all items and headers in the novel structure for a given root handle, or for all if root handle is None. @@ -856,7 +859,7 @@ class ItemIndex: for tItem in self._project.tree: if tItem.isNoteLayout(): continue - if skipExcl and not tItem.isActive: + if activeOnly and not tItem.isActive: continue tHandle = tItem.itemHandle diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index 8398092b..1569262b 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -674,7 +674,7 @@ class GuiNovelTree(QTreeWidget): tStart = time() logger.debug("Building novel tree for root item '%s'", rootHandle) - novStruct = SHARED.project.index.novelStructure(rootHandle=rootHandle, skipExcl=True) + novStruct = SHARED.project.index.novelStructure(rootHandle=rootHandle, activeOnly=True) for tKey, tHandle, sTitle, novIdx in novStruct: if novIdx.level == "H0": continue diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py index bc1a6497..db066cee 100644 --- a/novelwriter/gui/outline.py +++ b/novelwriter/gui/outline.py @@ -646,7 +646,7 @@ class GuiOutlineTree(QTreeWidget): headItem.setTextAlignment( self._colIdx[nwOutline.PCOUNT], Qt.AlignmentFlag.AlignRight) - novStruct = SHARED.project.index.novelStructure(rootHandle=rootHandle, skipExcl=True) + novStruct = SHARED.project.index.novelStructure(rootHandle=rootHandle, activeOnly=True) for _, tHandle, sTitle, novIdx in novStruct: iLevel = nwHeaders.H_LEVEL.get(novIdx.level, 0) diff --git a/tests/test_core/test_core_index.py b/tests/test_core/test_core_index.py index 920c4553..5e9dee3f 100644 --- a/tests/test_core/test_core_index.py +++ b/tests/test_core/test_core_index.py @@ -579,7 +579,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): project.tree[nHandle].setActive(False) # type: ignore keys = [] - for aKey, _, _, _ in index.novelStructure(skipExcl=False): + for aKey, _, _, _ in index.novelStructure(activeOnly=False): keys.append(aKey) assert keys == [ @@ -590,7 +590,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): ] keys = [] - for aKey, _, _, _ in index.novelStructure(skipExcl=True): + for aKey, _, _, _ in index.novelStructure(activeOnly=True): keys.append(aKey) assert keys == [ @@ -761,7 +761,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): assert index.scanText(sHandle, "### Scene One\n\n") # type: ignore assert index.scanText(tHandle, "### Scene Two\n\n") # type: ignore - assert [(h, t) for h, t, _ in index._itemIndex.iterNovelStructure(skipExcl=False)] == [ + assert [(h, t) for h, t, _ in index._itemIndex.iterNovelStructure(activeOnly=False)] == [ (C.hTitlePage, "T0001"), (C.hChapterDoc, "T0001"), (C.hSceneDoc, "T0001"), @@ -772,7 +772,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): (tHandle, "T0001"), ] - assert [(h, t) for h, t, _ in index._itemIndex.iterNovelStructure(skipExcl=True)] == [ + assert [(h, t) for h, t, _ in index._itemIndex.iterNovelStructure(activeOnly=True)] == [ (C.hTitlePage, "T0001"), (C.hChapterDoc, "T0001"), (C.hSceneDoc, "T0001"), @@ -783,7 +783,7 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): # Add a fake handle to the tree and check that it's ignored project.tree._order.append("0000000000000") - assert [(h, t) for h, t, _ in index._itemIndex.iterNovelStructure(skipExcl=False)] == [ + assert [(h, t) for h, t, _ in index._itemIndex.iterNovelStructure(activeOnly=False)] == [ (C.hTitlePage, "T0001"), (C.hChapterDoc, "T0001"), (C.hSceneDoc, "T0001"), @@ -796,22 +796,22 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): project.tree._order.remove("0000000000000") # Extract stats - assert index.getNovelWordCount(skipExcl=False) == 43 - assert index.getNovelWordCount(skipExcl=True) == 15 - assert index.getNovelTitleCounts(skipExcl=False) == [0, 3, 2, 3, 0] - assert index.getNovelTitleCounts(skipExcl=True) == [0, 1, 2, 3, 0] + assert index.getNovelWordCount(activeOnly=False) == 43 + assert index.getNovelWordCount(activeOnly=True) == 15 + assert index.getNovelTitleCounts(activeOnly=False) == [0, 3, 2, 3, 0] + assert index.getNovelTitleCounts(activeOnly=True) == [0, 1, 2, 3, 0] # Table of Contents - assert index.getTableOfContents(C.hNovelRoot, 0, skipExcl=True) == [] - assert index.getTableOfContents(C.hNovelRoot, 1, skipExcl=True) == [ + assert index.getTableOfContents(C.hNovelRoot, 0, activeOnly=True) == [] + assert index.getTableOfContents(C.hNovelRoot, 1, activeOnly=True) == [ (f"{C.hTitlePage}:T0001", 1, "New Novel", 15), ] - assert index.getTableOfContents(C.hNovelRoot, 2, skipExcl=True) == [ + assert index.getTableOfContents(C.hNovelRoot, 2, activeOnly=True) == [ (f"{C.hTitlePage}:T0001", 1, "New Novel", 5), (f"{C.hChapterDoc}:T0001", 2, "New Chapter", 4), (f"{hHandle}:T0001", 2, "Chapter One", 6), ] - assert index.getTableOfContents(C.hNovelRoot, 3, skipExcl=True) == [ + assert index.getTableOfContents(C.hNovelRoot, 3, activeOnly=True) == [ (f"{C.hTitlePage}:T0001", 1, "New Novel", 5), (f"{C.hChapterDoc}:T0001", 2, "New Chapter", 2), (f"{C.hSceneDoc}:T0001", 3, "New Scene", 2), @@ -820,8 +820,8 @@ def testCoreIndex_ExtractData(mockGUI, fncPath, mockRnd): (f"{tHandle}:T0001", 3, "Scene Two", 2), ] - assert index.getTableOfContents(C.hNovelRoot, 0, skipExcl=False) == [] - assert index.getTableOfContents(C.hNovelRoot, 1, skipExcl=False) == [ + assert index.getTableOfContents(C.hNovelRoot, 0, activeOnly=False) == [] + assert index.getTableOfContents(C.hNovelRoot, 1, activeOnly=False) == [ (f"{C.hTitlePage}:T0001", 1, "New Novel", 9), (f"{nHandle}:T0001", 1, "Hello World!", 12), (f"{nHandle}:T0002", 1, "Hello World!", 22), @@ -1173,7 +1173,7 @@ def testCoreIndex_ItemIndex(mockGUI, fncPath, mockRnd): # Skip excluded project.tree[sHandle].setActive(False) # type: ignore - nStruct = list(itemIndex.iterNovelStructure(skipExcl=True)) + nStruct = list(itemIndex.iterNovelStructure(activeOnly=True)) assert len(nStruct) == 3 assert nStruct[0][0] == nHandle assert nStruct[1][0] == cHandle