From e3af43725a9fb2abe8cafbf313ad3f4a4f1455f7 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Fri, 2 Nov 2018 23:22:29 +0100 Subject: [PATCH] Using global enum class instead of constants in classes. --- nw/__init__.py | 6 +-- nw/enum.py | 32 ++++++++++++++++ nw/gui/doctree.py | 32 ++++++++-------- nw/gui/winmain.py | 10 ++--- nw/project/item.py | 66 +++++++++----------------------- nw/project/project.py | 47 +++++++++++------------ sample/sampleNovel/nwProject.nwx | 9 ++++- 7 files changed, 103 insertions(+), 99 deletions(-) create mode 100644 nw/enum.py diff --git a/nw/__init__.py b/nw/__init__.py index 0e9ebe0f..394fad61 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -17,6 +17,7 @@ from os import path, remove, rename from PyQt5.QtWidgets import QApplication from nw.main import NovelWriter from nw.config import Config +from nw.enum import * __package__ = "novelWriter" __author__ = "Veronica Berglyd Olsen" @@ -62,11 +63,6 @@ logger = logging.getLogger(__name__) # Load the main config as a global object CONFIG = Config() -# Constants -DOCTYPE_ABOUT = 0 -DOCTYPE_DOC = 1 -DOCTYPE_PROJECT = 2 - def main(sysArgs): """ Parses command line, sets up logging, and launches main GUI. diff --git a/nw/enum.py b/nw/enum.py new file mode 100644 index 00000000..bf94d67d --- /dev/null +++ b/nw/enum.py @@ -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 diff --git a/nw/gui/doctree.py b/nw/gui/doctree.py index 03a29dbd..1e750da7 100644 --- a/nw/gui/doctree.py +++ b/nw/gui/doctree.py @@ -18,7 +18,7 @@ from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt, QSize from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterator, QAbstractItemView -from nw.project.item import NWItem +from nw.enum import nwItemType, nwItemClass logger = logging.getLogger(__name__) @@ -60,31 +60,31 @@ class GuiDocTree(QTreeWidget): # Figure out where to put the new item if rHandle is None: - nwType = NWItem.TYPE_ROOT + nwType = nwItemType.ROOT pHandle = None else: rItem = self.theProject.projTree[rHandle] - if rItem.itemType == NWItem.TYPE_FILE: + if rItem.itemType == nwItemType.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 itemType == nwItemType.FILE: + tHandle = self.theProject.newFile("New File", nwItemClass.NONE, pHandle) + elif itemType == nwItemType.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) + if pItem.itemClass == nwItemClass.NOVEL: + tHandle = self.theProject.newFolder("New Chapter", nwItemClass.CHAPTER, pHandle) + elif pItem.itemClass == nwItemClass.CHAPTER: + tHandle = self.theProject.newFolder("New Chapter", nwItemClass.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) + tHandle = self.theProject.newFolder("New Folder", nwItemClass.NONE, pHandle) + elif itemType == nwItemType.ROOT: + tHandle = self.theProject.newRoot("Root Folder", nwItemClass.NONE) else: logger.error("Failed to add new item.") return @@ -132,11 +132,11 @@ class GuiDocTree(QTreeWidget): else: self.theMap[pHandle].addChild(newItem) newItem.setExpanded(nwItem.isExpanded) - if nwItem.itemType == NWItem.TYPE_ROOT: + if nwItem.itemType == nwItemType.ROOT: newItem.setIcon(0, QIcon.fromTheme("drive-harddisk")) - elif nwItem.itemType == NWItem.TYPE_FOLDER: + elif nwItem.itemType == nwItemType.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")) return True diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 2847cf23..13522be4 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -18,11 +18,11 @@ from PyQt5.QtWidgets import qApp, QWidget, QMainWindow, QHBoxLayout, QVBoxL from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QIcon, QStandardItemModel +from nw.enum import nwItemType from nw.gui.doctree import GuiDocTree from nw.gui.doceditor import GuiDocEditor from nw.gui.projecteditor import GuiProjectEditor from nw.project.project import NWProject -from nw.project.item import NWItem from nw.project.document import NWDoc logger = logging.getLogger(__name__) @@ -149,7 +149,7 @@ class GuiMain(QMainWindow): tHandle = tItem.text(3) logger.verbose("User double clicked tree item with handle %s" % 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) self.openDocument(tHandle) else: @@ -396,21 +396,21 @@ class GuiMain(QMainWindow): 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)) + tbRootNew.triggered.connect(lambda: self.treeView.newTreeItem(nwItemType.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 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) # Document > New tbDocNew = QAction(QIcon.fromTheme("document-new"), "New Document (Ctrl+N)", toolBar) tbDocNew.setShortcut("Ctrl+N") 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) return diff --git a/nw/project/item.py b/nw/project/item.py index 1e569030..7bf3c404 100644 --- a/nw/project/item.py +++ b/nw/project/item.py @@ -17,28 +17,20 @@ from os import path, mkdir from lxml import etree from datetime import datetime +from nw.enum import nwItemType, nwItemClass + logger = logging.getLogger(__name__) 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): self.itemName = "" self.itemHandle = None self.parHandle = None self.itemOrder = None - self.itemType = None - self.itemClass = None + self.itemType = nwItemType.NONE + self.itemClass = nwItemClass.NONE self.isExpanded = False return @@ -69,35 +61,27 @@ class NWItem(): return def setType(self, theType): - if isinstance(theType, int): + if isinstance(theType, nwItemType): 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: - logger.error("Unrecognised item type '%s'" % theType) - self.itemType = None + for itemType in nwItemType: + if theType == itemType.name: + self.itemType = itemType + return + logger.error("Unrecognised item type '%s'" % theType) + self.itemType = nwItemType.NONE return def setClass(self, theClass): - if isinstance(theClass, int): + if isinstance(theClass, nwItemClass): 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: - logger.error("Unrecognised root item '%s'" % theClass) - self.itemClass = None + for itemClass in nwItemClass: + if theClass == itemClass.name: + self.itemClass = itemClass + return + logger.error("Unrecognised item class '%s'" % theClass) + self.itemClass = nwItemClass.NONE return def setExpanded(self, expState): @@ -107,18 +91,4 @@ class NWItem(): self.isExpanded = expState 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 diff --git a/nw/project/project.py b/nw/project/project.py index 46175372..2cb97761 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -13,12 +13,13 @@ import logging import nw -from os import path, mkdir -from lxml import etree -from hashlib import sha256 -from datetime import datetime -from time import time +from os import path, mkdir +from lxml import etree +from hashlib import sha256 +from datetime import datetime +from time import time +from nw.enum import nwItemType, nwItemClass from nw.project.item import NWItem logger = logging.getLogger(__name__) @@ -47,7 +48,7 @@ class NWProject(): def newRoot(self, rootName, rootClass): newItem = NWItem() newItem.setName(rootName) - newItem.setType(NWItem.TYPE_ROOT) + newItem.setType(nwItemType.ROOT) newItem.setClass(rootClass) self._appendItem(None,None,newItem) return newItem.itemHandle @@ -55,7 +56,7 @@ class NWProject(): def newFolder(self, folderName, folderClass, pHandle): newItem = NWItem() newItem.setName(folderName) - newItem.setType(NWItem.TYPE_FOLDER) + newItem.setType(nwItemType.FOLDER) newItem.setClass(folderClass) self._appendItem(None,pHandle,newItem) return newItem.itemHandle @@ -63,7 +64,7 @@ class NWProject(): def newFile(self, fileName, fileClass, pHandle): newItem = NWItem() newItem.setName(fileName) - newItem.setType(NWItem.TYPE_FILE) + newItem.setType(nwItemType.FILE) newItem.setClass(fileClass) self._appendItem(None,pHandle,newItem) return newItem.itemHandle @@ -76,11 +77,11 @@ class NWProject(): self.projName = "" self.bookTitle = "" self.bookAuthors = [] - 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", NWItem.CLASS_CHAPTER ,hNovel) - hScene = self.newFile("New Scene", NWItem.CLASS_NONE, hChapt) + hNovel = self.newRoot("Novel", nwItemClass.NOVEL) + hChars = self.newRoot("Characters",nwItemClass.CHARACTER) + hWorld = self.newRoot("World", nwItemClass.WORLD) + hChapt = self.newFolder("New Chapter", nwItemClass.CHAPTER ,hNovel) + hScene = self.newFile("New Scene", nwItemClass.NONE, hChapt) return def openProject(self, fileName): @@ -129,7 +130,7 @@ class NWProject(): if "handle" in xItem.attrib: tHandle = itemAttrib["handle"] else: - logger.error("Skipping rntry missing handle") + logger.error("Skipping entry missing handle") continue if "parent" in xItem.attrib: pHandle = itemAttrib["parent"] @@ -184,16 +185,14 @@ class NWProject(): "parent" : str(nwItem.parHandle), "order" : str(nwItem.itemOrder), }) - xItemName = etree.SubElement(xItem,"name") - xItemName.text = str(nwItem.itemName) - xItemType = etree.SubElement(xItem,"type") - xItemType.text = str(nwItem.getType()) - if nwItem.getClass() is not "NONE": - xItemValue = etree.SubElement(xItem,"class") - xItemValue.text = str(nwItem.getClass()) - if nwItem.isExpanded: - xItemValue = etree.SubElement(xItem,"expanded") - xItemValue.text = str(nwItem.isExpanded) + xItemValue = etree.SubElement(xItem,"name") + xItemValue.text = str(nwItem.itemName) + xItemValue = etree.SubElement(xItem,"type") + xItemValue.text = str(nwItem.itemType.name) + xItemValue = etree.SubElement(xItem,"class") + xItemValue.text = str(nwItem.itemClass.name) + xItemValue = etree.SubElement(xItem,"expanded") + xItemValue.text = str(nwItem.isExpanded) # Write the xml tree to file with open(path.join(self.projPath,self.projFile),"wb") as outFile: diff --git a/sample/sampleNovel/nwProject.nwx b/sample/sampleNovel/nwProject.nwx index fccad454..b08f806c 100644 --- a/sample/sampleNovel/nwProject.nwx +++ b/sample/sampleNovel/nwProject.nwx @@ -1,5 +1,5 @@ - + Sample Project Sample Project @@ -16,25 +16,32 @@ New Chapter FOLDER + CHAPTER True New Scene FILE + NONE + False New File FILE + NONE + False Characters ROOT CHARACTER + False World ROOT WORLD + False