Refresh model when document heading count changes

This commit is contained in:
Veronica Berglyd Olsen
2025-03-22 21:10:01 +01:00
parent 9990ebf193
commit ef652355bf
6 changed files with 59 additions and 81 deletions
+41 -36
View File
@@ -120,35 +120,6 @@ class Index:
self._generateNovelModel(tHandle)
return self._novelModels.get(tHandle)
def refreshNovelModel(self, tHandle: str) -> None:
"""Refresh a novel model."""
if model := self.getNovelModel(tHandle):
logger.debug("Refreshing novel model '%s'", tHandle)
model.beginResetModel()
model.clear()
self._appendSubTreeToModel(tHandle, model)
model.endResetModel()
return
def _generateNovelModel(self, tHandle: str) -> None:
"""Generate a novel model for a specific handle."""
if (item := SHARED.project.tree[tHandle]) and item.isRootType() and item.isNovelLike():
model = NovelModel()
self._appendSubTreeToModel(tHandle, model)
self._novelModels[tHandle] = model
return
def _appendSubTreeToModel(self, tHandle: str, model: NovelModel) -> None:
"""Append all active novel documents to a novel model."""
for handle in SHARED.project.tree.subTree(tHandle):
if (
(node := self._itemIndex[handle])
and node.item.isDocumentLayout()
and node.item.isActive
):
model.append(node)
return
##
# Public Methods
##
@@ -207,6 +178,16 @@ class Index:
return self._rootChange.get(rootHandle, self._indexChange) > float(checkTime)
return False
def refreshNovelModel(self, tHandle: str) -> None:
"""Refresh a novel model."""
if model := self.getNovelModel(tHandle):
logger.info("Refreshing novel model '%s'", tHandle)
model.beginResetModel()
model.clear()
self._appendSubTreeToModel(tHandle, model)
model.endResetModel()
return
##
# Load and Save Index to/from File
##
@@ -304,6 +285,7 @@ class Index:
# Keep a record of existing tags, and create a new item entry
itemTags = dict.fromkeys(self._itemIndex.allItemTags(tHandle), False)
itemHeadings = self._itemIndex.headingCount(tHandle)
self._itemIndex.add(tHandle, tItem)
# Run word counter for the whole text
@@ -327,6 +309,11 @@ class Index:
else:
self._scanActive(tHandle, tItem, text, itemTags)
if itemHeadings == self._itemIndex.headingCount(tHandle):
pass
else:
tItem.notifyNovelStructureChange()
# Update timestamps for index changes
nowTime = time()
self._indexChange = nowTime
@@ -467,6 +454,25 @@ class Index:
return
def _generateNovelModel(self, tHandle: str) -> None:
"""Generate a novel model for a specific handle."""
if (item := SHARED.project.tree[tHandle]) and item.isRootType() and item.isNovelLike():
model = NovelModel()
self._appendSubTreeToModel(tHandle, model)
self._novelModels[tHandle] = model
return
def _appendSubTreeToModel(self, tHandle: str, model: NovelModel) -> None:
"""Append all active novel documents to a novel model."""
for handle in SHARED.project.tree.subTree(tHandle):
if (
(node := self._itemIndex[handle])
and node.item.isDocumentLayout()
and node.item.isActive
):
model.append(node)
return
##
# Check @ Lines
##
@@ -607,13 +613,6 @@ class Index:
hCount[iLevel] += 1
return hCount
def getHandleHeaderCount(self, tHandle: str) -> int:
"""Get the number of headers in an item."""
tItem = self._itemIndex[tHandle]
if isinstance(tItem, IndexNode):
return len(tItem)
return 0
def getTableOfContents(
self, rHandle: str | None, maxDepth: int, activeOnly: bool = True
) -> list[tuple[str, int, str, int]]:
@@ -916,6 +915,12 @@ class ItemIndex:
self._items[tHandle] = IndexNode(tHandle, nwItem)
return
def headingCount(self, tHandle: str) -> int:
"""Return the number of headings in this item."""
if tHandle in self._items:
return len(self._items[tHandle])
return 0
def allItemTags(self, tHandle: str) -> list[str]:
"""Get all tags set for headings of an item."""
if tHandle in self._items: