From 8d8fc72cc1b05f74cf63e0e9b79350fed35b7846 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 12 May 2019 21:32:09 +0200 Subject: [PATCH 1/3] Added common function for generating colour ranges, and added test for the common file --- nw/common.py | 33 +++++++++++++++++++++++++++++++- tests/nwtools.py | 13 ++++++++++++- tests/test_common.py | 45 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 tests/test_common.py diff --git a/nw/common.py b/nw/common.py index ab413a43..b1b1b4f7 100644 --- a/nw/common.py +++ b/nw/common.py @@ -19,7 +19,8 @@ def checkString(checkValue, defaultValue, allowNone=False): if allowNone: if checkValue == None: return None if checkValue == "None": return None - if isinstance(checkValue,str): return str(checkValue) + if isinstance(checkValue,str): + return str(checkValue) return defaultValue def checkInt(checkValue, defaultValue, allowNone=False): @@ -50,3 +51,33 @@ def checkBool(checkValue, defaultValue, allowNone=False): else: return defaultValue return defaultValue + +def colRange(rgbStart, rgbEnd, nStep): + + if len(rgbStart) != 3 and len(rgbEnd) != 3 and nStep < 1: + logger.error("Cannot create colour range from given parameters") + return None + + if nStep == 1: + return rgbStart + elif nStep == 2: + return [rgbStart, rgbEnd] + + dC = [0,0,0] + for c in range(3): + cA = rgbStart[c] + cB = rgbEnd[c] + dC[c] = (cB-cA)/(nStep-1) + print(dC) + retCol = [rgbStart] + for n in range(nStep): + if n > 0 and n < nStep: + retCol.append([ + int(retCol[n-1][0] + dC[0]), + int(retCol[n-1][1] + dC[1]), + int(retCol[n-1][2] + dC[2]), + ]) + retCol[-1] = rgbEnd + print(retCol) + + return retCol diff --git a/tests/nwtools.py b/tests/nwtools.py index dc3bd24b..34063c4f 100644 --- a/tests/nwtools.py +++ b/tests/nwtools.py @@ -3,6 +3,7 @@ """ from os import path, mkdir +from itertools import chain def ensureDir(theDir): if not path.isdir(theDir): @@ -28,7 +29,7 @@ def cmpFiles(fileOne, fileTwo, ignoreLines=[]): if n+1 in ignoreLines: print("Ignoring line %d" % (n+1)) continue - + if lnOne != lnTwo: print("Diff on line %d:" % (n+1)) print(" << '%s'" % lnOne) @@ -39,3 +40,13 @@ def cmpFiles(fileOne, fileTwo, ignoreLines=[]): foTwo.close() return not diffFound + +def cmpList(listOne, listTwo): + flatOne = list(chain.from_iterable([listOne])) + flatTwo = list(chain.from_iterable([listTwo])) + if len(flatOne) != len(flatTwo): + return False + for i in range(len(flatOne)): + if flatOne[i] != flatTwo[i]: + return False + return True diff --git a/tests/test_common.py b/tests/test_common.py new file mode 100644 index 00000000..d9694249 --- /dev/null +++ b/tests/test_common.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +"""novelWriter Common Class Tester +""" + +import nw +from nw.common import * +from nwtools import cmpList + +def testCheckString(): + assert checkString(None, "NotNone",True) is None + assert checkString("None","NotNone",True) is None + assert checkString("None","NotNone",False) == "None" + assert checkString(None, "NotNone",False) == "NotNone" + assert checkString(1, "NotNone",False) == "NotNone" + assert checkString(1.0, "NotNone",False) == "NotNone" + assert checkString(True, "NotNone",False) == "NotNone" + +def testCheckInt(): + assert checkInt(None, 3,True) is None + assert checkInt("None",3,True) is None + assert checkInt(None, 3,False) == 3 + assert checkInt(1, 3,False) == 1 + assert checkInt(1.0, 3,False) == 1 + assert checkInt(True, 3,False) == 1 + +def testCheckBool(): + assert checkBool(None, 3, True) is None + assert checkBool("None", 3, True) is None + assert checkBool("True", False,False) == True + assert checkBool("False",True, False) == False + assert checkBool("Boo", None, False) is None + assert checkBool(0, None, False) == False + assert checkBool(1, None, False) == True + assert checkBool(2, None, False) is None + assert checkBool(0.0, None, False) is None + assert checkBool(1.0, None, False) is None + assert checkBool(2.0, None, False) is None + +def testColRange(): + assert colRange([0,0], [0,0], 0) is None + assert cmpList(colRange([200,50,0], [50,200,0], 1), [200,50,0]) + assert cmpList(colRange([200,50,0], [50,200,0], 2), [[200,50,0],[50,200,0]]) + assert cmpList(colRange([200,50,0], [50,200,0], 3), [[200,50,0],[125,125,0],[50,200,0]]) + assert cmpList(colRange([200,50,0], [50,200,0], 4), [[200,50,0],[150,100,0],[100,150,0],[50,200,0]]) + assert cmpList(colRange([200,50,0], [50,200,0], 5), [[200,50,0],[162,87,0],[124,124,0],[86,161,0],[50,200,0]]) From 53b97e83998bf1b3557625efef371ad546e9998d Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 12 May 2019 21:54:21 +0200 Subject: [PATCH 2/3] Importance colours added to the GUI --- nw/gui/docdetails.py | 14 +++++++++++--- nw/gui/doctree.py | 18 +++++++++++++----- nw/gui/itemeditor.py | 14 ++++++++++---- nw/gui/winmain.py | 14 ++++++++++++++ nw/project/project.py | 9 ++++++++- 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/nw/gui/docdetails.py b/nw/gui/docdetails.py index c8b6a078..1552640a 100644 --- a/nw/gui/docdetails.py +++ b/nw/gui/docdetails.py @@ -71,11 +71,19 @@ class GuiDocDetails(QFrame): colTwo = [""]*4 else: itemStatus = nwItem.itemStatus - if itemStatus < 0 or itemStatus >= len(self.theParent.statusLabels): - itemStatus = 0 + if nwItem.itemClass == nwItemClass.NOVEL: + if itemStatus < 0 or itemStatus >= len(self.theParent.statusLabels): + statusLabel = self.theParent.statusLabels[0] + else: + statusLabel = self.theParent.statusLabels[itemStatus] + else: + if itemStatus < 0 or itemStatus >= len(self.theParent.importLabels): + statusLabel = self.theParent.importLabels[0] + else: + statusLabel = self.theParent.importLabels[itemStatus] colTwo = [ nwItem.itemName, - self.theParent.statusLabels[itemStatus], + statusLabel, nwLabels.CLASS_NAME[nwItem.itemClass], nwLabels.LAYOUT_NAME[nwItem.itemLayout], ] diff --git a/nw/gui/doctree.py b/nw/gui/doctree.py index 0893ad07..ef80d98a 100644 --- a/nw/gui/doctree.py +++ b/nw/gui/doctree.py @@ -19,9 +19,8 @@ from PyQt5.QtGui import QIcon, QFont, QColor from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QAbstractItemView, QInputDialog, QLineEdit, QApplication from nw.project.item import NWItem -from nw.enum import nwItemType, nwItemClass +from nw.enum import nwItemType, nwItemClass, nwAlert from nw.constants import nwLabels -from nw.enum import nwAlert logger = logging.getLogger(__name__) @@ -256,6 +255,7 @@ class GuiDocTree(QTreeWidget): trItem = self._getTreeItem(tHandle) nwItem = self.theProject.getItem(tHandle) tName = nwItem.itemName + tClass = nwItem.itemClass tHandle = nwItem.itemHandle pHandle = nwItem.parHandle @@ -263,12 +263,20 @@ class GuiDocTree(QTreeWidget): if nwItem.itemType == nwItemType.FILE: tStatus += "."+nwLabels.LAYOUT_FLAG[nwItem.itemLayout] nStatus = nwItem.itemStatus - if nStatus < 0 or nStatus >= len(self.theParent.statusIcons): - nStatus = 0 + if tClass == nwItemClass.NOVEL: + if nStatus < 0 or nStatus >= len(self.theParent.statusIcons): + flagIcon = self.theParent.statusIcons[0] + else: + flagIcon = self.theParent.statusIcons[nStatus] + else: + if nStatus < 0 or nStatus >= len(self.theParent.importIcons): + flagIcon = self.theParent.importIcons[0] + else: + flagIcon = self.theParent.importIcons[nStatus] trItem.setText(self.C_NAME,tName) trItem.setText(self.C_FLAGS,tStatus) - trItem.setIcon(self.C_FLAGS,self.theParent.statusIcons[nStatus]) + trItem.setIcon(self.C_FLAGS,flagIcon) return diff --git a/nw/gui/itemeditor.py b/nw/gui/itemeditor.py index 5ebbcfe1..3cc48140 100644 --- a/nw/gui/itemeditor.py +++ b/nw/gui/itemeditor.py @@ -54,10 +54,16 @@ class GuiItemEditor(QDialog): self.editStatus = QComboBox() self.editLayout = QComboBox() - for n in range(len(self.theParent.statusLabels)): - self.editStatus.addItem( - self.theParent.statusIcons[n], self.theParent.statusLabels[n], n - ) + if self.theItem.itemClass == nwItemClass.NOVEL: + for n in range(len(self.theParent.statusLabels)): + self.editStatus.addItem( + self.theParent.statusIcons[n], self.theParent.statusLabels[n], n + ) + else: + for n in range(len(self.theParent.statusLabels)): + self.editStatus.addItem( + self.theParent.importIcons[n], self.theParent.importLabels[n], n + ) self.validLayouts = [] if self.theItem.itemType == nwItemType.FILE: diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 1fbdd5ab..8b1b3357 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -60,6 +60,8 @@ class GuiMain(QMainWindow): # Minor Gui Elements self.statusIcons = [] self.statusLabels = [] + self.importIcons = [] + self.importLabels = [] # Assemble Main Window self.stackPane = QStackedWidget() @@ -87,6 +89,7 @@ class GuiMain(QMainWindow): self.treeView.itemDoubleClicked.connect(self._treeDoubleClick) self.treeView.buildTree() self._makeStatusIcons() + self._makeImportIcons() # Set Main Window Elements self.setMenuBar(self.mainMenu) @@ -179,6 +182,7 @@ class GuiMain(QMainWindow): self.treeView.buildTree() self._setWindowTitle(self.theProject.projName) self._makeStatusIcons() + self._makeImportIcons() self.docEditor.setPwl(path.join(self.theProject.projMeta,"wordlist.txt")) self.docEditor.setSpellCheck(self.theProject.spellCheck) self.mainMenu.updateMenu() @@ -370,6 +374,16 @@ class GuiMain(QMainWindow): self.statusLabels.append(sLabel) return + def _makeImportIcons(self): + self.importIcons = [] + self.importLabels = [] + for sLabel, sR, sG, sB in self.theProject.importCols: + theIcon = QPixmap(32,32) + theIcon.fill(QColor(sR,sG,sB)) + self.importIcons.append(QIcon(theIcon)) + self.importLabels.append(sLabel) + return + ## # Events ## diff --git a/nw/project/project.py b/nw/project/project.py index 1c193b95..14a964c2 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -46,7 +46,6 @@ class NWProject(): self.projMeta = None self.projCache = None self.projFile = None - self.statusCols = None # Project Meta self.projName = None @@ -55,6 +54,8 @@ class NWProject(): # Project Settings self.spellCheck = False + self.statusCols = None + self.importCols = None # Set Defaults self.clearProject() @@ -147,6 +148,12 @@ class NWProject(): ("Draft", 200,150, 0), ("Finished", 50,200, 0), ] + self.importCols = [ + ("None", 100,100,100), + ("Minor", 200, 45, 60), + ("Major", 160, 67,130), + ("Main", 120, 90,200), + ] return From 8b9b5f40adba63efc4c7938f7ec081b83195418e Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 12 May 2019 21:59:31 +0200 Subject: [PATCH 3/3] Use same colours as for status --- nw/project/project.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nw/project/project.py b/nw/project/project.py index 14a964c2..da1af818 100644 --- a/nw/project/project.py +++ b/nw/project/project.py @@ -150,9 +150,9 @@ class NWProject(): ] self.importCols = [ ("None", 100,100,100), - ("Minor", 200, 45, 60), - ("Major", 160, 67,130), - ("Main", 120, 90,200), + ("Minor", 200, 50, 0), + ("Major", 200,150, 0), + ("Main", 50,200, 0), ] return