Merge pull request #175 from vkbo/dialog_options

Saving of Dialog Options
This commit is contained in:
Veronica K. Berglyd Olsen
2020-02-19 20:12:51 +01:00
committed by GitHub
11 changed files with 299 additions and 246 deletions
+1 -4
View File
@@ -25,10 +25,7 @@ class nwFiles():
PROJ_DICT = "wordlist.txt" PROJ_DICT = "wordlist.txt"
SESS_INFO = "sessionInfo.log" SESS_INFO = "sessionInfo.log"
INDEX_FILE = "tagsIndex.json" INDEX_FILE = "tagsIndex.json"
EXPORT_OPT = "exportOptions.json" OPTS_FILE = "guiOptions.json"
TLINE_OPT = "timelineOptions.json"
SLOG_OPT = "sessionLogOptions.json"
MERGE_OPT = "docMergeOptions.json"
# END Class nwFiles # END Class nwFiles
+8 -1
View File
@@ -33,6 +33,7 @@ class GuiDocSplit(QDialog):
self.mainConf = nw.CONFIG self.mainConf = nw.CONFIG
self.theParent = theParent self.theParent = theParent
self.theProject = theProject self.theProject = theProject
self.optState = self.theProject.optState
self.sourceItem = None self.sourceItem = None
self.outerBox = QHBoxLayout() self.outerBox = QHBoxLayout()
@@ -56,7 +57,11 @@ class GuiDocSplit(QDialog):
self.splitLevel.addItem("Split up to Header Level 2 (Chapter)", 2) self.splitLevel.addItem("Split up to Header Level 2 (Chapter)", 2)
self.splitLevel.addItem("Split up to Header Level 3 (Scene)", 3) self.splitLevel.addItem("Split up to Header Level 3 (Scene)", 3)
self.splitLevel.addItem("Split up to Header Level 4 (Section)", 4) self.splitLevel.addItem("Split up to Header Level 4 (Section)", 4)
self.splitLevel.setCurrentIndex(2) spIndex = self.splitLevel.findData(
self.optState.getInt("GuiDocSplit", "spLevel", 3)
)
if spIndex != -1:
self.splitLevel.setCurrentIndex(spIndex)
self.splitLevel.currentIndexChanged.connect(self._populateList) self.splitLevel.currentIndexChanged.connect(self._populateList)
self.splitButton = QPushButton("Split") self.splitButton = QPushButton("Split")
@@ -172,6 +177,7 @@ class GuiDocSplit(QDialog):
"""Close the dialog window without doing anything. """Close the dialog window without doing anything.
""" """
logger.verbose("GuiDocSplit close button clicked") logger.verbose("GuiDocSplit close button clicked")
self.optState.saveSettings()
self.close() self.close()
return return
@@ -206,6 +212,7 @@ class GuiDocSplit(QDialog):
theText = theDoc.openDocument(self.sourceItem, False) theText = theDoc.openDocument(self.sourceItem, False)
spLevel = self.splitLevel.currentData() spLevel = self.splitLevel.currentData()
self.optState.setValue("GuiDocSplit", "spLevel", spLevel)
logger.debug("Scanning document %s for headings level <= %d" % (self.sourceItem, spLevel)) logger.debug("Scanning document %s for headings level <= %d" % (self.sourceItem, spLevel))
lineNo = 0 lineNo = 0
+63 -65
View File
@@ -24,7 +24,6 @@ from PyQt5.QtWidgets import (
) )
from nw.convert import TextFile, HtmlFile, MarkdownFile, LaTeXFile, ConcatFile from nw.convert import TextFile, HtmlFile, MarkdownFile, LaTeXFile, ConcatFile
from nw.tools import OptLastState
from nw.common import packageRefURL from nw.common import packageRefURL
from nw.constants import nwFiles, nwItemType, nwAlert from nw.constants import nwFiles, nwItemType, nwAlert
@@ -40,8 +39,7 @@ class GuiExport(QDialog):
self.mainConf = nw.CONFIG self.mainConf = nw.CONFIG
self.theParent = theParent self.theParent = theParent
self.theProject = theProject self.theProject = theProject
self.optState = ExportLastState(self.theProject,nwFiles.EXPORT_OPT) self.optState = self.theProject.optState
self.optState.loadSettings()
self.outerBox = QHBoxLayout() self.outerBox = QHBoxLayout()
self.innerBox = QVBoxLayout() self.innerBox = QVBoxLayout()
@@ -50,8 +48,8 @@ class GuiExport(QDialog):
self.guiDeco = self.theParent.theTheme.loadDecoration("export",(64,64)) self.guiDeco = self.theParent.theTheme.loadDecoration("export",(64,64))
self.tabMain = GuiExportMain(self.theParent, self.theProject, self.optState) self.tabMain = GuiExportMain(self.theParent, self.theProject)
self.tabPandoc = GuiExportPandoc(self.theParent, self.theProject, self.optState) self.tabPandoc = GuiExportPandoc(self.theParent, self.theProject)
self.tabWidget = QTabWidget() self.tabWidget = QTabWidget()
self.tabWidget.addTab(self.tabMain, "Settings") self.tabWidget.addTab(self.tabMain, "Settings")
@@ -290,24 +288,24 @@ class GuiExport(QDialog):
if saveTo.startswith("~"): if saveTo.startswith("~"):
saveTo = path.expanduser(saveTo) saveTo = path.expanduser(saveTo)
self.optState.setSetting("wNovel", wNovel) self.optState.setValue("GuiExport", "wNovel", wNovel)
self.optState.setSetting("wNotes", wNotes) self.optState.setValue("GuiExport", "wNotes", wNotes)
self.optState.setSetting("eFormat", eFormat) self.optState.setValue("GuiExport", "eFormat", eFormat)
self.optState.setSetting("fixWidth", fixWidth) self.optState.setValue("GuiExport", "fixWidth", fixWidth)
self.optState.setSetting("wComments",wComments) self.optState.setValue("GuiExport", "wComments", wComments)
self.optState.setSetting("wKeywords",wKeywords) self.optState.setValue("GuiExport", "wKeywords", wKeywords)
self.optState.setSetting("chFormat", chFormat) self.optState.setValue("GuiExport", "chFormat", chFormat)
self.optState.setSetting("unFormat", unFormat) self.optState.setValue("GuiExport", "unFormat", unFormat)
self.optState.setSetting("scFormat", scFormat) self.optState.setValue("GuiExport", "scFormat", scFormat)
self.optState.setSetting("seFormat", seFormat) self.optState.setValue("GuiExport", "seFormat", seFormat)
self.optState.setSetting("saveTo", saveTo) self.optState.setValue("GuiExport", "saveTo", saveTo)
self.optState.setSetting("hScene", hScene) self.optState.setValue("GuiExport", "hScene", hScene)
self.optState.setSetting("hSection", hSection) self.optState.setValue("GuiExport", "hSection", hSection)
# Pandoc Settings # Pandoc Settings
pFormat = self.tabPandoc.outputFormat.currentData() pFormat = self.tabPandoc.outputFormat.currentData()
self.optState.setSetting("pFormat", pFormat) self.optState.setValue("GuiExport", "pFormat", pFormat)
self.optState.saveSettings() self.optState.saveSettings()
self.close() self.close()
@@ -362,14 +360,14 @@ class GuiExportMain(QWidget):
), ),
} }
def __init__(self, theParent, theProject, optState): def __init__(self, theParent, theProject):
QWidget.__init__(self, theParent) QWidget.__init__(self, theParent)
self.theParent = theParent self.theParent = theParent
self.theProject = theProject self.theProject = theProject
self.theTheme = theParent.theTheme self.theTheme = theParent.theTheme
self.outerBox = QGridLayout() self.outerBox = QGridLayout()
self.optState = optState self.optState = self.theProject.optState
self.currFormat = self.FMT_TXT self.currFormat = self.FMT_TXT
# Select Files # Select Files
@@ -378,19 +376,27 @@ class GuiExportMain(QWidget):
self.guiFiles.setLayout(self.guiFilesForm) self.guiFiles.setLayout(self.guiFilesForm)
self.expNovel = QCheckBox("Novel files",self) self.expNovel = QCheckBox("Novel files",self)
self.expNovel.setChecked(self.optState.getSetting("wNovel")) self.expNovel.setChecked(
self.optState.getBool("GuiExport", "wNovel", True)
)
self.expNovel.setToolTip("Include all novel files in the exported document") self.expNovel.setToolTip("Include all novel files in the exported document")
self.expNotes = QCheckBox("Note files",self) self.expNotes = QCheckBox("Note files",self)
self.expNotes.setChecked(self.optState.getSetting("wNotes")) self.expNotes.setChecked(
self.optState.getBool("GuiExport", "wNotes", False)
)
self.expNotes.setToolTip("Include all note files in the exported document") self.expNotes.setToolTip("Include all note files in the exported document")
self.expComments = QCheckBox("Comments",self) self.expComments = QCheckBox("Comments",self)
self.expComments.setChecked(self.optState.getSetting("wComments")) self.expComments.setChecked(
self.optState.getBool("GuiExport", "wComments", False)
)
self.expComments.setToolTip("Export comments from all files") self.expComments.setToolTip("Export comments from all files")
self.expKeywords = QCheckBox("Keywords",self) self.expKeywords = QCheckBox("Keywords",self)
self.expKeywords.setChecked(self.optState.getSetting("wKeywords")) self.expKeywords.setChecked(
self.optState.getBool("GuiExport", "wKeywords", False)
)
self.expKeywords.setToolTip("Export @keywords from all files") self.expKeywords.setToolTip("Export @keywords from all files")
self.guiFilesForm.addWidget(self.expNovel, 0, 1) self.guiFilesForm.addWidget(self.expNovel, 0, 1)
@@ -406,13 +412,17 @@ class GuiExportMain(QWidget):
self.chapterFormat = QLineEdit() self.chapterFormat = QLineEdit()
self.chapterFormat.setMaxLength(200) self.chapterFormat.setMaxLength(200)
self.chapterFormat.setText(self.optState.getSetting("chFormat")) self.chapterFormat.setText(
self.optState.getString("GuiExport", "chFormat", "Chapter %numword%")
)
self.chapterFormat.setToolTip("Available formats: %num%, %numword%, %title%") self.chapterFormat.setToolTip("Available formats: %num%, %numword%, %title%")
self.chapterFormat.setMinimumWidth(250) self.chapterFormat.setMinimumWidth(250)
self.unnumFormat = QLineEdit() self.unnumFormat = QLineEdit()
self.unnumFormat.setMaxLength(200) self.unnumFormat.setMaxLength(200)
self.unnumFormat.setText(self.optState.getSetting("unFormat")) self.unnumFormat.setText(
self.optState.getString("GuiExport", "unFormat", "%title%")
)
self.unnumFormat.setToolTip("Available formats: %title%") self.unnumFormat.setToolTip("Available formats: %title%")
self.unnumFormat.setMinimumWidth(250) self.unnumFormat.setMinimumWidth(250)
@@ -428,22 +438,30 @@ class GuiExportMain(QWidget):
self.sceneFormat = QLineEdit() self.sceneFormat = QLineEdit()
self.sceneFormat.setMaxLength(200) self.sceneFormat.setMaxLength(200)
self.sceneFormat.setText(self.optState.getSetting("scFormat")) self.sceneFormat.setText(
self.optState.getString("GuiExport", "scFormat", "* * *")
)
self.sceneFormat.setToolTip("Available formats: %title%") self.sceneFormat.setToolTip("Available formats: %title%")
self.sceneFormat.setMinimumWidth(100) self.sceneFormat.setMinimumWidth(100)
self.sectionFormat = QLineEdit() self.sectionFormat = QLineEdit()
self.sectionFormat.setMaxLength(200) self.sectionFormat.setMaxLength(200)
self.sectionFormat.setText(self.optState.getSetting("seFormat")) self.sectionFormat.setText(
self.optState.getString("GuiExport", "seFormat", "")
)
self.sectionFormat.setToolTip("Available formats: %title%") self.sectionFormat.setToolTip("Available formats: %title%")
self.sectionFormat.setMinimumWidth(100) self.sectionFormat.setMinimumWidth(100)
self.hideScene = QCheckBox("Skip",self) self.hideScene = QCheckBox("Skip",self)
self.hideScene.setChecked(self.optState.getSetting("hScene")) self.hideScene.setChecked(
self.optState.getBool("GuiExport", "hScene", False)
)
self.hideScene.setToolTip("Skip scene titles in export") self.hideScene.setToolTip("Skip scene titles in export")
self.hideSection = QCheckBox("Skip",self) self.hideSection = QCheckBox("Skip",self)
self.hideSection.setChecked(self.optState.getSetting("hSection")) self.hideSection.setChecked(
self.optState.getBool("GuiExport", "hSection", False)
)
self.hideSection.setToolTip("Skip section titles in export") self.hideSection.setToolTip("Skip section titles in export")
self.guiScenesForm.addWidget(QLabel("Scenes"), 0, 0) self.guiScenesForm.addWidget(QLabel("Scenes"), 0, 0)
@@ -458,8 +476,9 @@ class GuiExportMain(QWidget):
self.exportToForm = QGridLayout(self) self.exportToForm = QGridLayout(self)
self.exportTo.setLayout(self.exportToForm) self.exportTo.setLayout(self.exportToForm)
self.exportPath = QLineEdit(self.optState.getSetting("saveTo")) self.exportPath = QLineEdit(
self.optState.getString("GuiExport", "saveTo", "")
)
self.exportGetPath = QPushButton(self.theTheme.getIcon("folder"),"") self.exportGetPath = QPushButton(self.theTheme.getIcon("folder"),"")
self.exportGetPath.clicked.connect(self._exportFolder) self.exportGetPath.clicked.connect(self._exportFolder)
@@ -486,7 +505,9 @@ class GuiExportMain(QWidget):
self.outputFormat.addItem("Pandoc via Markdown or HTML", self.FMT_PDOC) self.outputFormat.addItem("Pandoc via Markdown or HTML", self.FMT_PDOC)
self.outputFormat.currentIndexChanged.connect(self._updateFormat) self.outputFormat.currentIndexChanged.connect(self._updateFormat)
optIdx = self.outputFormat.findData(self.optState.getSetting("eFormat")) optIdx = self.outputFormat.findData(
self.optState.getInt("GuiExport", "eFormat", 1)
)
if optIdx == -1: if optIdx == -1:
self.outputFormat.setCurrentIndex(1) self.outputFormat.setCurrentIndex(1)
self._updateFormat(1) self._updateFormat(1)
@@ -508,7 +529,9 @@ class GuiExportMain(QWidget):
self.fixedWidth.setMinimum(0) self.fixedWidth.setMinimum(0)
self.fixedWidth.setMaximum(999) self.fixedWidth.setMaximum(999)
self.fixedWidth.setSingleStep(1) self.fixedWidth.setSingleStep(1)
self.fixedWidth.setValue(self.optState.getSetting("fixWidth")) self.fixedWidth.setValue(
self.optState.getInt("GuiExport", "fixWidth", 80)
)
self.fixedWidth.setToolTip( self.fixedWidth.setToolTip(
"Applies to .txt and .md files. A value of '0' disables the feature." "Applies to .txt and .md files. A value of '0' disables the feature."
) )
@@ -609,13 +632,13 @@ class GuiExportPandoc(QWidget):
FMT_ZIM : "markdown", FMT_ZIM : "markdown",
} }
def __init__(self, theParent, theProject, optState): def __init__(self, theParent, theProject):
QWidget.__init__(self, theParent) QWidget.__init__(self, theParent)
self.theParent = theParent self.theParent = theParent
self.theProject = theProject self.theProject = theProject
self.outerBox = QGridLayout() self.outerBox = QGridLayout()
self.optState = optState self.optState = self.theProject.optState
try: try:
import pypandoc import pypandoc
@@ -659,7 +682,9 @@ class GuiExportPandoc(QWidget):
self.outputFormat.addItem("ePUB eBook v3 (.epub3)", self.FMT_EPUB3) self.outputFormat.addItem("ePUB eBook v3 (.epub3)", self.FMT_EPUB3)
self.outputFormat.addItem("Zim Wiki (.txt)", self.FMT_ZIM) self.outputFormat.addItem("Zim Wiki (.txt)", self.FMT_ZIM)
optIdx = self.outputFormat.findData(self.optState.getSetting("pFormat")) optIdx = self.outputFormat.findData(
self.optState.getInt("GuiExport", "pFormat", 1)
)
if optIdx == -1: if optIdx == -1:
self.outputFormat.setCurrentIndex(1) self.outputFormat.setCurrentIndex(1)
else: else:
@@ -678,30 +703,3 @@ class GuiExportPandoc(QWidget):
return return
# END Class GuiExportPandoc # END Class GuiExportPandoc
class ExportLastState(OptLastState):
def __init__(self, theProject, theFile):
OptLastState.__init__(self, theProject, theFile)
self.theState = {
"wNovel" : True,
"wNotes" : False,
"eFormat" : 1,
"pFormat" : 1,
"fixWidth" : 80,
"wComments" : False,
"wKeywords" : False,
"chFormat" : "Chapter %numword%",
"unFormat" : "%title%",
"scFormat" : "* * *",
"seFormat" : "",
"saveTo" : "",
"hScene" : False,
"hSection" : False,
}
self.stringOpt = ("chFormat","unFormat","scFormat","seFormat","saveTo")
self.boolOpt = ("wNovel","wNotes","wComments","wKeywords","hScene","hSection")
self.intOpt = ("eFormat","pFormat","fixWidth")
return
# END Class ExportLastState
+20 -37
View File
@@ -24,7 +24,6 @@ from PyQt5.QtWidgets import (
) )
from nw.constants import nwConst, nwFiles, nwAlert from nw.constants import nwConst, nwFiles, nwAlert
from nw.tools import OptLastState
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -38,8 +37,7 @@ class GuiSessionLogView(QDialog):
self.mainConf = nw.CONFIG self.mainConf = nw.CONFIG
self.theProject = theProject self.theProject = theProject
self.theParent = theParent self.theParent = theParent
self.optState = SessionLogLastState(self.theProject,nwFiles.SLOG_OPT) self.optState = self.theProject.optState
self.optState.loadSettings()
self.timeFilter = 0.0 self.timeFilter = 0.0
self.timeTotal = 0.0 self.timeTotal = 0.0
@@ -52,13 +50,13 @@ class GuiSessionLogView(QDialog):
self.setMinimumHeight(400) self.setMinimumHeight(400)
widthCol0 = self.optState.validIntRange( widthCol0 = self.optState.validIntRange(
self.optState.getSetting("widthCol0"), 30, 999, 180 self.optState.getInt("GuiSession", "widthCol0", 180), 30, 999, 180
) )
widthCol1 = self.optState.validIntRange( widthCol1 = self.optState.validIntRange(
self.optState.getSetting("widthCol1"), 30, 999, 80 self.optState.getInt("GuiSession", "widthCol1", 80), 30, 999, 80
) )
widthCol2 = self.optState.validIntRange( widthCol2 = self.optState.validIntRange(
self.optState.getSetting("widthCol2"), 30, 999, 80 self.optState.getInt("GuiSession", "widthCol2", 80), 30, 999, 80
) )
self.listBox = QTreeWidget() self.listBox = QTreeWidget()
@@ -77,10 +75,11 @@ class GuiSessionLogView(QDialog):
sortValid = (Qt.AscendingOrder, Qt.DescendingOrder) sortValid = (Qt.AscendingOrder, Qt.DescendingOrder)
sortCol = self.optState.validIntRange( sortCol = self.optState.validIntRange(
self.optState.getSetting("sortCol"), 0, 2, 0 self.optState.getInt("GuiSession", "sortCol", 0), 0, 2, 0
) )
sortOrder = self.optState.validIntTuple( sortOrder = self.optState.validIntTuple(
self.optState.getSetting("sortOrder"), sortValid, Qt.DescendingOrder self.optState.getInt("GuiSession", "sortOrder", Qt.DescendingOrder),
sortValid, Qt.DescendingOrder
) )
self.listBox.sortByColumn(sortCol, sortOrder) self.listBox.sortByColumn(sortCol, sortOrder)
@@ -110,11 +109,15 @@ class GuiSessionLogView(QDialog):
self.filterBox.setLayout(self.filterBoxForm) self.filterBox.setLayout(self.filterBoxForm)
self.hideZeros = QCheckBox("Hide zero word count", self) self.hideZeros = QCheckBox("Hide zero word count", self)
self.hideZeros.setChecked(self.optState.getSetting("hideZeros")) self.hideZeros.setChecked(
self.optState.getBool("GuiSession", "hideZeros", True)
)
self.hideZeros.stateChanged.connect(self._doHideZeros) self.hideZeros.stateChanged.connect(self._doHideZeros)
self.hideNegative = QCheckBox("Hide negative word count", self) self.hideNegative = QCheckBox("Hide negative word count", self)
self.hideNegative.setChecked(self.optState.getSetting("hideNegative")) self.hideNegative.setChecked(
self.optState.getBool("GuiSession", "hideNegative", False)
)
self.hideNegative.stateChanged.connect(self._doHideNegative) self.hideNegative.stateChanged.connect(self._doHideNegative)
self.filterBoxForm.addWidget(self.hideZeros, 0, 0) self.filterBoxForm.addWidget(self.hideZeros, 0, 0)
@@ -208,13 +211,13 @@ class GuiSessionLogView(QDialog):
hideZeros = self.hideZeros.isChecked() hideZeros = self.hideZeros.isChecked()
hideNegative = self.hideNegative.isChecked() hideNegative = self.hideNegative.isChecked()
self.optState.setSetting("widthCol0", widthCol0) self.optState.setValue("GuiSession", "widthCol0", widthCol0)
self.optState.setSetting("widthCol1", widthCol1) self.optState.setValue("GuiSession", "widthCol1", widthCol1)
self.optState.setSetting("widthCol2", widthCol2) self.optState.setValue("GuiSession", "widthCol2", widthCol2)
self.optState.setSetting("sortCol", sortCol) self.optState.setValue("GuiSession", "sortCol", sortCol)
self.optState.setSetting("sortOrder", sortOrder) self.optState.setValue("GuiSession", "sortOrder", sortOrder)
self.optState.setSetting("hideZeros", hideZeros) self.optState.setValue("GuiSession", "hideZeros", hideZeros)
self.optState.setSetting("hideNegative",hideNegative) self.optState.setValue("GuiSession", "hideNegative", hideNegative)
self.optState.saveSettings() self.optState.saveSettings()
self.close() self.close()
@@ -237,23 +240,3 @@ class GuiSessionLogView(QDialog):
return "%02d:%02d:%02d" % (tH,tM,tS) return "%02d:%02d:%02d" % (tH,tM,tS)
# END Class GuiSessionLogView # END Class GuiSessionLogView
class SessionLogLastState(OptLastState):
def __init__(self, theProject, theFile):
OptLastState.__init__(self, theProject, theFile)
self.theState = {
"widthCol0" : 180,
"widthCol1" : 80,
"widthCol2" : 80,
"sortCol" : 0,
"sortOrder" : Qt.DescendingOrder,
"hideZeros" : True,
"hideNegative" : False,
}
self.stringOpt = ()
self.boolOpt = ("hideZeros","hideNegative")
self.intOpt = ("widthCol0","widthCol1","widthCol2","sortCol","sortOrder")
return
# END Class SessionLogLastState
+33 -43
View File
@@ -22,7 +22,6 @@ from PyQt5.QtWidgets import (
) )
from nw.constants import nwFiles, nwItemClass from nw.constants import nwFiles, nwItemClass
from nw.tools import OptLastState
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -37,8 +36,7 @@ class GuiTimeLineView(QDialog):
self.theProject = theProject self.theProject = theProject
self.theParent = theParent self.theParent = theParent
self.theIndex = theIndex self.theIndex = theIndex
self.optState = TimeLineLastState(self.theProject,nwFiles.TLINE_OPT) self.optState = self.theProject.optState
self.optState.loadSettings()
self.theMatrix = {} self.theMatrix = {}
self.numRows = 0 self.numRows = 0
@@ -54,10 +52,10 @@ class GuiTimeLineView(QDialog):
self.setMinimumHeight(400) self.setMinimumHeight(400)
winWidth = self.optState.validIntRange( winWidth = self.optState.validIntRange(
self.optState.getSetting("winWidth"), 700, 10000, 700 self.optState.getInt("GuiTimeLine", "winWidth", 700), 700, 10000, 700
) )
winHeight = self.optState.validIntRange( winHeight = self.optState.validIntRange(
self.optState.getSetting("winHeight"), 400, 10000, 400 self.optState.getInt("GuiTimeLine", "winHeight", 400), 400, 10000, 400
) )
self.resize(winWidth,winHeight) self.resize(winWidth,winHeight)
@@ -79,27 +77,39 @@ class GuiTimeLineView(QDialog):
self.optFilter.setLayout(self.optFilterGrid) self.optFilter.setLayout(self.optFilterGrid)
self.filterPlot = QCheckBox("Plot tags", self) self.filterPlot = QCheckBox("Plot tags", self)
self.filterPlot.setChecked(self.optState.getSetting("fPlot")) self.filterPlot.setChecked(
self.optState.getBool("GuiTimeLine", "fPlot", True)
)
self.filterPlot.stateChanged.connect(self._filterChange) self.filterPlot.stateChanged.connect(self._filterChange)
self.filterChar = QCheckBox("Character tags", self) self.filterChar = QCheckBox("Character tags", self)
self.filterChar.setChecked(self.optState.getSetting("fChar")) self.filterChar.setChecked(
self.optState.getBool("GuiTimeLine", "fChar", True)
)
self.filterChar.stateChanged.connect(self._filterChange) self.filterChar.stateChanged.connect(self._filterChange)
self.filterWorld = QCheckBox("Location tags", self) self.filterWorld = QCheckBox("Location tags", self)
self.filterWorld.setChecked(self.optState.getSetting("fWorld")) self.filterWorld.setChecked(
self.optState.getBool("GuiTimeLine", "fWorld", True)
)
self.filterWorld.stateChanged.connect(self._filterChange) self.filterWorld.stateChanged.connect(self._filterChange)
self.filterTime = QCheckBox("Timeline tags", self) self.filterTime = QCheckBox("Timeline tags", self)
self.filterTime.setChecked(self.optState.getSetting("fTime")) self.filterTime.setChecked(
self.optState.getBool("GuiTimeLine", "fTime", True)
)
self.filterTime.stateChanged.connect(self._filterChange) self.filterTime.stateChanged.connect(self._filterChange)
self.filterObject = QCheckBox("Object tags", self) self.filterObject = QCheckBox("Object tags", self)
self.filterObject.setChecked(self.optState.getSetting("fObject")) self.filterObject.setChecked(
self.optState.getBool("GuiTimeLine", "fObject", True)
)
self.filterObject.stateChanged.connect(self._filterChange) self.filterObject.stateChanged.connect(self._filterChange)
self.filterCustom = QCheckBox("Custom tags", self) self.filterCustom = QCheckBox("Custom tags", self)
self.filterCustom.setChecked(self.optState.getSetting("fCustom")) self.filterCustom.setChecked(
self.optState.getBool("GuiTimeLine", "fCustom", True)
)
self.filterCustom.stateChanged.connect(self._filterChange) self.filterCustom.stateChanged.connect(self._filterChange)
self.optFilterGrid.addWidget(self.filterPlot, 0, 1) self.optFilterGrid.addWidget(self.filterPlot, 0, 1)
@@ -114,7 +124,9 @@ class GuiTimeLineView(QDialog):
self.optHide.setLayout(self.optHideGrid) self.optHide.setLayout(self.optHideGrid)
self.hideUnused = QCheckBox("Hide unused", self) self.hideUnused = QCheckBox("Hide unused", self)
self.hideUnused.setChecked(self.optState.getSetting("hUnused")) self.hideUnused.setChecked(
self.optState.getBool("GuiTimeLine", "hUnused", True)
)
self.hideUnused.stateChanged.connect(self._filterChange) self.hideUnused.stateChanged.connect(self._filterChange)
self.optHideGrid.addWidget(self.hideUnused, 0, 1) self.optHideGrid.addWidget(self.hideUnused, 0, 1)
@@ -227,15 +239,15 @@ class GuiTimeLineView(QDialog):
fCustom = self.filterCustom.isChecked() fCustom = self.filterCustom.isChecked()
hUnused = self.hideUnused.isChecked() hUnused = self.hideUnused.isChecked()
self.optState.setSetting("winWidth", winWidth) self.optState.setValue("GuiTimeLine", "winWidth", winWidth)
self.optState.setSetting("winHeight",winHeight) self.optState.setValue("GuiTimeLine", "winHeight", winHeight)
self.optState.setSetting("fPlot", fPlot) self.optState.setValue("GuiTimeLine", "fPlot", fPlot)
self.optState.setSetting("fChar", fChar) self.optState.setValue("GuiTimeLine", "fChar", fChar)
self.optState.setSetting("fWorld", fWorld) self.optState.setValue("GuiTimeLine", "fWorld", fWorld)
self.optState.setSetting("fTime", fTime) self.optState.setValue("GuiTimeLine", "fTime", fTime)
self.optState.setSetting("fObject", fObject) self.optState.setValue("GuiTimeLine", "fObject", fObject)
self.optState.setSetting("fCustom", fCustom) self.optState.setValue("GuiTimeLine", "fCustom", fCustom)
self.optState.setSetting("hUnused", hUnused) self.optState.setValue("GuiTimeLine", "hUnused", hUnused)
self.optState.saveSettings() self.optState.saveSettings()
self.close() self.close()
@@ -247,25 +259,3 @@ class GuiTimeLineView(QDialog):
return return
# END Class GuiTimeLineView # END Class GuiTimeLineView
class TimeLineLastState(OptLastState):
def __init__(self, theProject, theFile):
OptLastState.__init__(self, theProject, theFile)
self.theState = {
"winWidth" : 700,
"winHeight" : 400,
"fPlot" : True,
"fChar" : True,
"fWorld" : True,
"fTime" : True,
"fObject" : True,
"fCustom" : True,
"hUnused" : True,
}
self.stringOpt = ()
self.boolOpt = ("fPlot","fChar","fWorld","fTime","fObject","fCustom","hUnused")
self.intOpt = ("winWidth","winHeight")
return
# END Class TimeLineLastState
+4 -1
View File
@@ -21,7 +21,7 @@ from time import time
from nw.project.status import NWStatus from nw.project.status import NWStatus
from nw.project.item import NWItem from nw.project.item import NWItem
from nw.tools import projectMaintenance from nw.tools import projectMaintenance, OptionState
from nw.common import checkString, checkBool, checkInt from nw.common import checkString, checkBool, checkInt
from nw.constants import ( from nw.constants import (
nwFiles, nwConst, nwItemType, nwItemClass, nwItemLayout, nwAlert nwFiles, nwConst, nwItemType, nwItemClass, nwItemLayout, nwAlert
@@ -36,6 +36,7 @@ class NWProject():
# Internal # Internal
self.theParent = theParent self.theParent = theParent
self.mainConf = self.theParent.mainConf self.mainConf = self.theParent.mainConf
self.optState = OptionState(self)
self.projOpened = None # The time stamp of when the project file was opened self.projOpened = None # The time stamp of when the project file was opened
self.projChanged = None # The project has unsaved changes self.projChanged = None # The project has unsaved changes
self.projAltered = None # The project has been altered this session self.projAltered = None # The project has been altered this session
@@ -295,6 +296,7 @@ class NWProject():
nwItem.setFromTag(xValue.tag,xValue.text) nwItem.setFromTag(xValue.tag,xValue.text)
self._appendItem(tHandle,pHandle,nwItem) self._appendItem(tHandle,pHandle,nwItem)
self.optState.loadSettings()
self.mainConf.setRecent(self.projPath) self.mainConf.setRecent(self.projPath)
self.theParent.setStatus("Opened Project: %s" % self.projName) self.theParent.setStatus("Opened Project: %s" % self.projName)
@@ -384,6 +386,7 @@ class NWProject():
rename(saveFile, backFile) rename(saveFile, backFile)
rename(tempFile, saveFile) rename(tempFile, saveFile)
self.optState.saveSettings()
self.mainConf.setRecent(self.projPath) self.mainConf.setRecent(self.projPath)
self.theParent.setStatus("Saved Project: %s" % self.projName) self.theParent.setStatus("Saved Project: %s" % self.projName)
self.setProjectChanged(False) self.setProjectChanged(False)
+2 -2
View File
@@ -2,7 +2,7 @@
from nw.tools.analyse import TextAnalysis from nw.tools.analyse import TextAnalysis
from nw.tools.legacy import projectMaintenance from nw.tools.legacy import projectMaintenance
from nw.tools.optlaststate import OptLastState from nw.tools.optionstate import OptionState
from nw.tools.spellcheck import NWSpellCheck from nw.tools.spellcheck import NWSpellCheck
from nw.tools.spellenchant import NWSpellEnchant from nw.tools.spellenchant import NWSpellEnchant
from nw.tools.spellsimple import NWSpellSimple from nw.tools.spellsimple import NWSpellSimple
@@ -12,7 +12,7 @@ from nw.tools.wordcount import countWords
__all__ = [ __all__ = [
"TextAnalysis", "TextAnalysis",
"projectMaintenance", "projectMaintenance",
"OptLastState", "OptionState",
"NWSpellCheck", "NWSpellCheck",
"NWSpellEnchant", "NWSpellEnchant",
"NWSpellSimple", "NWSpellSimple",
+16
View File
@@ -44,4 +44,20 @@ def projectMaintenance(theProject):
except Exception as e: except Exception as e:
logger.error(str(e)) logger.error(str(e))
# Remove no longer used meta files
rmList = []
rmList.append(path.join(theProject.projMeta, "mainOptions.json"))
rmList.append(path.join(theProject.projMeta, "exportOptions.json"))
rmList.append(path.join(theProject.projMeta, "outlineOptions.json"))
rmList.append(path.join(theProject.projMeta, "timelineOptions.json"))
rmList.append(path.join(theProject.projMeta, "docMergeOptions.json"))
rmList.append(path.join(theProject.projMeta, "sessionLogOptions.json"))
for rmFile in rmList:
if path.isfile(rmFile):
logger.info("Deleting: %s" % rmFile)
try:
unlink(rmFile)
except Exception as e:
logger.error(str(e))
return return
+150
View File
@@ -0,0 +1,150 @@
# -*- coding: utf-8 -*-
"""novelWriter Options State
novelWriter Options State
=============================
Class holding the last state of GUI options
File History:
Created: 2019-10-21 [0.3.1] - Original version meant to be sub classed
Created: 2020-02-19 [0.4.5] - Rewritten from superclass to single file tool
"""
import logging
import json
import nw
from os import path
from nw.common import checkString, checkBool, checkInt
from nw.constants import nwFiles
logger = logging.getLogger(__name__)
class OptionState():
def __init__(self, theProject):
self.theProject = theProject
self.theState = {}
self.stringOpt = ()
self.boolOpt = ()
self.intOpt = ()
return
def loadSettings(self):
"""Load the options dictionary from the project settings file.
"""
stateFile = path.join(self.theProject.projMeta, nwFiles.OPTS_FILE)
theState = {}
if path.isfile(stateFile):
logger.debug("Loading GUI options file")
try:
with open(stateFile,mode="r",encoding="utf8") as inFile:
theJson = inFile.read()
theState = json.loads(theJson)
except Exception as e:
logger.error("Failed to load GUI options file")
logger.error(str(e))
return False
for anOpt in theState:
self.theState[anOpt] = theState[anOpt]
return True
def saveSettings(self):
"""Save the options dictionary to the project settings file.
"""
stateFile = path.join(self.theProject.projMeta, nwFiles.OPTS_FILE)
logger.debug("Saving GUI options file")
try:
with open(stateFile,mode="w+",encoding="utf8") as outFile:
outFile.write(json.dumps(self.theState, indent=2))
except Exception as e:
logger.error("Failed to save GUI options file")
logger.error(str(e))
return False
return True
def setValue(self, setGroup, setName, setValue):
"""Saves a value, with a given group and name.
"""
if not setGroup in self.theState:
self.theState[setGroup] = {}
self.theState[setGroup][setName] = setValue
return True
def getString(self, getGroup, getName, defaultValue):
"""Return the value as a string, if it exists. Otherwise, return
the default value.
"""
if getGroup in self.theState:
if getName in self.theState[getGroup]:
try:
return str(self.theState[getGroup][getName])
except:
return defaultValue
return defaultValue
def getInt(self, getGroup, getName, defaultValue):
"""Return the value as an int, if it exists. Otherwise, return
the default value.
"""
if getGroup in self.theState:
if getName in self.theState[getGroup]:
try:
return int(self.theState[getGroup][getName])
except:
return defaultValue
return defaultValue
def getFloat(self, getGroup, getName, defaultValue):
"""Return the value as a float, if it exists. Otherwise, return
the default value.
"""
if getGroup in self.theState:
if getName in self.theState[getGroup]:
try:
return float(self.theState[getGroup][getName])
except:
return defaultValue
return defaultValue
def getBool(self, getGroup, getName, defaultValue):
"""Return the value as a bool, if it exists. Otherwise, return
the default value.
"""
if getGroup in self.theState:
if getName in self.theState[getGroup]:
try:
return bool(self.theState[getGroup][getName])
except:
return defaultValue
return defaultValue
def validIntRange(self, theValue, intA, intB, intDefault):
"""Check that an int is in a given range. If it isn't, return
the default value.
"""
if isinstance(theValue, int):
if theValue >= intA and theValue <= intB:
return theValue
return intDefault
def validIntTuple(self, theValue, theTuple, intDefault):
"""Check that an int is an element of a tuple. If it isn't,
return the default value.
"""
if isinstance(theValue, int):
if theValue in theTuple:
return theValue
return intDefault
# END Class OptionState
-91
View File
@@ -1,91 +0,0 @@
# -*- coding: utf-8 -*-
"""novelWriter Options Last State
novelWriter Options Last State
==================================
Class holding the last state of GUI options
File History:
Created: 2019-10-21 [0.3.1]
"""
import logging
import json
import nw
from os import path
from nw.common import checkString, checkBool, checkInt
logger = logging.getLogger(__name__)
class OptLastState():
def __init__(self, theProject, theFile):
self.theProject = theProject
self.theFile = theFile
self.theState = {}
self.stringOpt = ()
self.boolOpt = ()
self.intOpt = ()
return
def loadSettings(self):
stateFile = path.join(self.theProject.projMeta,self.theFile)
theState = {}
if path.isfile(stateFile):
logger.debug("Loading options file")
try:
with open(stateFile,mode="r",encoding="utf8") as inFile:
theJson = inFile.read()
theState = json.loads(theJson)
except Exception as e:
logger.error("Failed to load options file")
logger.error(str(e))
return False
for anOpt in theState:
self.theState[anOpt] = theState[anOpt]
return True
def saveSettings(self):
stateFile = path.join(self.theProject.projMeta,self.theFile)
logger.debug("Saving options file")
try:
with open(stateFile,mode="w+",encoding="utf8") as outFile:
outFile.write(json.dumps(self.theState, indent=2))
except Exception as e:
logger.error("Failed to save options file")
logger.error(str(e))
return False
return True
def setSetting(self, setName, setValue):
if setName in self.theState:
self.theState[setName] = setValue
else:
return False
return True
def getSetting(self, setName):
if setName in self.stringOpt:
return checkString(self.theState[setName],self.theState[setName],False)
elif setName in self.boolOpt:
return checkBool(self.theState[setName],self.theState[setName],False)
elif setName in self.intOpt:
return checkInt(self.theState[setName],self.theState[setName],False)
return None
def validIntRange(self, theValue, intA, intB, intDefault):
if isinstance(theValue, int):
if theValue >= intA and theValue <= intB:
return theValue
return intDefault
def validIntTuple(self, theValue, theTuple, intDefault):
if isinstance(theValue, int):
if theValue in theTuple:
return theValue
return intDefault
# END Class OptLastState
+2 -2
View File
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="0.4.1" fileVersion="1.0" timeStamp="2019-11-16 12:31:19"> <novelWriterXML appVersion="0.4.5" fileVersion="1.0" timeStamp="2020-02-19 19:55:13">
<project> <project>
<name>Sample Project</name> <name>Sample Project</name>
<title>Sample Project</title> <title>Sample Project</title>
@@ -82,7 +82,7 @@
<charCount>1199</charCount> <charCount>1199</charCount>
<wordCount>216</wordCount> <wordCount>216</wordCount>
<paraCount>7</paraCount> <paraCount>7</paraCount>
<cursorPos>949</cursorPos> <cursorPos>19</cursorPos>
</item> </item>
<item handle="bc0cbd2a407f3" order="2" parent="e7ded148d6e4a"> <item handle="bc0cbd2a407f3" order="2" parent="e7ded148d6e4a">
<name>Another Scene</name> <name>Another Scene</name>