Clean up setters and getters in Config

This commit is contained in:
Veronica Berglyd Olsen
2022-11-10 09:29:00 +01:00
parent e2f3a44d96
commit 15fec91358
11 changed files with 220 additions and 206 deletions
+16
View File
@@ -124,6 +124,17 @@ def checkUuid(value, default):
return default return default
def checkPath(value, default):
"""Check if a value is a valid path. Non-empty strings are accepted.
"""
if isinstance(value, Path):
return value
elif isinstance(value, str):
if value.strip():
return Path(value)
return default
# =============================================================================================== # # =============================================================================================== #
# Validator Functions # Validator Functions
# =============================================================================================== # # =============================================================================================== #
@@ -552,6 +563,11 @@ class NWConfigParser(ConfigParser):
logger.error("Could not read '%s':'%s' from config", section, option) logger.error("Could not read '%s':'%s' from config", section, option)
return default return default
def rdPath(self, section, option, default):
"""Read a path value.
"""
return checkPath(self.get(section, option, fallback=default), default)
def rdStrList(self, section, option, default): def rdStrList(self, section, option, default):
"""Read string list. """Read string list.
""" """
+136 -137
View File
@@ -37,7 +37,7 @@ from PyQt5.QtCore import (
) )
from novelwriter.error import logException, formatException from novelwriter.error import logException, formatException
from novelwriter.common import splitVersionNumber, formatTimeStamp, NWConfigParser from novelwriter.common import checkPath, splitVersionNumber, formatTimeStamp, NWConfigParser
from novelwriter.constants import nwFiles, nwUnicode from novelwriter.constants import nwFiles, nwUnicode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -73,10 +73,10 @@ class Config:
self._appPath = self._appRoot self._appPath = self._appRoot
# Runtime Settings and Variables # Runtime Settings and Variables
self._hasError = False # True if the config class encountered an error self._hasError = False # True if the config class encountered an error
self._errData = [] # List of error messages self._errData = [] # List of error messages
self.confChanged = False # True whenever the config has chenged, false after save self._confChanged = False # True whenever the config has chenged, false after save
self.cmdOpen = None # Path from command line for project to be opened on launch self.cmdOpen = None # Path from command line for project to be opened on launch
# Localisation Info # Localisation Info
self._qLocal = QLocale.system() self._qLocal = QLocale.system()
@@ -106,14 +106,13 @@ class Config:
self.setDefaultSyntaxTheme() self.setDefaultSyntaxTheme()
# Size Settings # Size Settings
self.winGeometry = [1200, 650] self._winGeometry = [1200, 650]
self.prefGeometry = [700, 615] self._prefGeometry = [700, 615]
self.projColWidth = [200, 60, 140] self._projColWidth = [200, 60, 140]
self.mainPanePos = [300, 800] self._mainPanePos = [300, 800]
self.docPanePos = [400, 400] self._viewPanePos = [500, 150]
self.viewPanePos = [500, 150] self._outlnPanePos = [500, 150]
self.outlnPanePos = [500, 150] self.isFullScreen = False
self.isFullScreen = False
# Feature Settings # Feature Settings
self.hideVScroll = False # Hide vertical scroll bars on main widgets self.hideVScroll = False # Hide vertical scroll bars on main widgets
@@ -258,6 +257,109 @@ class Config:
def recentProjects(self): def recentProjects(self):
return self._recentProj return self._recentProj
@property
def mainWinSize(self):
return [int(x*self.guiScale) for x in self._winGeometry]
@property
def preferencesWinSize(self):
return [int(x*self.guiScale) for x in self._prefGeometry]
@property
def projLoadColWidths(self):
return [int(x*self.guiScale) for x in self._projColWidth]
@property
def mainPanePos(self):
return [int(x*self.guiScale) for x in self._mainPanePos]
@property
def viewPanePos(self):
return [int(x*self.guiScale) for x in self._viewPanePos]
@property
def outlinePanePos(self):
return [int(x*self.guiScale) for x in self._outlnPanePos]
##
# Setters
##
def setMainWinSize(self, newWidth, newHeight):
"""Set the size of the main window, but only if the change is
larger than 5 pixels. The OS window manager will sometimes
adjust it a bit, and we don't want the main window to shrink or
grow each time the app is opened.
"""
newWidth = int(newWidth/self.guiScale)
newHeight = int(newHeight/self.guiScale)
if abs(self._winGeometry[0] - newWidth) > 5:
self._winGeometry[0] = newWidth
self._confChanged = True
if abs(self._winGeometry[1] - newHeight) > 5:
self._winGeometry[1] = newHeight
self._confChanged = True
return
def setPreferencesWinSize(self, newWidth, newHeight):
"""Sat the size of the Preferences dialog window.
"""
self._prefGeometry[0] = int(newWidth/self.guiScale)
self._prefGeometry[1] = int(newHeight/self.guiScale)
self._confChanged = True
return
def setProjLoadColWidths(self, colWidths):
"""Set the column widths of the Load Project dialog.
"""
self._projColWidth = [int(x/self.guiScale) for x in colWidths]
self._confChanged = True
return
def setMainPanePos(self, panePos):
"""Set the position of the main GUI splitter.
"""
self._mainPanePos = [int(x/self.guiScale) for x in panePos]
self._confChanged = True
return
def setViewPanePos(self, panePos):
"""Set the position of the viewer meta data splitter.
"""
self._viewPanePos = [int(x/self.guiScale) for x in panePos]
self._confChanged = True
return
def setOutlinePanePos(self, panePos):
"""Set the position of the outline details splitter.
"""
self._outlnPanePos = [int(x/self.guiScale) for x in panePos]
self._confChanged = True
return
def setLastPath(self, lastPath):
"""Set the last used path. Only the folder is saved, so if the
path is not a folder, the parent of the path is used instead.
"""
if isinstance(lastPath, (str, Path)):
lastPath = Path(lastPath)
if not lastPath.is_dir():
lastPath = lastPath.parent
if lastPath.is_dir():
self._lastPath = lastPath
logger.debug("Last path updated: %s" % self._lastPath)
return
def setBackupPath(self, backupPath):
"""Set the current backup path.
"""
self._backupPath = checkPath(backupPath, None)
return
def setConfigChanged(self, value):
self._confChanged = bool(value)
return
## ##
# Methods # Methods
## ##
@@ -291,8 +393,9 @@ class Config:
def lastPath(self): def lastPath(self):
"""Return the last path used by the user, but ensure it exists. """Return the last path used by the user, but ensure it exists.
""" """
if self._lastPath.is_dir(): if isinstance(self._lastPath, Path):
return self._lastPath if self._lastPath.is_dir():
return self._lastPath
return Path.home().absolute() return Path.home().absolute()
def backupPath(self): def backupPath(self):
@@ -440,13 +543,12 @@ class Config:
# Sizes # Sizes
cnfSec = "Sizes" cnfSec = "Sizes"
self.winGeometry = theConf.rdIntList(cnfSec, "geometry", self.winGeometry) self._winGeometry = theConf.rdIntList(cnfSec, "geometry", self._winGeometry)
self.prefGeometry = theConf.rdIntList(cnfSec, "preferences", self.prefGeometry) self._prefGeometry = theConf.rdIntList(cnfSec, "preferences", self._prefGeometry)
self.projColWidth = theConf.rdIntList(cnfSec, "projcols", self.projColWidth) self._projColWidth = theConf.rdIntList(cnfSec, "projcols", self._projColWidth)
self.mainPanePos = theConf.rdIntList(cnfSec, "mainpane", self.mainPanePos) self._mainPanePos = theConf.rdIntList(cnfSec, "mainpane", self._mainPanePos)
self.docPanePos = theConf.rdIntList(cnfSec, "docpane", self.docPanePos) self._viewPanePos = theConf.rdIntList(cnfSec, "viewpane", self._viewPanePos)
self.viewPanePos = theConf.rdIntList(cnfSec, "viewpane", self.viewPanePos) self._outlnPanePos = theConf.rdIntList(cnfSec, "outlinepane", self._outlnPanePos)
self.outlnPanePos = theConf.rdIntList(cnfSec, "outlinepane", self.outlnPanePos)
self.isFullScreen = theConf.rdBool(cnfSec, "fullscreen", self.isFullScreen) self.isFullScreen = theConf.rdBool(cnfSec, "fullscreen", self.isFullScreen)
# Project # Project
@@ -496,10 +598,9 @@ class Config:
# Backup # Backup
cnfSec = "Backup" cnfSec = "Backup"
backupPath = theConf.rdStr(cnfSec, "backuppath", None) self._backupPath = theConf.rdPath(cnfSec, "backuppath", self._backupPath)
self.backupOnClose = theConf.rdBool(cnfSec, "backuponclose", self.backupOnClose) self.backupOnClose = theConf.rdBool(cnfSec, "backuponclose", self.backupOnClose)
self.askBeforeBackup = theConf.rdBool(cnfSec, "askbeforebackup", self.askBeforeBackup) self.askBeforeBackup = theConf.rdBool(cnfSec, "askbeforebackup", self.askBeforeBackup)
self.setBackupPath(backupPath)
# State # State
cnfSec = "State" cnfSec = "State"
@@ -515,7 +616,7 @@ class Config:
# Path # Path
cnfSec = "Path" cnfSec = "Path"
self._lastPath = Path(theConf.rdStr(cnfSec, "lastpath", self._lastPath)) self._lastPath = theConf.rdPath(cnfSec, "lastpath", self._lastPath)
# Check Certain Values for None # Check Certain Values for None
self.spellLanguage = self._checkNone(self.spellLanguage) self.spellLanguage = self._checkNone(self.spellLanguage)
@@ -551,13 +652,12 @@ class Config:
} }
theConf["Sizes"] = { theConf["Sizes"] = {
"geometry": self._packList(self.winGeometry), "geometry": self._packList(self._winGeometry),
"preferences": self._packList(self.prefGeometry), "preferences": self._packList(self._prefGeometry),
"projcols": self._packList(self.projColWidth), "projcols": self._packList(self._projColWidth),
"mainpane": self._packList(self.mainPanePos), "mainpane": self._packList(self._mainPanePos),
"docpane": self._packList(self.docPanePos), "viewpane": self._packList(self._viewPanePos),
"viewpane": self._packList(self.viewPanePos), "outlinepane": self._packList(self._outlnPanePos),
"outlinepane": self._packList(self.outlnPanePos),
"fullscreen": str(self.isFullScreen), "fullscreen": str(self.isFullScreen),
} }
@@ -633,7 +733,7 @@ class Config:
try: try:
with open(cnfPath, mode="w", encoding="utf-8") as outFile: with open(cnfPath, mode="w", encoding="utf-8") as outFile:
theConf.write(outFile) theConf.write(outFile)
self.confChanged = False self._confChanged = False
except Exception as exc: except Exception as exc:
logger.error("Could not save config file") logger.error("Could not save config file")
logException() logException()
@@ -648,105 +748,25 @@ class Config:
# Setters # Setters
## ##
def setLastPath(self, lastPath):
"""Set the last used path. Only the folder is saved, so if the
path is not a folder, the parent of the path is used instead.
"""
if isinstance(lastPath, (str, Path)):
lastPath = Path(lastPath)
if not lastPath.is_dir():
lastPath = lastPath.parent
if lastPath.is_dir():
self._lastPath = lastPath
logger.debug("Last path updated: %s" % self._lastPath)
return
def setBackupPath(self, backupPath):
"""Set the current backup path.
"""
self._backupPath = None
if isinstance(backupPath, (str, Path)):
self._backupPath = Path(backupPath)
return
def setWinSize(self, newWidth, newHeight):
"""Set the size of the main window, but only if the change is
larger than 5 pixels. The OS window manager will sometimes
adjust it a bit, and we don't want the main window to shrink or
grow each time the app is opened.
"""
newWidth = int(newWidth/self.guiScale)
newHeight = int(newHeight/self.guiScale)
if abs(self.winGeometry[0] - newWidth) > 5:
self.winGeometry[0] = newWidth
self.confChanged = True
if abs(self.winGeometry[1] - newHeight) > 5:
self.winGeometry[1] = newHeight
self.confChanged = True
return
def setPreferencesSize(self, newWidth, newHeight):
"""Sat the size of the Preferences dialog window.
"""
self.prefGeometry[0] = int(newWidth/self.guiScale)
self.prefGeometry[1] = int(newHeight/self.guiScale)
self.confChanged = True
return
def setProjColWidths(self, colWidths):
"""Set the column widths of the Load Project dialog.
"""
self.projColWidth = [int(x/self.guiScale) for x in colWidths]
self.confChanged = True
return
def setMainPanePos(self, panePos):
"""Set the position of the main GUI splitter.
"""
self.mainPanePos = [int(x/self.guiScale) for x in panePos]
self.confChanged = True
return
def setDocPanePos(self, panePos):
"""Set the position of the main editor/viewer splitter.
"""
self.docPanePos = [int(x/self.guiScale) for x in panePos]
self.confChanged = True
return
def setViewPanePos(self, panePos):
"""Set the position of the viewer meta data splitter.
"""
self.viewPanePos = [int(x/self.guiScale) for x in panePos]
self.confChanged = True
return
def setOutlinePanePos(self, panePos):
"""Set the position of the outline details splitter.
"""
self.outlnPanePos = [int(x/self.guiScale) for x in panePos]
self.confChanged = True
return
def setShowRefPanel(self, checkState): def setShowRefPanel(self, checkState):
"""Set the visibility state of the reference panel. """Set the visibility state of the reference panel.
""" """
self.showRefPanel = checkState self.showRefPanel = checkState
self.confChanged = True self._confChanged = True
return return
def setViewComments(self, viewState): def setViewComments(self, viewState):
"""Set the visibility state of comments in the viewer. """Set the visibility state of comments in the viewer.
""" """
self.viewComments = viewState self.viewComments = viewState
self.confChanged = True self._confChanged = True
return return
def setViewSynopsis(self, viewState): def setViewSynopsis(self, viewState):
"""Set the visibility state of synopsis comments in the viewer. """Set the visibility state of synopsis comments in the viewer.
""" """
self.viewSynopsis = viewState self.viewSynopsis = viewState
self.confChanged = True self._confChanged = True
return return
## ##
@@ -767,27 +787,6 @@ class Config:
# Getters # Getters
## ##
def getWinSize(self):
return [int(x*self.guiScale) for x in self.winGeometry]
def getPreferencesSize(self):
return [int(x*self.guiScale) for x in self.prefGeometry]
def getProjColWidths(self):
return [int(x*self.guiScale) for x in self.projColWidth]
def getMainPanePos(self):
return [int(x*self.guiScale) for x in self.mainPanePos]
def getDocPanePos(self):
return [int(x*self.guiScale) for x in self.docPanePos]
def getViewPanePos(self):
return [int(x*self.guiScale) for x in self.viewPanePos]
def getOutlinePanePos(self):
return [int(x*self.guiScale) for x in self.outlnPanePos]
def getTextWidth(self, focusMode=False): def getTextWidth(self, focusMode=False):
if focusMode: if focusMode:
return self.pxInt(max(self.focusWidth, 200)) return self.pxInt(max(self.focusWidth, 200))
+9 -9
View File
@@ -74,7 +74,7 @@ class GuiPreferences(PagedDialog):
self.buttonBox.rejected.connect(self._doClose) self.buttonBox.rejected.connect(self._doClose)
self.addControls(self.buttonBox) self.addControls(self.buttonBox)
self.resize(*self.mainConf.getPreferencesSize()) self.resize(*self.mainConf.preferencesWinSize)
# Settings # Settings
self._updateTheme = False self._updateTheme = False
@@ -143,7 +143,7 @@ class GuiPreferences(PagedDialog):
def _saveWindowSize(self): def _saveWindowSize(self):
"""Save the dialog window size. """Save the dialog window size.
""" """
self.mainConf.setPreferencesSize(self.width(), self.height()) self.mainConf.setPreferencesWinSize(self.width(), self.height())
return return
# END Class GuiPreferences # END Class GuiPreferences
@@ -311,7 +311,7 @@ class GuiPreferencesGeneral(QWidget):
self.mainConf.hideVScroll = self.hideVScroll.isChecked() self.mainConf.hideVScroll = self.hideVScroll.isChecked()
self.mainConf.hideHScroll = self.hideHScroll.isChecked() self.mainConf.hideHScroll = self.hideHScroll.isChecked()
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
@@ -458,7 +458,7 @@ class GuiPreferencesProjects(QWidget):
self.mainConf.stopWhenIdle = self.stopWhenIdle.isChecked() self.mainConf.stopWhenIdle = self.stopWhenIdle.isChecked()
self.mainConf.userIdleTime = round(self.userIdleTime.value() * 60) self.mainConf.userIdleTime = round(self.userIdleTime.value() * 60)
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
@@ -629,7 +629,7 @@ class GuiPreferencesDocuments(QWidget):
self.mainConf.textMargin = self.textMargin.value() self.mainConf.textMargin = self.textMargin.value()
self.mainConf.tabWidth = self.tabWidth.value() self.mainConf.tabWidth = self.tabWidth.value()
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
@@ -820,7 +820,7 @@ class GuiPreferencesEditor(QWidget):
self.mainConf.autoScroll = self.autoScroll.isChecked() self.mainConf.autoScroll = self.autoScroll.isChecked()
self.mainConf.autoScrollPos = self.autoScrollPos.value() self.mainConf.autoScrollPos = self.autoScrollPos.value()
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
@@ -911,7 +911,7 @@ class GuiPreferencesSyntax(QWidget):
# Text Errors # Text Errors
self.mainConf.showMultiSpaces = self.showMultiSpaces.isChecked() self.mainConf.showMultiSpaces = self.showMultiSpaces.isChecked()
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
@@ -1065,7 +1065,7 @@ class GuiPreferencesAutomation(QWidget):
self.mainConf.fmtPadAfter = self.fmtPadAfter.text().strip() self.mainConf.fmtPadAfter = self.fmtPadAfter.text().strip()
self.mainConf.fmtPadThin = self.fmtPadThin.isChecked() self.mainConf.fmtPadThin = self.fmtPadThin.isChecked()
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
@@ -1186,7 +1186,7 @@ class GuiPreferencesQuotes(QWidget):
self.mainConf.fmtDoubleQuotes[0] = self.quoteSym["DO"].text() self.mainConf.fmtDoubleQuotes[0] = self.quoteSym["DO"].text()
self.mainConf.fmtDoubleQuotes[1] = self.quoteSym["DC"].text() self.mainConf.fmtDoubleQuotes[1] = self.quoteSym["DC"].text()
self.mainConf.confChanged = True self.mainConf.setConfigChanged(True)
return return
+2 -2
View File
@@ -258,7 +258,7 @@ class GuiProjectLoad(QDialog):
colWidths[self.C_NAME] = self.listBox.columnWidth(self.C_NAME) colWidths[self.C_NAME] = self.listBox.columnWidth(self.C_NAME)
colWidths[self.C_COUNT] = self.listBox.columnWidth(self.C_COUNT) colWidths[self.C_COUNT] = self.listBox.columnWidth(self.C_COUNT)
colWidths[self.C_TIME] = self.listBox.columnWidth(self.C_TIME) colWidths[self.C_TIME] = self.listBox.columnWidth(self.C_TIME)
self.mainConf.setProjColWidths(colWidths) self.mainConf.setProjLoadColWidths(colWidths)
return return
def _populateList(self): def _populateList(self):
@@ -284,7 +284,7 @@ class GuiProjectLoad(QDialog):
if self.listBox.topLevelItemCount() > 0: if self.listBox.topLevelItemCount() > 0:
self.listBox.topLevelItem(0).setSelected(True) self.listBox.topLevelItem(0).setSelected(True)
projColWidth = self.mainConf.getProjColWidths() projColWidth = self.mainConf.projLoadColWidths
if len(projColWidth) == 3: if len(projColWidth) == 3:
self.listBox.setColumnWidth(self.C_NAME, projColWidth[self.C_NAME]) self.listBox.setColumnWidth(self.C_NAME, projColWidth[self.C_NAME])
self.listBox.setColumnWidth(self.C_COUNT, projColWidth[self.C_COUNT]) self.listBox.setColumnWidth(self.C_COUNT, projColWidth[self.C_COUNT])
+1 -1
View File
@@ -71,7 +71,7 @@ class GuiOutlineView(QWidget):
self.splitOutline = QSplitter(Qt.Vertical) self.splitOutline = QSplitter(Qt.Vertical)
self.splitOutline.addWidget(self.outlineTree) self.splitOutline.addWidget(self.outlineTree)
self.splitOutline.addWidget(self.outlineData) self.splitOutline.addWidget(self.outlineData)
self.splitOutline.setSizes(self.mainConf.getOutlinePanePos()) self.splitOutline.setSizes(self.mainConf.outlinePanePos)
# Assemble # Assemble
self.outerBox = QVBoxLayout() self.outerBox = QVBoxLayout()
+4 -5
View File
@@ -93,7 +93,7 @@ class GuiMain(QMainWindow):
self.idleTime = 0.0 self.idleTime = 0.0
# Prepare Main Window # Prepare Main Window
self.resize(*self.mainConf.getWinSize()) self.resize(*self.mainConf.mainWinSize)
self._updateWindowTitle() self._updateWindowTitle()
nwIcon = self.mainConf.assetPath("icons") / "novelwriter.svg" nwIcon = self.mainConf.assetPath("icons") / "novelwriter.svg"
@@ -140,7 +140,7 @@ class GuiMain(QMainWindow):
self.splitView.addWidget(self.docViewer) self.splitView.addWidget(self.docViewer)
self.splitView.addWidget(self.viewMeta) self.splitView.addWidget(self.viewMeta)
self.splitView.setHandleWidth(hWd) self.splitView.setHandleWidth(hWd)
self.splitView.setSizes(self.mainConf.getViewPanePos()) self.splitView.setSizes(self.mainConf.viewPanePos)
# Splitter : Document Editor / Document Viewer # Splitter : Document Editor / Document Viewer
self.splitDocs = QSplitter(Qt.Horizontal) self.splitDocs = QSplitter(Qt.Horizontal)
@@ -154,7 +154,7 @@ class GuiMain(QMainWindow):
self.splitMain.addWidget(self.treePane) self.splitMain.addWidget(self.treePane)
self.splitMain.addWidget(self.splitDocs) self.splitMain.addWidget(self.splitDocs)
self.splitMain.setHandleWidth(hWd) self.splitMain.setHandleWidth(hWd)
self.splitMain.setSizes(self.mainConf.getMainPanePos()) self.splitMain.setSizes(self.mainConf.mainPanePos)
# Main Stack : Editor / Outline # Main Stack : Editor / Outline
self.mainStack = QStackedWidget() self.mainStack = QStackedWidget()
@@ -1169,14 +1169,13 @@ class GuiMain(QMainWindow):
if not self.isFocusMode: if not self.isFocusMode:
self.mainConf.setMainPanePos(self.splitMain.sizes()) self.mainConf.setMainPanePos(self.splitMain.sizes())
self.mainConf.setDocPanePos(self.splitDocs.sizes())
self.mainConf.setOutlinePanePos(self.outlineView.splitSizes()) self.mainConf.setOutlinePanePos(self.outlineView.splitSizes())
if self.viewMeta.isVisible(): if self.viewMeta.isVisible():
self.mainConf.setViewPanePos(self.splitView.sizes()) self.mainConf.setViewPanePos(self.splitView.sizes())
self.mainConf.setShowRefPanel(self.viewMeta.isVisible()) self.mainConf.setShowRefPanel(self.viewMeta.isVisible())
if not self.mainConf.isFullScreen: if not self.mainConf.isFullScreen:
self.mainConf.setWinSize(self.width(), self.height()) self.mainConf.setMainWinSize(self.width(), self.height())
if self.hasProject: if self.hasProject:
self.closeProject(True) self.closeProject(True)
@@ -14,7 +14,6 @@ geometry = 1200, 650
preferences = 700, 615 preferences = 700, 615
projcols = 200, 60, 140 projcols = 200, 60, 140
mainpane = 300, 800 mainpane = 300, 800
docpane = 400, 400
viewpane = 500, 150 viewpane = 500, 150
outlinepane = 500, 150 outlinepane = 500, 150
fullscreen = False fullscreen = False
@@ -14,7 +14,6 @@ geometry = 1200, 650
preferences = 699, 614 preferences = 699, 614
projcols = 200, 60, 140 projcols = 200, 60, 140
mainpane = 300, 800 mainpane = 300, 800
docpane = 400, 400
viewpane = 500, 150 viewpane = 500, 150
outlinepane = 500, 150 outlinepane = 500, 150
fullscreen = False fullscreen = False
+18 -3
View File
@@ -23,15 +23,17 @@ import time
import pytest import pytest
import hashlib import hashlib
from pathlib import Path
from mock import causeOSError from mock import causeOSError
from tools import writeFile from tools import writeFile
from novelwriter.guimain import GuiMain from novelwriter.guimain import GuiMain
from novelwriter.common import ( from novelwriter.common import (
checkStringNone, checkString, checkInt, checkFloat, checkBool, checkHandle, checkStringNone, checkString, checkInt, checkFloat, checkBool, checkHandle,
checkUuid, isHandle, isTitleTag, isItemClass, isItemType, isItemLayout, checkUuid, checkPath, isHandle, isTitleTag, isItemClass, isItemType,
hexToInt, minmax, checkIntTuple, formatInt, formatTimeStamp, formatTime, isItemLayout, hexToInt, minmax, checkIntTuple, formatInt, formatTimeStamp,
simplified, yesNo, splitVersionNumber, transferCase, fuzzyTime, formatTime, simplified, yesNo, splitVersionNumber, transferCase, fuzzyTime,
numberToRoman, jsonEncode, readTextFile, makeFileNameSafe, sha256sum, numberToRoman, jsonEncode, readTextFile, makeFileNameSafe, sha256sum,
getGuiItem, NWConfigParser getGuiItem, NWConfigParser
) )
@@ -175,6 +177,19 @@ def testBaseCommon_CheckUuid():
# END Test testBaseCommon_CheckUuid # END Test testBaseCommon_CheckUuid
@pytest.mark.base
def testBaseCommon_CheckPath():
"""Test the checkPath function.
"""
assert checkPath(Path("test"), None) == Path("test")
assert checkPath("test", None) == Path("test")
assert checkPath(None, None) is None
assert checkPath("", None) is None
assert checkPath(" ", None) is None
# END Test testBaseCommon_CheckPath
@pytest.mark.base @pytest.mark.base
def testBaseCommon_IsHandle(): def testBaseCommon_IsHandle():
"""Test the isHandle function. """Test the isHandle function.
+33 -46
View File
@@ -253,96 +253,83 @@ def testBaseConfig_SettersGetters(tmpConf):
# Window Size # Window Size
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setWinSize(1205, 655) tmpConf.setMainWinSize(1205, 655)
assert tmpConf.confChanged is False assert tmpConf._confChanged is False
tmpConf.guiScale = 2.0 tmpConf.guiScale = 2.0
tmpConf.setWinSize(70, 70) tmpConf.setMainWinSize(70, 70)
assert tmpConf.getWinSize() == [70, 70] assert tmpConf.mainWinSize == [70, 70]
assert tmpConf.winGeometry == [35, 35] assert tmpConf._winGeometry == [35, 35]
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setWinSize(70, 70) tmpConf.setMainWinSize(70, 70)
assert tmpConf.getWinSize() == [70, 70] assert tmpConf.mainWinSize == [70, 70]
assert tmpConf.winGeometry == [70, 70] assert tmpConf._winGeometry == [70, 70]
tmpConf.setWinSize(1200, 650) tmpConf.setMainWinSize(1200, 650)
# Preferences Size # Preferences Size
tmpConf.guiScale = 2.0 tmpConf.guiScale = 2.0
tmpConf.setPreferencesSize(70, 70) tmpConf.setPreferencesWinSize(70, 70)
assert tmpConf.getPreferencesSize() == [70, 70] assert tmpConf.preferencesWinSize == [70, 70]
assert tmpConf.prefGeometry == [35, 35] assert tmpConf._prefGeometry == [35, 35]
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setPreferencesSize(70, 70) tmpConf.setPreferencesWinSize(70, 70)
assert tmpConf.getPreferencesSize() == [70, 70] assert tmpConf.preferencesWinSize == [70, 70]
assert tmpConf.prefGeometry == [70, 70] assert tmpConf._prefGeometry == [70, 70]
tmpConf.setPreferencesSize(700, 615) tmpConf.setPreferencesWinSize(700, 615)
# Project Settings Tree Columns # Project Settings Tree Columns
tmpConf.guiScale = 2.0 tmpConf.guiScale = 2.0
tmpConf.setProjColWidths([10, 20, 30]) tmpConf.setProjLoadColWidths([10, 20, 30])
assert tmpConf.getProjColWidths() == [10, 20, 30] assert tmpConf.projLoadColWidths == [10, 20, 30]
assert tmpConf.projColWidth == [5, 10, 15] assert tmpConf._projColWidth == [5, 10, 15]
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setProjColWidths([10, 20, 30]) tmpConf.setProjLoadColWidths([10, 20, 30])
assert tmpConf.getProjColWidths() == [10, 20, 30] assert tmpConf.projLoadColWidths == [10, 20, 30]
assert tmpConf.projColWidth == [10, 20, 30] assert tmpConf._projColWidth == [10, 20, 30]
tmpConf.setProjColWidths([200, 60, 140]) tmpConf.setProjLoadColWidths([200, 60, 140])
# Main Pane Splitter # Main Pane Splitter
tmpConf.guiScale = 2.0 tmpConf.guiScale = 2.0
tmpConf.setMainPanePos([200, 700]) tmpConf.setMainPanePos([200, 700])
assert tmpConf.getMainPanePos() == [200, 700] assert tmpConf.mainPanePos == [200, 700]
assert tmpConf.mainPanePos == [100, 350] assert tmpConf._mainPanePos == [100, 350]
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setMainPanePos([200, 700]) tmpConf.setMainPanePos([200, 700])
assert tmpConf.getMainPanePos() == [200, 700]
assert tmpConf.mainPanePos == [200, 700] assert tmpConf.mainPanePos == [200, 700]
assert tmpConf._mainPanePos == [200, 700]
tmpConf.setMainPanePos([300, 800]) tmpConf.setMainPanePos([300, 800])
# Doc Pane Splitter
tmpConf.guiScale = 2.0
tmpConf.setDocPanePos([300, 300])
assert tmpConf.getDocPanePos() == [300, 300]
assert tmpConf.docPanePos == [150, 150]
tmpConf.guiScale = 1.0
tmpConf.setDocPanePos([300, 300])
assert tmpConf.getDocPanePos() == [300, 300]
assert tmpConf.docPanePos == [300, 300]
tmpConf.setDocPanePos([400, 400])
# View Pane Splitter # View Pane Splitter
tmpConf.guiScale = 2.0 tmpConf.guiScale = 2.0
tmpConf.setViewPanePos([400, 250]) tmpConf.setViewPanePos([400, 250])
assert tmpConf.getViewPanePos() == [400, 250] assert tmpConf.viewPanePos == [400, 250]
assert tmpConf.viewPanePos == [200, 125] assert tmpConf._viewPanePos == [200, 125]
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setViewPanePos([400, 250]) tmpConf.setViewPanePos([400, 250])
assert tmpConf.getViewPanePos() == [400, 250]
assert tmpConf.viewPanePos == [400, 250] assert tmpConf.viewPanePos == [400, 250]
assert tmpConf._viewPanePos == [400, 250]
tmpConf.setViewPanePos([500, 150]) tmpConf.setViewPanePos([500, 150])
# Outline Pane Splitter # Outline Pane Splitter
tmpConf.guiScale = 2.0 tmpConf.guiScale = 2.0
tmpConf.setOutlinePanePos([400, 250]) tmpConf.setOutlinePanePos([400, 250])
assert tmpConf.getOutlinePanePos() == [400, 250] assert tmpConf.outlinePanePos == [400, 250]
assert tmpConf.outlnPanePos == [200, 125] assert tmpConf._outlnPanePos == [200, 125]
tmpConf.guiScale = 1.0 tmpConf.guiScale = 1.0
tmpConf.setOutlinePanePos([400, 250]) tmpConf.setOutlinePanePos([400, 250])
assert tmpConf.getOutlinePanePos() == [400, 250] assert tmpConf.outlinePanePos == [400, 250]
assert tmpConf.outlnPanePos == [400, 250] assert tmpConf._outlnPanePos == [400, 250]
tmpConf.setOutlinePanePos([500, 150]) tmpConf.setOutlinePanePos([500, 150])
+1 -1
View File
@@ -215,7 +215,7 @@ def testDlgPreferences_Main(qtbot, monkeypatch, nwGUI, fncPath, tstPaths):
qtbot.mouseClick(nwPrefs.buttonBox.button(QDialogButtonBox.Ok), Qt.LeftButton) qtbot.mouseClick(nwPrefs.buttonBox.button(QDialogButtonBox.Ok), Qt.LeftButton)
nwPrefs._doClose() nwPrefs._doClose()
assert theConf.confChanged assert theConf._confChanged is True
assert nwGUI.mainConf.saveConfig() assert nwGUI.mainConf.saveConfig()
projFile = fncPath / "novelwriter.conf" projFile = fncPath / "novelwriter.conf"