From e77b71bbbc3be9d4a82fb4ddbb905dd1bfbf82f7 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:06:02 +0200 Subject: [PATCH] Connect main progress bar to potential bulky operations in the project tree --- novelwriter/core/coretools.py | 7 +++++++ novelwriter/core/index.py | 2 +- novelwriter/gui/projtree.py | 20 ++++++++++++++++++++ novelwriter/shared.py | 11 ++--------- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index bb68a810..31b1e084 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -160,6 +160,10 @@ class DocSplitter: return + def __len__(self) -> int: + """The length of the split job.""" + return len(self._rawData) + ## # Methods ## @@ -270,7 +274,9 @@ class DocDuplicator: after = True if items: hMap: dict[str, str | None] = {t: None for t in items} + SHARED.initMainProgress(len(items)) for tHandle in items: + SHARED.incMainProgress() if oldItem := self._project.tree[tHandle]: pHandle = hMap.get(oldItem.itemParent or "") or oldItem.itemParent if newItem := self._project.tree.duplicate(tHandle, pHandle, after): @@ -282,6 +288,7 @@ class DocDuplicator: after = False else: break + SHARED.clearMainProgress() return result diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index 0165444f..a0c11ff1 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -147,7 +147,7 @@ class Index: def rebuild(self) -> None: """Rebuild the entire index from scratch.""" self.clear() - SHARED.initMainProgress(len(self._project.tree) - 1) + SHARED.initMainProgress(len(self._project.tree)) for nwItem in self._project.tree: if nwItem.isFileType(): text = self._project.storage.getDocumentText(nwItem.itemHandle) diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index b35445ae..87a30855 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -718,9 +718,15 @@ class GuiProjectTree(QTreeView): else: return False + SHARED.initMainProgress(len(items)) + self.setEnabled(False) for sHandle in items: + SHARED.incMainProgress() docMerger.appendText(sHandle, True, mLabel) + self.setEnabled(True) + SHARED.clearMainProgress() + if not docMerger.writeTargetDoc(): SHARED.error( self.tr("Could not write document content."), @@ -764,7 +770,10 @@ class GuiProjectTree(QTreeView): docSplit.setParentItem(tItem.itemParent) docSplit.splitDocument(headerList, text) + SHARED.initMainProgress(len(docSplit)) + self.setEnabled(False) for writeOk in docSplit.writeDocuments(docHierarchy): + SHARED.incMainProgress() if not writeOk: SHARED.error( self.tr("Could not write document content."), @@ -774,6 +783,9 @@ class GuiProjectTree(QTreeView): if data.get("moveToTrash", False): self.processDeleteRequest([tHandle], False) + self.setEnabled(True) + SHARED.clearMainProgress() + return True def duplicateFromHandle(self, tHandle: str) -> None: @@ -786,10 +798,12 @@ class GuiProjectTree(QTreeView): else: question = self.tr("Do you want to duplicate this item and all child items?") if SHARED.question(question): + self.setEnabled(False) docDup = DocDuplicator(SHARED.project) dHandles = docDup.duplicate(itemTree) if len(dHandles) != len(itemTree): SHARED.warn(self.tr("Could not duplicate all items.")) + self.setEnabled(True) self.restoreExpandedState() return @@ -912,17 +926,23 @@ class GuiProjectTree(QTreeView): if not SHARED.question(self.tr("Permanently delete selected item(s)?")): logger.info("Action cancelled by user") return + + self.setEnabled(False) for index in indices: if node := model.node(index): for child in reversed(node.allChildren()): SHARED.project.removeItem(child.item.itemHandle) SHARED.project.removeItem(node.item.itemHandle) + self.setEnabled(True) elif trashNode := SHARED.project.tree.trash: if askFirst and not SHARED.question(self.tr("Move selected item(s) to Trash?")): logger.info("Action cancelled by user") return + + self.setEnabled(False) model.multiMove(indices, model.indexFromNode(trashNode)) + self.setEnabled(True) return diff --git a/novelwriter/shared.py b/novelwriter/shared.py index f213db16..28c8d5be 100644 --- a/novelwriter/shared.py +++ b/novelwriter/shared.py @@ -269,20 +269,13 @@ class SharedData(QObject): self._idleRefTime = currTime return - def initMainProgress(self, maximum: int) -> None: + def initMainProgress(self, maximum: int, inclusive: bool = False) -> None: """Start a session for the main progress bar.""" if gui := self._gui: - gui.mainProgress.setMaximum(maximum) + gui.mainProgress.setMaximum(maximum - (1 if inclusive else 0)) gui.mainProgress.setValue(0) return - def updateMainProgress(self, value: int) -> None: - """Update the value for the main progress bar.""" - if gui := self._gui: - gui.mainProgress.setValue(value) - QApplication.processEvents() - return - def incMainProgress(self) -> None: """Increment the value for the main progress bar.""" if gui := self._gui: