Improve build settings

This commit is contained in:
Veronica Berglyd Olsen
2024-10-01 14:01:36 +02:00
parent d8bb9950d3
commit 22473823c9
4 changed files with 30 additions and 33 deletions
+9 -15
View File
@@ -40,15 +40,15 @@ from novelwriter.constants import nwFiles, nwHeadFmt
from novelwriter.core.project import NWProject
from novelwriter.enum import nwBuildFmt
from novelwriter.error import logException
from novelwriter.types import T_Basic
logger = logging.getLogger(__name__)
# The Settings Template
# =====================
# Each entry contains a tuple on the form:
# (type, default, [min value, max value])
# Each entry contains a tuple on the form: (type, default)
SETTINGS_TEMPLATE = {
SETTINGS_TEMPLATE: dict[str, tuple[type, T_Basic]] = {
"filter.includeNovel": (bool, True),
"filter.includeNotes": (bool, False),
"filter.includeInactive": (bool, False),
@@ -83,7 +83,7 @@ SETTINGS_TEMPLATE = {
"text.ignoredKeywords": (str, ""),
"text.addNoteHeadings": (bool, True),
"format.textFont": (str, CONFIG.textFont.toString()),
"format.lineHeight": (float, 1.15, 0.75, 3.0),
"format.lineHeight": (float, 1.15),
"format.justifyText": (bool, False),
"format.stripUnicode": (bool, False),
"format.replaceTabs": (bool, False),
@@ -356,18 +356,12 @@ class BuildSettings:
self._changed = True
return
def setValue(self, key: str, value: str | int | bool | float) -> bool:
def setValue(self, key: str, value: T_Basic) -> None:
"""Set a specific value for a build setting."""
if key not in SETTINGS_TEMPLATE:
return False
definition = SETTINGS_TEMPLATE[key]
if not isinstance(value, definition[0]):
return False
if len(definition) == 4 and isinstance(value, (int, float)):
value = min(max(value, definition[2]), definition[3])
self._changed = value != self._settings[key]
self._settings[key] = value
return True
if (d := SETTINGS_TEMPLATE.get(key)) and len(d) == 2 and isinstance(value, d[0]):
self._changed = value != self._settings[key]
self._settings[key] = value
return
##
# Methods
+4
View File
@@ -27,6 +27,10 @@ from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QFont, QPainter, QTextCharFormat, QTextCursor, QTextFormat
from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QSizePolicy, QStyle
# Type Aliases
T_Basic = str | int | float | bool
# Qt Alignment Flags
QtAlignAbsolute = Qt.AlignmentFlag.AlignAbsolute
+16 -17
View File
@@ -29,7 +29,7 @@ from pathlib import Path
import pytest
from novelwriter import CONFIG
from novelwriter.constants import nwFiles
from novelwriter.constants import nwFiles, nwHeadFmt
from novelwriter.core.buildsettings import BuildCollection, BuildSettings, FilterMode
from novelwriter.core.project import NWProject
from novelwriter.enum import nwBuildFmt, nwItemClass
@@ -153,43 +153,42 @@ def testCoreBuildSettings_BuildValues():
floatSetting = "format.lineHeight"
# Invalid setting
assert build.setValue("foo", "bar") is False
build.setValue("foo", "bar")
assert build.getStr("foo") == "None"
# Value must be correct type
assert build.setValue(strSetting, 15) is False
assert build.setValue(intSetting, 15.0) is False
assert build.setValue(boolSetting, "string") is False
assert build.setValue(floatSetting, 15) is False
# Check min/max range
assert build.setValue(floatSetting, 200.0) is True
assert build.getFloat(floatSetting) == 3.0
assert build.setValue(floatSetting, 0.0) is True
assert build.getFloat(floatSetting) == 0.75
build.setValue(strSetting, 15)
assert build.getStr(strSetting) == nwHeadFmt.TITLE
build.setValue(intSetting, 15.0)
assert build.getInt(intSetting) == 0
build.setValue(floatSetting, 15)
assert build.getFloat(floatSetting) == 1.15
build.setValue(boolSetting, "string")
assert build.getBool(boolSetting) is True
# Check string values
assert build.setValue(strSetting, "foobar") is True
build.setValue(strSetting, "foobar")
assert build.getStr(strSetting) == "foobar"
assert build.getInt(strSetting) == 0
assert build.getBool(strSetting) is True
assert build.getFloat(strSetting) == 0.0
# Check int values
assert build.setValue(intSetting, 42) is True
build.setValue(intSetting, 42)
assert build.getStr(intSetting) == "42"
assert build.getInt(intSetting) == 42
assert build.getBool(intSetting) is True
assert build.getFloat(intSetting) == 42.0
# Check bool values
assert build.setValue(boolSetting, True) is True
build.setValue(boolSetting, True)
assert build.getStr(boolSetting) == "True"
assert build.getInt(boolSetting) == 1
assert build.getBool(boolSetting) is True
assert build.getFloat(boolSetting) == 1.0
# Check float values
assert build.setValue(floatSetting, 2.5) is True
build.setValue(floatSetting, 2.5)
assert build.getStr(floatSetting) == "2.5"
assert build.getInt(floatSetting) == 2
assert build.getBool(floatSetting) is True
@@ -334,7 +333,7 @@ def testCoreBuildSettings_Filters(mockGUI, fncPath: Path, mockRnd):
hCharDoc: (True, FilterMode.INCLUDED),
}
# Set everything back to filered
# Set everything back to filtered
build.setValue("filter.includeNotes", False)
build.setAllowRoot(C.hPlotRoot, False)
build.setAllowRoot(C.hCharRoot, True)
+1 -1
View File
@@ -311,7 +311,7 @@ def testToolBuildSettings_Headings(qtbot, nwGUI):
"""Test the Headings Tab of the GuiBuildSettings dialog."""
build = BuildSettings()
ttTitle = f"Title: {nwHeadFmt.TITLE}"
ttTitle = f"Part: {nwHeadFmt.TITLE}"
chTitle = f"Chapter: {nwHeadFmt.TITLE}"
unTitle = f"Interlude: {nwHeadFmt.TITLE}"
scTitle = f"Scene: {nwHeadFmt.TITLE}"