Save both status and importance flags (#1030)

* Put the status icons in the status object itself
* Allow saving both status and importance values
* Update current tests
* Improve test coverage
* Update sample project file
This commit is contained in:
Veronica Berglyd Olsen
2022-04-03 22:43:11 +02:00
committed by GitHub
parent a04b44d890
commit 23fd6b815f
29 changed files with 481 additions and 418 deletions
+40 -7
View File
@@ -50,6 +50,7 @@ class NWItem():
self._class = nwItemClass.NO_CLASS self._class = nwItemClass.NO_CLASS
self._layout = nwItemLayout.NO_LAYOUT self._layout = nwItemLayout.NO_LAYOUT
self._status = None self._status = None
self._import = None
self._expanded = False self._expanded = False
self._exported = True self._exported = True
@@ -104,6 +105,10 @@ class NWItem():
def itemStatus(self): def itemStatus(self):
return self._status return self._status
@property
def itemImport(self):
return self._import
@property @property
def isExpanded(self): def isExpanded(self):
return self._expanded return self._expanded
@@ -159,12 +164,13 @@ class NWItem():
nameAttrib = {} nameAttrib = {}
nameAttrib["status"] = str(self._status) nameAttrib["status"] = str(self._status)
nameAttrib["import"] = str(self._import)
if self._type == nwItemType.FILE: if self._type == nwItemType.FILE:
nameAttrib["exported"] = str(self._exported) nameAttrib["exported"] = str(self._exported)
xPack = etree.SubElement(xParent, "item", attrib=itemAttrib) xPack = etree.SubElement(xParent, "item", attrib=itemAttrib)
self._subPack(xPack, "meta", attrib=metaAttrib) self._subPack(xPack, "meta", attrib=metaAttrib)
self._subPack(xPack, "name", text=str(self._name), attrib=nameAttrib) self._subPack(xPack, "name", text=str(self._name), attrib=nameAttrib)
return return
@@ -197,11 +203,12 @@ class NWItem():
elif xValue.tag == "name": elif xValue.tag == "name":
self.setName(xValue.text) self.setName(xValue.text)
self.setStatus(xValue.attrib.get("status", None)) self.setStatus(xValue.attrib.get("status", None))
self.setImport(xValue.attrib.get("import", None))
self.setExported(xValue.attrib.get("exported", True)) self.setExported(xValue.attrib.get("exported", True))
# Legacy Format (1.3 and earlier) # Legacy Format (1.3 and earlier)
elif xValue.tag == "status": elif xValue.tag == "status":
self.setStatus(xValue.text) self.setImportStatus(xValue.text)
elif xValue.tag == "type": elif xValue.tag == "type":
self.setType(xValue.text) self.setType(xValue.text)
elif xValue.tag == "class": elif xValue.tag == "class":
@@ -268,6 +275,28 @@ class NWItem():
return trConst(nwLabels.ITEM_DESCRIPTION.get(descKey, "")) return trConst(nwLabels.ITEM_DESCRIPTION.get(descKey, ""))
def getImportStatus(self):
"""Return the relevant importance or status label and icon for
the current item based on its class.
"""
if self._class in nwLists.CLS_NOVEL:
stName = self.theProject.statusItems.checkEntry(self._status)
stIcon = self.theProject.statusItems.getIcon(stName)
else:
stName = self.theProject.importItems.checkEntry(self._import)
stIcon = self.theProject.importItems.getIcon(stName)
return stName, stIcon
def setImportStatus(self, theLabel):
"""Update the importance or status value based on class. This is
a wrapper setter for setStatus and setImport.
"""
if self._class in nwLists.CLS_NOVEL:
self.setStatus(theLabel)
else:
self.setImport(theLabel)
return
## ##
# Set Item Values # Set Item Values
## ##
@@ -354,10 +383,14 @@ class NWItem():
"""Set the item status by looking it up in the valid status """Set the item status by looking it up in the valid status
items of the current project. items of the current project.
""" """
if self._class in nwLists.CLS_NOVEL: self._status = self.theProject.statusItems.checkEntry(theStatus)
self._status = self.theProject.statusItems.checkEntry(theStatus) return
else:
self._status = self.theProject.importItems.checkEntry(theStatus) def setImport(self, theImport):
"""Set the item importance by looking it up in the valid import
items of the current project.
"""
self._import = self.theProject.importItems.checkEntry(theImport)
return return
def setExpanded(self, expState): def setExpanded(self, expState):
+7 -7
View File
@@ -46,7 +46,7 @@ from novelwriter.common import (
checkString, checkBool, checkInt, isHandle, formatTimeStamp, checkString, checkBool, checkInt, isHandle, formatTimeStamp,
makeFileNameSafe, hexToInt makeFileNameSafe, hexToInt
) )
from novelwriter.constants import trConst, nwFiles, nwLabels from novelwriter.constants import nwLists, trConst, nwFiles, nwLabels
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1071,7 +1071,7 @@ class NWProject():
""" """
replaceMap = self.statusItems.setNewEntries(newCols) replaceMap = self.statusItems.setNewEntries(newCols)
for nwItem in self.projTree: for nwItem in self.projTree:
if nwItem.itemClass == nwItemClass.NOVEL: if nwItem.itemClass in nwLists.CLS_NOVEL:
if nwItem.itemStatus in replaceMap: if nwItem.itemStatus in replaceMap:
nwItem.setStatus(replaceMap[nwItem.itemStatus]) nwItem.setStatus(replaceMap[nwItem.itemStatus])
self.setProjectChanged(True) self.setProjectChanged(True)
@@ -1083,9 +1083,9 @@ class NWProject():
""" """
replaceMap = self.importItems.setNewEntries(newCols) replaceMap = self.importItems.setNewEntries(newCols)
for nwItem in self.projTree: for nwItem in self.projTree:
if nwItem.itemClass != nwItemClass.NOVEL: if nwItem.itemClass not in nwLists.CLS_NOVEL:
if nwItem.itemStatus in replaceMap: if nwItem.itemImport in replaceMap:
nwItem.setStatus(replaceMap[nwItem.itemStatus]) nwItem.setImport(replaceMap[nwItem.itemImport])
self.setProjectChanged(True) self.setProjectChanged(True)
return True return True
@@ -1206,10 +1206,10 @@ class NWProject():
self.statusItems.resetCounts() self.statusItems.resetCounts()
self.importItems.resetCounts() self.importItems.resetCounts()
for nwItem in self.projTree: for nwItem in self.projTree:
if nwItem.itemClass == nwItemClass.NOVEL: if nwItem.itemClass in nwLists.CLS_NOVEL:
self.statusItems.countEntry(nwItem.itemStatus) self.statusItems.countEntry(nwItem.itemStatus)
else: else:
self.importItems.countEntry(nwItem.itemStatus) self.importItems.countEntry(nwItem.itemImport)
return return
def localLookup(self, theWord): def localLookup(self, theWord):
+46 -30
View File
@@ -24,9 +24,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import logging import logging
import novelwriter
from lxml import etree from lxml import etree
from PyQt5.QtGui import QIcon, QPixmap, QColor
from novelwriter.common import checkInt from novelwriter.common import checkInt
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -39,9 +42,11 @@ class NWStatus():
self._theLabels = [] self._theLabels = []
self._theColours = [] self._theColours = []
self._theCounts = [] self._theCounts = []
self._theIcons = []
self._theMap = {} self._theMap = {}
self._theLength = 0 self._theLength = 0
self._theIndex = 0 self._theIndex = 0
self._iconSize = novelwriter.CONFIG.pxInt(32)
return return
@@ -50,38 +55,35 @@ class NWStatus():
a duplicate. a duplicate.
""" """
theLabel = theLabel.strip() theLabel = theLabel.strip()
if self.lookupEntry(theLabel) is None: if self._getIndex(theLabel) is None:
theIcon = QPixmap(self._iconSize, self._iconSize)
theIcon.fill(QColor(*theColours))
self._theIcons.append(QIcon(theIcon))
self._theLabels.append(theLabel) self._theLabels.append(theLabel)
self._theColours.append(theColours) self._theColours.append(theColours)
self._theCounts.append(0) self._theCounts.append(0)
self._theMap[theLabel] = self._theLength self._theMap[theLabel] = self._theLength
self._theLength += 1 self._theLength += 1
return True
def lookupEntry(self, theLabel): return True
"""Look up a status entry in the object lists, and return it if
it exists.
"""
if theLabel is None:
return None
theLabel = theLabel.strip()
if theLabel in self._theMap.keys():
return self._theMap[theLabel]
return None
def checkEntry(self, theStatus): def checkEntry(self, theStatus):
"""Check if a status value is valid, and returns the safe """Check if a status value is valid, and returns the safe
reference to be used internally. reference to be used internally.
""" """
if isinstance(theStatus, str): if isinstance(theStatus, str):
theStatus = theStatus.strip() if self._getIndex(theStatus) is not None:
if self.lookupEntry(theStatus) is not None: return theStatus.strip()
return theStatus
theStatus = checkInt(theStatus, 0, False)
if theStatus >= 0 and theStatus < self._theLength:
return self._theLabels[theStatus]
return self._theLabels[0] return self._theLabels[0]
def getIcon(self, theLabel):
"""Return the icon for the given status item.
"""
theIndex = self._getIndex(theLabel)
if theIndex is not None:
return self._theIcons[theIndex]
return QIcon()
def setNewEntries(self, newList): def setNewEntries(self, newList):
"""Update the list of entries after they have been modified by """Update the list of entries after they have been modified by
the GUI tool. the GUI tool.
@@ -92,6 +94,7 @@ class NWStatus():
self._theLabels = [] self._theLabels = []
self._theColours = [] self._theColours = []
self._theCounts = [] self._theCounts = []
self._theIcons = []
self._theMap = {} self._theMap = {}
self._theLength = 0 self._theLength = 0
self._theIndex = 0 self._theIndex = 0
@@ -113,7 +116,7 @@ class NWStatus():
"""Increment the counter for a given label. This should be used """Increment the counter for a given label. This should be used
together with resetCounts in a loop over project items. together with resetCounts in a loop over project items.
""" """
theIndex = self.lookupEntry(theLabel) theIndex = self._getIndex(theLabel)
if theIndex is not None: if theIndex is not None:
self._theCounts[theIndex] += 1 self._theCounts[theIndex] += 1
return return
@@ -124,9 +127,9 @@ class NWStatus():
""" """
for n in range(self._theLength): for n in range(self._theLength):
xSub = etree.SubElement(xParent, "entry", attrib={ xSub = etree.SubElement(xParent, "entry", attrib={
"blue": str(self._theColours[n][2]),
"green": str(self._theColours[n][1]),
"red": str(self._theColours[n][0]), "red": str(self._theColours[n][0]),
"green": str(self._theColours[n][1]),
"blue": str(self._theColours[n][2]),
}) })
xSub.text = self._theLabels[n] xSub.text = self._theLabels[n]
return True return True
@@ -145,18 +148,31 @@ class NWStatus():
theColours.append((cR, cG, cB)) theColours.append((cR, cG, cB))
if len(theLabels) > 0: if len(theLabels) > 0:
self._theLabels = [] self._theLabels = []
self._theColours = [] self._theColours = []
self._theCounts = [] self._theCounts = []
self._theMap = {} self._theIcons = []
self._theLength = 0 self._theMap = {}
self._theIndex = 0 self._theLength = 0
self._theIndex = 0
for n in range(len(theLabels)): for n in range(len(theLabels)):
self.addEntry(theLabels[n], theColours[n]) self.addEntry(theLabels[n], theColours[n])
return True return True
##
# Internal Functions
##
def _getIndex(self, theLabel):
"""Look up a status entry in the object lists, and return it if
it exists.
"""
if theLabel is None:
return None
return self._theMap.get(theLabel.strip(), None)
## ##
# Iterator Bits # Iterator Bits
## ##
@@ -165,8 +181,8 @@ class NWStatus():
"""Return an entry by its index. """Return an entry by its index.
""" """
if n >= 0 and n < self._theLength: if n >= 0 and n < self._theLength:
return self._theLabels[n], self._theColours[n], self._theCounts[n] return self._theLabels[n], self._theColours[n], self._theCounts[n], self._theIcons[n]
return None, None, None return None, None, None, QIcon()
def __iter__(self): def __iter__(self):
"""Initialise the iterator. """Initialise the iterator.
@@ -178,9 +194,9 @@ class NWStatus():
"""Return the next entry for the iterator. """Return the next entry for the iterator.
""" """
if self._theIndex < self._theLength: if self._theIndex < self._theLength:
theLabel, theColour, theCount = self.__getitem__(self._theIndex) theLabel, theColour, theCount, theIcon = self.__getitem__(self._theIndex)
self._theIndex += 1 self._theIndex += 1
return theLabel, theColour, theCount return theLabel, theColour, theCount, theIcon
else: else:
raise StopIteration raise StopIteration
+1
View File
@@ -133,6 +133,7 @@ class GuiDocMerge(QDialog):
nHandle = self.theProject.newFile(srcItem.itemName, srcItem.itemClass, srcItem.itemParent) nHandle = self.theProject.newFile(srcItem.itemName, srcItem.itemClass, srcItem.itemParent)
newItem = self.theProject.projTree[nHandle] newItem = self.theProject.projTree[nHandle]
newItem.setStatus(srcItem.itemStatus) newItem.setStatus(srcItem.itemStatus)
newItem.setImport(srcItem.itemImport)
outDoc = NWDoc(self.theProject, nHandle) outDoc = NWDoc(self.theProject, nHandle)
if not outDoc.writeDocument(theText): if not outDoc.writeDocument(theText):
+1
View File
@@ -203,6 +203,7 @@ class GuiDocSplit(QDialog):
newItem = self.theProject.projTree[nHandle] newItem = self.theProject.projTree[nHandle]
newItem.setLayout(itemLayout) newItem.setLayout(itemLayout)
newItem.setStatus(srcItem.itemStatus) newItem.setStatus(srcItem.itemStatus)
newItem.setImport(srcItem.itemImport)
logger.verbose( logger.verbose(
"Creating new document '%s' with text from line %d to %d", "Creating new document '%s' with text from line %d to %d",
nHandle, iStart+1, iEnd nHandle, iStart+1, iEnd
+7 -10
View File
@@ -75,15 +75,11 @@ class GuiItemEditor(QDialog):
self.editStatus = QComboBox() self.editStatus = QComboBox()
self.editStatus.setMinimumWidth(mVd) self.editStatus.setMinimumWidth(mVd)
if self.theItem.itemClass in nwLists.CLS_NOVEL: if self.theItem.itemClass in nwLists.CLS_NOVEL:
for sLabel, _, _ in self.theProject.statusItems: for sLabel, _, _, sIcon in self.theProject.statusItems:
self.editStatus.addItem( self.editStatus.addItem(sIcon, sLabel, sLabel)
self.theParent.statusIcons[sLabel], sLabel, sLabel
)
else: else:
for sLabel, _, _ in self.theProject.importItems: for sLabel, _, _, sIcon in self.theProject.importItems:
self.editStatus.addItem( self.editStatus.addItem(sIcon, sLabel, sLabel)
self.theParent.importIcons[sLabel], sLabel, sLabel
)
# Item Layout # Item Layout
self.editLayout = QComboBox() self.editLayout = QComboBox()
@@ -120,7 +116,8 @@ class GuiItemEditor(QDialog):
self.editName.setText(self.theItem.itemName) self.editName.setText(self.theItem.itemName)
self.editName.selectAll() self.editName.selectAll()
statusIdx = self.editStatus.findData(self.theItem.itemStatus) currStatus, _ = self.theItem.getImportStatus()
statusIdx = self.editStatus.findData(currStatus)
if statusIdx != -1: if statusIdx != -1:
self.editStatus.setCurrentIndex(statusIdx) self.editStatus.setCurrentIndex(statusIdx)
@@ -180,7 +177,7 @@ class GuiItemEditor(QDialog):
isExported = self.editExport.isChecked() isExported = self.editExport.isChecked()
self.theItem.setName(itemName) self.theItem.setName(itemName)
self.theItem.setStatus(itemStatus) self.theItem.setImportStatus(itemStatus)
self.theItem.setLayout(itemLayout) self.theItem.setLayout(itemLayout)
self.theItem.setExported(isExported) self.theItem.setExported(isExported)
+1 -1
View File
@@ -285,7 +285,7 @@ class GuiProjectEditStatus(QWidget):
self.listBox.setColumnWidth(self.COL_LABEL, wCol0) self.listBox.setColumnWidth(self.COL_LABEL, wCol0)
self.listBox.setIndentation(0) self.listBox.setIndentation(0)
for iName, iCol, nUse in self.theStatus: for iName, iCol, nUse, _ in self.theStatus:
self._addItem(iName, iCol, iName, nUse) self._addItem(iName, iCol, iName, nUse)
# List Controls # List Controls
+3 -10
View File
@@ -50,7 +50,7 @@ from PyQt5.QtWidgets import (
) )
from novelwriter.core import NWDoc, NWSpellEnchant, countWords from novelwriter.core import NWDoc, NWSpellEnchant, countWords
from novelwriter.enum import nwAlert, nwDocAction, nwDocInsert, nwItemClass from novelwriter.enum import nwAlert, nwDocAction, nwDocInsert
from novelwriter.common import transferCase from novelwriter.common import transferCase
from novelwriter.constants import nwConst, nwKeyWords, nwUnicode from novelwriter.constants import nwConst, nwKeyWords, nwUnicode
from novelwriter.gui.dochighlight import GuiDocHighlighter from novelwriter.gui.dochighlight import GuiDocHighlighter
@@ -2940,17 +2940,10 @@ class GuiDocEditFooter(QWidget):
sIcon = QPixmap() sIcon = QPixmap()
sText = "" sText = ""
else: else:
iStatus = self._theItem.itemStatus theStatus, theIcon = self._theItem.getImportStatus()
if self._theItem.itemClass == nwItemClass.NOVEL:
iStatus = self.theProject.statusItems.checkEntry(iStatus)
theIcon = self.theParent.statusIcons[iStatus]
else:
iStatus = self.theProject.importItems.checkEntry(iStatus)
theIcon = self.theParent.importIcons[iStatus]
sIcon = theIcon.pixmap(self.sPx, self.sPx) sIcon = theIcon.pixmap(self.sPx, self.sPx)
hLevel = self.theParent.theIndex.getHandleHeaderLevel(self._docHandle) hLevel = self.theParent.theIndex.getHandleHeaderLevel(self._docHandle)
sText = f"{self._theItem.itemStatus} / {self._theItem.describeMe(hLevel)}" sText = f"{theStatus} / {self._theItem.describeMe(hLevel)}"
self.statusIcon.setPixmap(sIcon) self.statusIcon.setPixmap(sIcon)
self.statusText.setText(sText) self.statusText.setText(sText)
+4 -11
View File
@@ -30,7 +30,7 @@ from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtGui import QFont, QPixmap from PyQt5.QtGui import QFont, QPixmap
from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel
from novelwriter.enum import nwItemClass, nwItemType from novelwriter.enum import nwItemType
from novelwriter.constants import trConst, nwLabels from novelwriter.constants import trConst, nwLabels
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -249,16 +249,9 @@ class GuiItemDetails(QWidget):
# Status # Status
# ====== # ======
itStatus = nwItem.itemStatus theStatus, theIcon = nwItem.getImportStatus()
if nwItem.itemClass == nwItemClass.NOVEL: self.statusIcon.setPixmap(theIcon.pixmap(iPx, iPx))
itStatus = self.theProject.statusItems.checkEntry(itStatus) # Make sure it's valid self.statusData.setText(theStatus)
flagIcon = self.theParent.statusIcons[itStatus]
else:
itStatus = self.theProject.importItems.checkEntry(itStatus) # Make sure it's valid
flagIcon = self.theParent.importIcons[itStatus]
self.statusIcon.setPixmap(flagIcon.pixmap(iPx, iPx))
self.statusData.setText(nwItem.itemStatus)
# Class # Class
# ===== # =====
+3 -10
View File
@@ -610,14 +610,7 @@ class GuiProjectTree(QTreeWidget):
else: else:
expIcon = self.theTheme.getIcon("cross") expIcon = self.theTheme.getIcon("cross")
iStatus = nwItem.itemStatus itempStatus, statusIcon = nwItem.getImportStatus()
if nwItem.itemClass == nwItemClass.NOVEL:
iStatus = self.theProject.statusItems.checkEntry(iStatus) # Make sure it's valid
statIcon = self.theParent.statusIcons[iStatus]
else:
iStatus = self.theProject.importItems.checkEntry(iStatus) # Make sure it's valid
statIcon = self.theParent.importIcons[iStatus]
hLevel = self.theIndex.getHandleHeaderLevel(tHandle) hLevel = self.theIndex.getHandleHeaderLevel(tHandle)
itemIcon = self.theTheme.getItemIcon( itemIcon = self.theTheme.getItemIcon(
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
@@ -626,8 +619,8 @@ class GuiProjectTree(QTreeWidget):
trItem.setIcon(self.C_NAME, itemIcon) trItem.setIcon(self.C_NAME, itemIcon)
trItem.setText(self.C_NAME, nwItem.itemName) trItem.setText(self.C_NAME, nwItem.itemName)
trItem.setIcon(self.C_EXPORT, expIcon) trItem.setIcon(self.C_EXPORT, expIcon)
trItem.setIcon(self.C_STATUS, statIcon) trItem.setIcon(self.C_STATUS, statusIcon)
trItem.setToolTip(self.C_STATUS, nwItem.itemStatus) trItem.setToolTip(self.C_STATUS, itempStatus)
if self.mainConf.emphLabels and nwItem.itemLayout == nwItemLayout.DOCUMENT: if self.mainConf.emphLabels and nwItem.itemLayout == nwItemLayout.DOCUMENT:
trFont = trItem.font(self.C_NAME) trFont = trItem.font(self.C_NAME)
+1 -30
View File
@@ -31,7 +31,7 @@ from time import time
from datetime import datetime from datetime import datetime
from PyQt5.QtCore import Qt, QTimer, QSize, QThreadPool, pyqtSlot from PyQt5.QtCore import Qt, QTimer, QSize, QThreadPool, pyqtSlot
from PyQt5.QtGui import QIcon, QPixmap, QColor, QKeySequence, QCursor from PyQt5.QtGui import QIcon, QKeySequence, QCursor
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
qApp, QMainWindow, QVBoxLayout, QWidget, QSplitter, QFileDialog, QShortcut, qApp, QMainWindow, QVBoxLayout, QWidget, QSplitter, QFileDialog, QShortcut,
QMessageBox, QDialog, QTabWidget, QToolBar, QAction QMessageBox, QDialog, QTabWidget, QToolBar, QAction
@@ -129,10 +129,6 @@ class GuiMain(QMainWindow):
self.treeView.novelItemChanged.connect(self._treeNovelItemChanged) self.treeView.novelItemChanged.connect(self._treeNovelItemChanged)
self.treeView.wordCountsChanged.connect(self._updateStatusWordCount) self.treeView.wordCountsChanged.connect(self._updateStatusWordCount)
# Minor GUI Elements
self.statusIcons = []
self.importIcons = []
# Project Tree Tabs # Project Tree Tabs
self.projTabs = QTabWidget() self.projTabs = QTabWidget()
self.projTabs.setTabPosition(QTabWidget.South) self.projTabs.setTabPosition(QTabWidget.South)
@@ -869,8 +865,6 @@ class GuiMain(QMainWindow):
def rebuildTrees(self): def rebuildTrees(self):
"""Rebuild the project tree. """Rebuild the project tree.
""" """
self._makeStatusIcons()
self._makeImportIcons()
self.treeView.buildTree() self.treeView.buildTree()
self.novelView.refreshTree() self.novelView.refreshTree()
return return
@@ -1462,29 +1456,6 @@ class GuiMain(QMainWindow):
self.saveDocument() self.saveDocument()
return return
def _makeStatusIcons(self):
"""Generate all the item status icons based on project settings.
"""
self.statusIcons = {}
iPx = self.mainConf.pxInt(32)
for sLabel, sCol, _ in self.theProject.statusItems:
theIcon = QPixmap(iPx, iPx)
theIcon.fill(QColor(*sCol))
self.statusIcons[sLabel] = QIcon(theIcon)
return
def _makeImportIcons(self):
"""Generate all the item importance icons based on project
settings.
"""
self.importIcons = {}
iPx = self.mainConf.pxInt(32)
for sLabel, sCol, _ in self.theProject.importItems:
theIcon = QPixmap(iPx, iPx)
theIcon.fill(QColor(*sCol))
self.importIcons[sLabel] = QIcon(theIcon)
return
def _assembleProjectWizardData(self, newProj): def _assembleProjectWizardData(self, newProj):
"""Extract the user choices from the New Project Wizard and """Extract the user choices from the New Project Wizard and
store them in a dictionary. store them in a dictionary.
+38 -38
View File
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:55:50"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 22:32:30">
<project> <project>
<name>Sample Project</name> <name>Sample Project</name>
<title>Sample Project</title> <title>Sample Project</title>
@@ -7,7 +7,7 @@
<author>Jay Doh</author> <author>Jay Doh</author>
<saveCount>1303</saveCount> <saveCount>1303</saveCount>
<autoCount>199</autoCount> <autoCount>199</autoCount>
<editTime>64457</editTime> <editTime>65005</editTime>
</project> </project>
<settings> <settings>
<doBackup>False</doBackup> <doBackup>False</doBackup>
@@ -33,121 +33,121 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Notes</entry> <entry red="200" green="50" blue="0">Notes</entry>
<entry blue="0" green="60" red="182">Started</entry> <entry red="182" green="60" blue="0">Started</entry>
<entry blue="0" green="129" red="193">1st Draft</entry> <entry red="193" green="129" blue="0">1st Draft</entry>
<entry blue="0" green="129" red="193">2nd Draft</entry> <entry red="193" green="129" blue="0">2nd Draft</entry>
<entry blue="0" green="129" red="193">3rd Draft</entry> <entry red="193" green="129" blue="0">3rd Draft</entry>
<entry blue="58" green="180" red="58">Finished</entry> <entry red="58" green="180" blue="58">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">None</entry> <entry red="100" green="100" blue="100">None</entry>
<entry blue="188" green="122" red="0">Minor</entry> <entry red="0" green="122" blue="188">Minor</entry>
<entry blue="180" green="0" red="21">Major</entry> <entry red="21" green="0" blue="180">Major</entry>
<entry blue="175" green="0" red="117">Main</entry> <entry red="117" green="0" blue="175">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="25"> <content count="25">
<item handle="7031beac91f75" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="7031beac91f75" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="Started">Novel</name> <name status="Started" import="None">Novel</name>
</item> </item>
<item handle="53b69b83cdafc" parent="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="53b69b83cdafc" parent="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="93" wordCount="19" paraCount="2" cursorPos="2"/> <meta charCount="93" wordCount="19" paraCount="2" cursorPos="2"/>
<name status="Started" exported="True">Title Page</name> <name status="Started" import="None" exported="True">Title Page</name>
</item> </item>
<item handle="974e400180a99" parent="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="974e400180a99" parent="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="186" wordCount="39" paraCount="2" cursorPos="212"/> <meta charCount="186" wordCount="39" paraCount="2" cursorPos="212"/>
<name status="New" exported="True">Page</name> <name status="New" import="None" exported="True">Page</name>
</item> </item>
<item handle="edca4be2fcaf8" parent="7031beac91f75" order="2" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="edca4be2fcaf8" parent="7031beac91f75" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="26" wordCount="6" paraCount="1" cursorPos="33"/> <meta charCount="26" wordCount="6" paraCount="1" cursorPos="33"/>
<name status="New" exported="True">Part One</name> <name status="New" import="None" exported="True">Part One</name>
</item> </item>
<item handle="e7ded148d6e4a" parent="7031beac91f75" order="3" type="FOLDER" class="NOVEL"> <item handle="e7ded148d6e4a" parent="7031beac91f75" order="3" type="FOLDER" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="1st Draft">A Folder</name> <name status="1st Draft" import="None">A Folder</name>
</item> </item>
<item handle="6a2d6d5f4f401" parent="e7ded148d6e4a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="6a2d6d5f4f401" parent="e7ded148d6e4a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="75" wordCount="14" paraCount="1" cursorPos="279"/> <meta charCount="75" wordCount="14" paraCount="1" cursorPos="279"/>
<name status="Notes" exported="True">Chapter One</name> <name status="Notes" import="None" exported="True">Chapter One</name>
</item> </item>
<item handle="636b6aa9b697b" parent="e7ded148d6e4a" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="636b6aa9b697b" parent="e7ded148d6e4a" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="2429" wordCount="432" paraCount="14" cursorPos="219"/> <meta charCount="2429" wordCount="432" paraCount="14" cursorPos="219"/>
<name status="1st Draft" exported="True">Making a Scene</name> <name status="1st Draft" import="None" exported="True">Making a Scene</name>
</item> </item>
<item handle="bc0cbd2a407f3" parent="e7ded148d6e4a" order="2" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="bc0cbd2a407f3" parent="e7ded148d6e4a" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="476" wordCount="93" paraCount="3" cursorPos="577"/> <meta charCount="476" wordCount="93" paraCount="3" cursorPos="577"/>
<name status="1st Draft" exported="True">Another Scene</name> <name status="1st Draft" import="None" exported="True">Another Scene</name>
</item> </item>
<item handle="ba8a28a246524" parent="e7ded148d6e4a" order="3" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="ba8a28a246524" parent="e7ded148d6e4a" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="617" wordCount="101" paraCount="3" cursorPos="4"/> <meta charCount="617" wordCount="101" paraCount="3" cursorPos="4"/>
<name status="New" exported="True">Interlude</name> <name status="New" import="None" exported="True">Interlude</name>
</item> </item>
<item handle="96b68994dfa3d" parent="e7ded148d6e4a" order="4" type="FILE" class="NOVEL" layout="NOTE"> <item handle="96b68994dfa3d" parent="e7ded148d6e4a" order="4" type="FILE" class="NOVEL" layout="NOTE">
<meta charCount="1692" wordCount="313" paraCount="6" cursorPos="1110"/> <meta charCount="1692" wordCount="313" paraCount="6" cursorPos="1110"/>
<name status="2nd Draft" exported="False">A Note on Structure</name> <name status="2nd Draft" import="None" exported="False">A Note on Structure</name>
</item> </item>
<item handle="88706ddc78b1b" parent="e7ded148d6e4a" order="5" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="88706ddc78b1b" parent="e7ded148d6e4a" order="5" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="139" wordCount="28" paraCount="1" cursorPos="343"/> <meta charCount="139" wordCount="28" paraCount="1" cursorPos="343"/>
<name status="1st Draft" exported="True">Chapter Two</name> <name status="1st Draft" import="None" exported="True">Chapter Two</name>
</item> </item>
<item handle="ae7339df26ded" parent="e7ded148d6e4a" order="6" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="ae7339df26ded" parent="e7ded148d6e4a" order="6" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="189" wordCount="37" paraCount="1" cursorPos="224"/> <meta charCount="189" wordCount="37" paraCount="1" cursorPos="224"/>
<name status="1st Draft" exported="True">We Found John!</name> <name status="1st Draft" import="None" exported="True">We Found John!</name>
</item> </item>
<item handle="f6622b4617424" parent="None" order="1" type="ROOT" class="CHARACTER"> <item handle="f6622b4617424" parent="None" order="1" type="ROOT" class="CHARACTER">
<meta expanded="True"/> <meta expanded="True"/>
<name status="None">Characters</name> <name status="New" import="None">Characters</name>
</item> </item>
<item handle="f7e2d9f330615" parent="f6622b4617424" order="0" type="FOLDER" class="CHARACTER"> <item handle="f7e2d9f330615" parent="f6622b4617424" order="0" type="FOLDER" class="CHARACTER">
<meta expanded="True"/> <meta expanded="True"/>
<name status="None">Main Characters</name> <name status="New" import="None">Main Characters</name>
</item> </item>
<item handle="14298de4d9524" parent="f7e2d9f330615" order="0" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="14298de4d9524" parent="f7e2d9f330615" order="0" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="49" wordCount="9" paraCount="1" cursorPos="24"/> <meta charCount="49" wordCount="9" paraCount="1" cursorPos="24"/>
<name status="Minor" exported="True">John Smith</name> <name status="New" import="Minor" exported="True">John Smith</name>
</item> </item>
<item handle="bb2c23b3c42cc" parent="f7e2d9f330615" order="1" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="bb2c23b3c42cc" parent="f7e2d9f330615" order="1" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="55" wordCount="9" paraCount="1" cursorPos="25"/> <meta charCount="55" wordCount="9" paraCount="1" cursorPos="25"/>
<name status="Major" exported="True">Jane Smith</name> <name status="New" import="Major" exported="True">Jane Smith</name>
</item> </item>
<item handle="15c4492bd5107" parent="None" order="2" type="ROOT" class="WORLD"> <item handle="15c4492bd5107" parent="None" order="2" type="ROOT" class="WORLD">
<meta expanded="True"/> <meta expanded="True"/>
<name status="None">Locations</name> <name status="New" import="None">Locations</name>
</item> </item>
<item handle="b3e74dbc1f584" parent="15c4492bd5107" order="0" type="FILE" class="WORLD" layout="NOTE"> <item handle="b3e74dbc1f584" parent="15c4492bd5107" order="0" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="76" wordCount="15" paraCount="1" cursorPos="20"/> <meta charCount="76" wordCount="15" paraCount="1" cursorPos="20"/>
<name status="Main" exported="True">Earth</name> <name status="New" import="Main" exported="True">Earth</name>
</item> </item>
<item handle="f1471bef9f2ae" parent="15c4492bd5107" order="1" type="FILE" class="WORLD" layout="NOTE"> <item handle="f1471bef9f2ae" parent="15c4492bd5107" order="1" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="115" wordCount="24" paraCount="1" cursorPos="133"/> <meta charCount="115" wordCount="24" paraCount="1" cursorPos="133"/>
<name status="Minor" exported="True">Space</name> <name status="New" import="Minor" exported="True">Space</name>
</item> </item>
<item handle="5eaea4e8cdee8" parent="15c4492bd5107" order="2" type="FILE" class="WORLD" layout="NOTE"> <item handle="5eaea4e8cdee8" parent="15c4492bd5107" order="2" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="28" wordCount="6" paraCount="1" cursorPos="45"/> <meta charCount="28" wordCount="6" paraCount="1" cursorPos="45"/>
<name status="Major" exported="True">Mars</name> <name status="New" import="Major" exported="True">Mars</name>
</item> </item>
<item handle="6827118336ac1" parent="None" order="3" type="ROOT" class="ARCHIVE"> <item handle="6827118336ac1" parent="None" order="3" type="ROOT" class="ARCHIVE">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Archive</name> <name status="New" import="None">Archive</name>
</item> </item>
<item handle="ae9bf3c3ea159" parent="6827118336ac1" order="0" type="FOLDER" class="ARCHIVE"> <item handle="ae9bf3c3ea159" parent="6827118336ac1" order="0" type="FOLDER" class="ARCHIVE">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Scenes</name> <name status="New" import="None">Scenes</name>
</item> </item>
<item handle="8a5deb88c0e97" parent="ae9bf3c3ea159" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="8a5deb88c0e97" parent="ae9bf3c3ea159" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="315" wordCount="55" paraCount="1" cursorPos="322"/> <meta charCount="315" wordCount="55" paraCount="1" cursorPos="322"/>
<name status="1st Draft" exported="True">Old File</name> <name status="1st Draft" import="None" exported="True">Old File</name>
</item> </item>
<item handle="98acd8c76c93a" parent="None" order="4" type="TRASH" class="TRASH"> <item handle="98acd8c76c93a" parent="None" order="4" type="TRASH" class="TRASH">
<meta expanded="True"/> <meta expanded="True"/>
<name status="None">Trash</name> <name status="New" import="None">Trash</name>
</item> </item>
<item handle="b8136a5a774a0" parent="98acd8c76c93a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="b8136a5a774a0" parent="98acd8c76c93a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="30" wordCount="6" paraCount="1" cursorPos="36"/> <meta charCount="30" wordCount="6" paraCount="1" cursorPos="36"/>
<name status="New" exported="True">Delete Me!</name> <name status="New" import="None" exported="True">Delete Me!</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
+7
View File
@@ -36,6 +36,13 @@ from PyQt5.QtWidgets import QMessageBox # noqa: E402
from novelwriter.config import Config # noqa: E402 from novelwriter.config import Config # noqa: E402
@pytest.fixture(autouse=True)
def initQt(qtbot):
"""Ensures that the qt main thread is always available in all tests.
"""
return
## ##
# Core Test Folders # Core Test Folders
## ##
+32 -32
View File
@@ -1,12 +1,12 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 22:04:38"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:36:12">
<project> <project>
<name>Lorem Ipsum</name> <name>Lorem Ipsum</name>
<title>Lorem Ipsum</title> <title>Lorem Ipsum</title>
<author>lipsum.com</author> <author>lipsum.com</author>
<saveCount>21</saveCount> <saveCount>23</saveCount>
<autoCount>24</autoCount> <autoCount>24</autoCount>
<editTime>1847</editTime> <editTime>1854</editTime>
</project> </project>
<settings> <settings>
<doBackup>False</doBackup> <doBackup>False</doBackup>
@@ -31,102 +31,102 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="21"> <content count="21">
<item handle="b3643d0f92e32" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="b3643d0f92e32" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Novel</name> <name status="New" import="New">Novel</name>
</item> </item>
<item handle="7a992350f3eb6" parent="b3643d0f92e32" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="7a992350f3eb6" parent="b3643d0f92e32" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="230" wordCount="40" paraCount="3" cursorPos="148"/> <meta charCount="230" wordCount="40" paraCount="3" cursorPos="148"/>
<name status="Finished" exported="True">Lorem Ipsum</name> <name status="Finished" import="New" exported="True">Lorem Ipsum</name>
</item> </item>
<item handle="8c58a65414c23" parent="b3643d0f92e32" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="8c58a65414c23" parent="b3643d0f92e32" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="1058" wordCount="176" paraCount="2" cursorPos="43"/> <meta charCount="1058" wordCount="176" paraCount="2" cursorPos="43"/>
<name status="Finished" exported="True">Front Matter</name> <name status="Finished" import="New" exported="True">Front Matter</name>
</item> </item>
<item handle="88d59a277361b" parent="b3643d0f92e32" order="2" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="88d59a277361b" parent="b3643d0f92e32" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="584" wordCount="92" paraCount="1" cursorPos="4"/> <meta charCount="584" wordCount="92" paraCount="1" cursorPos="4"/>
<name status="Draft" exported="True">Prologue</name> <name status="Draft" import="New" exported="True">Prologue</name>
</item> </item>
<item handle="db7e733775d4d" parent="b3643d0f92e32" order="3" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="db7e733775d4d" parent="b3643d0f92e32" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="35" wordCount="6" paraCount="1" cursorPos="42"/> <meta charCount="35" wordCount="6" paraCount="1" cursorPos="42"/>
<name status="New" exported="True">Act One</name> <name status="New" import="New" exported="True">Act One</name>
</item> </item>
<item handle="45e6b01ca35c1" parent="b3643d0f92e32" order="4" type="FOLDER" class="NOVEL"> <item handle="45e6b01ca35c1" parent="b3643d0f92e32" order="4" type="FOLDER" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="Draft">Chapter One</name> <name status="Draft" import="New">Chapter One</name>
</item> </item>
<item handle="fb609cd8319dc" parent="45e6b01ca35c1" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="fb609cd8319dc" parent="45e6b01ca35c1" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="419" wordCount="67" paraCount="1" cursorPos="56"/> <meta charCount="419" wordCount="67" paraCount="1" cursorPos="56"/>
<name status="Draft" exported="True">Chapter One</name> <name status="Draft" import="New" exported="True">Chapter One</name>
</item> </item>
<item handle="88243afbe5ed8" parent="45e6b01ca35c1" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="88243afbe5ed8" parent="45e6b01ca35c1" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="2758" wordCount="404" paraCount="4" cursorPos="1528"/> <meta charCount="2758" wordCount="404" paraCount="4" cursorPos="1528"/>
<name status="Finished" exported="True">Scene One</name> <name status="Finished" import="New" exported="True">Scene One</name>
</item> </item>
<item handle="f96ec11c6a3da" parent="45e6b01ca35c1" order="2" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="f96ec11c6a3da" parent="45e6b01ca35c1" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="4043" wordCount="600" paraCount="6" cursorPos="2335"/> <meta charCount="4043" wordCount="600" paraCount="6" cursorPos="2335"/>
<name status="Finished" exported="True">Scene Two</name> <name status="Finished" import="New" exported="True">Scene Two</name>
</item> </item>
<item handle="846352075de7d" parent="b3643d0f92e32" order="5" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="846352075de7d" parent="b3643d0f92e32" order="5" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="631" wordCount="109" paraCount="3" cursorPos="376"/> <meta charCount="631" wordCount="109" paraCount="3" cursorPos="376"/>
<name status="New" exported="False">Interlude</name> <name status="New" import="New" exported="False">Interlude</name>
</item> </item>
<item handle="6bd935d2490cd" parent="b3643d0f92e32" order="6" type="FOLDER" class="NOVEL"> <item handle="6bd935d2490cd" parent="b3643d0f92e32" order="6" type="FOLDER" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="Draft">Chapter Two</name> <name status="Draft" import="New">Chapter Two</name>
</item> </item>
<item handle="441420a886d82" parent="6bd935d2490cd" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="441420a886d82" parent="6bd935d2490cd" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="477" wordCount="70" paraCount="1" cursorPos="56"/> <meta charCount="477" wordCount="70" paraCount="1" cursorPos="56"/>
<name status="Draft" exported="True">Chapter Two</name> <name status="Draft" import="New" exported="True">Chapter Two</name>
</item> </item>
<item handle="eb103bc70c90c" parent="6bd935d2490cd" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="eb103bc70c90c" parent="6bd935d2490cd" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="3006" wordCount="439" paraCount="4" cursorPos="57"/> <meta charCount="3006" wordCount="439" paraCount="4" cursorPos="57"/>
<name status="Finished" exported="True">Scene Three</name> <name status="Finished" import="New" exported="True">Scene Three</name>
</item> </item>
<item handle="f8c0562e50f1b" parent="6bd935d2490cd" order="2" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="f8c0562e50f1b" parent="6bd935d2490cd" order="2" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="3839" wordCount="563" paraCount="6" cursorPos="56"/> <meta charCount="3839" wordCount="563" paraCount="6" cursorPos="56"/>
<name status="Finished" exported="True">Scene Four</name> <name status="Finished" import="New" exported="True">Scene Four</name>
</item> </item>
<item handle="47666c91c7ccf" parent="6bd935d2490cd" order="3" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="47666c91c7ccf" parent="6bd935d2490cd" order="3" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="3644" wordCount="543" paraCount="5" cursorPos="351"/> <meta charCount="3644" wordCount="543" paraCount="5" cursorPos="351"/>
<name status="Finished" exported="True">Scene Five</name> <name status="Finished" import="New" exported="True">Scene Five</name>
</item> </item>
<item handle="67a8707f2f249" parent="None" order="1" type="ROOT" class="CHARACTER"> <item handle="67a8707f2f249" parent="None" order="1" type="ROOT" class="CHARACTER">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Characters</name> <name status="New" import="New">Characters</name>
</item> </item>
<item handle="4c4f28287af27" parent="67a8707f2f249" order="0" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="4c4f28287af27" parent="67a8707f2f249" order="0" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="1864" wordCount="284" paraCount="3" cursorPos="1883"/> <meta charCount="1864" wordCount="284" paraCount="3" cursorPos="1883"/>
<name status="Major" exported="True">Mr. Nobody</name> <name status="New" import="New" exported="True">Mr. Nobody</name>
</item> </item>
<item handle="6c6afb1247750" parent="None" order="2" type="ROOT" class="PLOT"> <item handle="6c6afb1247750" parent="None" order="2" type="ROOT" class="PLOT">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Plot</name> <name status="New" import="New">Plot</name>
</item> </item>
<item handle="2426c6f0ca922" parent="6c6afb1247750" order="0" type="FILE" class="PLOT" layout="NOTE"> <item handle="2426c6f0ca922" parent="6c6afb1247750" order="0" type="FILE" class="PLOT" layout="NOTE">
<meta charCount="1369" wordCount="195" paraCount="2" cursorPos="1387"/> <meta charCount="1369" wordCount="195" paraCount="2" cursorPos="1387"/>
<name status="Main" exported="True">Main</name> <name status="New" import="New" exported="True">Main</name>
</item> </item>
<item handle="60bdf227455cc" parent="None" order="3" type="ROOT" class="WORLD"> <item handle="60bdf227455cc" parent="None" order="3" type="ROOT" class="WORLD">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">World</name> <name status="New" import="New">World</name>
</item> </item>
<item handle="04468803b92e1" parent="60bdf227455cc" order="0" type="FILE" class="WORLD" layout="NOTE"> <item handle="04468803b92e1" parent="60bdf227455cc" order="0" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="1770" wordCount="259" paraCount="3" cursorPos="1792"/> <meta charCount="1770" wordCount="259" paraCount="3" cursorPos="1792"/>
<name status="Minor" exported="True">Ancient Europe</name> <name status="New" import="New" exported="True">Ancient Europe</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
+19 -19
View File
@@ -1,13 +1,13 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:21"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:36:18">
<project> <project>
<name>Test Minimal</name> <name>Test Minimal</name>
<title>Minimal</title> <title>Minimal</title>
<author>Jane Doe</author> <author>Jane Doe</author>
<author>John Doh</author> <author>John Doh</author>
<saveCount>12</saveCount> <saveCount>14</saveCount>
<autoCount>2</autoCount> <autoCount>2</autoCount>
<editTime>129</editTime> <editTime>135</editTime>
</project> </project>
<settings> <settings>
<doBackup>True</doBackup> <doBackup>True</doBackup>
@@ -29,50 +29,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="a508bb932959c" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="a508bb932959c" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Novel</name> <name status="New" import="New">Novel</name>
</item> </item>
<item handle="a35baf2e93843" parent="a508bb932959c" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="a35baf2e93843" parent="a508bb932959c" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="28" wordCount="6" paraCount="1" cursorPos="33"/> <meta charCount="28" wordCount="6" paraCount="1" cursorPos="33"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="New" exported="True">Title Page</name>
</item> </item>
<item handle="a6d311a93600a" parent="a508bb932959c" order="1" type="FOLDER" class="NOVEL"> <item handle="a6d311a93600a" parent="a508bb932959c" order="1" type="FOLDER" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">New Chapter</name> <name status="New" import="New">New Chapter</name>
</item> </item>
<item handle="f5ab3e30151e1" parent="a6d311a93600a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="f5ab3e30151e1" parent="a6d311a93600a" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="16"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="16"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="New" exported="True">New Chapter</name>
</item> </item>
<item handle="8c659a11cd429" parent="a6d311a93600a" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="8c659a11cd429" parent="a6d311a93600a" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="9" wordCount="2" paraCount="0" cursorPos="15"/> <meta charCount="9" wordCount="2" paraCount="0" cursorPos="15"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="New" exported="True">New Scene</name>
</item> </item>
<item handle="7695ce551d265" parent="None" order="1" type="ROOT" class="PLOT"> <item handle="7695ce551d265" parent="None" order="1" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="New">Plot</name>
</item> </item>
<item handle="afb3043c7b2b3" parent="None" order="2" type="ROOT" class="CHARACTER"> <item handle="afb3043c7b2b3" parent="None" order="2" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="New">Characters</name>
</item> </item>
<item handle="9d5247ab588e0" parent="None" order="3" type="ROOT" class="WORLD"> <item handle="9d5247ab588e0" parent="None" order="3" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">World</name> <name status="New" import="New">World</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:31"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:38:23">
<project> <project>
<name>Test Custom</name> <name>Test Custom</name>
<title>Test Novel</title> <title>Test Novel</title>
@@ -29,110 +29,110 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="23"> <content count="23">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="None">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="None">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="None">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Locations</name> <name status="New" import="None">Locations</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="None" order="0" type="ROOT" class="TIMELINE"> <item handle="25fc0e7096fc6" parent="None" order="0" type="ROOT" class="TIMELINE">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Timeline</name> <name status="New" import="None">Timeline</name>
</item> </item>
<item handle="31489056e0916" parent="None" order="0" type="ROOT" class="OBJECT"> <item handle="31489056e0916" parent="None" order="0" type="ROOT" class="OBJECT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Objects</name> <name status="New" import="None">Objects</name>
</item> </item>
<item handle="98010bd9270f9" parent="None" order="0" type="ROOT" class="ENTITY"> <item handle="98010bd9270f9" parent="None" order="0" type="ROOT" class="ENTITY">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Entities</name> <name status="New" import="None">Entities</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="None" exported="True">Title Page</name>
</item> </item>
<item handle="1a6562590ef19" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="1a6562590ef19" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Chapter 1</name> <name status="New" import="None">Chapter 1</name>
</item> </item>
<item handle="031b4af5197ec" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="031b4af5197ec" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Chapter 1</name> <name status="New" import="None" exported="True">Chapter 1</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="41cfc0d1f2d12" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 1.1</name> <name status="New" import="None" exported="True">Scene 1.1</name>
</item> </item>
<item handle="2858dcd1057d3" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="2858dcd1057d3" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 1.2</name> <name status="New" import="None" exported="True">Scene 1.2</name>
</item> </item>
<item handle="2fca346db6561" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="2fca346db6561" parent="1a6562590ef19" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 1.3</name> <name status="New" import="None" exported="True">Scene 1.3</name>
</item> </item>
<item handle="02d20bbd7e394" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="02d20bbd7e394" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Chapter 2</name> <name status="New" import="None">Chapter 2</name>
</item> </item>
<item handle="7688b6ef52555" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="7688b6ef52555" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Chapter 2</name> <name status="New" import="None" exported="True">Chapter 2</name>
</item> </item>
<item handle="c837649cce43f" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="c837649cce43f" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 2.1</name> <name status="New" import="None" exported="True">Scene 2.1</name>
</item> </item>
<item handle="6208ef0f7750c" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="6208ef0f7750c" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 2.2</name> <name status="New" import="None" exported="True">Scene 2.2</name>
</item> </item>
<item handle="3e1e967e9b793" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="3e1e967e9b793" parent="02d20bbd7e394" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 2.3</name> <name status="New" import="None" exported="True">Scene 2.3</name>
</item> </item>
<item handle="39fa9ec190eee" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="39fa9ec190eee" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Chapter 3</name> <name status="New" import="None">Chapter 3</name>
</item> </item>
<item handle="d029fa3a95e17" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="d029fa3a95e17" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Chapter 3</name> <name status="New" import="None" exported="True">Chapter 3</name>
</item> </item>
<item handle="81b8a03f97e87" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="81b8a03f97e87" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 3.1</name> <name status="New" import="None" exported="True">Scene 3.1</name>
</item> </item>
<item handle="da4ea2a5506f2" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="da4ea2a5506f2" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 3.2</name> <name status="New" import="None" exported="True">Scene 3.2</name>
</item> </item>
<item handle="a68b412c42825" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="a68b412c42825" parent="39fa9ec190eee" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 3.3</name> <name status="New" import="None" exported="True">Scene 3.3</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:31"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:38:23">
<project> <project>
<name>Test Custom</name> <name>Test Custom</name>
<title>Test Novel</title> <title>Test Novel</title>
@@ -29,74 +29,74 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="14"> <content count="14">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="None">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="None">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="None">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Locations</name> <name status="New" import="None">Locations</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="None" order="0" type="ROOT" class="TIMELINE"> <item handle="25fc0e7096fc6" parent="None" order="0" type="ROOT" class="TIMELINE">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Timeline</name> <name status="New" import="None">Timeline</name>
</item> </item>
<item handle="31489056e0916" parent="None" order="0" type="ROOT" class="OBJECT"> <item handle="31489056e0916" parent="None" order="0" type="ROOT" class="OBJECT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Objects</name> <name status="New" import="None">Objects</name>
</item> </item>
<item handle="98010bd9270f9" parent="None" order="0" type="ROOT" class="ENTITY"> <item handle="98010bd9270f9" parent="None" order="0" type="ROOT" class="ENTITY">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Entities</name> <name status="New" import="None">Entities</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="None" exported="True">Title Page</name>
</item> </item>
<item handle="1a6562590ef19" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="1a6562590ef19" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 1</name> <name status="New" import="None" exported="True">Scene 1</name>
</item> </item>
<item handle="031b4af5197ec" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="031b4af5197ec" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 2</name> <name status="New" import="None" exported="True">Scene 2</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="41cfc0d1f2d12" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 3</name> <name status="New" import="None" exported="True">Scene 3</name>
</item> </item>
<item handle="2858dcd1057d3" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="2858dcd1057d3" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 4</name> <name status="New" import="None" exported="True">Scene 4</name>
</item> </item>
<item handle="2fca346db6561" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="2fca346db6561" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 5</name> <name status="New" import="None" exported="True">Scene 5</name>
</item> </item>
<item handle="02d20bbd7e394" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="02d20bbd7e394" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Scene 6</name> <name status="New" import="None" exported="True">Scene 6</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:32"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:38:23">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,58 +27,58 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="10"> <content count="10">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="New">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="New">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="New">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">World</name> <name status="New" import="New">World</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="New" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="31489056e0916" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">New Chapter</name> <name status="New" import="New">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="New" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="New" exported="True">New Scene</name>
</item> </item>
<item handle="1a6562590ef19" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="1a6562590ef19" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Hello</name> <name status="New" import="None" exported="True">Hello</name>
</item> </item>
<item handle="031b4af5197ec" parent="71ee45a3c0db9" order="0" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="031b4af5197ec" parent="71ee45a3c0db9" order="0" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Jane</name> <name status="New" import="None" exported="True">Jane</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:31"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:54:40">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,50 +27,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="New">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="New">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="New">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">World</name> <name status="New" import="New">World</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="New" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="31489056e0916" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">New Chapter</name> <name status="New" import="New">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="New" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="New" exported="True">New Scene</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:32"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:38:23">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,66 +27,66 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="12"> <content count="12">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="New">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="New">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="New">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">World</name> <name status="New" import="New">World</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="New" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="31489056e0916" parent="73475cb40a568" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">New Chapter</name> <name status="New" import="New">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="New" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="New" exported="True">New Scene</name>
</item> </item>
<item handle="1a6562590ef19" parent="None" order="0" type="ROOT" class="TIMELINE"> <item handle="1a6562590ef19" parent="None" order="0" type="ROOT" class="TIMELINE">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Timeline</name> <name status="New" import="None">Timeline</name>
</item> </item>
<item handle="031b4af5197ec" parent="None" order="0" type="ROOT" class="OBJECT"> <item handle="031b4af5197ec" parent="None" order="0" type="ROOT" class="OBJECT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Object</name> <name status="New" import="None">Object</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="None" order="0" type="ROOT" class="CUSTOM"> <item handle="41cfc0d1f2d12" parent="None" order="0" type="ROOT" class="CUSTOM">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Custom1</name> <name status="New" import="None">Custom1</name>
</item> </item>
<item handle="2858dcd1057d3" parent="None" order="0" type="ROOT" class="CUSTOM"> <item handle="2858dcd1057d3" parent="None" order="0" type="ROOT" class="CUSTOM">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Custom2</name> <name status="New" import="None">Custom2</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 22:05:03"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:31:53">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,66 +27,66 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="12"> <content count="12">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Novel</name> <name status="New" import="New">Novel</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="New" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" order="1" type="FOLDER" class="NOVEL"> <item handle="31489056e0916" parent="73475cb40a568" order="1" type="FOLDER" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">New Chapter</name> <name status="New" import="New">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="New" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="31489056e0916" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="612" wordCount="95" paraCount="10" cursorPos="768"/> <meta charCount="612" wordCount="95" paraCount="10" cursorPos="768"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="New" exported="True">New Scene</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="1" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="1" type="ROOT" class="PLOT">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Plot</name> <name status="New" import="New">Plot</name>
</item> </item>
<item handle="031b4af5197ec" parent="44cb730c42048" order="0" type="FILE" class="PLOT" layout="NOTE"> <item handle="031b4af5197ec" parent="44cb730c42048" order="0" type="FILE" class="PLOT" layout="NOTE">
<meta charCount="48" wordCount="10" paraCount="1" cursorPos="69"/> <meta charCount="48" wordCount="10" paraCount="1" cursorPos="69"/>
<name status="New" exported="True">New File</name> <name status="New" import="None" exported="True">New File</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="2" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="2" type="ROOT" class="CHARACTER">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">Characters</name> <name status="New" import="New">Characters</name>
</item> </item>
<item handle="1a6562590ef19" parent="71ee45a3c0db9" order="0" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="1a6562590ef19" parent="71ee45a3c0db9" order="0" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="34" wordCount="8" paraCount="1" cursorPos="51"/> <meta charCount="34" wordCount="8" paraCount="1" cursorPos="51"/>
<name status="New" exported="True">New File</name> <name status="New" import="None" exported="True">New File</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="3" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="3" type="ROOT" class="WORLD">
<meta expanded="True"/> <meta expanded="True"/>
<name status="New">World</name> <name status="New" import="New">World</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="811786ad1ae74" order="0" type="FILE" class="WORLD" layout="NOTE"> <item handle="41cfc0d1f2d12" parent="811786ad1ae74" order="0" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="51" wordCount="9" paraCount="1" cursorPos="68"/> <meta charCount="51" wordCount="9" paraCount="1" cursorPos="68"/>
<name status="New" exported="True">New File</name> <name status="New" import="None" exported="True">New File</name>
</item> </item>
<item handle="2fca346db6561" parent="None" order="4" type="TRASH" class="TRASH"> <item handle="2fca346db6561" parent="None" order="4" type="TRASH" class="TRASH">
<meta expanded="True"/> <meta expanded="True"/>
<name status="None">Trash</name> <name status="None" import="None">Trash</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:41"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:00:21">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,50 +27,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="150" red="200">Draft</entry> <entry red="200" green="150" blue="0">Draft</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="200" red="50">Main</entry> <entry red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="None">Novel</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="None" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" order="1" type="FOLDER" class="NOVEL"> <item handle="31489056e0916" parent="73475cb40a568" order="1" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">New Chapter</name> <name status="New" import="None">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="None" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="31489056e0916" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="None" exported="True">New Scene</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="1" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="1" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="None">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="2" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="2" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="None">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="3" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="3" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">World</name> <name status="New" import="None">World</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:36"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-03 21:00:18">
<project> <project>
<name>Project Name</name> <name>Project Name</name>
<title>Project Title</title> <title>Project Title</title>
@@ -33,50 +33,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Note</entry> <entry red="200" green="50" blue="0">Note</entry>
<entry blue="0" green="200" red="50">Finished</entry> <entry red="50" green="200" blue="0">Finished</entry>
<entry blue="40" green="30" red="20">Final</entry> <entry red="20" green="30" blue="40">Final</entry>
</status> </status>
<importance> <importance>
<entry blue="100" green="100" red="100">New</entry> <entry red="100" green="100" blue="100">New</entry>
<entry blue="0" green="50" red="200">Minor</entry> <entry red="200" green="50" blue="0">Minor</entry>
<entry blue="0" green="150" red="200">Major</entry> <entry red="200" green="150" blue="0">Major</entry>
<entry blue="0" green="0" red="0">Final</entry> <entry red="0" green="0" blue="0">Final</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL"> <item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Novel</name> <name status="New" import="None">Novel</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="25fc0e7096fc6" parent="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">Title Page</name> <name status="New" import="None" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" order="1" type="FOLDER" class="NOVEL"> <item handle="31489056e0916" parent="73475cb40a568" order="1" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">New Chapter</name> <name status="New" import="None">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="98010bd9270f9" parent="31489056e0916" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Chapter</name> <name status="New" import="None" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0e17daca5f3e1" parent="31489056e0916" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="New" exported="True">New Scene</name> <name status="New" import="None" exported="True">New Scene</name>
</item> </item>
<item handle="44cb730c42048" parent="None" order="1" type="ROOT" class="PLOT"> <item handle="44cb730c42048" parent="None" order="1" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Plot</name> <name status="New" import="None">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" order="2" type="ROOT" class="CHARACTER"> <item handle="71ee45a3c0db9" parent="None" order="2" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">Characters</name> <name status="New" import="None">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" order="3" type="ROOT" class="WORLD"> <item handle="811786ad1ae74" parent="None" order="3" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="New">World</name> <name status="New" import="None">World</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
+60 -15
View File
@@ -23,6 +23,8 @@ import pytest
from lxml import etree from lxml import etree
from PyQt5.QtGui import QIcon
from novelwriter.core import NWProject from novelwriter.core import NWProject
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
@@ -74,16 +76,17 @@ def testCoreItem_Setters(mockGUI):
assert theItem.itemOrder == 1 assert theItem.itemOrder == 1
# Importance # Importance
theItem.setStatus("Nonsense") theItem._class = nwItemClass.CHARACTER
assert theItem.itemStatus == "New" theItem.setImport("Nonsense")
theItem.setStatus("New") assert theItem.itemImport == "New"
assert theItem.itemStatus == "New" theItem.setImport("New")
theItem.setStatus("Minor") assert theItem.itemImport == "New"
assert theItem.itemStatus == "Minor" theItem.setImport("Minor")
theItem.setStatus("Major") assert theItem.itemImport == "Minor"
assert theItem.itemStatus == "Major" theItem.setImport("Major")
theItem.setStatus("Main") assert theItem.itemImport == "Major"
assert theItem.itemStatus == "Main" theItem.setImport("Main")
assert theItem.itemImport == "Main"
# Status # Status
theItem._class = nwItemClass.NOVEL theItem._class = nwItemClass.NOVEL
@@ -98,6 +101,27 @@ def testCoreItem_Setters(mockGUI):
theItem.setStatus("Finished") theItem.setStatus("Finished")
assert theItem.itemStatus == "Finished" assert theItem.itemStatus == "Finished"
# Status/Importance Wrapper
theItem._class = nwItemClass.CHARACTER
theItem.setImportStatus("New")
assert theItem.itemImport == "New"
theItem.setImportStatus("Minor")
assert theItem.itemImport == "Minor"
theItem.setImportStatus("Note")
assert theItem.itemImport == "New"
theItem.setImportStatus("Draft")
assert theItem.itemImport == "New"
theItem._class = nwItemClass.NOVEL
theItem.setImportStatus("New")
assert theItem.itemStatus == "New"
theItem.setImportStatus("Minor")
assert theItem.itemStatus == "New"
theItem.setImportStatus("Note")
assert theItem.itemStatus == "Note"
theItem.setImportStatus("Draft")
assert theItem.itemStatus == "Draft"
# Expanded # Expanded
theItem.setExpanded(8) theItem.setExpanded(8)
assert theItem.isExpanded is False assert theItem.isExpanded is False
@@ -196,6 +220,22 @@ def testCoreItem_Methods(mockGUI):
theItem.setLayout("NOTE") theItem.setLayout("NOTE")
assert theItem.describeMe() == "Project Note" assert theItem.describeMe() == "Project Note"
# Status + Icon
# =============
theItem.setType("FILE")
theItem.setStatus("Note")
theItem.setImport("Minor")
theItem.setClass("NOVEL")
stT, stI = theItem.getImportStatus()
assert stT == "Note"
assert isinstance(stI, QIcon)
theItem.setClass("CHARACTER")
stT, stI = theItem.getImportStatus()
assert stT == "Minor"
assert isinstance(stI, QIcon)
# Representation # Representation
# ============== # ==============
@@ -342,9 +382,11 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog):
xContent = etree.SubElement(nwXML, "content") xContent = etree.SubElement(nwXML, "content")
theItem.packXML(xContent) theItem.packXML(xContent)
assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == ( assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == (
b'<content><item handle="0123456789abc" parent="0123456789abc" order="1" type="FILE" ' b'<content>'
b'class="NOVEL" layout="NOTE"><meta charCount="7" wordCount="5" paraCount="3" ' b'<item handle="0123456789abc" parent="0123456789abc" order="1" type="FILE" class="NOVEL" '
b'cursorPos="11"/><name status="New" exported="False">A Name</name></item></content>' b'layout="NOTE"><meta charCount="7" wordCount="5" paraCount="3" cursorPos="11"/>'
b'<name status="New" import="None" exported="False">A Name</name></item>'
b'</content>'
) )
# Unpack # Unpack
@@ -385,8 +427,11 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog):
xContent = etree.SubElement(nwXML, "content") xContent = etree.SubElement(nwXML, "content")
theItem.packXML(xContent) theItem.packXML(xContent)
assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == ( assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == (
b'<content><item handle="0123456789abc" parent="0123456789abc" order="1" type="FOLDER" ' b'<content>'
b'class="NOVEL"><meta expanded="True"/><name status="New">A Name</name></item></content>' b'<item handle="0123456789abc" parent="0123456789abc" order="1" type="FOLDER" '
b'class="NOVEL"><meta expanded="True"/><name status="New" import="None">A Name</name>'
b'</item>'
b'</content>'
) )
# Unpack # Unpack
+2 -6
View File
@@ -61,10 +61,6 @@ def testCoreProject_NewMinimal(fncDir, outDir, refDir, mockGUI):
# Creating the project once more should fail # Creating the project once more should fail
assert theProject.newProject({"projPath": fncDir}) is False assert theProject.newProject({"projPath": fncDir}) is False
# Check the new project
copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile, [2, 6, 7, 8])
# Open again # Open again
assert theProject.openProject(projFile) is True assert theProject.openProject(projFile) is True
@@ -857,7 +853,7 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, mockGUI, tmpDir):
# Change importance # Change importance
fHandle = theProject.newFile("Jane Doe", nwItemClass.CHARACTER, "afb3043c7b2b3") fHandle = theProject.newFile("Jane Doe", nwItemClass.CHARACTER, "afb3043c7b2b3")
theProject.projTree[fHandle].setStatus("Main") theProject.projTree[fHandle].setImport("Main")
newList = [ newList = [
("New", 1, 1, 1, "New"), ("New", 1, 1, 1, "New"),
("Minor", 2, 2, 2, "Minor"), ("Minor", 2, 2, 2, "Minor"),
@@ -872,7 +868,7 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, mockGUI, tmpDir):
assert theProject.importItems._theColours == [ assert theProject.importItems._theColours == [
(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5) (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5)
] ]
assert theProject.projTree[fHandle].itemStatus == "Min" assert theProject.projTree[fHandle].itemImport == "Min"
# Check status counts # Check status counts
assert theProject.statusItems._theCounts == [0, 0, 0, 0, 0] assert theProject.statusItems._theCounts == [0, 0, 0, 0, 0]
+22 -11
View File
@@ -23,6 +23,8 @@ import pytest
from lxml import etree from lxml import etree
from PyQt5.QtGui import QIcon
from novelwriter.core.status import NWStatus from novelwriter.core.status import NWStatus
@@ -48,9 +50,9 @@ def testCoreStatus_Entries():
assert theStatus._theLength == 4 assert theStatus._theLength == 4
# Lookups # Lookups
assert theStatus.lookupEntry(None) is None assert theStatus._getIndex(None) is None
assert theStatus.lookupEntry("stuff") is None assert theStatus._getIndex("stuff") is None
assert theStatus.lookupEntry("Main") == 3 assert theStatus._getIndex("Main") == 3
# Checks # Checks
assert theStatus.checkEntry(123) == "New" assert theStatus.checkEntry(123) == "New"
@@ -58,6 +60,10 @@ def testCoreStatus_Entries():
assert theStatus.checkEntry("New ") == "New" assert theStatus.checkEntry("New ") == "New"
assert theStatus.checkEntry(" Main ") == "Main" assert theStatus.checkEntry(" Main ") == "Main"
# Icons
assert isinstance(theStatus.getIcon("Stuff"), QIcon)
assert isinstance(theStatus.getIcon("New"), QIcon)
# Set new list # Set new list
newList = [ newList = [
("New", 1, 1, 1, "New"), ("New", 1, 1, 1, "New"),
@@ -87,12 +93,17 @@ def testCoreStatus_Entries():
assert theStatus._theCounts == countTo assert theStatus._theCounts == countTo
# Iterate # Iterate
for i, (sA, sB, sC) in enumerate(theStatus): for i, (sA, sB, sC, sD) in enumerate(theStatus):
assert sA == theStatus._theLabels[i] assert sA == theStatus._theLabels[i]
assert sB == theStatus._theColours[i] assert sB == theStatus._theColours[i]
assert sC == theStatus._theCounts[i] assert sC == theStatus._theCounts[i]
assert sD == theStatus._theIcons[i]
assert theStatus[9] == (None, None, None) sA, sB, sC, sD = theStatus[9]
assert sA is None
assert sB is None
assert sC is None
assert isinstance(sD, QIcon)
# Clear counts # Clear counts
theStatus.resetCounts() theStatus.resetCounts()
@@ -122,12 +133,12 @@ def testCoreStatus_XMLPackUnpack():
xStatus = etree.SubElement(nwXML, "status") xStatus = etree.SubElement(nwXML, "status")
theStatus.packXML(xStatus) theStatus.packXML(xStatus)
assert etree.tostring(xStatus, pretty_print=False, encoding="utf-8") == ( assert etree.tostring(xStatus, pretty_print=False, encoding="utf-8") == (
b"<status>" b'<status>'
b"<entry blue=\"100\" green=\"100\" red=\"100\">New</entry>" b'<entry red="100" green="100" blue="100">New</entry>'
b"<entry blue=\"0\" green=\"50\" red=\"200\">Minor</entry>" b'<entry red="200" green="50" blue="0">Minor</entry>'
b"<entry blue=\"0\" green=\"150\" red=\"200\">Major</entry>" b'<entry red="200" green="150" blue="0">Major</entry>'
b"<entry blue=\"0\" green=\"200\" red=\"50\">Main</entry>" b'<entry red="50" green="200" blue="0">Main</entry>'
b"</status>" b'</status>'
) )
# Unpack # Unpack
+5 -1
View File
@@ -30,7 +30,7 @@ from novelwriter.core.tokenizer import Tokenizer
class BareTokenizer(Tokenizer): class BareTokenizer(Tokenizer):
def doConvert(self): def doConvert(self):
pass super().doConvert()
@pytest.mark.core @pytest.mark.core
@@ -219,6 +219,10 @@ def testCoreToken_TextOps(monkeypatch, nwMinimal, mockGUI):
"# Notes: Plot\n\n" "# Notes: Plot\n\n"
) )
# Ckeck abstract method
with pytest.raises(NotImplementedError):
theToken.doConvert()
# END Test testCoreToken_TextOps # END Test testCoreToken_TextOps
+12 -11
View File
@@ -387,25 +387,26 @@ def testCoreTree_XMLPackUnpack(mockGUI, mockItems):
assert etree.tostring(nwXML, pretty_print=False, encoding="utf-8") == ( assert etree.tostring(nwXML, pretty_print=False, encoding="utf-8") == (
b'<novelWriterXML>' b'<novelWriterXML>'
b'<content count="8">' b'<content count="8">'
b'<item handle="a000000000001" parent="None" order="0" type="ROOT" class="NOVEL">' b'<item handle="a000000000001" parent="None" order="0" type="ROOT" class="NOVEL"><meta '
b'<meta expanded="True"/><name status="None">Novel</name></item>' b'expanded="True"/><name status="None" import="None">Novel</name></item>'
b'<item handle="b000000000001" parent="a000000000001" order="0" type="FOLDER" ' b'<item handle="b000000000001" parent="a000000000001" order="0" type="FOLDER" '
b'class="NOVEL"><meta expanded="True"/><name status="None">Act One</name></item>' b'class="NOVEL"><meta expanded="True"/><name status="None" import="None">Act One</name>'
b'</item>'
b'<item handle="c000000000001" parent="b000000000001" order="0" type="FILE" class="NOVEL" ' b'<item handle="c000000000001" parent="b000000000001" order="0" type="FILE" class="NOVEL" '
b'layout="DOCUMENT"><meta charCount="300" wordCount="50" paraCount="2" cursorPos="0"/>' b'layout="DOCUMENT"><meta charCount="300" wordCount="50" paraCount="2" cursorPos="0"/>'
b'<name status="None" exported="True">Chapter One</name></item>' b'<name status="None" import="None" exported="True">Chapter One</name></item>'
b'<item handle="c000000000002" parent="b000000000001" order="0" type="FILE" class="NOVEL" ' b'<item handle="c000000000002" parent="b000000000001" order="0" type="FILE" class="NOVEL" '
b'layout="DOCUMENT"><meta charCount="3000" wordCount="500" paraCount="20" cursorPos="0"/>' b'layout="DOCUMENT"><meta charCount="3000" wordCount="500" paraCount="20" cursorPos="0"/>'
b'<name status="None" exported="True">Scene One</name></item>' b'<name status="None" import="None" exported="True">Scene One</name></item>'
b'<item handle="a000000000002" parent="None" order="0" type="ROOT" class="ARCHIVE">' b'<item handle="a000000000002" parent="None" order="0" type="ROOT" class="ARCHIVE"><meta '
b'<meta expanded="False"/><name status="None">Outtakes</name></item>' b'expanded="False"/><name status="None" import="None">Outtakes</name></item>'
b'<item handle="a000000000003" parent="None" order="0" type="TRASH" class="TRASH">' b'<item handle="a000000000003" parent="None" order="0" type="TRASH" class="TRASH"><meta '
b'<meta expanded="False"/><name status="None">Trash</name></item>' b'expanded="False"/><name status="None" import="None">Trash</name></item>'
b'<item handle="a000000000004" parent="None" order="0" type="ROOT" class="CHARACTER">' b'<item handle="a000000000004" parent="None" order="0" type="ROOT" class="CHARACTER">'
b'<meta expanded="True"/><name status="None">Characters</name></item>' b'<meta expanded="True"/><name status="None" import="None">Characters</name></item>'
b'<item handle="b000000000002" parent="a000000000002" order="0" type="FILE" ' b'<item handle="b000000000002" parent="a000000000002" order="0" type="FILE" '
b'class="CHARACTER" layout="NOTE"><meta charCount="2000" wordCount="400" paraCount="16" ' b'class="CHARACTER" layout="NOTE"><meta charCount="2000" wordCount="400" paraCount="16" '
b'cursorPos="0"/><name status="None" exported="True">Jane Doe</name></item>' b'cursorPos="0"/><name status="None" import="None" exported="True">Jane Doe</name></item>'
b'</content>' b'</content>'
b'</novelWriterXML>' b'</novelWriterXML>'
) )
+3 -2
View File
@@ -174,11 +174,12 @@ def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj):
itemEdit.editName.setText("New Character") itemEdit.editName.setText("New Character")
itemEdit.editStatus.setCurrentIndex(1) itemEdit.editStatus.setCurrentIndex(1)
itemEdit.editExport.setChecked(False) itemEdit.editExport.setChecked(False)
itemEdit._doSave()
# Check New Settings # Check New Settings
itemEdit._doSave()
assert itemEdit.theItem.itemName == "New Character" assert itemEdit.theItem.itemName == "New Character"
assert itemEdit.theItem.itemStatus == "Minor" assert itemEdit.theItem.itemStatus == "New"
assert itemEdit.theItem.itemImport == "Minor"
assert itemEdit.theItem.itemLayout == nwItemLayout.NOTE assert itemEdit.theItem.itemLayout == nwItemLayout.NOTE
assert itemEdit.theItem.isExported is False assert itemEdit.theItem.isExported is False