diff --git a/nw/core/document.py b/nw/core/document.py index 6ab4d500..8e2ae571 100644 --- a/nw/core/document.py +++ b/nw/core/document.py @@ -71,6 +71,9 @@ class NWDoc(): """Open a document from handle, capturing potential file system errors and parse meta data. """ + if not isHandle(tHandle): + return None + # Always clear first, since the object will often be reused. self.clearDocument() @@ -170,7 +173,10 @@ class NWDoc(): """Permanently delete a document source file and its backups from the project data folder. """ - docFile = self.docHandle+".nwd" + if not isHandle(tHandle): + return False + + docFile = tHandle+".nwd" chkList = [] chkList.append(path.join(self.theProject.projContent, docFile)) diff --git a/nw/core/project.py b/nw/core/project.py index 20ca89e9..be62ffae 100644 --- a/nw/core/project.py +++ b/nw/core/project.py @@ -152,15 +152,19 @@ class NWProject(): self.projTree.append(None, pHandle, newItem) return newItem.itemHandle - def addTrash(self): + def trashFolder(self): """Add the special trash root folder to the project. """ - newItem = NWItem(self) - newItem.setName("Trash") - newItem.setType(nwItemType.TRASH) - newItem.setClass(nwItemClass.TRASH) - self.projTree.append(None, None, newItem) - return newItem.itemHandle + trashHandle = self.projTree.trashRoot() + if trashHandle is None: + newItem = NWItem(self) + newItem.setName("Trash") + newItem.setType(nwItemType.TRASH) + newItem.setClass(nwItemClass.TRASH) + self.projTree.append(None, None, newItem) + return newItem.itemHandle + + return trashHandle ## # Project Methods @@ -179,6 +183,7 @@ class NWProject(): hScene = self.newFile("New Scene", nwItemClass.NOVEL, hChapt) self.projOpened = time() self.setProjectChanged(True) + self.saveProject(autoSave=True) return True def clearProject(self): @@ -674,7 +679,7 @@ class NWProject(): # Setters ## - def setProjectPath(self, projPath): + def setProjectPath(self, projPath, newProject=False): """Set the project storage path, and also expand ~ to the user directory using the path library. """ @@ -684,7 +689,18 @@ class NWProject(): if projPath.startswith("~"): projPath = path.expanduser(projPath) self.projPath = path.abspath(projPath) + + if newProject and self.mainConf.showGUI: + if listdir(self.projPath): + self.theParent.makeAlert(( + "New project folder is not empty. " + "Each project requires a dedicated project folder." + ), nwAlert.ERROR) + return False + + self.ensureFolderStructure() self.setProjectChanged(True) + return True def setProjectName(self, projName): diff --git a/nw/gui/elements/doctree.py b/nw/gui/elements/doctree.py index 02db9bde..6da9e5d7 100644 --- a/nw/gui/elements/doctree.py +++ b/nw/gui/elements/doctree.py @@ -200,8 +200,8 @@ class GuiDocTree(QTreeWidget): def revealTreeItem(self, tHandle): """Reveal a newly added project item in the project tree. """ - nwItem = self.theProject.projTree[tHandle] - trItem = self._addTreeItem(nwItem) + nwItem = self.theProject.projTree[tHandle] + trItem = self._addTreeItem(nwItem) pHandle = nwItem.parHandle if pHandle is not None and pHandle in self.theMap.keys(): self.theMap[pHandle].setExpanded(True) @@ -608,15 +608,15 @@ class GuiDocTree(QTreeWidget): """Adds the trash root folder if it doesn't already exist in the project tree. """ - trashHandle = self.theProject.projTree.trashRoot() + trashHandle = self.theProject.trashFolder() if trashHandle is None: - self.theProject.addTrash() + return None + trItem = self._getTreeItem(trashHandle) + if trItem is None: trItem = self._addTreeItem( self.theProject.projTree[trashHandle] ) trItem.setExpanded(True) - else: - trItem = self._getTreeItem(trashHandle) return trItem def _addOrphanedRoot(self): diff --git a/nw/guimain.py b/nw/guimain.py index a3b7d46e..67bb9fe0 100644 --- a/nw/guimain.py +++ b/nw/guimain.py @@ -294,12 +294,14 @@ class GuiMain(QMainWindow): return False logger.info("Creating new project") - self.theProject.newProject() - self.theProject.setProjectPath(projPath) - self.rebuildTree() - self.saveProject() - self.hasProject = True - self.statusBar.setRefTime(self.theProject.projOpened) + if self.theProject.setProjectPath(projPath, newProject=True): + self.theProject.newProject() + self.rebuildTree() + self.saveProject() + self.hasProject = True + self.statusBar.setRefTime(self.theProject.projOpened) + else: + return False return True diff --git a/tests/reference/gui/1_nwProject.nwx b/tests/reference/gui/1_nwProject.nwx index a09a089f..ab090c92 100644 --- a/tests/reference/gui/1_nwProject.nwx +++ b/tests/reference/gui/1_nwProject.nwx @@ -1,5 +1,5 @@ - + New Project @@ -9,7 +9,7 @@ True True 31489056e0916 - 31489056e0916 + None 86 @@ -35,7 +35,7 @@ Main - + Novel ROOT @@ -119,5 +119,12 @@ 1 68 + + Trash + TRASH + TRASH + None + True + diff --git a/tests/test_gui.py b/tests/test_gui.py index c638e77f..e006cabb 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -235,6 +235,15 @@ def testMainWindows(qtbot, nwTempGUI, nwRef, nwTemp): assert nwGUI.closeDocViewer() qtbot.wait(stepDelay) + # Check a Quick Create and Delete + assert nwGUI.treeView.newTreeItem(nwItemType.FILE, None) + newHandle = nwGUI.treeView.getSelectedHandle() + assert nwGUI.theProject.projTree["031b4af5197ec"] is not None + assert nwGUI.treeView.deleteItem() + assert nwGUI.treeView.setSelectedHandle(newHandle) + assert nwGUI.treeView.deleteItem() + assert nwGUI.saveProject() + # Check the files refFile = path.join(nwTempGUI, "nwProject.nwx") assert cmpFiles(refFile, path.join(nwRef, "gui", "1_nwProject.nwx"), [2])