diff --git a/novelwriter/core/doctools.py b/novelwriter/core/doctools.py index a51f5901..58394197 100644 --- a/novelwriter/core/doctools.py +++ b/novelwriter/core/doctools.py @@ -26,6 +26,7 @@ along with this program. If not, see . import logging +from novelwriter.common import minmax from novelwriter.core.document import NWDoc logger = logging.getLogger(__name__) @@ -131,6 +132,7 @@ class DocSplitter: self._srcHandle = None self._srcItem = None + self._inFolder = False self._rawData = [] srcItem = self.theProject.tree[sHandle] @@ -154,6 +156,7 @@ class DocSplitter: new documents. """ self._parHandle = pHandle + self._inFolder = False return def newParentFolder(self, pHandle, folderLabel): @@ -164,11 +167,12 @@ class DocSplitter: return None newHandle = self.theProject.newFolder(folderLabel, pHandle) - newItem = self.theProject.tree[self._parHandle] + newItem = self.theProject.tree[newHandle] newItem.setStatus(self._srcItem.itemStatus) newItem.setImport(self._srcItem.itemImport) self._parHandle = newHandle + self._inFolder = True return newHandle @@ -184,23 +188,49 @@ class DocSplitter: return True - def writeDocuments(self): + def writeDocuments(self, docHierarchy): """An iterator that will write each document in the buffer, and return its new handle, parent handle, and sibling handle. """ - nearHandle = self._parHandle + pHandle = self._parHandle + nHandle = self._parHandle if self._inFolder else self._srcHandle + hHandle = [self._parHandle, None, None, None, None] + + pLevel = 0 for docText, hLevel, docLabel in self._rawData: - newHandle = self.theProject.newFile(docLabel, self._parHandle) + hLevel = minmax(hLevel, 1, 4) + if pLevel == 0: + pLevel = hLevel - outDoc = NWDoc(self.theProject, newHandle) + if docHierarchy: + if hLevel == 1: + pHandle = self._parHandle + elif hLevel == 2: + pHandle = hHandle[1] or hHandle[0] + elif hLevel == 3: + pHandle = hHandle[2] or hHandle[1] or hHandle[0] + elif hLevel == 4: + pHandle = hHandle[3] or hHandle[2] or hHandle[1] or hHandle[0] + + if hLevel < pLevel: + nHandle = hHandle[hLevel] or hHandle[0] + elif hLevel > pLevel: + nHandle = pHandle + + dHandle = self.theProject.newFile(docLabel, pHandle) + hHandle[hLevel] = dHandle + + outDoc = NWDoc(self.theProject, dHandle) status = outDoc.writeDocument("\n".join(docText)) if not status: self._error = outDoc.getError() - yield status, newHandle, nearHandle + yield status, dHandle, nHandle - nearHandle = newHandle + hHandle[hLevel] = dHandle + nHandle = dHandle + pLevel = hLevel return diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index 9ae801bd..78609b45 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -517,18 +517,14 @@ class GuiProjectTree(QTreeWidget): # Handle new file creation if itemType == nwItemType.FILE and hLevel > 0: - if self.theProject.writeNewFile(tHandle, hLevel, not isNote): - # If successful, update word count - wC = self.theProject.index.getCounts(tHandle)[1] - self.propagateCount(tHandle, wC) - self.projView.wordCountsChanged.emit() + self.theProject.writeNewFile(tHandle, hLevel, not isNote) # Add the new item to the project tree - self.revealNewTreeItem(tHandle, nHandle) + self.revealNewTreeItem(tHandle, nHandle=nHandle, wordCount=True) return True - def revealNewTreeItem(self, tHandle, nHandle=None): + def revealNewTreeItem(self, tHandle, nHandle=None, wordCount=False): """Reveal a newly added project item in the project tree. """ nwItem = self.theProject.tree[tHandle] @@ -539,6 +535,11 @@ class GuiProjectTree(QTreeWidget): if trItem is None: return False + if nwItem.isFileType() and wordCount: + wC = self.theProject.index.getCounts(tHandle)[1] + self.propagateCount(tHandle, wC) + self.projView.wordCountsChanged.emit() + pHandle = nwItem.itemParent if pHandle is not None and pHandle in self._treeMap: self._treeMap[pHandle].setExpanded(True) @@ -802,17 +803,16 @@ class GuiProjectTree(QTreeWidget): logger.debug("Permanently deleting item '%s'", tHandle) self.propagateCount(tHandle, 0) - itemList = self.getTreeFromHandle(tHandle) trItemP = trItemS.parent() tIndex = trItemP.indexOfChild(trItemS) trItemP.takeChild(tIndex) - for dHandle in reversed(itemList): + for dHandle in reversed(self.getTreeFromHandle(tHandle)): if self.mainGui.docEditor.docHandle() == dHandle: self.mainGui.closeDocument() - self.theProject.removeItem(tHandle) - self._treeMap.pop(tHandle, None) + self.theProject.removeItem(dHandle) + self._treeMap.pop(dHandle, None) self._alertTreeChange(tHandle, flush=flush) self.projView.wordCountsChanged.emit() @@ -1433,14 +1433,14 @@ class GuiProjectTree(QTreeWidget): if not docMerger.writeTargetDoc(): self.mainGui.makeAlert([ - self.tr("Could not save document."), docMerger.getError() + self.tr("Could not write document content."), docMerger.getError() ], nwAlert.ERROR) return False - if newFile: - self.mainGui.projView.revealNewTreeItem(mHandle, tHandle) - self.theProject.index.reIndexHandle(mHandle) + if newFile: + self.revealNewTreeItem(mHandle, nHandle=tHandle, wordCount=True) + self.mainGui.openDocument(mHandle, doScroll=True) if mrgData.get("moveToTrash", False): @@ -1477,17 +1477,30 @@ class GuiProjectTree(QTreeWidget): if dlgSplit.result() == QDialog.Accepted: splitData, splitText = dlgSplit.getData() - print(splitData) headerList = splitData.get("headerList", []) + intoFolder = splitData.get("intoFolder", False) + docHierarchy = splitData.get("docHierarchy", False) docSplit = DocSplitter(self.theProject, tHandle) - docSplit.setParentItem(tItem.itemParent) - docSplit.splitDocument(headerList, splitText) + if intoFolder: + fHandle = docSplit.newParentFolder(tItem.itemParent, tItem.itemName) + self.revealNewTreeItem(fHandle, nHandle=tHandle) + self._alertTreeChange(fHandle, flush=False) + else: + docSplit.setParentItem(tItem.itemParent) - for writeOk, dHandle, nHandle in docSplit.writeDocuments(): - self.mainGui.projView.revealNewTreeItem(dHandle, nHandle) + docSplit.splitDocument(headerList, splitText) + for writeOk, dHandle, nHandle in docSplit.writeDocuments(docHierarchy): + self.theProject.index.reIndexHandle(dHandle) + self.revealNewTreeItem(dHandle, nHandle=nHandle, wordCount=True) self._alertTreeChange(dHandle, flush=False) + if not writeOk: + self.mainGui.makeAlert([ + self.tr("Could not write document content."), docSplit.getError() + ], nwAlert.ERROR) + + self.saveTreeOrder() else: logger.info("Action cancelled by user")