Using global enum class instead of constants in classes.

This commit is contained in:
Veronica K. B. Olsen
2018-11-02 23:22:29 +01:00
parent 8c10251fff
commit e3af43725a
7 changed files with 103 additions and 99 deletions
+1 -5
View File
@@ -17,6 +17,7 @@ from os import path, remove, rename
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from nw.main import NovelWriter from nw.main import NovelWriter
from nw.config import Config from nw.config import Config
from nw.enum import *
__package__ = "novelWriter" __package__ = "novelWriter"
__author__ = "Veronica Berglyd Olsen" __author__ = "Veronica Berglyd Olsen"
@@ -62,11 +63,6 @@ logger = logging.getLogger(__name__)
# Load the main config as a global object # Load the main config as a global object
CONFIG = Config() CONFIG = Config()
# Constants
DOCTYPE_ABOUT = 0
DOCTYPE_DOC = 1
DOCTYPE_PROJECT = 2
def main(sysArgs): def main(sysArgs):
""" """
Parses command line, sets up logging, and launches main GUI. Parses command line, sets up logging, and launches main GUI.
+32
View File
@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*
"""novelWriter Enums
novelWriter Enums
=====================
All enum values
File History:
Created: 2018-11-02 [0.0.1]
"""
from enum import Enum
class nwItemType(Enum):
NONE = 0
ROOT = 1
FOLDER = 2
FILE = 3
# END Enum nwItemType
class nwItemClass(Enum):
NONE = 0
NOVEL = 1
CHAPTER = 2
CHARACTER = 3
WORLD = 4
# END Enum nwItemClass
+16 -16
View File
@@ -18,7 +18,7 @@ from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QSize from PyQt5.QtCore import Qt, QSize
from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterator, QAbstractItemView from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterator, QAbstractItemView
from nw.project.item import NWItem from nw.enum import nwItemType, nwItemClass
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -60,31 +60,31 @@ class GuiDocTree(QTreeWidget):
# Figure out where to put the new item # Figure out where to put the new item
if rHandle is None: if rHandle is None:
nwType = NWItem.TYPE_ROOT nwType = nwItemType.ROOT
pHandle = None pHandle = None
else: else:
rItem = self.theProject.projTree[rHandle] rItem = self.theProject.projTree[rHandle]
if rItem.itemType == NWItem.TYPE_FILE: if rItem.itemType == nwItemType.FILE:
pHandle = rItem.parHandle pHandle = rItem.parHandle
else: else:
pHandle = rHandle pHandle = rHandle
# Create the new item # Create the new item
if itemType == NWItem.TYPE_FILE: if itemType == nwItemType.FILE:
tHandle = self.theProject.newFile("New File", NWItem.CLASS_NONE, pHandle) tHandle = self.theProject.newFile("New File", nwItemClass.NONE, pHandle)
elif itemType == NWItem.TYPE_FOLDER: elif itemType == nwItemType.FOLDER:
if pHandle is None: if pHandle is None:
logger.error("Failed to add new item.") logger.error("Failed to add new item.")
return return
pItem = self.theProject.projTree[rHandle] pItem = self.theProject.projTree[rHandle]
if pItem.itemClass == NWItem.CLASS_NOVEL: if pItem.itemClass == nwItemClass.NOVEL:
tHandle = self.theProject.newFolder("New Chapter", NWItem.CLASS_CHAPTER, pHandle) tHandle = self.theProject.newFolder("New Chapter", nwItemClass.CHAPTER, pHandle)
elif pItem.itemClass == NWItem.CLASS_CHAPTER: elif pItem.itemClass == nwItemClass.CHAPTER:
tHandle = self.theProject.newFolder("New Chapter", NWItem.CLASS_CHAPTER, pItem.parHandle) tHandle = self.theProject.newFolder("New Chapter", nwItemClass.CHAPTER, pItem.parHandle)
else: else:
tHandle = self.theProject.newFolder("New Folder", NWItem.CLASS_NONE, pHandle) tHandle = self.theProject.newFolder("New Folder", nwItemClass.NONE, pHandle)
elif itemType == NWItem.TYPE_ROOT: elif itemType == nwItemType.ROOT:
tHandle = self.theProject.newRoot("Root Folder", NWItem.CLASS_NONE) tHandle = self.theProject.newRoot("Root Folder", nwItemClass.NONE)
else: else:
logger.error("Failed to add new item.") logger.error("Failed to add new item.")
return return
@@ -132,11 +132,11 @@ class GuiDocTree(QTreeWidget):
else: else:
self.theMap[pHandle].addChild(newItem) self.theMap[pHandle].addChild(newItem)
newItem.setExpanded(nwItem.isExpanded) newItem.setExpanded(nwItem.isExpanded)
if nwItem.itemType == NWItem.TYPE_ROOT: if nwItem.itemType == nwItemType.ROOT:
newItem.setIcon(0, QIcon.fromTheme("drive-harddisk")) newItem.setIcon(0, QIcon.fromTheme("drive-harddisk"))
elif nwItem.itemType == NWItem.TYPE_FOLDER: elif nwItem.itemType == nwItemType.FOLDER:
newItem.setIcon(0, QIcon.fromTheme("folder")) newItem.setIcon(0, QIcon.fromTheme("folder"))
elif nwItem.itemType == NWItem.TYPE_FILE: elif nwItem.itemType == nwItemType.FILE:
newItem.setIcon(0, QIcon.fromTheme("x-office-document")) newItem.setIcon(0, QIcon.fromTheme("x-office-document"))
return True return True
+5 -5
View File
@@ -18,11 +18,11 @@ from PyQt5.QtWidgets import qApp, QWidget, QMainWindow, QHBoxLayout, QVBoxL
from PyQt5.QtCore import Qt, QSize from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon, QStandardItemModel from PyQt5.QtGui import QIcon, QStandardItemModel
from nw.enum import nwItemType
from nw.gui.doctree import GuiDocTree from nw.gui.doctree import GuiDocTree
from nw.gui.doceditor import GuiDocEditor from nw.gui.doceditor import GuiDocEditor
from nw.gui.projecteditor import GuiProjectEditor from nw.gui.projecteditor import GuiProjectEditor
from nw.project.project import NWProject from nw.project.project import NWProject
from nw.project.item import NWItem
from nw.project.document import NWDoc from nw.project.document import NWDoc
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -149,7 +149,7 @@ class GuiMain(QMainWindow):
tHandle = tItem.text(3) tHandle = tItem.text(3)
logger.verbose("User double clicked tree item with handle %s" % tHandle) logger.verbose("User double clicked tree item with handle %s" % tHandle)
nwItem = self.theProject.getItem(tHandle) nwItem = self.theProject.getItem(tHandle)
if nwItem.itemType == NWItem.TYPE_FILE: if nwItem.itemType == nwItemType.FILE:
logger.verbose("Requested item %s is a file" % tHandle) logger.verbose("Requested item %s is a file" % tHandle)
self.openDocument(tHandle) self.openDocument(tHandle)
else: else:
@@ -396,21 +396,21 @@ class GuiMain(QMainWindow):
tbRootNew = QAction(QIcon.fromTheme("folder-new"), "New Root Folder (Ctrl+Alt+N)", toolBar) tbRootNew = QAction(QIcon.fromTheme("folder-new"), "New Root Folder (Ctrl+Alt+N)", toolBar)
tbRootNew.setShortcut("Ctrl+Alt+N") tbRootNew.setShortcut("Ctrl+Alt+N")
tbRootNew.setStatusTip("Create New Root Folder") tbRootNew.setStatusTip("Create New Root Folder")
tbRootNew.triggered.connect(lambda: self.treeView.newTreeItem(NWItem.TYPE_ROOT)) tbRootNew.triggered.connect(lambda: self.treeView.newTreeItem(nwItemType.ROOT))
toolBar.addAction(tbRootNew) 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 Chapter or Folder") tbFolderNew.setStatusTip("Create New Chapter or Folder")
tbFolderNew.triggered.connect(lambda: self.treeView.newTreeItem(NWItem.TYPE_FOLDER)) tbFolderNew.triggered.connect(lambda: self.treeView.newTreeItem(nwItemType.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)) tbDocNew.triggered.connect(lambda: self.treeView.newTreeItem(nwItemType.FILE))
toolBar.addAction(tbDocNew) toolBar.addAction(tbDocNew)
return return
+18 -48
View File
@@ -17,28 +17,20 @@ from os import path, mkdir
from lxml import etree from lxml import etree
from datetime import datetime from datetime import datetime
from nw.enum import nwItemType, nwItemClass
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class NWItem(): class NWItem():
TYPE_ROOT = 0
TYPE_FOLDER = 1
TYPE_FILE = 2
CLASS_NONE = 0
CLASS_NOVEL = 1
CLASS_CHAPTER = 2
CLASS_CHARACTER = 3
CLASS_WORLD = 4
def __init__(self): def __init__(self):
self.itemName = "" self.itemName = ""
self.itemHandle = None self.itemHandle = None
self.parHandle = None self.parHandle = None
self.itemOrder = None self.itemOrder = None
self.itemType = None self.itemType = nwItemType.NONE
self.itemClass = None self.itemClass = nwItemClass.NONE
self.isExpanded = False self.isExpanded = False
return return
@@ -69,35 +61,27 @@ class NWItem():
return return
def setType(self, theType): def setType(self, theType):
if isinstance(theType, int): if isinstance(theType, nwItemType):
self.itemType = theType self.itemType = theType
elif theType == "ROOT":
self.itemType = self.TYPE_ROOT
elif theType == "FOLDER":
self.itemType = self.TYPE_FOLDER
elif theType == "FILE":
self.itemType = self.TYPE_FILE
else: else:
logger.error("Unrecognised item type '%s'" % theType) for itemType in nwItemType:
self.itemType = None if theType == itemType.name:
self.itemType = itemType
return
logger.error("Unrecognised item type '%s'" % theType)
self.itemType = nwItemType.NONE
return return
def setClass(self, theClass): def setClass(self, theClass):
if isinstance(theClass, int): if isinstance(theClass, nwItemClass):
self.itemClass = theClass self.itemClass = theClass
elif theClass == "NONE":
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":
self.itemClass = self.CLASS_WORLD
else: else:
logger.error("Unrecognised root item '%s'" % theClass) for itemClass in nwItemClass:
self.itemClass = None if theClass == itemClass.name:
self.itemClass = itemClass
return
logger.error("Unrecognised item class '%s'" % theClass)
self.itemClass = nwItemClass.NONE
return return
def setExpanded(self, expState): def setExpanded(self, expState):
@@ -107,18 +91,4 @@ class NWItem():
self.isExpanded = expState self.isExpanded = expState
return return
def getType(self):
if self.itemType == self.TYPE_ROOT: return "ROOT"
if self.itemType == self.TYPE_FOLDER: return "FOLDER"
if self.itemType == self.TYPE_FILE: return "FILE"
return "NONE"
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"
# END Class NWItem # END Class NWItem
+23 -24
View File
@@ -13,12 +13,13 @@
import logging import logging
import nw import nw
from os import path, mkdir from os import path, mkdir
from lxml import etree from lxml import etree
from hashlib import sha256 from hashlib import sha256
from datetime import datetime from datetime import datetime
from time import time from time import time
from nw.enum import nwItemType, nwItemClass
from nw.project.item import NWItem from nw.project.item import NWItem
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -47,7 +48,7 @@ class NWProject():
def newRoot(self, rootName, rootClass): def newRoot(self, rootName, rootClass):
newItem = NWItem() newItem = NWItem()
newItem.setName(rootName) newItem.setName(rootName)
newItem.setType(NWItem.TYPE_ROOT) newItem.setType(nwItemType.ROOT)
newItem.setClass(rootClass) newItem.setClass(rootClass)
self._appendItem(None,None,newItem) self._appendItem(None,None,newItem)
return newItem.itemHandle return newItem.itemHandle
@@ -55,7 +56,7 @@ class NWProject():
def newFolder(self, folderName, folderClass, pHandle): def newFolder(self, folderName, folderClass, pHandle):
newItem = NWItem() newItem = NWItem()
newItem.setName(folderName) newItem.setName(folderName)
newItem.setType(NWItem.TYPE_FOLDER) newItem.setType(nwItemType.FOLDER)
newItem.setClass(folderClass) newItem.setClass(folderClass)
self._appendItem(None,pHandle,newItem) self._appendItem(None,pHandle,newItem)
return newItem.itemHandle return newItem.itemHandle
@@ -63,7 +64,7 @@ class NWProject():
def newFile(self, fileName, fileClass, pHandle): def newFile(self, fileName, fileClass, pHandle):
newItem = NWItem() newItem = NWItem()
newItem.setName(fileName) newItem.setName(fileName)
newItem.setType(NWItem.TYPE_FILE) newItem.setType(nwItemType.FILE)
newItem.setClass(fileClass) newItem.setClass(fileClass)
self._appendItem(None,pHandle,newItem) self._appendItem(None,pHandle,newItem)
return newItem.itemHandle return newItem.itemHandle
@@ -76,11 +77,11 @@ class NWProject():
self.projName = "" self.projName = ""
self.bookTitle = "" self.bookTitle = ""
self.bookAuthors = [] self.bookAuthors = []
hNovel = self.newRoot("Novel", NWItem.CLASS_NOVEL) hNovel = self.newRoot("Novel", nwItemClass.NOVEL)
hChars = self.newRoot("Characters",NWItem.CLASS_CHARACTER) hChars = self.newRoot("Characters",nwItemClass.CHARACTER)
hWorld = self.newRoot("World", NWItem.CLASS_WORLD) hWorld = self.newRoot("World", nwItemClass.WORLD)
hChapt = self.newFolder("New Chapter", NWItem.CLASS_CHAPTER ,hNovel) hChapt = self.newFolder("New Chapter", nwItemClass.CHAPTER ,hNovel)
hScene = self.newFile("New Scene", NWItem.CLASS_NONE, hChapt) hScene = self.newFile("New Scene", nwItemClass.NONE, hChapt)
return return
def openProject(self, fileName): def openProject(self, fileName):
@@ -129,7 +130,7 @@ class NWProject():
if "handle" in xItem.attrib: if "handle" in xItem.attrib:
tHandle = itemAttrib["handle"] tHandle = itemAttrib["handle"]
else: else:
logger.error("Skipping rntry missing handle") logger.error("Skipping entry missing handle")
continue continue
if "parent" in xItem.attrib: if "parent" in xItem.attrib:
pHandle = itemAttrib["parent"] pHandle = itemAttrib["parent"]
@@ -184,16 +185,14 @@ class NWProject():
"parent" : str(nwItem.parHandle), "parent" : str(nwItem.parHandle),
"order" : str(nwItem.itemOrder), "order" : str(nwItem.itemOrder),
}) })
xItemName = etree.SubElement(xItem,"name") xItemValue = etree.SubElement(xItem,"name")
xItemName.text = str(nwItem.itemName) xItemValue.text = str(nwItem.itemName)
xItemType = etree.SubElement(xItem,"type") xItemValue = etree.SubElement(xItem,"type")
xItemType.text = str(nwItem.getType()) xItemValue.text = str(nwItem.itemType.name)
if nwItem.getClass() is not "NONE": xItemValue = etree.SubElement(xItem,"class")
xItemValue = etree.SubElement(xItem,"class") xItemValue.text = str(nwItem.itemClass.name)
xItemValue.text = str(nwItem.getClass()) xItemValue = etree.SubElement(xItem,"expanded")
if nwItem.isExpanded: xItemValue.text = str(nwItem.isExpanded)
xItemValue = etree.SubElement(xItem,"expanded")
xItemValue.text = str(nwItem.isExpanded)
# Write the xml tree to file # Write the xml tree to file
with open(path.join(self.projPath,self.projFile),"wb") as outFile: with open(path.join(self.projPath,self.projFile),"wb") as outFile:
+8 -1
View File
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="0.1.0" fileVersion="1.0" timeStamp="2018-11-02 21:07:47"> <novelWriterXML appVersion="0.0.1" fileVersion="1.0" timeStamp="2018-11-02 23:17:55">
<project> <project>
<name>Sample Project</name> <name>Sample Project</name>
<title>Sample Project</title> <title>Sample Project</title>
@@ -16,25 +16,32 @@
<item handle="e7ded148d6e4a" order="0" parent="7031beac91f75"> <item handle="e7ded148d6e4a" order="0" parent="7031beac91f75">
<name>New Chapter</name> <name>New Chapter</name>
<type>FOLDER</type> <type>FOLDER</type>
<class>CHAPTER</class>
<expanded>True</expanded> <expanded>True</expanded>
</item> </item>
<item handle="96b68994dfa3d" order="0" parent="e7ded148d6e4a"> <item handle="96b68994dfa3d" order="0" parent="e7ded148d6e4a">
<name>New Scene</name> <name>New Scene</name>
<type>FILE</type> <type>FILE</type>
<class>NONE</class>
<expanded>False</expanded>
</item> </item>
<item handle="636b6aa9b697b" order="1" parent="e7ded148d6e4a"> <item handle="636b6aa9b697b" order="1" parent="e7ded148d6e4a">
<name>New File</name> <name>New File</name>
<type>FILE</type> <type>FILE</type>
<class>NONE</class>
<expanded>False</expanded>
</item> </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>
<class>CHARACTER</class> <class>CHARACTER</class>
<expanded>False</expanded>
</item> </item>
<item handle="73eee34351f85" order="2" parent="None"> <item handle="73eee34351f85" order="2" parent="None">
<name>World</name> <name>World</name>
<type>ROOT</type> <type>ROOT</type>
<class>WORLD</class> <class>WORLD</class>
<expanded>False</expanded>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>