From c2dbbf647c9abd1959cdee7fadc3602b7f521972 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Fri, 2 Nov 2018 22:08:15 +0100 Subject: [PATCH] New folders and files can now be added. --- nw/gui/doctree.py | 100 ++++++++++++++---- nw/gui/winmain.py | 13 ++- nw/project/item.py | 8 +- nw/project/project.py | 16 +-- .../sampleNovel/data_6/36b6aa9b697b_main.htm | 11 ++ sample/sampleNovel/nwProject.nwx | 8 +- 6 files changed, 122 insertions(+), 34 deletions(-) create mode 100644 sample/sampleNovel/data_6/36b6aa9b697b_main.htm diff --git a/nw/gui/doctree.py b/nw/gui/doctree.py index 50846b6d..6884bf26 100644 --- a/nw/gui/doctree.py +++ b/nw/gui/doctree.py @@ -53,6 +53,48 @@ class GuiDocTree(QTreeWidget): return + def newTreeItem(self, itemType): + + rHandle = self._getSelectedHandle() + logger.verbose("Adding item relative to handle %s" % rHandle) + + # Figure out where to put the new item + if rHandle is None: + nwType = NWItem.TYPE_ROOT + pHandle = None + else: + rItem = self.theProject.projTree[rHandle] + if rItem.itemType == NWItem.TYPE_FILE: + pHandle = rItem.parHandle + else: + pHandle = rHandle + + # Create the new item + if itemType == NWItem.TYPE_FILE: + tHandle = self.theProject.newFile("New File", NWItem.CLASS_NONE, pHandle) + elif itemType == NWItem.TYPE_FOLDER: + if pHandle is None: + logger.error("Failed to add new item.") + return + pItem = self.theProject.projTree[rHandle] + if pItem.itemClass == NWItem.CLASS_NOVEL: + tHandle = self.theProject.newFolder("New Chapter", NWItem.CLASS_CHAPTER, pHandle) + elif pItem.itemClass == NWItem.CLASS_CHAPTER: + tHandle = self.theProject.newFolder("New Chapter", NWItem.CLASS_CHAPTER, pItem.parHandle) + else: + tHandle = self.theProject.newFolder("New Folder", NWItem.CLASS_NONE, pHandle) + elif itemType == NWItem.TYPE_ROOT: + tHandle = self.theProject.newRoot("Root Folder", NWItem.CLASS_NONE) + else: + logger.error("Failed to add new item.") + return + + # Add the new item to the tree + nwItem = self.theProject.projTree[tHandle] + self._addTreeItem(nwItem) + + return + def saveTreeOrder(self): theList = [] for i in range(self.topLevelItemCount()): @@ -70,31 +112,49 @@ class GuiDocTree(QTreeWidget): self._scanChildren(theList, theItem.child(i), i) return theList + def _scanParents(self, theItem, theCount=0): + if theItem.parent() is not None: + theItem, theCount = self._scanParents(theItem.parent(), theCount) + return theItem, theCount+1 + + def _addTreeItem(self, nwItem): + tName = nwItem.itemName + tHandle = nwItem.itemHandle + pHandle = nwItem.parHandle + tStatus = 0 + wCount = 0 + newItem = QTreeWidgetItem([ + tName, str(tStatus), str(wCount), tHandle + ]) + self.theMap[tHandle] = newItem + if pHandle is None: + self.addTopLevelItem(newItem) + else: + self.theMap[pHandle].addChild(newItem) + newItem.setExpanded(nwItem.isExpanded) + if nwItem.itemType == NWItem.TYPE_ROOT: + newItem.setIcon(0, QIcon.fromTheme("drive-harddisk")) + elif nwItem.itemType == NWItem.TYPE_FOLDER: + newItem.setIcon(0, QIcon.fromTheme("folder")) + elif nwItem.itemType == NWItem.TYPE_FILE: + newItem.setIcon(0, QIcon.fromTheme("x-office-document")) + return True + def buildTree(self): self.clear() for tHandle in self.theProject.projTree: - nwItem = self.theProject.projTree[tHandle] - tName = nwItem.itemName - tStatus = 0 - wCount = 0 - pHandle = nwItem.parHandle - newItem = QTreeWidgetItem([ - tName, str(tStatus), str(wCount), tHandle - ]) - self.theMap[tHandle] = newItem - if pHandle is None: - self.addTopLevelItem(newItem) - else: - self.theMap[pHandle].addChild(newItem) - newItem.setExpanded(nwItem.isExpanded) - if nwItem.itemType == NWItem.TYPE_ROOT: - newItem.setIcon(0, QIcon.fromTheme("drive-harddisk")) - elif nwItem.itemType == NWItem.TYPE_FOLDER: - newItem.setIcon(0, QIcon.fromTheme("folder")) - elif nwItem.itemType == NWItem.TYPE_FILE: - newItem.setIcon(0, QIcon.fromTheme("x-office-document")) + nwItem = self.theProject.projTree[tHandle] + self._addTreeItem(nwItem) return True + def _getSelectedHandle(self): + selItem = self.selectedItems() + if len(selItem) == 0: + return None + if isinstance(selItem[0], QTreeWidgetItem): + return selItem[0].text(3) + return None + def getColumnSizes(self): retVals = [ self.columnWidth(0), diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 2c707c64..588c807a 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -392,16 +392,25 @@ class GuiMain(QMainWindow): toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly) toolBar.setIconSize(QSize(16,16)) + # Root > New + tbRootNew = QAction(QIcon.fromTheme("folder-new"), "New Root Folder (Ctrl+Alt+N)", toolBar) + tbRootNew.setShortcut("Ctrl+Alt+N") + tbRootNew.setStatusTip("Create New Root Folder") + tbRootNew.triggered.connect(lambda: self.treeView.newTreeItem(NWItem.TYPE_ROOT)) + toolBar.addAction(tbRootNew) + # Folder > New tbFolderNew = QAction(QIcon.fromTheme("folder-new"), "New Folder (Ctrl+Shift+N)", toolBar) tbFolderNew.setShortcut("Ctrl+Shift+N") - tbFolderNew.setStatusTip("Create new folder") + tbFolderNew.setStatusTip("Create New Chapter or Folder") + tbFolderNew.triggered.connect(lambda: self.treeView.newTreeItem(NWItem.TYPE_FOLDER)) toolBar.addAction(tbFolderNew) # Document > New tbDocNew = QAction(QIcon.fromTheme("document-new"), "New Document (Ctrl+N)", toolBar) tbDocNew.setShortcut("Ctrl+N") - tbDocNew.setStatusTip("Create new document") + tbDocNew.setStatusTip("Create New Document") + tbDocNew.triggered.connect(lambda: self.treeView.newTreeItem(NWItem.TYPE_FILE)) toolBar.addAction(tbDocNew) return diff --git a/nw/project/item.py b/nw/project/item.py index 93d8d9b8..b870efca 100644 --- a/nw/project/item.py +++ b/nw/project/item.py @@ -27,8 +27,9 @@ class NWItem(): CLASS_NONE = 0 CLASS_NOVEL = 1 - CLASS_CHARACTER = 2 - CLASS_WORLD = 3 + CLASS_CHAPTER = 2 + CLASS_CHARACTER = 3 + CLASS_WORLD = 4 def __init__(self): @@ -88,6 +89,8 @@ class NWItem(): self.itemClass = self.CLASS_NONE elif theClass == "NOVEL": self.itemClass = self.CLASS_NOVEL + elif theClass == "CHAPTER": + self.itemClass = self.CLASS_CHAPTER elif theClass == "CHARACTER": self.itemClass = self.CLASS_CHARACTER elif theClass == "WORLD": @@ -113,6 +116,7 @@ class NWItem(): def getClass(self): if self.itemClass == self.CLASS_NONE: return "NONE" if self.itemClass == self.CLASS_NOVEL: return "NOVEL" + if self.itemClass == self.CLASS_CHAPTER: return "CHAPTER" if self.itemClass == self.CLASS_CHARACTER: return "CHARACTER" if self.itemClass == self.CLASS_WORLD: return "WORLD" return "NONE" diff --git a/nw/project/project.py b/nw/project/project.py index 9290ee11..2fcfef16 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -44,27 +44,27 @@ class NWProject(): def buildProjectTree(self): return True - def newRoot(self, rootName, rootType): + def newRoot(self, rootName, rootClass): newItem = NWItem() newItem.setName(rootName) newItem.setType(NWItem.TYPE_ROOT) - newItem.setClass(rootType) + newItem.setClass(rootClass) self._appendItem(None,None,newItem) return newItem.itemHandle - def newFolder(self, folderName, pHandle): + def newFolder(self, folderName, folderClass, pHandle): newItem = NWItem() newItem.setName(folderName) newItem.setType(NWItem.TYPE_FOLDER) - newItem.setClass(NWItem.CLASS_NONE) + newItem.setClass(folderClass) self._appendItem(None,pHandle,newItem) return newItem.itemHandle - def newFile(self, fileName, pHandle): + def newFile(self, fileName, fileClass, pHandle): newItem = NWItem() newItem.setName(fileName) newItem.setType(NWItem.TYPE_FILE) - newItem.setClass(NWItem.CLASS_NONE) + newItem.setClass(fileClass) self._appendItem(None,pHandle,newItem) return newItem.itemHandle @@ -79,8 +79,8 @@ class NWProject(): hNovel = self.newRoot("Novel", NWItem.CLASS_NOVEL) hChars = self.newRoot("Characters",NWItem.CLASS_CHARACTER) hWorld = self.newRoot("World", NWItem.CLASS_WORLD) - hChapt = self.newFolder("New Chapter", hNovel) - hScene = self.newFile("New Scene", hChapt) + hChapt = self.newFolder("New Chapter", NWItem.CLASS_CHAPTER ,hNovel) + hScene = self.newFile("New Scene", NWItem.CLASS_NONE, hChapt) return def openProject(self, fileName): diff --git a/sample/sampleNovel/data_6/36b6aa9b697b_main.htm b/sample/sampleNovel/data_6/36b6aa9b697b_main.htm new file mode 100644 index 00000000..93c0ecda --- /dev/null +++ b/sample/sampleNovel/data_6/36b6aa9b697b_main.htm @@ -0,0 +1,11 @@ + + + + + + +

File with stuff.

+ + diff --git a/sample/sampleNovel/nwProject.nwx b/sample/sampleNovel/nwProject.nwx index 0c881926..fccad454 100644 --- a/sample/sampleNovel/nwProject.nwx +++ b/sample/sampleNovel/nwProject.nwx @@ -1,12 +1,12 @@ - + Sample Project Sample Project Jane Smith Jay Doh - + Novel ROOT @@ -22,6 +22,10 @@ New Scene FILE + + New File + FILE + Characters ROOT