Finish up controls on manuscript build tool

This commit is contained in:
Veronica Berglyd Olsen
2023-06-09 22:06:05 +02:00
parent c344cf441e
commit 112aa8468c
2 changed files with 52 additions and 16 deletions
+25 -4
View File
@@ -34,6 +34,7 @@ from pathlib import Path
from PyQt5.QtCore import QT_TRANSLATE_NOOP from PyQt5.QtCore import QT_TRANSLATE_NOOP
from novelwriter import CONFIG
from novelwriter.enum import nwBuildFmt from novelwriter.enum import nwBuildFmt
from novelwriter.error import logException from novelwriter.error import logException
from novelwriter.common import checkUuid, isHandle, jsonEncode from novelwriter.common import checkUuid, isHandle, jsonEncode
@@ -65,14 +66,14 @@ SETTINGS_TEMPLATE = {
"text.includeBodyText": (bool, True), "text.includeBodyText": (bool, True),
"text.addNoteHeadings": (bool, True), "text.addNoteHeadings": (bool, True),
"format.buildLang": (str, "en_GB"), "format.buildLang": (str, "en_GB"),
"format.textFont": (str, ""), "format.textFont": (str, CONFIG.textFont),
"format.textSize": (int, 12), "format.textSize": (int, 12),
"format.lineHeight": (float, 1.15, 0.75, 3.0), "format.lineHeight": (float, 1.15, 0.75, 3.0),
"format.justifyText": (bool, False), "format.justifyText": (bool, False),
"format.stripUnicode": (bool, False), "format.stripUnicode": (bool, False),
"format.replaceTabs": (bool, False), "format.replaceTabs": (bool, False),
"odt.addColours": (bool, True), "odt.addColours": (bool, True),
"html.addStyles": (bool, False), "html.addStyles": (bool, True),
} }
SETTINGS_LABELS = { SETTINGS_LABELS = {
@@ -434,8 +435,17 @@ class BuildCollection:
def __init__(self, project: NWProject): def __init__(self, project: NWProject):
self._project = project self._project = project
self._builds = {} self._builds = {}
self._loadCollection()
return return
def __len__(self):
"""Return the number of builds."""
return len(self._builds)
##
# Methods
##
def getBuild(self, buildID: str) -> BuildSettings | None: def getBuild(self, buildID: str) -> BuildSettings | None:
"""Get a specific build settings object.""" """Get a specific build settings object."""
if buildID not in self._builds: if buildID not in self._builds:
@@ -450,15 +460,26 @@ class BuildCollection:
return False return False
buildID = build.buildID buildID = build.buildID
self._builds[buildID] = build.pack() self._builds[buildID] = build.pack()
self._saveCollection()
return True return True
def removeBuild(self, buildID: str):
"""Remove the a build from the collection."""
self._builds.pop(buildID, None)
self._saveCollection()
return
def builds(self) -> Iterable[tuple[str, str]]: def builds(self) -> Iterable[tuple[str, str]]:
"""Iterate over all avaiable builds.""" """Iterate over all avaiable builds."""
for buildID in self._builds: for buildID in self._builds:
yield buildID, self._builds[buildID].get("name", "") yield buildID, self._builds[buildID].get("name", "")
return return
def loadCollection(self) -> bool: ##
# Internal Functions
##
def _loadCollection(self) -> bool:
"""Load build collections file.""" """Load build collections file."""
buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE) buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE)
if not isinstance(buildsFile, Path): if not isinstance(buildsFile, Path):
@@ -490,7 +511,7 @@ class BuildCollection:
return True return True
def saveCollection(self) -> bool: def _saveCollection(self) -> bool:
"""Save build collections file.""" """Save build collections file."""
buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE) buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE)
if not isinstance(buildsFile, Path): if not isinstance(buildsFile, Path):
+27 -12
View File
@@ -114,8 +114,9 @@ class GuiManuscript(QDialog):
self.tbDel = QToolButton(self) self.tbDel = QToolButton(self)
self.tbDel.setIcon(self.mainTheme.getIcon("remove")) self.tbDel.setIcon(self.mainTheme.getIcon("remove"))
self.tbDel.setIconSize(QSize(iPx, iPx)) self.tbDel.setIconSize(QSize(iPx, iPx))
self.tbDel.setToolTip(self.tr("Remove Selected Build")) self.tbDel.setToolTip(self.tr("Delete Selected Build"))
self.tbDel.setStyleSheet(buttonStyle) self.tbDel.setStyleSheet(buttonStyle)
self.tbDel.clicked.connect(self._deleteSelectedBuild)
self.tbEdit = QToolButton(self) self.tbEdit = QToolButton(self)
self.tbEdit.setIcon(self.mainTheme.getIcon("edit")) self.tbEdit.setIcon(self.mainTheme.getIcon("edit"))
@@ -125,12 +126,10 @@ class GuiManuscript(QDialog):
self.tbEdit.clicked.connect(self._editSelectedBuild) self.tbEdit.clicked.connect(self._editSelectedBuild)
self.lblBuilds = QLabel("<b>{0}</b>".format(self.tr("Builds"))) self.lblBuilds = QLabel("<b>{0}</b>".format(self.tr("Builds")))
self.buildList = QListWidget()
self.tbMore = QToolButton(self) self.buildList = QListWidget()
self.tbMore.setIcon(self.mainTheme.getIcon("menu")) self.buildList.setIconSize(QSize(iPx, iPx))
self.tbMore.setIconSize(QSize(iPx, iPx)) self.buildList.doubleClicked.connect(self._editSelectedBuild)
self.tbMore.setStyleSheet(buttonStyle)
self.listToolBox = QHBoxLayout() self.listToolBox = QHBoxLayout()
self.listToolBox.addWidget(self.lblBuilds) self.listToolBox.addWidget(self.lblBuilds)
@@ -138,7 +137,6 @@ class GuiManuscript(QDialog):
self.listToolBox.addWidget(self.tbAdd) self.listToolBox.addWidget(self.tbAdd)
self.listToolBox.addWidget(self.tbDel) self.listToolBox.addWidget(self.tbDel)
self.listToolBox.addWidget(self.tbEdit) self.listToolBox.addWidget(self.tbEdit)
self.listToolBox.addWidget(self.tbMore)
self.listToolBox.setSpacing(0) self.listToolBox.setSpacing(0)
# Process Controls # Process Controls
@@ -182,8 +180,8 @@ class GuiManuscript(QDialog):
self.mainSplit.setStretchFactor(0, 0) self.mainSplit.setStretchFactor(0, 0)
self.mainSplit.setStretchFactor(1, 1) self.mainSplit.setStretchFactor(1, 1)
self.mainSplit.setSizes([ self.mainSplit.setSizes([
CONFIG.pxInt(pOptions.getInt("GuiManuscript", "optsWidth", wWin//3)), CONFIG.pxInt(pOptions.getInt("GuiManuscript", "optsWidth", wWin//4)),
CONFIG.pxInt(pOptions.getInt("GuiManuscript", "viewWidth", 2*wWin//3)), CONFIG.pxInt(pOptions.getInt("GuiManuscript", "viewWidth", 3*wWin//4)),
]) ])
self.outerBox = QVBoxLayout() self.outerBox = QVBoxLayout()
@@ -203,7 +201,11 @@ class GuiManuscript(QDialog):
def loadContent(self): def loadContent(self):
"""Load dialog content from project data.""" """Load dialog content from project data."""
self._builds.loadCollection() if len(self._builds) == 0:
build = BuildSettings()
build.setName(self.tr("My Manuscript"))
self._builds.setBuild(build)
self._updateBuildsList() self._updateBuildsList()
logger.debug("Loading build cache") logger.debug("Loading build cache")
@@ -260,11 +262,24 @@ class GuiManuscript(QDialog):
self._openSettingsDialog(build) self._openSettingsDialog(build)
return return
@pyqtSlot()
def _deleteSelectedBuild(self):
"""Delete the currently selected build settings entry."""
build = self._getSelectedBuild()
if build is not None:
proceed = self.mainGui.askQuestion(
self.tr("Delete Build"),
self.tr("Delete build '{0}'?".format(build.name))
)
if proceed:
self._builds.removeBuild(build.buildID)
self._updateBuildsList()
return
@pyqtSlot(BuildSettings) @pyqtSlot(BuildSettings)
def _processNewSettings(self, build: BuildSettings): def _processNewSettings(self, build: BuildSettings):
"""Process new build settings from the settings dialog.""" """Process new build settings from the settings dialog."""
self._builds.setBuild(build) self._builds.setBuild(build)
self._builds.saveCollection()
self._updateBuildItem(build) self._updateBuildItem(build)
return return
@@ -322,7 +337,6 @@ class GuiManuscript(QDialog):
# After the build is done, save build settings changes # After the build is done, save build settings changes
if build.changed: if build.changed:
self._builds.setBuild(build) self._builds.setBuild(build)
self._builds.saveCollection()
return return
@@ -405,6 +419,7 @@ class GuiManuscript(QDialog):
for key, name in self._builds.builds(): for key, name in self._builds.builds():
bItem = QListWidgetItem() bItem = QListWidgetItem()
bItem.setText(name) bItem.setText(name)
bItem.setIcon(self.mainTheme.getIcon("export"))
bItem.setData(self.D_KEY, key) bItem.setData(self.D_KEY, key)
self.buildList.addItem(bItem) self.buildList.addItem(bItem)
self._buildMap[key] = bItem self._buildMap[key] = bItem