Allow theme colours for status and importance labels (#2400)
This commit is contained in:
@@ -447,7 +447,6 @@ class nwLabels:
|
|||||||
"Custom": (-1.0, -1.0),
|
"Custom": (-1.0, -1.0),
|
||||||
}
|
}
|
||||||
THEME_COLORS: Final[dict[str, str]] = {
|
THEME_COLORS: Final[dict[str, str]] = {
|
||||||
"theme": QT_TRANSLATE_NOOP("Constant", "Theme Colours"),
|
|
||||||
"default": QT_TRANSLATE_NOOP("Constant", "Foreground Colour"),
|
"default": QT_TRANSLATE_NOOP("Constant", "Foreground Colour"),
|
||||||
"base": QT_TRANSLATE_NOOP("Constant", "Background Colour"),
|
"base": QT_TRANSLATE_NOOP("Constant", "Background Colour"),
|
||||||
"faded": QT_TRANSLATE_NOOP("Constant", "Faded Colour"),
|
"faded": QT_TRANSLATE_NOOP("Constant", "Faded Colour"),
|
||||||
|
|||||||
@@ -483,14 +483,14 @@ class NWProject:
|
|||||||
|
|
||||||
def setDefaultStatusImport(self) -> None:
|
def setDefaultStatusImport(self) -> None:
|
||||||
"""Set the default status and importance values."""
|
"""Set the default status and importance values."""
|
||||||
self._data.itemStatus.add(None, self.tr("New"), (120, 120, 120), "STAR", 0)
|
self._data.itemStatus.add(None, self.tr("New"), "faded", "STAR", 0)
|
||||||
self._data.itemStatus.add(None, self.tr("Note"), (205, 171, 143), "TRIANGLE", 0)
|
self._data.itemStatus.add(None, self.tr("Note"), "red", "TRIANGLE", 0)
|
||||||
self._data.itemStatus.add(None, self.tr("Draft"), (143, 240, 164), "CIRCLE_T", 0)
|
self._data.itemStatus.add(None, self.tr("Draft"), "yellow", "CIRCLE_T", 0)
|
||||||
self._data.itemStatus.add(None, self.tr("Finished"), (249, 240, 107), "STAR", 0)
|
self._data.itemStatus.add(None, self.tr("Finished"), "green", "STAR", 0)
|
||||||
self._data.itemImport.add(None, self.tr("New"), (120, 120, 120), "SQUARE", 0)
|
self._data.itemImport.add(None, self.tr("New"), "purple", "SQUARE", 0)
|
||||||
self._data.itemImport.add(None, self.tr("Minor"), (220, 138, 221), "BLOCK_2", 0)
|
self._data.itemImport.add(None, self.tr("Minor"), "purple", "BLOCK_2", 0)
|
||||||
self._data.itemImport.add(None, self.tr("Major"), (220, 138, 221), "BLOCK_3", 0)
|
self._data.itemImport.add(None, self.tr("Major"), "purple", "BLOCK_3", 0)
|
||||||
self._data.itemImport.add(None, self.tr("Main"), (220, 138, 221), "BLOCK_4", 0)
|
self._data.itemImport.add(None, self.tr("Main"), "purple", "BLOCK_4", 0)
|
||||||
return
|
return
|
||||||
|
|
||||||
def setProjectLang(self, language: str | None) -> None:
|
def setProjectLang(self, language: str | None) -> None:
|
||||||
@@ -547,6 +547,12 @@ class NWProject:
|
|||||||
self._tree.refreshAllItems()
|
self._tree.refreshAllItems()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def updateTheme(self) -> None:
|
||||||
|
"""Update theme elements."""
|
||||||
|
self._data.itemStatus.refreshIcons()
|
||||||
|
self._data.itemImport.refreshIcons()
|
||||||
|
return
|
||||||
|
|
||||||
def localLookup(self, word: str | int) -> str:
|
def localLookup(self, word: str | int) -> str:
|
||||||
"""Look up a word or number in the translation map for the
|
"""Look up a word or number in the translation map for the
|
||||||
project and return it. The variable is cast to a string before
|
project and return it. The variable is cast to a string before
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ if TYPE_CHECKING:
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
FILE_VERSION = "1.5" # The current project file format version
|
FILE_VERSION = "1.5" # The current project file format version
|
||||||
FILE_REVISION = "5" # The current project file format revision
|
FILE_REVISION = "6" # The current project file format revision
|
||||||
HEX_VERSION = 0x0105
|
HEX_VERSION = 0x0105
|
||||||
|
|
||||||
NUM_VERSION = {
|
NUM_VERSION = {
|
||||||
@@ -111,6 +111,8 @@ class ProjectXMLReader:
|
|||||||
nodes. 2.5.
|
nodes. 2.5.
|
||||||
Rev 5: Added novelChars and notesChars attributes to content
|
Rev 5: Added novelChars and notesChars attributes to content
|
||||||
node. 2.7 RC 1.
|
node. 2.7 RC 1.
|
||||||
|
Rev 6: Replaced red, green and blue attributes with a single
|
||||||
|
color attribute. 2.8 Beta 1.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, path: str | Path) -> None:
|
def __init__(self, path: str | Path) -> None:
|
||||||
@@ -439,12 +441,15 @@ class ProjectXMLReader:
|
|||||||
for xEntry in xItem:
|
for xEntry in xItem:
|
||||||
if xEntry.tag == "entry":
|
if xEntry.tag == "entry":
|
||||||
key = xEntry.attrib.get("key", None)
|
key = xEntry.attrib.get("key", None)
|
||||||
red = checkInt(xEntry.attrib.get("red", 0), 0)
|
red = checkInt(xEntry.attrib.get("red", 0), 0) # Deprecated in 1.5 R6
|
||||||
green = checkInt(xEntry.attrib.get("green", 0), 0)
|
green = checkInt(xEntry.attrib.get("green", 0), 0) # Deprecated in 1.5 R6
|
||||||
blue = checkInt(xEntry.attrib.get("blue", 0), 0)
|
blue = checkInt(xEntry.attrib.get("blue", 0), 0) # Deprecated in 1.5 R6
|
||||||
|
color = xEntry.attrib.get("color") # Added in 1.5 R6
|
||||||
count = checkInt(xEntry.attrib.get("count", 0), 0)
|
count = checkInt(xEntry.attrib.get("count", 0), 0)
|
||||||
shape = xEntry.attrib.get("shape", "")
|
shape = xEntry.attrib.get("shape", "")
|
||||||
sObject.add(key, xEntry.text or "", (red, green, blue), shape, count)
|
if color is None:
|
||||||
|
color = f"{red}, {green}, {blue}"
|
||||||
|
sObject.add(key, xEntry.text or "", color, shape, count)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _parseDictKeyText(self, xItem: ET.Element) -> dict:
|
def _parseDictKeyText(self, xItem: ET.Element) -> dict:
|
||||||
|
|||||||
+23
-12
@@ -35,6 +35,7 @@ from PyQt6.QtGui import QColor, QIcon, QPainter, QPainterPath, QPixmap, QPolygon
|
|||||||
|
|
||||||
from novelwriter import SHARED
|
from novelwriter import SHARED
|
||||||
from novelwriter.common import simplified
|
from novelwriter.common import simplified
|
||||||
|
from novelwriter.constants import nwLabels
|
||||||
from novelwriter.enum import nwStatusShape
|
from novelwriter.enum import nwStatusShape
|
||||||
from novelwriter.types import QtPaintAntiAlias, QtTransparent
|
from novelwriter.types import QtPaintAntiAlias, QtTransparent
|
||||||
|
|
||||||
@@ -43,12 +44,15 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
CUSTOM_COL = "custom"
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class StatusEntry:
|
class StatusEntry:
|
||||||
|
|
||||||
name: str
|
name: str
|
||||||
color: QColor
|
color: QColor
|
||||||
|
theme: str
|
||||||
shape: nwStatusShape
|
shape: nwStatusShape
|
||||||
icon: QIcon
|
icon: QIcon
|
||||||
count: int = 0
|
count: int = 0
|
||||||
@@ -62,7 +66,7 @@ class StatusEntry:
|
|||||||
return status
|
return status
|
||||||
|
|
||||||
|
|
||||||
NO_ENTRY = StatusEntry("", QColor(0, 0, 0), nwStatusShape.SQUARE, QIcon(), 0)
|
NO_ENTRY = StatusEntry("", QColor(0, 0, 0), CUSTOM_COL, nwStatusShape.SQUARE, QIcon(), 0)
|
||||||
|
|
||||||
T_UpdateEntry = list[tuple[str | None, StatusEntry]]
|
T_UpdateEntry = list[tuple[str | None, StatusEntry]]
|
||||||
T_StatusKind = Literal["s", "i"]
|
T_StatusKind = Literal["s", "i"]
|
||||||
@@ -97,15 +101,12 @@ class NWStatus:
|
|||||||
# Methods
|
# Methods
|
||||||
##
|
##
|
||||||
|
|
||||||
def add(self, key: str | None, name: str, color: tuple[int, int, int],
|
def add(self, key: str | None, name: str, color: str, shape: str, count: int) -> str:
|
||||||
shape: str, count: int) -> str:
|
|
||||||
"""Add or update a status entry. If the key is invalid, a new
|
"""Add or update a status entry. If the key is invalid, a new
|
||||||
key is generated.
|
key is generated.
|
||||||
"""
|
"""
|
||||||
if isinstance(color, tuple) and len(color) == 3:
|
qColor = SHARED.theme.parseColor(color)
|
||||||
qColor = QColor(*color)
|
theme = color if color in nwLabels.THEME_COLORS else CUSTOM_COL
|
||||||
else:
|
|
||||||
qColor = QColor(100, 100, 100)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
iShape = nwStatusShape[shape]
|
iShape = nwStatusShape[shape]
|
||||||
@@ -115,7 +116,7 @@ class NWStatus:
|
|||||||
key = self._checkKey(key)
|
key = self._checkKey(key)
|
||||||
name = simplified(name)
|
name = simplified(name)
|
||||||
icon = self.createIcon(self._height, qColor, iShape)
|
icon = self.createIcon(self._height, qColor, iShape)
|
||||||
self._store[key] = StatusEntry(name, qColor, iShape, icon, count)
|
self._store[key] = StatusEntry(name, qColor, theme, iShape, icon, count)
|
||||||
|
|
||||||
if self._default is None:
|
if self._default is None:
|
||||||
self._default = key
|
self._default = key
|
||||||
@@ -157,12 +158,14 @@ class NWStatus:
|
|||||||
def pack(self) -> Iterable[tuple[str, dict]]:
|
def pack(self) -> Iterable[tuple[str, dict]]:
|
||||||
"""Pack the status entries into a dictionary."""
|
"""Pack the status entries into a dictionary."""
|
||||||
for key, entry in self._store.items():
|
for key, entry in self._store.items():
|
||||||
|
if entry.theme == CUSTOM_COL:
|
||||||
|
color = entry.color.name(QColor.NameFormat.HexRgb)
|
||||||
|
else:
|
||||||
|
color = entry.theme
|
||||||
yield (entry.name, {
|
yield (entry.name, {
|
||||||
"key": key,
|
"key": key,
|
||||||
"count": str(entry.count),
|
"count": str(entry.count),
|
||||||
"red": str(entry.color.red()),
|
"color": color,
|
||||||
"green": str(entry.color.green()),
|
|
||||||
"blue": str(entry.color.blue()),
|
|
||||||
"shape": entry.shape.name,
|
"shape": entry.shape.name,
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
@@ -179,12 +182,20 @@ class NWStatus:
|
|||||||
try:
|
try:
|
||||||
shape = nwStatusShape[str(data[0])]
|
shape = nwStatusShape[str(data[0])]
|
||||||
color = QColor(str(data[1]))
|
color = QColor(str(data[1]))
|
||||||
|
theme = CUSTOM_COL if data[1].startswith("#") else data[1]
|
||||||
icon = NWStatus.createIcon(self._height, color, shape)
|
icon = NWStatus.createIcon(self._height, color, shape)
|
||||||
return StatusEntry(simplified(data[2]), color, shape, icon)
|
return StatusEntry(simplified(data[2]), color, theme, shape, icon)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.error("Could not parse entry %s", str(data))
|
logger.error("Could not parse entry %s", str(data))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def refreshIcons(self) -> None:
|
||||||
|
"""Refresh all icons."""
|
||||||
|
for entry in self._store.values():
|
||||||
|
entry.color = SHARED.theme.parseColor(entry.theme)
|
||||||
|
entry.icon = NWStatus.createIcon(self._height, entry.color, entry.shape)
|
||||||
|
return
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def createIcon(height: int, color: QColor, shape: nwStatusShape) -> QIcon:
|
def createIcon(height: int, color: QColor, shape: nwStatusShape) -> QIcon:
|
||||||
"""Generate an icon for a status label."""
|
"""Generate an icon for a status label."""
|
||||||
|
|||||||
@@ -294,6 +294,7 @@ class GuiPreferences(NDialog):
|
|||||||
# Tree Icon Colours
|
# Tree Icon Colours
|
||||||
self.iconColTree = NComboBox(self)
|
self.iconColTree = NComboBox(self)
|
||||||
self.iconColTree.setMinimumWidth(200)
|
self.iconColTree.setMinimumWidth(200)
|
||||||
|
self.iconColTree.addItem(self.tr("Theme Colours"), DEF_TREECOL)
|
||||||
for key, label in nwLabels.THEME_COLORS.items():
|
for key, label in nwLabels.THEME_COLORS.items():
|
||||||
self.iconColTree.addItem(trConst(label), key)
|
self.iconColTree.addItem(trConst(label), key)
|
||||||
self.iconColTree.setCurrentData(CONFIG.iconColTree, DEF_TREECOL)
|
self.iconColTree.setCurrentData(CONFIG.iconColTree, DEF_TREECOL)
|
||||||
|
|||||||
@@ -33,14 +33,14 @@ from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot
|
|||||||
from PyQt6.QtGui import QCloseEvent, QColor
|
from PyQt6.QtGui import QCloseEvent, QColor
|
||||||
from PyQt6.QtWidgets import (
|
from PyQt6.QtWidgets import (
|
||||||
QAbstractItemView, QApplication, QColorDialog, QDialogButtonBox,
|
QAbstractItemView, QApplication, QColorDialog, QDialogButtonBox,
|
||||||
QFileDialog, QGridLayout, QHBoxLayout, QLineEdit, QMenu, QStackedWidget,
|
QFileDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMenu,
|
||||||
QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
|
QStackedWidget, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import formatFileFilter, qtAddAction, qtLambda, simplified
|
from novelwriter.common import formatFileFilter, qtAddAction, qtLambda, simplified
|
||||||
from novelwriter.constants import nwLabels, trConst
|
from novelwriter.constants import nwLabels, trConst
|
||||||
from novelwriter.core.status import NWStatus, StatusEntry
|
from novelwriter.core.status import CUSTOM_COL, NWStatus, StatusEntry
|
||||||
from novelwriter.enum import nwStatusShape
|
from novelwriter.enum import nwStatusShape
|
||||||
from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollableForm
|
from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollableForm
|
||||||
from novelwriter.extensions.modified import NComboBox, NDialog, NIconToolButton
|
from novelwriter.extensions.modified import NComboBox, NDialog, NIconToolButton
|
||||||
@@ -326,6 +326,7 @@ class _StatusPage(NFixedPage):
|
|||||||
self._changed = False
|
self._changed = False
|
||||||
self._color = QColor(100, 100, 100)
|
self._color = QColor(100, 100, 100)
|
||||||
self._shape = nwStatusShape.SQUARE
|
self._shape = nwStatusShape.SQUARE
|
||||||
|
self._theme = CUSTOM_COL
|
||||||
self._icons = {}
|
self._icons = {}
|
||||||
|
|
||||||
self._iPx = SHARED.theme.baseIconHeight
|
self._iPx = SHARED.theme.baseIconHeight
|
||||||
@@ -384,11 +385,26 @@ class _StatusPage(NFixedPage):
|
|||||||
self.exportButton.clicked.connect(self._exportLabels)
|
self.exportButton.clicked.connect(self._exportLabels)
|
||||||
|
|
||||||
# Edit Form
|
# Edit Form
|
||||||
self.labelText = QLineEdit(self)
|
self.editName = QLineEdit(self)
|
||||||
self.labelText.setMaxLength(40)
|
self.editName.setMaxLength(40)
|
||||||
self.labelText.setPlaceholderText(self.tr("Select item to edit"))
|
self.editName.setPlaceholderText(self.tr("Select item to edit"))
|
||||||
self.labelText.setEnabled(False)
|
self.editName.setEnabled(False)
|
||||||
self.labelText.textEdited.connect(self._onNameEdit)
|
self.editName.textEdited.connect(self._onNameEdit)
|
||||||
|
|
||||||
|
self.labelName = QLabel(self.tr("Label"), self)
|
||||||
|
self.labelName.setBuddy(self.editName)
|
||||||
|
|
||||||
|
# Icon Colours
|
||||||
|
self.iconColor = NComboBox(self)
|
||||||
|
self.iconColor.setMinimumWidth(200)
|
||||||
|
self.iconColor.setEnabled(False)
|
||||||
|
self.iconColor.addItem(self.tr("Custom"), CUSTOM_COL)
|
||||||
|
for key, label in nwLabels.THEME_COLORS.items():
|
||||||
|
self.iconColor.addItem(trConst(label), key)
|
||||||
|
self.iconColor.currentIndexChanged.connect(self._onThemeSelect)
|
||||||
|
|
||||||
|
self.labelColor = QLabel(self.tr("Colour"), self)
|
||||||
|
self.labelColor.setBuddy(self.iconColor)
|
||||||
|
|
||||||
buttonStyle = (
|
buttonStyle = (
|
||||||
"QToolButton {padding: 0 4px;} "
|
"QToolButton {padding: 0 4px;} "
|
||||||
@@ -425,6 +441,9 @@ class _StatusPage(NFixedPage):
|
|||||||
self.shapeButton.setStyleSheet(buttonStyle)
|
self.shapeButton.setStyleSheet(buttonStyle)
|
||||||
self.shapeButton.setEnabled(False)
|
self.shapeButton.setEnabled(False)
|
||||||
|
|
||||||
|
self.labelShape = QLabel(self.tr("Shape"), self)
|
||||||
|
self.labelShape.setBuddy(self.iconColor)
|
||||||
|
|
||||||
# Assemble
|
# Assemble
|
||||||
self.listControls = QVBoxLayout()
|
self.listControls = QVBoxLayout()
|
||||||
self.listControls.addWidget(self.addButton)
|
self.listControls.addWidget(self.addButton)
|
||||||
@@ -435,10 +454,15 @@ class _StatusPage(NFixedPage):
|
|||||||
self.listControls.addWidget(self.importButton)
|
self.listControls.addWidget(self.importButton)
|
||||||
self.listControls.addWidget(self.exportButton)
|
self.listControls.addWidget(self.exportButton)
|
||||||
|
|
||||||
self.editBox = QHBoxLayout()
|
self.editBox = QGridLayout()
|
||||||
self.editBox.addWidget(self.labelText, 1)
|
self.editBox.addWidget(self.labelName, 0, 0)
|
||||||
self.editBox.addWidget(self.colorButton, 0)
|
self.editBox.addWidget(self.editName, 0, 1, 1, 5)
|
||||||
self.editBox.addWidget(self.shapeButton, 0)
|
self.editBox.addWidget(self.labelColor, 1, 0)
|
||||||
|
self.editBox.addWidget(self.iconColor, 1, 1)
|
||||||
|
self.editBox.addWidget(self.colorButton, 1, 2)
|
||||||
|
self.editBox.addWidget(self.labelShape, 1, 3)
|
||||||
|
self.editBox.addWidget(self.shapeButton, 1, 4)
|
||||||
|
self.editBox.setColumnStretch(5, 1)
|
||||||
|
|
||||||
self.innerBox = QGridLayout()
|
self.innerBox = QGridLayout()
|
||||||
self.innerBox.addWidget(self.listBox, 0, 0)
|
self.innerBox.addWidget(self.listBox, 0, 0)
|
||||||
@@ -496,11 +520,20 @@ class _StatusPage(NFixedPage):
|
|||||||
self._changed = True
|
self._changed = True
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(int)
|
||||||
|
def _onThemeSelect(self, index: int) -> None:
|
||||||
|
"""Update the colour handling on theme selection change."""
|
||||||
|
self._theme = str(self.iconColor.currentData())
|
||||||
|
self._setButtonIcons()
|
||||||
|
self._updateIcon()
|
||||||
|
return
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def _onColorSelect(self) -> None:
|
def _onColorSelect(self) -> None:
|
||||||
"""Open a dialog to select the status icon colour."""
|
"""Open a dialog to select the status icon colour."""
|
||||||
if (color := QColorDialog.getColor(self._color, self, self.trSelColor)).isValid():
|
if (color := QColorDialog.getColor(self._color, self, self.trSelColor)).isValid():
|
||||||
self._color = color
|
self._color = color
|
||||||
|
self._theme = CUSTOM_COL
|
||||||
self._setButtonIcons()
|
self._setButtonIcons()
|
||||||
self._updateIcon()
|
self._updateIcon()
|
||||||
return
|
return
|
||||||
@@ -511,7 +544,8 @@ class _StatusPage(NFixedPage):
|
|||||||
color = QColor(100, 100, 100)
|
color = QColor(100, 100, 100)
|
||||||
shape = nwStatusShape.SQUARE
|
shape = nwStatusShape.SQUARE
|
||||||
icon = NWStatus.createIcon(self._iPx, color, shape)
|
icon = NWStatus.createIcon(self._iPx, color, shape)
|
||||||
self._addItem(None, StatusEntry(self.tr("New Item"), color, shape, icon, 0))
|
theme = str(self.iconColor.currentData())
|
||||||
|
self._addItem(None, StatusEntry(self.tr("New Item"), color, theme, shape, icon, 0))
|
||||||
self._changed = True
|
self._changed = True
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -537,22 +571,26 @@ class _StatusPage(NFixedPage):
|
|||||||
entry: StatusEntry = item.data(self.C_DATA, self.D_ENTRY)
|
entry: StatusEntry = item.data(self.C_DATA, self.D_ENTRY)
|
||||||
self._color = entry.color
|
self._color = entry.color
|
||||||
self._shape = entry.shape
|
self._shape = entry.shape
|
||||||
|
self._theme = entry.theme
|
||||||
self._setButtonIcons()
|
self._setButtonIcons()
|
||||||
|
|
||||||
self.labelText.setText(entry.name)
|
self.editName.setText(entry.name)
|
||||||
self.labelText.selectAll()
|
self.editName.selectAll()
|
||||||
self.labelText.setFocus()
|
self.editName.setFocus()
|
||||||
|
|
||||||
self.labelText.setEnabled(True)
|
self.editName.setEnabled(True)
|
||||||
|
self.iconColor.setEnabled(True)
|
||||||
self.colorButton.setEnabled(True)
|
self.colorButton.setEnabled(True)
|
||||||
self.shapeButton.setEnabled(True)
|
self.shapeButton.setEnabled(True)
|
||||||
else:
|
else:
|
||||||
self._color = QColor(100, 100, 100)
|
self._color = QColor(100, 100, 100)
|
||||||
self._shape = nwStatusShape.SQUARE
|
self._shape = nwStatusShape.SQUARE
|
||||||
|
self._theme = CUSTOM_COL
|
||||||
self._setButtonIcons()
|
self._setButtonIcons()
|
||||||
self.labelText.setText("")
|
self.editName.setText("")
|
||||||
|
|
||||||
self.labelText.setEnabled(False)
|
self.editName.setEnabled(False)
|
||||||
|
self.iconColor.setEnabled(False)
|
||||||
self.colorButton.setEnabled(False)
|
self.colorButton.setEnabled(False)
|
||||||
self.shapeButton.setEnabled(False)
|
self.shapeButton.setEnabled(False)
|
||||||
return
|
return
|
||||||
@@ -608,10 +646,11 @@ class _StatusPage(NFixedPage):
|
|||||||
def _updateIcon(self) -> None:
|
def _updateIcon(self) -> None:
|
||||||
"""Apply changes made to a status icon."""
|
"""Apply changes made to a status icon."""
|
||||||
if item := self._getSelectedItem():
|
if item := self._getSelectedItem():
|
||||||
icon = NWStatus.createIcon(self._iPx, self._color, self._shape)
|
icon = NWStatus.createIcon(self._iPx, self._pickColor(), self._shape)
|
||||||
entry: StatusEntry = item.data(self.C_DATA, self.D_ENTRY)
|
entry: StatusEntry = item.data(self.C_DATA, self.D_ENTRY)
|
||||||
entry.color = self._color
|
entry.color = self._color
|
||||||
entry.shape = self._shape
|
entry.shape = self._shape
|
||||||
|
entry.theme = self._theme
|
||||||
entry.icon = icon
|
entry.icon = icon
|
||||||
item.setIcon(self.C_LABEL, icon)
|
item.setIcon(self.C_LABEL, icon)
|
||||||
self._changed = True
|
self._changed = True
|
||||||
@@ -658,11 +697,18 @@ class _StatusPage(NFixedPage):
|
|||||||
|
|
||||||
def _setButtonIcons(self) -> None:
|
def _setButtonIcons(self) -> None:
|
||||||
"""Set the colour of the colour button."""
|
"""Set the colour of the colour button."""
|
||||||
icon = NWStatus.createIcon(self._iPx, self._color, nwStatusShape.SQUARE)
|
icon = NWStatus.createIcon(self._iPx, self._pickColor(), nwStatusShape.SQUARE)
|
||||||
|
self.iconColor.setCurrentData(self._theme, CUSTOM_COL)
|
||||||
self.colorButton.setIcon(icon)
|
self.colorButton.setIcon(icon)
|
||||||
self.shapeButton.setIcon(self._icons[self._shape])
|
self.shapeButton.setIcon(self._icons[self._shape])
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def _pickColor(self) -> QColor:
|
||||||
|
"""Get the correct colour value based on selections."""
|
||||||
|
if self._theme == CUSTOM_COL:
|
||||||
|
return self._color
|
||||||
|
return SHARED.theme.getBaseColor(self._theme)
|
||||||
|
|
||||||
|
|
||||||
class _ReplacePage(NFixedPage):
|
class _ReplacePage(NFixedPage):
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ from PyQt6.QtWidgets import QApplication
|
|||||||
|
|
||||||
from novelwriter import CONFIG
|
from novelwriter import CONFIG
|
||||||
from novelwriter.common import checkInt, minmax
|
from novelwriter.common import checkInt, minmax
|
||||||
from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS
|
from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS, DEF_TREECOL
|
||||||
from novelwriter.constants import nwLabels
|
from novelwriter.constants import nwLabels
|
||||||
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwTheme
|
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwTheme
|
||||||
from novelwriter.error import logException
|
from novelwriter.error import logException
|
||||||
@@ -438,7 +438,7 @@ class GuiTheme:
|
|||||||
self._guiPalette.setBrush(QtColDisabled, QPalette.ColorRole.Accent, grey)
|
self._guiPalette.setBrush(QtColDisabled, QPalette.ColorRole.Accent, grey)
|
||||||
|
|
||||||
# Set project override colours
|
# Set project override colours
|
||||||
if (override := CONFIG.iconColTree) != "theme":
|
if (override := CONFIG.iconColTree) != DEF_TREECOL:
|
||||||
color = self._qColors.get(override, QtBlack)
|
color = self._qColors.get(override, QtBlack)
|
||||||
self._setBaseColor("root", color)
|
self._setBaseColor("root", color)
|
||||||
self._setBaseColor("folder", color)
|
self._setBaseColor("folder", color)
|
||||||
@@ -465,11 +465,7 @@ class GuiTheme:
|
|||||||
"""Load a standard style sheet."""
|
"""Load a standard style sheet."""
|
||||||
return self._styleSheets.get(name, "")
|
return self._styleSheets.get(name, "")
|
||||||
|
|
||||||
##
|
def parseColor(self, value: str, default: QColor = QtBlack) -> QColor:
|
||||||
# Internal Functions
|
|
||||||
##
|
|
||||||
|
|
||||||
def _parseColor(self, value: str, default: QColor = QtBlack) -> QColor:
|
|
||||||
"""Parse a string as a colour value."""
|
"""Parse a string as a colour value."""
|
||||||
if value in self._qColors:
|
if value in self._qColors:
|
||||||
# Named colour
|
# Named colour
|
||||||
@@ -500,6 +496,10 @@ class GuiTheme:
|
|||||||
return QColor(*result)
|
return QColor(*result)
|
||||||
return default
|
return default
|
||||||
|
|
||||||
|
##
|
||||||
|
# Internal Functions
|
||||||
|
##
|
||||||
|
|
||||||
def _setBaseColor(self, key: str, color: QColor) -> None:
|
def _setBaseColor(self, key: str, color: QColor) -> None:
|
||||||
"""Set the colour for a named colour."""
|
"""Set the colour for a named colour."""
|
||||||
self._qColors[key] = QColor(color)
|
self._qColors[key] = QColor(color)
|
||||||
@@ -560,7 +560,7 @@ class GuiTheme:
|
|||||||
|
|
||||||
def _readColor(self, parser: ConfigParser, section: str, name: str) -> QColor:
|
def _readColor(self, parser: ConfigParser, section: str, name: str) -> QColor:
|
||||||
"""Parse a colour value from a config string."""
|
"""Parse a colour value from a config string."""
|
||||||
return self._parseColor(parser.get(section, name, fallback="default"))
|
return self.parseColor(parser.get(section, name, fallback="default"))
|
||||||
|
|
||||||
def _setPalette(
|
def _setPalette(
|
||||||
self, parser: ConfigParser, section: str, name: str, value: QPalette.ColorRole
|
self, parser: ConfigParser, section: str, name: str, value: QPalette.ColorRole
|
||||||
|
|||||||
@@ -913,6 +913,7 @@ class GuiMain(QMainWindow):
|
|||||||
def refreshThemeColors(self, syntax: bool = False, force: bool = False) -> None:
|
def refreshThemeColors(self, syntax: bool = False, force: bool = False) -> None:
|
||||||
"""Refresh the GUI theme."""
|
"""Refresh the GUI theme."""
|
||||||
SHARED.theme.loadTheme(force=force)
|
SHARED.theme.loadTheme(force=force)
|
||||||
|
SHARED.project.updateTheme()
|
||||||
self.setPalette(QApplication.palette())
|
self.setPalette(QApplication.palette())
|
||||||
self.docEditor.updateTheme()
|
self.docEditor.updateTheme()
|
||||||
self.docViewer.updateTheme()
|
self.docViewer.updateTheme()
|
||||||
|
|||||||
+15
-15
@@ -1,6 +1,6 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7.1" hexVersion="0x020701f0" fileVersion="1.5" fileRevision="5" timeStamp="2025-06-09 22:54:50">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 13:04:43">
|
||||||
<project id="e2be99af-f9bf-4403-857a-c3d1ac25abea" saveCount="2194" autoCount="286" editTime="96892">
|
<project id="e2be99af-f9bf-4403-857a-c3d1ac25abea" saveCount="2221" autoCount="289" editTime="97582">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jane Smith</author>
|
<author>Jane Smith</author>
|
||||||
</project>
|
</project>
|
||||||
@@ -20,20 +20,20 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="sf12341" count="8" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="sf12341" count="8" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="sf24ce6" count="2" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="sf24ce6" count="2" color="red" shape="STAR">Notes</entry>
|
||||||
<entry key="sc24b8f" count="3" red="182" green="60" blue="0" shape="BARS_1">Started</entry>
|
<entry key="sc24b8f" count="3" color="yellow" shape="BARS_1">Started</entry>
|
||||||
<entry key="s90e6c9" count="5" red="193" green="129" blue="0" shape="BARS_2">1st Draft</entry>
|
<entry key="s90e6c9" count="5" color="yellow" shape="BARS_2">1st Draft</entry>
|
||||||
<entry key="sd51c5b" count="1" red="193" green="129" blue="0" shape="BARS_3">2nd Draft</entry>
|
<entry key="sd51c5b" count="1" color="yellow" shape="BARS_3">2nd Draft</entry>
|
||||||
<entry key="s8ae72a" count="1" red="193" green="129" blue="0" shape="BARS_4">3rd Draft</entry>
|
<entry key="s8ae72a" count="1" color="yellow" shape="BARS_4">3rd Draft</entry>
|
||||||
<entry key="s78ea90" count="1" red="58" green="180" blue="58" shape="STAR">Finished</entry>
|
<entry key="s78ea90" count="1" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="ia857f0" count="5" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="ia857f0" count="5" color="faded" shape="STAR">None</entry>
|
||||||
<entry key="i4a1d39" count="1" red="220" green="138" blue="221" shape="BLOCK_1">Background</entry>
|
<entry key="i4a1d39" count="1" color="purple" shape="BLOCK_1">Background</entry>
|
||||||
<entry key="icfb3a5" count="1" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="icfb3a5" count="1" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i2d7a54" count="2" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i2d7a54" count="2" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i56be10" count="1" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i56be10" count="1" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="31" novelWords="1016" notesWords="416" novelChars="5602" notesChars="2285">
|
<content items="31" novelWords="1016" notesWords="416" novelChars="5602" notesChars="2285">
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
<name status="sf24ce6" import="ia857f0" active="yes">Chapter One</name>
|
<name status="sf24ce6" import="ia857f0" active="yes">Chapter One</name>
|
||||||
</item>
|
</item>
|
||||||
<item handle="636b6aa9b697b" parent="6a2d6d5f4f401" root="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
<item handle="636b6aa9b697b" parent="6a2d6d5f4f401" root="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||||
<meta expanded="no" heading="H3" charCount="2999" wordCount="530" paraCount="16" cursorPos="718" />
|
<meta expanded="no" heading="H3" charCount="2999" wordCount="530" paraCount="16" cursorPos="1225" />
|
||||||
<name status="s90e6c9" import="ia857f0" active="yes">Making a Scene</name>
|
<name status="s90e6c9" import="ia857f0" active="yes">Making a Scene</name>
|
||||||
</item>
|
</item>
|
||||||
<item handle="bc0cbd2a407f3" parent="6a2d6d5f4f401" root="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
<item handle="bc0cbd2a407f3" parent="6a2d6d5f4f401" root="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
|
||||||
|
|||||||
+20
-2
@@ -34,8 +34,10 @@ from PyQt6.QtWidgets import QMessageBox
|
|||||||
sys.path.insert(1, str(Path(__file__).parent.parent.absolute()))
|
sys.path.insert(1, str(Path(__file__).parent.parent.absolute()))
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
|
from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT
|
||||||
|
from novelwriter.enum import nwTheme
|
||||||
|
|
||||||
from tests.mocked import MockGuiMain, MockTheme
|
from tests.mocked import MockGuiMain
|
||||||
from tests.tools import cleanProject
|
from tests.tools import cleanProject
|
||||||
|
|
||||||
_TST_ROOT = Path(__file__).parent
|
_TST_ROOT = Path(__file__).parent
|
||||||
@@ -60,6 +62,10 @@ def resetConfigVars():
|
|||||||
CONFIG._dLocale = QLocale("en_GB")
|
CONFIG._dLocale = QLocale("en_GB")
|
||||||
CONFIG._manuals = {"manual": _TMP_ROOT / "manual.pdf"}
|
CONFIG._manuals = {"manual": _TMP_ROOT / "manual.pdf"}
|
||||||
CONFIG.guiLocale = "en_GB"
|
CONFIG.guiLocale = "en_GB"
|
||||||
|
CONFIG.darkTheme = DEF_GUI_DARK
|
||||||
|
CONFIG.lightTheme = DEF_GUI_LIGHT
|
||||||
|
CONFIG.themeMode = nwTheme.LIGHT
|
||||||
|
CONFIG.emphLabels = True # Ensures better coverage, off by default
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -151,15 +157,27 @@ def projPath(fncPath):
|
|||||||
@pytest.fixture(scope="function")
|
@pytest.fixture(scope="function")
|
||||||
def mockGUI(qtbot, monkeypatch):
|
def mockGUI(qtbot, monkeypatch):
|
||||||
"""Create a mock instance of novelWriter's main GUI class."""
|
"""Create a mock instance of novelWriter's main GUI class."""
|
||||||
|
from novelwriter.gui.theme import GuiTheme
|
||||||
|
|
||||||
monkeypatch.setattr(QMessageBox, "exec", lambda *a: None)
|
monkeypatch.setattr(QMessageBox, "exec", lambda *a: None)
|
||||||
monkeypatch.setattr(QMessageBox, "result", lambda *a: QMessageBox.StandardButton.Yes)
|
monkeypatch.setattr(QMessageBox, "result", lambda *a: QMessageBox.StandardButton.Yes)
|
||||||
gui = MockGuiMain()
|
gui = MockGuiMain()
|
||||||
theme = MockTheme()
|
theme = GuiTheme()
|
||||||
monkeypatch.setattr(SHARED, "_gui", gui)
|
monkeypatch.setattr(SHARED, "_gui", gui)
|
||||||
monkeypatch.setattr(SHARED, "_theme", theme)
|
monkeypatch.setattr(SHARED, "_theme", theme)
|
||||||
|
|
||||||
return gui
|
return gui
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="function")
|
||||||
|
def mockGUIwithTheme(mockGUI):
|
||||||
|
"""Create a mock instance of novelWriter's main GUI class with the
|
||||||
|
theme instance initialised.
|
||||||
|
"""
|
||||||
|
SHARED.theme.initThemes()
|
||||||
|
return mockGUI
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="function")
|
@pytest.fixture(scope="function")
|
||||||
def nwGUI(qtbot, monkeypatch, functionFixture):
|
def nwGUI(qtbot, monkeypatch, functionFixture):
|
||||||
"""Create an instance of the novelWriter GUI."""
|
"""Create an instance of the novelWriter GUI."""
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:07:59">
|
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="6" timeStamp="2025-04-29 22:07:59">
|
||||||
<project id="e2be99af-f9bf-4403-857a-c3d1ac25abea" saveCount="2179" autoCount="285" editTime="1000">
|
<project id="e2be99af-f9bf-4403-857a-c3d1ac25abea" saveCount="2179" autoCount="285" editTime="1000">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jane Smith</author>
|
<author>Jane Smith</author>
|
||||||
@@ -20,20 +20,20 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="sf12341" count="8" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="sf12341" count="8" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="sf24ce6" count="2" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="sf24ce6" count="2" color="#c83200" shape="SQUARE">Notes</entry>
|
||||||
<entry key="sc24b8f" count="3" red="182" green="60" blue="0" shape="BARS_1">Started</entry>
|
<entry key="sc24b8f" count="3" color="#b63c00" shape="BARS_1">Started</entry>
|
||||||
<entry key="s90e6c9" count="5" red="193" green="129" blue="0" shape="BARS_2">1st Draft</entry>
|
<entry key="s90e6c9" count="5" color="#c18100" shape="BARS_2">1st Draft</entry>
|
||||||
<entry key="sd51c5b" count="1" red="193" green="129" blue="0" shape="BARS_3">2nd Draft</entry>
|
<entry key="sd51c5b" count="1" color="#c18100" shape="BARS_3">2nd Draft</entry>
|
||||||
<entry key="s8ae72a" count="1" red="193" green="129" blue="0" shape="BARS_4">3rd Draft</entry>
|
<entry key="s8ae72a" count="1" color="#c18100" shape="BARS_4">3rd Draft</entry>
|
||||||
<entry key="s78ea90" count="1" red="58" green="180" blue="58" shape="STAR">Finished</entry>
|
<entry key="s78ea90" count="1" color="#3ab43a" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="ia857f0" count="5" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="ia857f0" count="5" color="#646464" shape="SQUARE">None</entry>
|
||||||
<entry key="i4a1d39" count="1" red="220" green="138" blue="221" shape="BLOCK_1">Background</entry>
|
<entry key="i4a1d39" count="1" color="#dc8add" shape="BLOCK_1">Background</entry>
|
||||||
<entry key="icfb3a5" count="1" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="icfb3a5" count="1" color="#dc8add" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i2d7a54" count="2" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i2d7a54" count="2" color="#dc8add" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i56be10" count="1" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i56be10" count="1" color="#dc8add" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="31" novelWords="1016" notesWords="416" novelChars="5602" notesChars="2285">
|
<content items="31" novelWords="1016" notesWords="416" novelChars="5602" notesChars="2285">
|
||||||
|
|||||||
+10
-10
@@ -1,6 +1,6 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:45:09">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 19:19:46">
|
||||||
<project id="5ac0df12-8b8b-476b-9905-21d33685687c" saveCount="52" autoCount="29" editTime="2465">
|
<project id="5ac0df12-8b8b-476b-9905-21d33685687c" saveCount="54" autoCount="29" editTime="2469">
|
||||||
<name>Lorem Ipsum</name>
|
<name>Lorem Ipsum</name>
|
||||||
<author>lipsum.com</author>
|
<author>lipsum.com</author>
|
||||||
</project>
|
</project>
|
||||||
@@ -19,16 +19,16 @@
|
|||||||
<entry key="Rep2">Replace Text 2</entry>
|
<entry key="Rep2">Replace Text 2</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="sbaa94f" count="3" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="sbaa94f" count="3" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="s27bf7c" count="0" red="200" green="50" blue="0" shape="SQUARE">Note</entry>
|
<entry key="s27bf7c" count="0" color="#c83200" shape="SQUARE">Note</entry>
|
||||||
<entry key="s92a87b" count="5" red="200" green="150" blue="0" shape="SQUARE">Draft</entry>
|
<entry key="s92a87b" count="5" color="#c89600" shape="SQUARE">Draft</entry>
|
||||||
<entry key="sedd043" count="7" red="50" green="200" blue="0" shape="SQUARE">Finished</entry>
|
<entry key="sedd043" count="7" color="#32c800" shape="SQUARE">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i613591" count="7" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="i613591" count="7" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="i560cbf" count="0" red="200" green="50" blue="0" shape="SQUARE">Minor</entry>
|
<entry key="i560cbf" count="0" color="#c83200" shape="SQUARE">Minor</entry>
|
||||||
<entry key="i37861c" count="0" red="200" green="150" blue="0" shape="SQUARE">Major</entry>
|
<entry key="i37861c" count="0" color="#c89600" shape="SQUARE">Major</entry>
|
||||||
<entry key="id6b1d0" count="0" red="50" green="200" blue="0" shape="SQUARE">Main</entry>
|
<entry key="id6b1d0" count="0" color="#32c800" shape="SQUARE">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="22" novelWords="3115" notesWords="738" novelChars="20774" notesChars="5003">
|
<content items="22" novelWords="3115" notesWords="738" novelChars="20774" notesChars="5003">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:42:54">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:02:57">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="1" editTime="0">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="1" editTime="0">
|
||||||
<name>New Project</name>
|
<name>New Project</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="7" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="7" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="5" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="5" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="12" novelWords="10" notesWords="6" novelChars="45" notesChars="22">
|
<content items="12" novelWords="10" notesWords="6" novelChars="45" notesChars="22">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:42:54">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:02:57">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="1" editTime="0">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="1" editTime="0">
|
||||||
<name>New Project</name>
|
<name>New Project</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="6" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="6" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="10" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="10" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="16" novelWords="9" notesWords="0" novelChars="40" notesChars="0">
|
<content items="16" novelWords="9" notesWords="0" novelChars="40" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:42:52">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:02:55">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="1" editTime="0">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="1" editTime="0">
|
||||||
<name>New Project</name>
|
<name>New Project</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="16" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="16" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="3" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="3" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="19" novelWords="28" notesWords="0" novelChars="129" notesChars="0">
|
<content items="19" novelWords="28" notesWords="0" novelChars="129" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:42:52">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:02:55">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="0" editTime="0">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="0" editTime="0">
|
||||||
<name>Test Project A</name>
|
<name>Test Project A</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="15" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="15" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="7" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="7" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="22" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
<content items="22" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:42:52">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:02:55">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="0" editTime="0">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="1" autoCount="0" editTime="0">
|
||||||
<name>Test Project B</name>
|
<name>Test Project B</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="9" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="9" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="7" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="7" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="16" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
<content items="16" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<dcterms:created xsi:type="dcterms:W3CDTF">2025-04-29T22:46:36</dcterms:created>
|
<dcterms:created xsi:type="dcterms:W3CDTF">2025-06-12T19:20:06</dcterms:created>
|
||||||
<dcterms:modified xsi:type="dcterms:W3CDTF">2025-04-29T22:46:36</dcterms:modified>
|
<dcterms:modified xsi:type="dcterms:W3CDTF">2025-06-12T19:20:06</dcterms:modified>
|
||||||
<dc:creator>lipsum.com</dc:creator>
|
<dc:creator>lipsum.com</dc:creator>
|
||||||
<dc:title>Lorem Ipsum</dc:title>
|
<dc:title>Lorem Ipsum</dc:title>
|
||||||
<dc:language>en_GB</dc:language>
|
<dc:language>en_GB</dc:language>
|
||||||
<cp:revision>52</cp:revision>
|
<cp:revision>54</cp:revision>
|
||||||
<cp:lastModifiedBy>lipsum.com</cp:lastModifiedBy>
|
<cp:lastModifiedBy>lipsum.com</cp:lastModifiedBy>
|
||||||
</cp:coreProperties>
|
</cp:coreProperties>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:08:41">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:34:07">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="3" autoCount="2" editTime="4">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="3" autoCount="2" editTime="4">
|
||||||
<name>New Project</name>
|
<name>New Project</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="5" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="5" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="7" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="7" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="12" novelWords="173" notesWords="27" novelChars="1007" notesChars="133">
|
<content items="12" novelWords="173" notesWords="27" novelChars="1007" notesChars="133">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2025-04-29 22:01:24">
|
<novelWriterXML appVersion="2.8a0" hexVersion="0x020800a0" fileVersion="1.5" fileRevision="6" timeStamp="2025-06-12 18:03:05">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="2" autoCount="1" editTime="0">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="2" autoCount="1" editTime="0">
|
||||||
<name>New Project</name>
|
<name>New Project</name>
|
||||||
<author>Jane Doe</author>
|
<author>Jane Doe</author>
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
</lastHandle>
|
</lastHandle>
|
||||||
<autoReplace />
|
<autoReplace />
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="5" red="120" green="120" blue="120" shape="STAR">New</entry>
|
<entry key="s000000" count="5" color="faded" shape="STAR">New</entry>
|
||||||
<entry key="s000001" count="0" red="205" green="171" blue="143" shape="TRIANGLE">Note</entry>
|
<entry key="s000001" count="0" color="red" shape="TRIANGLE">Note</entry>
|
||||||
<entry key="s000002" count="0" red="143" green="240" blue="164" shape="CIRCLE_T">Draft</entry>
|
<entry key="s000002" count="0" color="yellow" shape="CIRCLE_T">Draft</entry>
|
||||||
<entry key="s000003" count="0" red="249" green="240" blue="107" shape="STAR">Finished</entry>
|
<entry key="s000003" count="0" color="green" shape="STAR">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000004" count="3" red="120" green="120" blue="120" shape="SQUARE">New</entry>
|
<entry key="i000004" count="3" color="purple" shape="SQUARE">New</entry>
|
||||||
<entry key="i000005" count="0" red="220" green="138" blue="221" shape="BLOCK_2">Minor</entry>
|
<entry key="i000005" count="0" color="purple" shape="BLOCK_2">Minor</entry>
|
||||||
<entry key="i000006" count="0" red="220" green="138" blue="221" shape="BLOCK_3">Major</entry>
|
<entry key="i000006" count="0" color="purple" shape="BLOCK_3">Major</entry>
|
||||||
<entry key="i000007" count="0" red="220" green="138" blue="221" shape="BLOCK_4">Main</entry>
|
<entry key="i000007" count="0" color="purple" shape="BLOCK_4">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="8" novelWords="9" notesWords="0" novelChars="40" notesChars="0">
|
<content items="8" novelWords="9" notesWords="0" novelChars="40" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2020-05-28 09:59:15">
|
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="6" timeStamp="2020-05-28 09:59:15">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="0" autoCount="0" editTime="1000">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="0" autoCount="0" editTime="1000">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jay Doh</author>
|
<author>Jay Doh</author>
|
||||||
@@ -20,19 +20,19 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="0" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="s000000" count="0" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="s000001" count="0" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="s000001" count="0" color="#c83200" shape="SQUARE">Notes</entry>
|
||||||
<entry key="s000002" count="0" red="182" green="60" blue="0" shape="SQUARE">Started</entry>
|
<entry key="s000002" count="0" color="#b63c00" shape="SQUARE">Started</entry>
|
||||||
<entry key="s000003" count="0" red="193" green="129" blue="0" shape="SQUARE">1st Draft</entry>
|
<entry key="s000003" count="0" color="#c18100" shape="SQUARE">1st Draft</entry>
|
||||||
<entry key="s000004" count="0" red="193" green="129" blue="0" shape="SQUARE">2nd Draft</entry>
|
<entry key="s000004" count="0" color="#c18100" shape="SQUARE">2nd Draft</entry>
|
||||||
<entry key="s000005" count="0" red="193" green="129" blue="0" shape="SQUARE">3rd Draft</entry>
|
<entry key="s000005" count="0" color="#c18100" shape="SQUARE">3rd Draft</entry>
|
||||||
<entry key="s000006" count="0" red="58" green="180" blue="58" shape="SQUARE">Finished</entry>
|
<entry key="s000006" count="0" color="#3ab43a" shape="SQUARE">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000007" count="0" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="i000007" count="0" color="#646464" shape="SQUARE">None</entry>
|
||||||
<entry key="i000008" count="0" red="0" green="122" blue="188" shape="SQUARE">Minor</entry>
|
<entry key="i000008" count="0" color="#007abc" shape="SQUARE">Minor</entry>
|
||||||
<entry key="i000009" count="0" red="21" green="0" blue="180" shape="SQUARE">Major</entry>
|
<entry key="i000009" count="0" color="#1500b4" shape="SQUARE">Major</entry>
|
||||||
<entry key="i00000a" count="0" red="117" green="0" blue="175" shape="SQUARE">Main</entry>
|
<entry key="i00000a" count="0" color="#7500af" shape="SQUARE">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="22" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
<content items="22" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2020-06-26 21:20:24">
|
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="6" timeStamp="2020-06-26 21:20:24">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jay Doh</author>
|
<author>Jay Doh</author>
|
||||||
@@ -20,19 +20,19 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="0" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="s000000" count="0" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="s000001" count="0" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="s000001" count="0" color="#c83200" shape="SQUARE">Notes</entry>
|
||||||
<entry key="s000002" count="0" red="182" green="60" blue="0" shape="SQUARE">Started</entry>
|
<entry key="s000002" count="0" color="#b63c00" shape="SQUARE">Started</entry>
|
||||||
<entry key="s000003" count="0" red="193" green="129" blue="0" shape="SQUARE">1st Draft</entry>
|
<entry key="s000003" count="0" color="#c18100" shape="SQUARE">1st Draft</entry>
|
||||||
<entry key="s000004" count="0" red="193" green="129" blue="0" shape="SQUARE">2nd Draft</entry>
|
<entry key="s000004" count="0" color="#c18100" shape="SQUARE">2nd Draft</entry>
|
||||||
<entry key="s000005" count="0" red="193" green="129" blue="0" shape="SQUARE">3rd Draft</entry>
|
<entry key="s000005" count="0" color="#c18100" shape="SQUARE">3rd Draft</entry>
|
||||||
<entry key="s000006" count="0" red="58" green="180" blue="58" shape="SQUARE">Finished</entry>
|
<entry key="s000006" count="0" color="#3ab43a" shape="SQUARE">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000007" count="0" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="i000007" count="0" color="#646464" shape="SQUARE">None</entry>
|
||||||
<entry key="i000008" count="0" red="0" green="122" blue="188" shape="SQUARE">Minor</entry>
|
<entry key="i000008" count="0" color="#007abc" shape="SQUARE">Minor</entry>
|
||||||
<entry key="i000009" count="0" red="21" green="0" blue="180" shape="SQUARE">Major</entry>
|
<entry key="i000009" count="0" color="#1500b4" shape="SQUARE">Major</entry>
|
||||||
<entry key="i00000a" count="0" red="117" green="0" blue="175" shape="SQUARE">Main</entry>
|
<entry key="i00000a" count="0" color="#7500af" shape="SQUARE">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="22" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
<content items="22" novelWords="0" notesWords="0" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2021-08-30 23:33:44">
|
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="6" timeStamp="2021-08-30 23:33:44">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jay Doh</author>
|
<author>Jay Doh</author>
|
||||||
@@ -20,19 +20,19 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="0" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="s000000" count="0" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="s000001" count="0" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="s000001" count="0" color="#c83200" shape="SQUARE">Notes</entry>
|
||||||
<entry key="s000002" count="0" red="182" green="60" blue="0" shape="SQUARE">Started</entry>
|
<entry key="s000002" count="0" color="#b63c00" shape="SQUARE">Started</entry>
|
||||||
<entry key="s000003" count="0" red="193" green="129" blue="0" shape="SQUARE">1st Draft</entry>
|
<entry key="s000003" count="0" color="#c18100" shape="SQUARE">1st Draft</entry>
|
||||||
<entry key="s000004" count="0" red="193" green="129" blue="0" shape="SQUARE">2nd Draft</entry>
|
<entry key="s000004" count="0" color="#c18100" shape="SQUARE">2nd Draft</entry>
|
||||||
<entry key="s000005" count="0" red="193" green="129" blue="0" shape="SQUARE">3rd Draft</entry>
|
<entry key="s000005" count="0" color="#c18100" shape="SQUARE">3rd Draft</entry>
|
||||||
<entry key="s000006" count="0" red="58" green="180" blue="58" shape="SQUARE">Finished</entry>
|
<entry key="s000006" count="0" color="#3ab43a" shape="SQUARE">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000007" count="0" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="i000007" count="0" color="#646464" shape="SQUARE">None</entry>
|
||||||
<entry key="i000008" count="0" red="0" green="122" blue="188" shape="SQUARE">Minor</entry>
|
<entry key="i000008" count="0" color="#007abc" shape="SQUARE">Minor</entry>
|
||||||
<entry key="i000009" count="0" red="21" green="0" blue="180" shape="SQUARE">Major</entry>
|
<entry key="i000009" count="0" color="#1500b4" shape="SQUARE">Major</entry>
|
||||||
<entry key="i00000a" count="0" red="117" green="0" blue="175" shape="SQUARE">Main</entry>
|
<entry key="i00000a" count="0" color="#7500af" shape="SQUARE">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="25" novelWords="840" notesWords="376" novelChars="0" notesChars="0">
|
<content items="25" novelWords="840" notesWords="376" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2022-10-25 18:26:15">
|
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="6" timeStamp="2022-10-25 18:26:15">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jay Doh</author>
|
<author>Jay Doh</author>
|
||||||
@@ -20,19 +20,19 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="s000000" count="0" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="s000000" count="0" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="s000001" count="0" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="s000001" count="0" color="#c83200" shape="SQUARE">Notes</entry>
|
||||||
<entry key="s000002" count="0" red="182" green="60" blue="0" shape="SQUARE">Started</entry>
|
<entry key="s000002" count="0" color="#b63c00" shape="SQUARE">Started</entry>
|
||||||
<entry key="s000003" count="0" red="193" green="129" blue="0" shape="SQUARE">1st Draft</entry>
|
<entry key="s000003" count="0" color="#c18100" shape="SQUARE">1st Draft</entry>
|
||||||
<entry key="s000004" count="0" red="193" green="129" blue="0" shape="SQUARE">2nd Draft</entry>
|
<entry key="s000004" count="0" color="#c18100" shape="SQUARE">2nd Draft</entry>
|
||||||
<entry key="s000005" count="0" red="193" green="129" blue="0" shape="SQUARE">3rd Draft</entry>
|
<entry key="s000005" count="0" color="#c18100" shape="SQUARE">3rd Draft</entry>
|
||||||
<entry key="s000006" count="0" red="58" green="180" blue="58" shape="SQUARE">Finished</entry>
|
<entry key="s000006" count="0" color="#3ab43a" shape="SQUARE">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="i000007" count="0" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="i000007" count="0" color="#646464" shape="SQUARE">None</entry>
|
||||||
<entry key="i000008" count="0" red="0" green="122" blue="188" shape="SQUARE">Minor</entry>
|
<entry key="i000008" count="0" color="#007abc" shape="SQUARE">Minor</entry>
|
||||||
<entry key="i000009" count="0" red="21" green="0" blue="180" shape="SQUARE">Major</entry>
|
<entry key="i000009" count="0" color="#1500b4" shape="SQUARE">Major</entry>
|
||||||
<entry key="i00000a" count="0" red="117" green="0" blue="175" shape="SQUARE">Main</entry>
|
<entry key="i00000a" count="0" color="#7500af" shape="SQUARE">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="25" novelWords="830" notesWords="376" novelChars="0" notesChars="0">
|
<content items="25" novelWords="830" notesWords="376" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="5" timeStamp="2022-10-15 12:12:59">
|
<novelWriterXML appVersion="2.7b1" hexVersion="0x020700b1" fileVersion="1.5" fileRevision="6" timeStamp="2022-10-15 12:12:59">
|
||||||
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="5" autoCount="10" editTime="1000">
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<author>Jay Doh</author>
|
<author>Jay Doh</author>
|
||||||
@@ -20,19 +20,19 @@
|
|||||||
<entry key="C">D</entry>
|
<entry key="C">D</entry>
|
||||||
</autoReplace>
|
</autoReplace>
|
||||||
<status>
|
<status>
|
||||||
<entry key="sf12341" count="4" red="100" green="100" blue="100" shape="SQUARE">New</entry>
|
<entry key="sf12341" count="4" color="#646464" shape="SQUARE">New</entry>
|
||||||
<entry key="sf24ce6" count="2" red="200" green="50" blue="0" shape="SQUARE">Notes</entry>
|
<entry key="sf24ce6" count="2" color="#c83200" shape="SQUARE">Notes</entry>
|
||||||
<entry key="sc24b8f" count="3" red="182" green="60" blue="0" shape="SQUARE">Started</entry>
|
<entry key="sc24b8f" count="3" color="#b63c00" shape="SQUARE">Started</entry>
|
||||||
<entry key="s90e6c9" count="7" red="193" green="129" blue="0" shape="SQUARE">1st Draft</entry>
|
<entry key="s90e6c9" count="7" color="#c18100" shape="SQUARE">1st Draft</entry>
|
||||||
<entry key="sd51c5b" count="0" red="193" green="129" blue="0" shape="SQUARE">2nd Draft</entry>
|
<entry key="sd51c5b" count="0" color="#c18100" shape="SQUARE">2nd Draft</entry>
|
||||||
<entry key="s8ae72a" count="0" red="193" green="129" blue="0" shape="SQUARE">3rd Draft</entry>
|
<entry key="s8ae72a" count="0" color="#c18100" shape="SQUARE">3rd Draft</entry>
|
||||||
<entry key="s78ea90" count="1" red="58" green="180" blue="58" shape="SQUARE">Finished</entry>
|
<entry key="s78ea90" count="1" color="#3ab43a" shape="SQUARE">Finished</entry>
|
||||||
</status>
|
</status>
|
||||||
<importance>
|
<importance>
|
||||||
<entry key="ia857f0" count="5" red="100" green="100" blue="100" shape="SQUARE">None</entry>
|
<entry key="ia857f0" count="5" color="#646464" shape="SQUARE">None</entry>
|
||||||
<entry key="icfb3a5" count="2" red="0" green="122" blue="188" shape="SQUARE">Minor</entry>
|
<entry key="icfb3a5" count="2" color="#007abc" shape="SQUARE">Minor</entry>
|
||||||
<entry key="i2d7a54" count="2" red="21" green="0" blue="180" shape="SQUARE">Major</entry>
|
<entry key="i2d7a54" count="2" color="#1500b4" shape="SQUARE">Major</entry>
|
||||||
<entry key="i56be10" count="1" red="117" green="0" blue="175" shape="SQUARE">Main</entry>
|
<entry key="i56be10" count="1" color="#7500af" shape="SQUARE">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content items="27" novelWords="954" notesWords="409" novelChars="0" notesChars="0">
|
<content items="27" novelWords="954" notesWords="409" novelChars="0" notesChars="0">
|
||||||
|
|||||||
@@ -547,8 +547,8 @@ def testCoreItem_ClassDefaults(mockGUI):
|
|||||||
def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
|
def testCoreItem_PackUnpack(mockGUI, caplog, mockRnd):
|
||||||
"""Test packing and unpacking entries for the NWItem class."""
|
"""Test packing and unpacking entries for the NWItem class."""
|
||||||
project = NWProject()
|
project = NWProject()
|
||||||
project.data.itemStatus.add(None, "New", (100, 100, 100), "SQUARE", 0)
|
project.data.itemStatus.add(None, "New", "#646464", "SQUARE", 0)
|
||||||
project.data.itemImport.add(None, "New", (100, 100, 100), "SQUARE", 0)
|
project.data.itemImport.add(None, "New", "#646464", "SQUARE", 0)
|
||||||
|
|
||||||
# Invalid
|
# Invalid
|
||||||
item = NWItem(project, "0000000000000")
|
item = NWItem(project, "0000000000000")
|
||||||
|
|||||||
@@ -27,12 +27,11 @@ from shutil import copyfile
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from PyQt6.QtGui import QColor
|
|
||||||
|
|
||||||
from novelwriter.constants import nwFiles
|
from novelwriter.constants import nwFiles
|
||||||
from novelwriter.core.item import NWItem
|
from novelwriter.core.item import NWItem
|
||||||
from novelwriter.core.projectdata import NWProjectData
|
from novelwriter.core.projectdata import NWProjectData
|
||||||
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
|
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
|
||||||
|
from novelwriter.core.status import CUSTOM_COL
|
||||||
from novelwriter.enum import nwStatusShape
|
from novelwriter.enum import nwStatusShape
|
||||||
|
|
||||||
from tests.mocked import causeOSError
|
from tests.mocked import causeOSError
|
||||||
@@ -137,7 +136,7 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, mockGUI, tstPaths, fncPath):
|
|||||||
assert xmlReader.state == XMLReadState.PARSED_OK
|
assert xmlReader.state == XMLReadState.PARSED_OK
|
||||||
assert xmlReader.xmlRoot == "novelWriterXML"
|
assert xmlReader.xmlRoot == "novelWriterXML"
|
||||||
assert xmlReader.xmlVersion == 0x0105
|
assert xmlReader.xmlVersion == 0x0105
|
||||||
assert xmlReader.xmlRevision == 5
|
assert xmlReader.xmlRevision == 6
|
||||||
assert xmlReader.appVersion == "2.7b1"
|
assert xmlReader.appVersion == "2.7b1"
|
||||||
assert xmlReader.hexVersion == 0x020700b1
|
assert xmlReader.hexVersion == 0x020700b1
|
||||||
|
|
||||||
@@ -173,19 +172,31 @@ def testCoreProjectXML_ReadCurrent(monkeypatch, mockGUI, tstPaths, fncPath):
|
|||||||
assert data.itemImport["i2d7a54"].name == "Major"
|
assert data.itemImport["i2d7a54"].name == "Major"
|
||||||
assert data.itemImport["i56be10"].name == "Main"
|
assert data.itemImport["i56be10"].name == "Main"
|
||||||
|
|
||||||
assert data.itemStatus["sf12341"].color == QColor(100, 100, 100)
|
assert data.itemStatus["sf12341"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemStatus["sf24ce6"].color == QColor(200, 50, 0)
|
assert data.itemStatus["sf24ce6"].color.getRgb() == (200, 50, 0, 255)
|
||||||
assert data.itemStatus["sc24b8f"].color == QColor(182, 60, 0)
|
assert data.itemStatus["sc24b8f"].color.getRgb() == (182, 60, 0, 255)
|
||||||
assert data.itemStatus["s90e6c9"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s90e6c9"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["sd51c5b"].color == QColor(193, 129, 0)
|
assert data.itemStatus["sd51c5b"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s8ae72a"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s8ae72a"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s78ea90"].color == QColor(58, 180, 58)
|
assert data.itemStatus["s78ea90"].color.getRgb() == (58, 180, 58, 255)
|
||||||
|
|
||||||
assert data.itemImport["ia857f0"].color == QColor(100, 100, 100)
|
assert data.itemImport["ia857f0"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemImport["i4a1d39"].color == QColor(220, 138, 221)
|
assert data.itemImport["icfb3a5"].color.getRgb() == (220, 138, 221, 255)
|
||||||
assert data.itemImport["icfb3a5"].color == QColor(220, 138, 221)
|
assert data.itemImport["i2d7a54"].color.getRgb() == (220, 138, 221, 255)
|
||||||
assert data.itemImport["i2d7a54"].color == QColor(220, 138, 221)
|
assert data.itemImport["i56be10"].color.getRgb() == (220, 138, 221, 255)
|
||||||
assert data.itemImport["i56be10"].color == QColor(220, 138, 221)
|
|
||||||
|
assert data.itemStatus["sf12341"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["sf24ce6"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["sc24b8f"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s90e6c9"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["sd51c5b"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s8ae72a"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s78ea90"].theme == CUSTOM_COL
|
||||||
|
|
||||||
|
assert data.itemImport["ia857f0"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["icfb3a5"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i2d7a54"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i56be10"].theme == CUSTOM_COL
|
||||||
|
|
||||||
assert data.itemStatus["sf12341"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["sf12341"].shape == nwStatusShape.SQUARE
|
||||||
assert data.itemStatus["sf24ce6"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["sf24ce6"].shape == nwStatusShape.SQUARE
|
||||||
@@ -305,18 +316,31 @@ def testCoreProjectXML_ReadLegacy10(tstPaths, fncPath, mockGUI, mockRnd):
|
|||||||
assert data.itemImport["i000009"].name == "Major"
|
assert data.itemImport["i000009"].name == "Major"
|
||||||
assert data.itemImport["i00000a"].name == "Main"
|
assert data.itemImport["i00000a"].name == "Main"
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].color == QColor(100, 100, 100)
|
assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemStatus["s000001"].color == QColor(200, 50, 0)
|
assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255)
|
||||||
assert data.itemStatus["s000002"].color == QColor(182, 60, 0)
|
assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255)
|
||||||
assert data.itemStatus["s000003"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000004"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000005"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000006"].color == QColor(58, 180, 58)
|
assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255)
|
||||||
|
|
||||||
assert data.itemImport["i000007"].color == QColor(100, 100, 100)
|
assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemImport["i000008"].color == QColor(0, 122, 188)
|
assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255)
|
||||||
assert data.itemImport["i000009"].color == QColor(21, 0, 180)
|
assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255)
|
||||||
assert data.itemImport["i00000a"].color == QColor(117, 0, 175)
|
assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255)
|
||||||
|
|
||||||
|
assert data.itemStatus["s000000"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000001"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000002"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000003"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000004"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000005"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000006"].theme == CUSTOM_COL
|
||||||
|
|
||||||
|
assert data.itemImport["i000007"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000008"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000009"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i00000a"].theme == CUSTOM_COL
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
||||||
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
||||||
@@ -450,18 +474,31 @@ def testCoreProjectXML_ReadLegacy11(tstPaths, fncPath, mockGUI, mockRnd):
|
|||||||
assert data.itemImport["i000009"].name == "Major"
|
assert data.itemImport["i000009"].name == "Major"
|
||||||
assert data.itemImport["i00000a"].name == "Main"
|
assert data.itemImport["i00000a"].name == "Main"
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].color == QColor(100, 100, 100)
|
assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemStatus["s000001"].color == QColor(200, 50, 0)
|
assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255)
|
||||||
assert data.itemStatus["s000002"].color == QColor(182, 60, 0)
|
assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255)
|
||||||
assert data.itemStatus["s000003"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000004"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000005"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000006"].color == QColor(58, 180, 58)
|
assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255)
|
||||||
|
|
||||||
assert data.itemImport["i000007"].color == QColor(100, 100, 100)
|
assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemImport["i000008"].color == QColor(0, 122, 188)
|
assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255)
|
||||||
assert data.itemImport["i000009"].color == QColor(21, 0, 180)
|
assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255)
|
||||||
assert data.itemImport["i00000a"].color == QColor(117, 0, 175)
|
assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255)
|
||||||
|
|
||||||
|
assert data.itemStatus["s000000"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000001"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000002"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000003"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000004"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000005"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000006"].theme == CUSTOM_COL
|
||||||
|
|
||||||
|
assert data.itemImport["i000007"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000008"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000009"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i00000a"].theme == CUSTOM_COL
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
||||||
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
||||||
@@ -595,18 +632,31 @@ def testCoreProjectXML_ReadLegacy12(tstPaths, fncPath, mockGUI, mockRnd):
|
|||||||
assert data.itemImport["i000009"].name == "Major"
|
assert data.itemImport["i000009"].name == "Major"
|
||||||
assert data.itemImport["i00000a"].name == "Main"
|
assert data.itemImport["i00000a"].name == "Main"
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].color == QColor(100, 100, 100)
|
assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemStatus["s000001"].color == QColor(200, 50, 0)
|
assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255)
|
||||||
assert data.itemStatus["s000002"].color == QColor(182, 60, 0)
|
assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255)
|
||||||
assert data.itemStatus["s000003"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000004"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000005"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000006"].color == QColor(58, 180, 58)
|
assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255)
|
||||||
|
|
||||||
assert data.itemImport["i000007"].color == QColor(100, 100, 100)
|
assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemImport["i000008"].color == QColor(0, 122, 188)
|
assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255)
|
||||||
assert data.itemImport["i000009"].color == QColor(21, 0, 180)
|
assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255)
|
||||||
assert data.itemImport["i00000a"].color == QColor(117, 0, 175)
|
assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255)
|
||||||
|
|
||||||
|
assert data.itemStatus["s000000"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000001"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000002"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000003"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000004"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000005"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000006"].theme == CUSTOM_COL
|
||||||
|
|
||||||
|
assert data.itemImport["i000007"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000008"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000009"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i00000a"].theme == CUSTOM_COL
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
||||||
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
||||||
@@ -743,18 +793,31 @@ def testCoreProjectXML_ReadLegacy13(tstPaths, fncPath, mockGUI, mockRnd):
|
|||||||
assert data.itemImport["i000009"].name == "Major"
|
assert data.itemImport["i000009"].name == "Major"
|
||||||
assert data.itemImport["i00000a"].name == "Main"
|
assert data.itemImport["i00000a"].name == "Main"
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].color == QColor(100, 100, 100)
|
assert data.itemStatus["s000000"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemStatus["s000001"].color == QColor(200, 50, 0)
|
assert data.itemStatus["s000001"].color.getRgb() == (200, 50, 0, 255)
|
||||||
assert data.itemStatus["s000002"].color == QColor(182, 60, 0)
|
assert data.itemStatus["s000002"].color.getRgb() == (182, 60, 0, 255)
|
||||||
assert data.itemStatus["s000003"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000003"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000004"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000004"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000005"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s000005"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s000006"].color == QColor(58, 180, 58)
|
assert data.itemStatus["s000006"].color.getRgb() == (58, 180, 58, 255)
|
||||||
|
|
||||||
assert data.itemImport["i000007"].color == QColor(100, 100, 100)
|
assert data.itemImport["i000007"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemImport["i000008"].color == QColor(0, 122, 188)
|
assert data.itemImport["i000008"].color.getRgb() == (0, 122, 188, 255)
|
||||||
assert data.itemImport["i000009"].color == QColor(21, 0, 180)
|
assert data.itemImport["i000009"].color.getRgb() == (21, 0, 180, 255)
|
||||||
assert data.itemImport["i00000a"].color == QColor(117, 0, 175)
|
assert data.itemImport["i00000a"].color.getRgb() == (117, 0, 175, 255)
|
||||||
|
|
||||||
|
assert data.itemStatus["s000000"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000001"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000002"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000003"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000004"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000005"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s000006"].theme == CUSTOM_COL
|
||||||
|
|
||||||
|
assert data.itemImport["i000007"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000008"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i000009"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i00000a"].theme == CUSTOM_COL
|
||||||
|
|
||||||
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000000"].shape == nwStatusShape.SQUARE
|
||||||
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["s000001"].shape == nwStatusShape.SQUARE
|
||||||
@@ -891,18 +954,31 @@ def testCoreProjectXML_ReadLegacy14(tstPaths, fncPath, mockGUI, mockRnd):
|
|||||||
assert data.itemImport["i2d7a54"].name == "Major"
|
assert data.itemImport["i2d7a54"].name == "Major"
|
||||||
assert data.itemImport["i56be10"].name == "Main"
|
assert data.itemImport["i56be10"].name == "Main"
|
||||||
|
|
||||||
assert data.itemStatus["sf12341"].color == QColor(100, 100, 100)
|
assert data.itemStatus["sf12341"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemStatus["sf24ce6"].color == QColor(200, 50, 0)
|
assert data.itemStatus["sf24ce6"].color.getRgb() == (200, 50, 0, 255)
|
||||||
assert data.itemStatus["sc24b8f"].color == QColor(182, 60, 0)
|
assert data.itemStatus["sc24b8f"].color.getRgb() == (182, 60, 0, 255)
|
||||||
assert data.itemStatus["s90e6c9"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s90e6c9"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["sd51c5b"].color == QColor(193, 129, 0)
|
assert data.itemStatus["sd51c5b"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s8ae72a"].color == QColor(193, 129, 0)
|
assert data.itemStatus["s8ae72a"].color.getRgb() == (193, 129, 0, 255)
|
||||||
assert data.itemStatus["s78ea90"].color == QColor(58, 180, 58)
|
assert data.itemStatus["s78ea90"].color.getRgb() == (58, 180, 58, 255)
|
||||||
|
|
||||||
assert data.itemImport["ia857f0"].color == QColor(100, 100, 100)
|
assert data.itemImport["ia857f0"].color.getRgb() == (100, 100, 100, 255)
|
||||||
assert data.itemImport["icfb3a5"].color == QColor(0, 122, 188)
|
assert data.itemImport["icfb3a5"].color.getRgb() == (0, 122, 188, 255)
|
||||||
assert data.itemImport["i2d7a54"].color == QColor(21, 0, 180)
|
assert data.itemImport["i2d7a54"].color.getRgb() == (21, 0, 180, 255)
|
||||||
assert data.itemImport["i56be10"].color == QColor(117, 0, 175)
|
assert data.itemImport["i56be10"].color.getRgb() == (117, 0, 175, 255)
|
||||||
|
|
||||||
|
assert data.itemStatus["sf12341"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["sf24ce6"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["sc24b8f"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s90e6c9"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["sd51c5b"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s8ae72a"].theme == CUSTOM_COL
|
||||||
|
assert data.itemStatus["s78ea90"].theme == CUSTOM_COL
|
||||||
|
|
||||||
|
assert data.itemImport["ia857f0"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["icfb3a5"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i2d7a54"].theme == CUSTOM_COL
|
||||||
|
assert data.itemImport["i56be10"].theme == CUSTOM_COL
|
||||||
|
|
||||||
assert data.itemStatus["sf12341"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["sf12341"].shape == nwStatusShape.SQUARE
|
||||||
assert data.itemStatus["sf24ce6"].shape == nwStatusShape.SQUARE
|
assert data.itemStatus["sf24ce6"].shape == nwStatusShape.SQUARE
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import pytest
|
|||||||
|
|
||||||
from PyQt6.QtGui import QColor, QIcon
|
from PyQt6.QtGui import QColor, QIcon
|
||||||
|
|
||||||
from novelwriter.core.status import NWStatus, StatusEntry, _ShapeCache
|
from novelwriter.core.status import CUSTOM_COL, NWStatus, StatusEntry, _ShapeCache
|
||||||
from novelwriter.enum import nwStatusShape
|
from novelwriter.enum import nwStatusShape
|
||||||
|
|
||||||
from tests.tools import C
|
from tests.tools import C
|
||||||
@@ -38,11 +38,12 @@ def testCoreStatus_StatusEntry():
|
|||||||
"""Test the StatusEntry class."""
|
"""Test the StatusEntry class."""
|
||||||
color = QColor(255, 0, 0)
|
color = QColor(255, 0, 0)
|
||||||
icon = NWStatus.createIcon(24, color, nwStatusShape.CIRCLE)
|
icon = NWStatus.createIcon(24, color, nwStatusShape.CIRCLE)
|
||||||
entry = StatusEntry("Test", color, nwStatusShape.CIRCLE, icon, 42)
|
entry = StatusEntry("Test", color, CUSTOM_COL, nwStatusShape.CIRCLE, icon, 42)
|
||||||
|
|
||||||
# Check values
|
# Check values
|
||||||
assert entry.name == "Test"
|
assert entry.name == "Test"
|
||||||
assert entry.color is color
|
assert entry.color is color
|
||||||
|
assert entry.theme == CUSTOM_COL
|
||||||
assert entry.shape == nwStatusShape.CIRCLE
|
assert entry.shape == nwStatusShape.CIRCLE
|
||||||
assert entry.icon is icon
|
assert entry.icon is icon
|
||||||
assert entry.count == 42
|
assert entry.count == 42
|
||||||
@@ -55,6 +56,7 @@ def testCoreStatus_StatusEntry():
|
|||||||
assert other.name == "Test"
|
assert other.name == "Test"
|
||||||
assert other.color is not color # Not the same object
|
assert other.color is not color # Not the same object
|
||||||
assert other.color == color # But same colours
|
assert other.color == color # But same colours
|
||||||
|
assert entry.theme == CUSTOM_COL
|
||||||
assert other.shape == nwStatusShape.CIRCLE
|
assert other.shape == nwStatusShape.CIRCLE
|
||||||
assert other.icon is not icon # Not the same icon, but a copy
|
assert other.icon is not icon # Not the same icon, but a copy
|
||||||
assert other.count == 42
|
assert other.count == 42
|
||||||
@@ -73,14 +75,14 @@ def testCoreStatus_Internal(mockGUI, mockRnd):
|
|||||||
assert nStatus._newKey() == statusKeys[1]
|
assert nStatus._newKey() == statusKeys[1]
|
||||||
|
|
||||||
# Key collision, should move to key 3
|
# Key collision, should move to key 3
|
||||||
nStatus.add(statusKeys[2], "Crash", (0, 0, 0), "SQUARE", 0)
|
nStatus.add(statusKeys[2], "Crash", "#000000", "SQUARE", 0)
|
||||||
assert nStatus._newKey() == statusKeys[3]
|
assert nStatus._newKey() == statusKeys[3]
|
||||||
|
|
||||||
assert nImport._newKey() == importKeys[0]
|
assert nImport._newKey() == importKeys[0]
|
||||||
assert nImport._newKey() == importKeys[1]
|
assert nImport._newKey() == importKeys[1]
|
||||||
|
|
||||||
# Key collision, should move to key 3
|
# Key collision, should move to key 3
|
||||||
nImport.add(importKeys[2], "Crash", (0, 0, 0), "SQUARE", 0)
|
nImport.add(importKeys[2], "Crash", "#000000", "SQUARE", 0)
|
||||||
assert nImport._newKey() == importKeys[3]
|
assert nImport._newKey() == importKeys[3]
|
||||||
|
|
||||||
# Check Key
|
# Check Key
|
||||||
@@ -119,14 +121,14 @@ def testCoreStatus_Internal(mockGUI, mockRnd):
|
|||||||
def testCoreStatus_Iterator(mockGUI, mockRnd):
|
def testCoreStatus_Iterator(mockGUI, mockRnd):
|
||||||
"""Test the iterator functions of the NWStatus class."""
|
"""Test the iterator functions of the NWStatus class."""
|
||||||
nStatus = NWStatus(NWStatus.STATUS)
|
nStatus = NWStatus(NWStatus.STATUS)
|
||||||
nStatus.add(None, "New", (100, 100, 100), "SQUARE", 0)
|
nStatus.add(None, "New", "#646464", "SQUARE", 0)
|
||||||
nStatus.add(None, "Note", (200, 50, 0), "CIRCLE", 1)
|
nStatus.add(None, "Note", "#ff3f00", "CIRCLE", 1)
|
||||||
nStatus.add(None, "Draft", (200, 150, 0), "SQUARE", 2)
|
nStatus.add(None, "Draft", "#ffaf00", "SQUARE", 2)
|
||||||
nStatus.add(None, "Finished", (50, 200, 0), "CIRCLE", 3)
|
nStatus.add(None, "Finished", "#3fff00", "CIRCLE", 3)
|
||||||
|
|
||||||
# Direct access
|
# Direct access
|
||||||
entry = nStatus[statusKeys[0]]
|
entry = nStatus[statusKeys[0]]
|
||||||
assert entry.color == QColor(100, 100, 100)
|
assert entry.color.getRgb() == (100, 100, 100, 255)
|
||||||
assert entry.name == "New"
|
assert entry.name == "New"
|
||||||
assert entry.count == 0
|
assert entry.count == 0
|
||||||
assert isinstance(entry.icon, QIcon)
|
assert isinstance(entry.icon, QIcon)
|
||||||
@@ -146,8 +148,8 @@ def testCoreStatus_Iterator(mockGUI, mockRnd):
|
|||||||
]
|
]
|
||||||
|
|
||||||
# Content : Colours
|
# Content : Colours
|
||||||
assert [e.color for _, e in nStatus.iterItems()] == [
|
assert [e.color.getRgb() for _, e in nStatus.iterItems()] == [
|
||||||
QColor(100, 100, 100), QColor(200, 50, 0), QColor(200, 150, 0), QColor(50, 200, 0)
|
(100, 100, 100, 255), (255, 63, 0, 255), (255, 175, 0, 255), (63, 255, 0, 255)
|
||||||
]
|
]
|
||||||
|
|
||||||
# Content : Shape
|
# Content : Shape
|
||||||
@@ -168,27 +170,31 @@ def testCoreStatus_Entries(mockGUI, mockRnd):
|
|||||||
# ===
|
# ===
|
||||||
|
|
||||||
# Has a key
|
# Has a key
|
||||||
nStatus.add(statusKeys[0], "Entry 1", (200, 100, 50), "SQUARE", 0)
|
nStatus.add(statusKeys[0], "Entry 1", "200, 100, 50", "SQUARE", 0)
|
||||||
assert nStatus[statusKeys[0]].name == "Entry 1"
|
assert nStatus[statusKeys[0]].name == "Entry 1"
|
||||||
assert nStatus[statusKeys[0]].color == QColor(200, 100, 50)
|
assert nStatus[statusKeys[0]].color.getRgb() == (200, 100, 50, 255)
|
||||||
|
assert nStatus[statusKeys[0]].theme == CUSTOM_COL
|
||||||
assert nStatus[statusKeys[0]].shape == nwStatusShape.SQUARE
|
assert nStatus[statusKeys[0]].shape == nwStatusShape.SQUARE
|
||||||
|
|
||||||
# Doesn't have a key
|
# Doesn't have a key
|
||||||
nStatus.add(None, "Entry 2", (210, 110, 60), "SQUARE", 0)
|
nStatus.add(None, "Entry 2", "210, 110, 60", "SQUARE", 0)
|
||||||
assert nStatus[statusKeys[1]].name == "Entry 2"
|
assert nStatus[statusKeys[1]].name == "Entry 2"
|
||||||
assert nStatus[statusKeys[1]].color == QColor(210, 110, 60)
|
assert nStatus[statusKeys[1]].color.getRgb() == (210, 110, 60, 255)
|
||||||
|
assert nStatus[statusKeys[1]].theme == CUSTOM_COL
|
||||||
assert nStatus[statusKeys[1]].shape == nwStatusShape.SQUARE
|
assert nStatus[statusKeys[1]].shape == nwStatusShape.SQUARE
|
||||||
|
|
||||||
# Wrong colour spec, unknown shape
|
# Wrong colour spec, unknown shape
|
||||||
nStatus.add(None, "Entry 3", "what?", "", 0) # type: ignore
|
nStatus.add(None, "Entry 3", "what?", "", 0)
|
||||||
assert nStatus[statusKeys[2]].name == "Entry 3"
|
assert nStatus[statusKeys[2]].name == "Entry 3"
|
||||||
assert nStatus[statusKeys[2]].color == QColor(100, 100, 100)
|
assert nStatus[statusKeys[2]].color.getRgb() == (0, 0, 0, 255)
|
||||||
|
assert nStatus[statusKeys[2]].theme == CUSTOM_COL
|
||||||
assert nStatus[statusKeys[2]].shape == nwStatusShape.SQUARE
|
assert nStatus[statusKeys[2]].shape == nwStatusShape.SQUARE
|
||||||
|
|
||||||
# Wrong colour count
|
# Wrong colour definition
|
||||||
nStatus.add(None, "Entry 4", (10, 20), "CIRCLE", 0) # type: ignore
|
nStatus.add(None, "Entry 4", "#stuff#", "CIRCLE", 0)
|
||||||
assert nStatus[statusKeys[3]].name == "Entry 4"
|
assert nStatus[statusKeys[3]].name == "Entry 4"
|
||||||
assert nStatus[statusKeys[3]].color == QColor(100, 100, 100)
|
assert nStatus[statusKeys[3]].color.getRgb() == (0, 0, 0, 255)
|
||||||
|
assert nStatus[statusKeys[3]].theme == CUSTOM_COL
|
||||||
assert nStatus[statusKeys[3]].shape == nwStatusShape.CIRCLE
|
assert nStatus[statusKeys[3]].shape == nwStatusShape.CIRCLE
|
||||||
|
|
||||||
# Check
|
# Check
|
||||||
@@ -202,8 +208,6 @@ def testCoreStatus_Entries(mockGUI, mockRnd):
|
|||||||
assert nStatus.check("s987654") == statusKeys[0]
|
assert nStatus.check("s987654") == statusKeys[0]
|
||||||
|
|
||||||
# Name Access
|
# Name Access
|
||||||
# ===========
|
|
||||||
|
|
||||||
assert nStatus[statusKeys[0]].name == "Entry 1"
|
assert nStatus[statusKeys[0]].name == "Entry 1"
|
||||||
assert nStatus[statusKeys[1]].name == "Entry 2"
|
assert nStatus[statusKeys[1]].name == "Entry 2"
|
||||||
assert nStatus[statusKeys[2]].name == "Entry 3"
|
assert nStatus[statusKeys[2]].name == "Entry 3"
|
||||||
@@ -211,17 +215,20 @@ def testCoreStatus_Entries(mockGUI, mockRnd):
|
|||||||
assert nStatus["blablabla"].name == "Entry 1"
|
assert nStatus["blablabla"].name == "Entry 1"
|
||||||
|
|
||||||
# Colour Access
|
# Colour Access
|
||||||
# =============
|
assert nStatus[statusKeys[0]].color.getRgb() == (200, 100, 50, 255)
|
||||||
|
assert nStatus[statusKeys[1]].color.getRgb() == (210, 110, 60, 255)
|
||||||
|
assert nStatus[statusKeys[2]].color.getRgb() == (0, 0, 0, 255)
|
||||||
|
assert nStatus[statusKeys[3]].color.getRgb() == (0, 0, 0, 255)
|
||||||
|
assert nStatus["blablabla"].color.getRgb() == (200, 100, 50, 255)
|
||||||
|
|
||||||
assert nStatus[statusKeys[0]].color == QColor(200, 100, 50)
|
# Theme Access
|
||||||
assert nStatus[statusKeys[1]].color == QColor(210, 110, 60)
|
assert nStatus[statusKeys[0]].theme == CUSTOM_COL
|
||||||
assert nStatus[statusKeys[2]].color == QColor(100, 100, 100)
|
assert nStatus[statusKeys[1]].theme == CUSTOM_COL
|
||||||
assert nStatus[statusKeys[3]].color == QColor(100, 100, 100)
|
assert nStatus[statusKeys[2]].theme == CUSTOM_COL
|
||||||
assert nStatus["blablabla"].color == QColor(200, 100, 50)
|
assert nStatus[statusKeys[3]].theme == CUSTOM_COL
|
||||||
|
assert nStatus["blablabla"].theme == CUSTOM_COL
|
||||||
|
|
||||||
# Icon Access
|
# Icon Access
|
||||||
# ===========
|
|
||||||
|
|
||||||
assert isinstance(nStatus[statusKeys[0]].icon, QIcon)
|
assert isinstance(nStatus[statusKeys[0]].icon, QIcon)
|
||||||
assert isinstance(nStatus[statusKeys[1]].icon, QIcon)
|
assert isinstance(nStatus[statusKeys[1]].icon, QIcon)
|
||||||
assert isinstance(nStatus[statusKeys[2]].icon, QIcon)
|
assert isinstance(nStatus[statusKeys[2]].icon, QIcon)
|
||||||
@@ -229,8 +236,6 @@ def testCoreStatus_Entries(mockGUI, mockRnd):
|
|||||||
assert isinstance(nStatus["blablabla"].icon, QIcon)
|
assert isinstance(nStatus["blablabla"].icon, QIcon)
|
||||||
|
|
||||||
# Shape Access
|
# Shape Access
|
||||||
# ============
|
|
||||||
|
|
||||||
assert nStatus[statusKeys[0]].shape == nwStatusShape.SQUARE
|
assert nStatus[statusKeys[0]].shape == nwStatusShape.SQUARE
|
||||||
assert nStatus[statusKeys[1]].shape == nwStatusShape.SQUARE
|
assert nStatus[statusKeys[1]].shape == nwStatusShape.SQUARE
|
||||||
assert nStatus[statusKeys[2]].shape == nwStatusShape.SQUARE
|
assert nStatus[statusKeys[2]].shape == nwStatusShape.SQUARE
|
||||||
@@ -319,13 +324,32 @@ def testCoreStatus_Entries(mockGUI, mockRnd):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testCoreStatus_Pack(mockGUI, mockRnd):
|
def testCoreStatus_RefreshIcons(mockGUIwithTheme, mockRnd):
|
||||||
|
"""Test refreshing the icons of the NWStatus class."""
|
||||||
|
nStatus = NWStatus(NWStatus.STATUS)
|
||||||
|
nStatus.add(None, "New", "default", "SQUARE", 0)
|
||||||
|
nStatus.add(None, "Note", "red", "CIRCLE", 0)
|
||||||
|
nStatus.add(None, "Draft", "yellow", "SQUARE", 0)
|
||||||
|
nStatus.add(None, "Finished", "green", "SQUARE", 0)
|
||||||
|
|
||||||
|
beforeIcons = [nStatus[statusKeys[i]].icon for i in range(4)]
|
||||||
|
|
||||||
|
# Refreshing the icons should generate new ones
|
||||||
|
nStatus.refreshIcons()
|
||||||
|
afterIcons = [nStatus[statusKeys[i]].icon for i in range(4)]
|
||||||
|
|
||||||
|
for before, after in zip(beforeIcons, afterIcons, strict=False):
|
||||||
|
assert before is not after
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.core
|
||||||
|
def testCoreStatus_Pack(mockGUIwithTheme, mockRnd):
|
||||||
"""Test data packing of the NWStatus class."""
|
"""Test data packing of the NWStatus class."""
|
||||||
nStatus = NWStatus(NWStatus.STATUS)
|
nStatus = NWStatus(NWStatus.STATUS)
|
||||||
nStatus.add(None, "New", (100, 100, 100), "SQUARE", 0)
|
nStatus.add(None, "New", "#646464", "SQUARE", 0)
|
||||||
nStatus.add(None, "Note", (200, 50, 0), "CIRCLE", 0)
|
nStatus.add(None, "Note", "#c83200", "CIRCLE", 0)
|
||||||
nStatus.add(None, "Draft", (200, 150, 0), "SQUARE", 0)
|
nStatus.add(None, "Draft", "#c89600", "SQUARE", 0)
|
||||||
nStatus.add(None, "Finished", (50, 200, 0), "SQUARE", 0)
|
nStatus.add(None, "Finished", "default", "SQUARE", 0)
|
||||||
|
|
||||||
countTo = [3, 5, 7, 9]
|
countTo = [3, 5, 7, 9]
|
||||||
for i, n in enumerate(countTo):
|
for i, n in enumerate(countTo):
|
||||||
@@ -337,33 +361,25 @@ def testCoreStatus_Pack(mockGUI, mockRnd):
|
|||||||
("New", {
|
("New", {
|
||||||
"key": statusKeys[0],
|
"key": statusKeys[0],
|
||||||
"count": "3",
|
"count": "3",
|
||||||
"red": "100",
|
"color": "#646464",
|
||||||
"green": "100",
|
|
||||||
"blue": "100",
|
|
||||||
"shape": "SQUARE",
|
"shape": "SQUARE",
|
||||||
}),
|
}),
|
||||||
("Note", {
|
("Note", {
|
||||||
"key": statusKeys[1],
|
"key": statusKeys[1],
|
||||||
"count": "5",
|
"count": "5",
|
||||||
"red": "200",
|
"color": "#c83200",
|
||||||
"green": "50",
|
|
||||||
"blue": "0",
|
|
||||||
"shape": "CIRCLE",
|
"shape": "CIRCLE",
|
||||||
}),
|
}),
|
||||||
("Draft", {
|
("Draft", {
|
||||||
"key": statusKeys[2],
|
"key": statusKeys[2],
|
||||||
"count": "7",
|
"count": "7",
|
||||||
"red": "200",
|
"color": "#c89600",
|
||||||
"green": "150",
|
|
||||||
"blue": "0",
|
|
||||||
"shape": "SQUARE",
|
"shape": "SQUARE",
|
||||||
}),
|
}),
|
||||||
("Finished", {
|
("Finished", {
|
||||||
"key": statusKeys[3],
|
"key": statusKeys[3],
|
||||||
"count": "9",
|
"count": "9",
|
||||||
"red": "50",
|
"color": "default",
|
||||||
"green": "200",
|
|
||||||
"blue": "0",
|
|
||||||
"shape": "SQUARE",
|
"shape": "SQUARE",
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ from PyQt6.QtGui import QAction, QFont, QFontDatabase, QKeyEvent
|
|||||||
from PyQt6.QtWidgets import QFileDialog, QFontDialog
|
from PyQt6.QtWidgets import QFileDialog, QFontDialog
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT
|
from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_TREECOL
|
||||||
from novelwriter.constants import nwUnicode
|
from novelwriter.constants import nwUnicode
|
||||||
from novelwriter.dialogs.preferences import GuiPreferences
|
from novelwriter.dialogs.preferences import GuiPreferences
|
||||||
from novelwriter.dialogs.quotes import GuiQuoteSelect
|
from novelwriter.dialogs.quotes import GuiQuoteSelect
|
||||||
@@ -196,11 +196,11 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths):
|
|||||||
# Project View
|
# Project View
|
||||||
prefs.iconColTree.setCurrentData("faded", "default")
|
prefs.iconColTree.setCurrentData("faded", "default")
|
||||||
prefs.iconColDocs.setChecked(True)
|
prefs.iconColDocs.setChecked(True)
|
||||||
prefs.emphLabels.setChecked(True)
|
prefs.emphLabels.setChecked(False)
|
||||||
|
|
||||||
assert CONFIG.iconColTree == "theme"
|
assert CONFIG.iconColTree == DEF_TREECOL
|
||||||
assert CONFIG.iconColDocs is False
|
assert CONFIG.iconColDocs is False
|
||||||
assert CONFIG.emphLabels is False
|
assert CONFIG.emphLabels is True
|
||||||
|
|
||||||
# Behaviour
|
# Behaviour
|
||||||
prefs.autoSaveDoc.stepUp()
|
prefs.autoSaveDoc.stepUp()
|
||||||
@@ -362,7 +362,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, fncPath, tstPaths):
|
|||||||
# Project View
|
# Project View
|
||||||
assert CONFIG.iconColTree == "faded"
|
assert CONFIG.iconColTree == "faded"
|
||||||
assert CONFIG.iconColDocs is True
|
assert CONFIG.iconColDocs is True
|
||||||
assert CONFIG.emphLabels is True
|
assert CONFIG.emphLabels is False
|
||||||
|
|
||||||
# Behaviour
|
# Behaviour
|
||||||
assert CONFIG.autoSaveDoc == 31
|
assert CONFIG.autoSaveDoc == 31
|
||||||
|
|||||||
@@ -214,22 +214,22 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn
|
|||||||
|
|
||||||
assert update[0][0] == C.sNew
|
assert update[0][0] == C.sNew
|
||||||
assert update[0][1].name == "New"
|
assert update[0][1].name == "New"
|
||||||
assert update[0][1].color == QColor(120, 120, 120)
|
assert update[0][1].color.getRgb() == (108, 108, 108, 255)
|
||||||
assert update[0][1].shape == nwStatusShape.STAR
|
assert update[0][1].shape == nwStatusShape.STAR
|
||||||
|
|
||||||
assert update[1][0] == C.sDraft
|
assert update[1][0] == C.sDraft
|
||||||
assert update[1][1].name == "Draft"
|
assert update[1][1].name == "Draft"
|
||||||
assert update[1][1].color == QColor(143, 240, 164)
|
assert update[1][1].color.getRgb() == (163, 156, 52, 255)
|
||||||
assert update[1][1].shape == nwStatusShape.CIRCLE_T
|
assert update[1][1].shape == nwStatusShape.CIRCLE_T
|
||||||
|
|
||||||
assert update[2][0] == C.sFinished
|
assert update[2][0] == C.sFinished
|
||||||
assert update[2][1].name == "Finished"
|
assert update[2][1].name == "Finished"
|
||||||
assert update[2][1].color == QColor(249, 240, 107)
|
assert update[2][1].color.getRgb() == (41, 102, 41, 255)
|
||||||
assert update[2][1].shape == nwStatusShape.STAR
|
assert update[2][1].shape == nwStatusShape.STAR
|
||||||
|
|
||||||
assert update[3][0] is None
|
assert update[3][0] is None
|
||||||
assert update[3][1].name == "Final"
|
assert update[3][1].name == "Final"
|
||||||
assert update[3][1].color == QColor(20, 30, 40)
|
assert update[3][1].color.getRgb() == (20, 30, 40, 255)
|
||||||
assert update[3][1].shape == nwStatusShape.CIRCLE
|
assert update[3][1].shape == nwStatusShape.CIRCLE
|
||||||
|
|
||||||
# Move items, none selected -> no change
|
# Move items, none selected -> no change
|
||||||
@@ -289,22 +289,22 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn
|
|||||||
|
|
||||||
assert update[0][0] == C.iNew
|
assert update[0][0] == C.iNew
|
||||||
assert update[0][1].name == "New"
|
assert update[0][1].name == "New"
|
||||||
assert update[0][1].color == QColor(120, 120, 120)
|
assert update[0][1].color.getRgb() == (179, 90, 179, 255)
|
||||||
assert update[0][1].shape == nwStatusShape.SQUARE
|
assert update[0][1].shape == nwStatusShape.SQUARE
|
||||||
|
|
||||||
assert update[1][0] == C.iMajor
|
assert update[1][0] == C.iMajor
|
||||||
assert update[1][1].name == "Major"
|
assert update[1][1].name == "Major"
|
||||||
assert update[1][1].color == QColor(220, 138, 221)
|
assert update[1][1].color.getRgb() == (179, 90, 179, 255)
|
||||||
assert update[1][1].shape == nwStatusShape.BLOCK_3
|
assert update[1][1].shape == nwStatusShape.BLOCK_3
|
||||||
|
|
||||||
assert update[2][0] == C.iMain
|
assert update[2][0] == C.iMain
|
||||||
assert update[2][1].name == "Main"
|
assert update[2][1].name == "Main"
|
||||||
assert update[2][1].color == QColor(220, 138, 221)
|
assert update[2][1].color.getRgb() == (179, 90, 179, 255)
|
||||||
assert update[2][1].shape == nwStatusShape.BLOCK_4
|
assert update[2][1].shape == nwStatusShape.BLOCK_4
|
||||||
|
|
||||||
assert update[3][0] is None
|
assert update[3][0] is None
|
||||||
assert update[3][1].name == "Final"
|
assert update[3][1].name == "Final"
|
||||||
assert update[3][1].color == QColor(20, 30, 40)
|
assert update[3][1].color.getRgb() == (20, 30, 40, 255)
|
||||||
assert update[3][1].shape == nwStatusShape.TRIANGLE
|
assert update[3][1].shape == nwStatusShape.TRIANGLE
|
||||||
|
|
||||||
# Check Project
|
# Check Project
|
||||||
@@ -354,10 +354,10 @@ def testDlgProjSettings_StatusImportExport(qtbot, monkeypatch, nwGUI, projPath,
|
|||||||
|
|
||||||
assert expFile.is_file() is True
|
assert expFile.is_file() is True
|
||||||
assert expFile.read_text().split() == [
|
assert expFile.read_text().split() == [
|
||||||
"STAR,#787878,New",
|
"STAR,#6c6c6c,New",
|
||||||
"TRIANGLE,#cdab8f,Note",
|
"TRIANGLE,#a62a2d,Note",
|
||||||
"CIRCLE_T,#8ff0a4,Draft",
|
"CIRCLE_T,#a39c34,Draft",
|
||||||
"STAR,#f9f06b,Finished",
|
"STAR,#296629,Finished",
|
||||||
]
|
]
|
||||||
|
|
||||||
# Import Error
|
# Import Error
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ def testGuiViewerPanel_Tags(qtbot, monkeypatch, caplog, nwGUI, projPath, mockRnd
|
|||||||
|
|
||||||
# Update Labels
|
# Update Labels
|
||||||
assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "New"
|
assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "New"
|
||||||
SHARED.project.data.itemImport.add(C.iNew, "Stuff", (100, 100, 100), "SQUARE", 0)
|
SHARED.project.data.itemImport.add(C.iNew, "Stuff", "#646464", "SQUARE", 0)
|
||||||
viewPanel.updateStatusLabels("i")
|
viewPanel.updateStatusLabels("i")
|
||||||
assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "Stuff"
|
assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "Stuff"
|
||||||
|
|
||||||
|
|||||||
@@ -267,8 +267,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, projPath, tstPaths, mockRnd):
|
|||||||
# Change some settings
|
# Change some settings
|
||||||
CONFIG.hideHScroll = True
|
CONFIG.hideHScroll = True
|
||||||
CONFIG.hideVScroll = True
|
CONFIG.hideVScroll = True
|
||||||
CONFIG.autoScrollPos = 80
|
CONFIG.autoScroll = False
|
||||||
CONFIG.autoScroll = True
|
|
||||||
|
|
||||||
# Add a Character File
|
# Add a Character File
|
||||||
nwGUI._changeView(nwView.PROJECT)
|
nwGUI._changeView(nwView.PROJECT)
|
||||||
|
|||||||
@@ -55,37 +55,37 @@ def testGuiTheme_ParseColor():
|
|||||||
theme._qColors["grey"] = QColor(127, 127, 127)
|
theme._qColors["grey"] = QColor(127, 127, 127)
|
||||||
|
|
||||||
# By Name
|
# By Name
|
||||||
assert theme._parseColor("red").getRgb() == (255, 0, 0, 255)
|
assert theme.parseColor("red").getRgb() == (255, 0, 0, 255)
|
||||||
assert theme._parseColor("green").getRgb() == (0, 255, 0, 255)
|
assert theme.parseColor("green").getRgb() == (0, 255, 0, 255)
|
||||||
assert theme._parseColor("blue").getRgb() == (0, 0, 255, 255)
|
assert theme.parseColor("blue").getRgb() == (0, 0, 255, 255)
|
||||||
assert theme._parseColor("bob").getRgb() == (0, 0, 0, 255)
|
assert theme.parseColor("bob").getRgb() == (0, 0, 0, 255)
|
||||||
|
|
||||||
# CSS Format
|
# CSS Format
|
||||||
assert theme._parseColor("#ff0000").getRgb() == (255, 0, 0, 255)
|
assert theme.parseColor("#ff0000").getRgb() == (255, 0, 0, 255)
|
||||||
assert theme._parseColor("#ff00007f").getRgb() == (255, 0, 0, 127)
|
assert theme.parseColor("#ff00007f").getRgb() == (255, 0, 0, 127)
|
||||||
assert theme._parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored
|
assert theme.parseColor("#ff00").getRgb() == (0, 0, 0, 255) # Too short -> ignored
|
||||||
assert theme._parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored
|
assert theme.parseColor("#ff00007f15").getRgb() == (0, 0, 0, 255) # Too long -> ignored
|
||||||
|
|
||||||
# Name + Alpha
|
# Name + Alpha
|
||||||
assert theme._parseColor("red:255").getRgb() == (255, 0, 0, 255)
|
assert theme.parseColor("red:255").getRgb() == (255, 0, 0, 255)
|
||||||
assert theme._parseColor("red:127").getRgb() == (255, 0, 0, 127)
|
assert theme.parseColor("red:127").getRgb() == (255, 0, 0, 127)
|
||||||
assert theme._parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated
|
assert theme.parseColor("red:512").getRgb() == (255, 0, 0, 255) # Value truncated
|
||||||
|
|
||||||
# Name + Lighter
|
# Name + Lighter
|
||||||
assert theme._parseColor("grey:L100").getRgb() == (127, 127, 127, 255)
|
assert theme.parseColor("grey:L100").getRgb() == (127, 127, 127, 255)
|
||||||
assert theme._parseColor("grey:L150").getRgb() == (190, 190, 190, 255)
|
assert theme.parseColor("grey:L150").getRgb() == (190, 190, 190, 255)
|
||||||
assert theme._parseColor("grey:L50").getRgb() == (63, 63, 63, 255)
|
assert theme.parseColor("grey:L50").getRgb() == (63, 63, 63, 255)
|
||||||
|
|
||||||
# Name + Darker
|
# Name + Darker
|
||||||
assert theme._parseColor("grey:D100").getRgb() == (127, 127, 127, 255)
|
assert theme.parseColor("grey:D100").getRgb() == (127, 127, 127, 255)
|
||||||
assert theme._parseColor("grey:D150").getRgb() == (85, 85, 85, 255)
|
assert theme.parseColor("grey:D150").getRgb() == (85, 85, 85, 255)
|
||||||
assert theme._parseColor("grey:D50").getRgb() == (254, 254, 254, 255)
|
assert theme.parseColor("grey:D50").getRgb() == (254, 254, 254, 255)
|
||||||
|
|
||||||
# Values
|
# Values
|
||||||
assert theme._parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255)
|
assert theme.parseColor("255, 0, 0").getRgb() == (255, 0, 0, 255)
|
||||||
assert theme._parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255)
|
assert theme.parseColor("255, 0, 0, 255").getRgb() == (255, 0, 0, 255)
|
||||||
assert theme._parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127)
|
assert theme.parseColor("255, 0, 0, 127").getRgb() == (255, 0, 0, 127)
|
||||||
assert theme._parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated
|
assert theme.parseColor("255, 0, 0, 127, 42").getRgb() == (255, 0, 0, 127) # Truncated
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gui
|
@pytest.mark.gui
|
||||||
|
|||||||
Reference in New Issue
Block a user