New folders and files can now be added.
This commit is contained in:
+80
-20
@@ -53,6 +53,48 @@ class GuiDocTree(QTreeWidget):
|
|||||||
|
|
||||||
return
|
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):
|
def saveTreeOrder(self):
|
||||||
theList = []
|
theList = []
|
||||||
for i in range(self.topLevelItemCount()):
|
for i in range(self.topLevelItemCount()):
|
||||||
@@ -70,31 +112,49 @@ class GuiDocTree(QTreeWidget):
|
|||||||
self._scanChildren(theList, theItem.child(i), i)
|
self._scanChildren(theList, theItem.child(i), i)
|
||||||
return theList
|
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):
|
def buildTree(self):
|
||||||
self.clear()
|
self.clear()
|
||||||
for tHandle in self.theProject.projTree:
|
for tHandle in self.theProject.projTree:
|
||||||
nwItem = self.theProject.projTree[tHandle]
|
nwItem = self.theProject.projTree[tHandle]
|
||||||
tName = nwItem.itemName
|
self._addTreeItem(nwItem)
|
||||||
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"))
|
|
||||||
return True
|
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):
|
def getColumnSizes(self):
|
||||||
retVals = [
|
retVals = [
|
||||||
self.columnWidth(0),
|
self.columnWidth(0),
|
||||||
|
|||||||
+11
-2
@@ -392,16 +392,25 @@ class GuiMain(QMainWindow):
|
|||||||
toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||||
toolBar.setIconSize(QSize(16,16))
|
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
|
# Folder > New
|
||||||
tbFolderNew = QAction(QIcon.fromTheme("folder-new"), "New Folder (Ctrl+Shift+N)", toolBar)
|
tbFolderNew = QAction(QIcon.fromTheme("folder-new"), "New Folder (Ctrl+Shift+N)", toolBar)
|
||||||
tbFolderNew.setShortcut("Ctrl+Shift+N")
|
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)
|
toolBar.addAction(tbFolderNew)
|
||||||
|
|
||||||
# Document > New
|
# Document > New
|
||||||
tbDocNew = QAction(QIcon.fromTheme("document-new"), "New Document (Ctrl+N)", toolBar)
|
tbDocNew = QAction(QIcon.fromTheme("document-new"), "New Document (Ctrl+N)", toolBar)
|
||||||
tbDocNew.setShortcut("Ctrl+N")
|
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)
|
toolBar.addAction(tbDocNew)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
+6
-2
@@ -27,8 +27,9 @@ class NWItem():
|
|||||||
|
|
||||||
CLASS_NONE = 0
|
CLASS_NONE = 0
|
||||||
CLASS_NOVEL = 1
|
CLASS_NOVEL = 1
|
||||||
CLASS_CHARACTER = 2
|
CLASS_CHAPTER = 2
|
||||||
CLASS_WORLD = 3
|
CLASS_CHARACTER = 3
|
||||||
|
CLASS_WORLD = 4
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
@@ -88,6 +89,8 @@ class NWItem():
|
|||||||
self.itemClass = self.CLASS_NONE
|
self.itemClass = self.CLASS_NONE
|
||||||
elif theClass == "NOVEL":
|
elif theClass == "NOVEL":
|
||||||
self.itemClass = self.CLASS_NOVEL
|
self.itemClass = self.CLASS_NOVEL
|
||||||
|
elif theClass == "CHAPTER":
|
||||||
|
self.itemClass = self.CLASS_CHAPTER
|
||||||
elif theClass == "CHARACTER":
|
elif theClass == "CHARACTER":
|
||||||
self.itemClass = self.CLASS_CHARACTER
|
self.itemClass = self.CLASS_CHARACTER
|
||||||
elif theClass == "WORLD":
|
elif theClass == "WORLD":
|
||||||
@@ -113,6 +116,7 @@ class NWItem():
|
|||||||
def getClass(self):
|
def getClass(self):
|
||||||
if self.itemClass == self.CLASS_NONE: return "NONE"
|
if self.itemClass == self.CLASS_NONE: return "NONE"
|
||||||
if self.itemClass == self.CLASS_NOVEL: return "NOVEL"
|
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_CHARACTER: return "CHARACTER"
|
||||||
if self.itemClass == self.CLASS_WORLD: return "WORLD"
|
if self.itemClass == self.CLASS_WORLD: return "WORLD"
|
||||||
return "NONE"
|
return "NONE"
|
||||||
|
|||||||
@@ -44,27 +44,27 @@ class NWProject():
|
|||||||
def buildProjectTree(self):
|
def buildProjectTree(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def newRoot(self, rootName, rootType):
|
def newRoot(self, rootName, rootClass):
|
||||||
newItem = NWItem()
|
newItem = NWItem()
|
||||||
newItem.setName(rootName)
|
newItem.setName(rootName)
|
||||||
newItem.setType(NWItem.TYPE_ROOT)
|
newItem.setType(NWItem.TYPE_ROOT)
|
||||||
newItem.setClass(rootType)
|
newItem.setClass(rootClass)
|
||||||
self._appendItem(None,None,newItem)
|
self._appendItem(None,None,newItem)
|
||||||
return newItem.itemHandle
|
return newItem.itemHandle
|
||||||
|
|
||||||
def newFolder(self, folderName, pHandle):
|
def newFolder(self, folderName, folderClass, pHandle):
|
||||||
newItem = NWItem()
|
newItem = NWItem()
|
||||||
newItem.setName(folderName)
|
newItem.setName(folderName)
|
||||||
newItem.setType(NWItem.TYPE_FOLDER)
|
newItem.setType(NWItem.TYPE_FOLDER)
|
||||||
newItem.setClass(NWItem.CLASS_NONE)
|
newItem.setClass(folderClass)
|
||||||
self._appendItem(None,pHandle,newItem)
|
self._appendItem(None,pHandle,newItem)
|
||||||
return newItem.itemHandle
|
return newItem.itemHandle
|
||||||
|
|
||||||
def newFile(self, fileName, pHandle):
|
def newFile(self, fileName, fileClass, pHandle):
|
||||||
newItem = NWItem()
|
newItem = NWItem()
|
||||||
newItem.setName(fileName)
|
newItem.setName(fileName)
|
||||||
newItem.setType(NWItem.TYPE_FILE)
|
newItem.setType(NWItem.TYPE_FILE)
|
||||||
newItem.setClass(NWItem.CLASS_NONE)
|
newItem.setClass(fileClass)
|
||||||
self._appendItem(None,pHandle,newItem)
|
self._appendItem(None,pHandle,newItem)
|
||||||
return newItem.itemHandle
|
return newItem.itemHandle
|
||||||
|
|
||||||
@@ -79,8 +79,8 @@ class NWProject():
|
|||||||
hNovel = self.newRoot("Novel", NWItem.CLASS_NOVEL)
|
hNovel = self.newRoot("Novel", NWItem.CLASS_NOVEL)
|
||||||
hChars = self.newRoot("Characters",NWItem.CLASS_CHARACTER)
|
hChars = self.newRoot("Characters",NWItem.CLASS_CHARACTER)
|
||||||
hWorld = self.newRoot("World", NWItem.CLASS_WORLD)
|
hWorld = self.newRoot("World", NWItem.CLASS_WORLD)
|
||||||
hChapt = self.newFolder("New Chapter", hNovel)
|
hChapt = self.newFolder("New Chapter", NWItem.CLASS_CHAPTER ,hNovel)
|
||||||
hScene = self.newFile("New Scene", hChapt)
|
hScene = self.newFile("New Scene", NWItem.CLASS_NONE, hChapt)
|
||||||
return
|
return
|
||||||
|
|
||||||
def openProject(self, fileName):
|
def openProject(self, fileName):
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta name="qrichtext" content="1">
|
||||||
|
<style type="text/css">
|
||||||
|
p, li { white-space: pre-wrap; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body style=" font-family:'Source Sans Pro'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||||
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">File with stuff.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="0.1.0" fileVersion="1.0" timeStamp="2018-10-30 21:03:03">
|
<novelWriterXML appVersion="0.1.0" fileVersion="1.0" timeStamp="2018-11-02 21:07:47">
|
||||||
<project>
|
<project>
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<title>Sample Project</title>
|
<title>Sample Project</title>
|
||||||
<author>Jane Smith</author>
|
<author>Jane Smith</author>
|
||||||
<author>Jay Doh</author>
|
<author>Jay Doh</author>
|
||||||
</project>
|
</project>
|
||||||
<content count="5">
|
<content count="6">
|
||||||
<item handle="7031beac91f75" order="0" parent="None">
|
<item handle="7031beac91f75" order="0" parent="None">
|
||||||
<name>Novel</name>
|
<name>Novel</name>
|
||||||
<type>ROOT</type>
|
<type>ROOT</type>
|
||||||
@@ -22,6 +22,10 @@
|
|||||||
<name>New Scene</name>
|
<name>New Scene</name>
|
||||||
<type>FILE</type>
|
<type>FILE</type>
|
||||||
</item>
|
</item>
|
||||||
|
<item handle="636b6aa9b697b" order="1" parent="e7ded148d6e4a">
|
||||||
|
<name>New File</name>
|
||||||
|
<type>FILE</type>
|
||||||
|
</item>
|
||||||
<item handle="f6622b4617424" order="1" parent="None">
|
<item handle="f6622b4617424" order="1" parent="None">
|
||||||
<name>Characters</name>
|
<name>Characters</name>
|
||||||
<type>ROOT</type>
|
<type>ROOT</type>
|
||||||
|
|||||||
Reference in New Issue
Block a user