Add build settings Content and Format tabs

This commit is contained in:
Veronica Berglyd Olsen
2023-05-23 16:39:43 +02:00
parent 06b46bb0d3
commit c302162d1f
4 changed files with 294 additions and 94 deletions
+4
View File
@@ -23,6 +23,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from PyQt5.QtGui import QFontDatabase
from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP
from novelwriter.enum import nwItemClass, nwItemLayout, nwOutline from novelwriter.enum import nwItemClass, nwItemLayout, nwOutline
@@ -53,6 +54,9 @@ class nwConst:
URL_HELP = "https://github.com/vkbo/novelWriter/discussions" URL_HELP = "https://github.com/vkbo/novelWriter/discussions"
URL_RELEASE = "https://github.com/vkbo/novelWriter/releases/latest" URL_RELEASE = "https://github.com/vkbo/novelWriter/releases/latest"
# System Values
SYSTEM_FONT = QFontDatabase.systemFont(QFontDatabase.GeneralFont).family()
# END Class nwConst # END Class nwConst
+24 -22
View File
@@ -36,7 +36,7 @@ from pathlib import Path
from PyQt5.QtCore import QT_TRANSLATE_NOOP from PyQt5.QtCore import QT_TRANSLATE_NOOP
from novelwriter.common import checkUuid, isHandle, jsonEncode from novelwriter.common import checkUuid, isHandle, jsonEncode
from novelwriter.constants import nwFiles, nwHeadingFormats from novelwriter.constants import nwConst, nwFiles, nwHeadingFormats
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.error import logException from novelwriter.error import logException
@@ -62,10 +62,10 @@ SETTINGS_TEMPLATE = {
"text.includeSynopsis": (bool, False), "text.includeSynopsis": (bool, False),
"text.includeComments": (bool, False), "text.includeComments": (bool, False),
"text.includeKeywords": (bool, False), "text.includeKeywords": (bool, False),
"text.includeBody": (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, nwConst.SYSTEM_FONT),
"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),
@@ -82,26 +82,28 @@ SETTINGS_LABELS = {
"filter.includeInactive": QT_TRANSLATE_NOOP("Builds", "Inactive Documents"), "filter.includeInactive": QT_TRANSLATE_NOOP("Builds", "Inactive Documents"),
"headings": QT_TRANSLATE_NOOP("Builds", "Headings"), "headings": QT_TRANSLATE_NOOP("Builds", "Headings"),
"headings.fmtTitle": QT_TRANSLATE_NOOP("Builds", "Title Heading"), "headings.fmtTitle": QT_TRANSLATE_NOOP("Builds", "Title Headings"),
"headings.fmtChapter": QT_TRANSLATE_NOOP("Builds", "Chapter Heading"), "headings.fmtChapter": QT_TRANSLATE_NOOP("Builds", "Chapter Headings"),
"headings.fmtUnnumbered": QT_TRANSLATE_NOOP("Builds", "Unnumbered Heading"), "headings.fmtUnnumbered": QT_TRANSLATE_NOOP("Builds", "Unnumbered Headings"),
"headings.fmtScene": QT_TRANSLATE_NOOP("Builds", "Scene Heading"), "headings.fmtScene": QT_TRANSLATE_NOOP("Builds", "Scene Headings"),
"headings.fmtSection": QT_TRANSLATE_NOOP("Builds", "Section Heading"), "headings.fmtSection": QT_TRANSLATE_NOOP("Builds", "Section Headings"),
"headings.hideScene": QT_TRANSLATE_NOOP("Builds", "Hide Scene"), "headings.hideScene": QT_TRANSLATE_NOOP("Builds", "Hide Scene Headings"),
"headings.hideSection": QT_TRANSLATE_NOOP("Builds", "Hide Section"), "headings.hideSection": QT_TRANSLATE_NOOP("Builds", "Hide Section Headings"),
"text": QT_TRANSLATE_NOOP("Builds", "Text Content"), "text.grpContent": QT_TRANSLATE_NOOP("Builds", "Text Content"),
"text.includeSynopsis": QT_TRANSLATE_NOOP("Builds", "Synopsis"), "text.includeSynopsis": QT_TRANSLATE_NOOP("Builds", "Include Synopsis"),
"text.includeComments": QT_TRANSLATE_NOOP("Builds", "Comments"), "text.includeComments": QT_TRANSLATE_NOOP("Builds", "Include Comments"),
"text.includeKeywords": QT_TRANSLATE_NOOP("Builds", "Keywords"), "text.includeKeywords": QT_TRANSLATE_NOOP("Builds", "Include Keywords"),
"text.includeBody": QT_TRANSLATE_NOOP("Builds", "Body Text"), "text.includeBodyText": QT_TRANSLATE_NOOP("Builds", "Include Body Text"),
"text.grpInsert": QT_TRANSLATE_NOOP("Builds", "Insert Content"),
"text.addNoteHeadings": QT_TRANSLATE_NOOP("Builds", "Add Titles for Notes"), "text.addNoteHeadings": QT_TRANSLATE_NOOP("Builds", "Add Titles for Notes"),
"format": QT_TRANSLATE_NOOP("Builds", "Text Format"), "format.grpFormat": QT_TRANSLATE_NOOP("Builds", "Text Format"),
"format.buildLang": QT_TRANSLATE_NOOP("Builds", "Build Language"), "format.buildLang": QT_TRANSLATE_NOOP("Builds", "Document Language"),
"format.textFont": QT_TRANSLATE_NOOP("Builds", "Font Family"), "format.textFont": QT_TRANSLATE_NOOP("Builds", "Font Family"),
"format.textSize": QT_TRANSLATE_NOOP("Builds", "Font Size"), "format.textSize": QT_TRANSLATE_NOOP("Builds", "Font Size"),
"format.lineHeight": QT_TRANSLATE_NOOP("Builds", "Line Height"), "format.lineHeight": QT_TRANSLATE_NOOP("Builds", "Line Height"),
"format.grpOptions": QT_TRANSLATE_NOOP("Builds", "Text Options"),
"format.justifyText": QT_TRANSLATE_NOOP("Builds", "Justify Text Margins"), "format.justifyText": QT_TRANSLATE_NOOP("Builds", "Justify Text Margins"),
"format.stripUnicode": QT_TRANSLATE_NOOP("Builds", "Replace Unicode Characters"), "format.stripUnicode": QT_TRANSLATE_NOOP("Builds", "Replace Unicode Characters"),
"format.replaceTabs": QT_TRANSLATE_NOOP("Builds", "Replace Tabs with Spaces"), "format.replaceTabs": QT_TRANSLATE_NOOP("Builds", "Replace Tabs with Spaces"),
@@ -382,7 +384,7 @@ class BuildCollection:
return return
def getBuild(self, buildID: str) -> BuildSettings | None: def getBuild(self, buildID: str) -> BuildSettings | None:
""" """Get a specific build settings object.
""" """
if buildID not in self._builds: if buildID not in self._builds:
return None return None
@@ -391,7 +393,7 @@ class BuildCollection:
return build return build
def setBuild(self, build: BuildSettings) -> bool: def setBuild(self, build: BuildSettings) -> bool:
""" """Set build settings data in the collection.
""" """
if not isinstance(build, BuildSettings): if not isinstance(build, BuildSettings):
return False return False
@@ -400,14 +402,14 @@ class BuildCollection:
return True return True
def builds(self) -> Iterable[tuple[str, str]]: def builds(self) -> Iterable[tuple[str, str]]:
""" """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: def loadCollection(self) -> bool:
""" """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):
@@ -440,7 +442,7 @@ class BuildCollection:
return True return True
def saveCollection(self) -> bool: def saveCollection(self) -> bool:
""" """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):
+5 -4
View File
@@ -28,9 +28,10 @@ import logging
from pathlib import Path from pathlib import Path
from typing import Iterable from typing import Iterable
from PyQt5.QtGui import QFont, QFontDatabase, QFontInfo from PyQt5.QtGui import QFont, QFontInfo
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.constants import nwConst
from novelwriter.core.tokenizer import Tokenizer from novelwriter.core.tokenizer import Tokenizer
from novelwriter.error import formatException from novelwriter.error import formatException
from novelwriter.core.tomd import ToMarkdown from novelwriter.core.tomd import ToMarkdown
@@ -174,7 +175,7 @@ class NWBuildDocument:
incSynopsis = self._build.getBool("text.includeSynopsis") incSynopsis = self._build.getBool("text.includeSynopsis")
incComments = self._build.getBool("text.includeComments") incComments = self._build.getBool("text.includeComments")
incKeywords = self._build.getBool("text.includeKeywords") incKeywords = self._build.getBool("text.includeKeywords")
includeBody = self._build.getBool("text.includeBody") incBodyText = self._build.getBool("text.includeBodyText")
buildLang = self._build.getStr("format.buildLang") buildLang = self._build.getStr("format.buildLang")
textFont = self._build.getStr("format.textFont") textFont = self._build.getStr("format.textFont")
@@ -193,7 +194,7 @@ class NWBuildDocument:
if not textFont: if not textFont:
textFont = str(CONFIG.textFont) textFont = str(CONFIG.textFont)
if not textFont: if not textFont:
textFont = QFontDatabase.systemFont(QFontDatabase.GeneralFont).family() textFont = nwConst.SYSTEM_FONT
bldFont = QFont(family=textFont, pointSize=textSize) bldFont = QFont(family=textFont, pointSize=textSize)
fontInfo = QFontInfo(bldFont) fontInfo = QFontInfo(bldFont)
@@ -212,7 +213,7 @@ class NWBuildDocument:
bldObj.setSynopsis(incSynopsis) bldObj.setSynopsis(incSynopsis)
bldObj.setComments(incComments) bldObj.setComments(incComments)
bldObj.setKeywords(incKeywords) bldObj.setKeywords(incKeywords)
bldObj.setBodyText(includeBody) bldObj.setBodyText(incBodyText)
if isinstance(bldObj, ToHtml): if isinstance(bldObj, ToHtml):
bldObj.setStyles(htmlAddStyles) bldObj.setStyles(htmlAddStyles)
+261 -68
View File
@@ -28,18 +28,22 @@ import logging
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from PyQt5.QtGui import QColor, QIcon, QSyntaxHighlighter, QTextCharFormat, QTextDocument from PyQt5.QtGui import (
QColor, QFont, QIcon, QSyntaxHighlighter, QTextCharFormat, QTextDocument
)
from PyQt5.QtCore import QEvent, QSize, Qt, pyqtSignal, pyqtSlot from PyQt5.QtCore import QEvent, QSize, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractButton, QAbstractItemView, QDialog, QDialogButtonBox, QGridLayout, QAbstractButton, QAbstractItemView, QComboBox, QDialog, QDialogButtonBox,
QHBoxLayout, QHeaderView, QLabel, QLineEdit, QMenu, QPlainTextEdit, QPushButton, QSplitter, QDoubleSpinBox, QFontDialog, QGridLayout, QHBoxLayout, QHeaderView, QLabel,
QLineEdit, QMenu, QPlainTextEdit, QPushButton, QSpinBox, QSplitter,
QStackedWidget, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QStackedWidget, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout,
QWidget QWidget
) )
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.constants import nwHeadingFormats from novelwriter.constants import nwConst, nwHeadingFormats
from novelwriter.core.buildsettings import BuildSettings, FilterMode from novelwriter.core.buildsettings import BuildSettings, FilterMode
from novelwriter.extensions.configlayout import NConfigLayout, NSimpleLayout
from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.switch import NSwitch
from novelwriter.extensions.switchbox import NSwitchBox from novelwriter.extensions.switchbox import NSwitchBox
from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.pagedsidebar import NPagedSideBar
@@ -55,8 +59,8 @@ class GuiBuildSettings(QDialog):
OPT_FILTERS = 1 OPT_FILTERS = 1
OPT_HEADINGS = 2 OPT_HEADINGS = 2
OPT_FORMAT = 3 OPT_CONTENT = 3
OPT_CONTENT = 4 OPT_FORMAT = 4
OPT_OUTPUT = 5 OPT_OUTPUT = 5
newSettingsReady = pyqtSignal(BuildSettings) newSettingsReady = pyqtSignal(BuildSettings)
@@ -98,8 +102,8 @@ class GuiBuildSettings(QDialog):
self.optSideBar.addLabel(self.tr("Options")) self.optSideBar.addLabel(self.tr("Options"))
self.optSideBar.addButton(self.tr("Filters"), self.OPT_FILTERS) self.optSideBar.addButton(self.tr("Filters"), self.OPT_FILTERS)
self.optSideBar.addButton(self.tr("Headings"), self.OPT_HEADINGS) self.optSideBar.addButton(self.tr("Headings"), self.OPT_HEADINGS)
self.optSideBar.addButton(self.tr("Format"), self.OPT_FORMAT)
self.optSideBar.addButton(self.tr("Content"), self.OPT_CONTENT) self.optSideBar.addButton(self.tr("Content"), self.OPT_CONTENT)
self.optSideBar.addButton(self.tr("Format"), self.OPT_FORMAT)
self.optSideBar.addButton(self.tr("Output"), self.OPT_OUTPUT) self.optSideBar.addButton(self.tr("Output"), self.OPT_OUTPUT)
self.optSideBar.buttonClicked.connect(self._stackPageSelected) self.optSideBar.buttonClicked.connect(self._stackPageSelected)
@@ -165,6 +169,8 @@ class GuiBuildSettings(QDialog):
self.editBuildName.setText(self._build.name) self.editBuildName.setText(self._build.name)
self.optTabSelect.loadContent() self.optTabSelect.loadContent()
self.optTabHeadings.loadContent() self.optTabHeadings.loadContent()
self.optTabContent.loadContent()
self.optTabFormat.loadContent()
return return
## ##
@@ -179,10 +185,10 @@ class GuiBuildSettings(QDialog):
self.toolStack.setCurrentWidget(self.optTabSelect) self.toolStack.setCurrentWidget(self.optTabSelect)
elif pageId == self.OPT_HEADINGS: elif pageId == self.OPT_HEADINGS:
self.toolStack.setCurrentWidget(self.optTabHeadings) self.toolStack.setCurrentWidget(self.optTabHeadings)
elif pageId == self.OPT_FORMAT:
self.toolStack.setCurrentWidget(self.optTabFormat)
elif pageId == self.OPT_CONTENT: elif pageId == self.OPT_CONTENT:
self.toolStack.setCurrentWidget(self.optTabContent) self.toolStack.setCurrentWidget(self.optTabContent)
elif pageId == self.OPT_FORMAT:
self.toolStack.setCurrentWidget(self.optTabFormat)
elif pageId == self.OPT_OUTPUT: elif pageId == self.OPT_OUTPUT:
self.toolStack.setCurrentWidget(self.optTabOutput) self.toolStack.setCurrentWidget(self.optTabOutput)
return return
@@ -194,6 +200,9 @@ class GuiBuildSettings(QDialog):
role = self.dlgButtons.buttonRole(button) role = self.dlgButtons.buttonRole(button)
if role in (QDialogButtonBox.ApplyRole, QDialogButtonBox.AcceptRole): if role in (QDialogButtonBox.ApplyRole, QDialogButtonBox.AcceptRole):
self._build.setName(self.editBuildName.text()) self._build.setName(self.editBuildName.text())
self.optTabHeadings.saveContent()
self.optTabContent.saveContent()
self.optTabFormat.saveContent()
self.newSettingsReady.emit(self._build) self.newSettingsReady.emit(self._build)
self._saveSettings() self._saveSettings()
@@ -553,7 +562,7 @@ class GuiBuildHeadingsTab(QWidget):
self.formatBox.setHorizontalSpacing(vSp) self.formatBox.setHorizontalSpacing(vSp)
# Title Heading # Title Heading
self.lblTitle = QLabel(BuildSettings.getLabel("headings.fmtTitle")) self.lblTitle = QLabel(self._build.getLabel("headings.fmtTitle"))
self.fmtTitle = QLineEdit("") self.fmtTitle = QLineEdit("")
self.fmtTitle.setEnabled(False) self.fmtTitle.setEnabled(False)
self.btnTitle = QToolButton() self.btnTitle = QToolButton()
@@ -569,7 +578,7 @@ class GuiBuildHeadingsTab(QWidget):
self.formatBox.addLayout(wrapTitle, 0, 1, Qt.AlignLeft) self.formatBox.addLayout(wrapTitle, 0, 1, Qt.AlignLeft)
# Chapter Heading # Chapter Heading
self.lblChapter = QLabel(BuildSettings.getLabel("headings.fmtChapter")) self.lblChapter = QLabel(self._build.getLabel("headings.fmtChapter"))
self.fmtChapter = QLineEdit("") self.fmtChapter = QLineEdit("")
self.fmtChapter.setEnabled(False) self.fmtChapter.setEnabled(False)
self.btnChapter = QToolButton() self.btnChapter = QToolButton()
@@ -585,7 +594,7 @@ class GuiBuildHeadingsTab(QWidget):
self.formatBox.addLayout(wrapChapter, 1, 1, Qt.AlignLeft) self.formatBox.addLayout(wrapChapter, 1, 1, Qt.AlignLeft)
# Unnumbered Chapter Heading # Unnumbered Chapter Heading
self.lblUnnumbered = QLabel(BuildSettings.getLabel("headings.fmtUnnumbered")) self.lblUnnumbered = QLabel(self._build.getLabel("headings.fmtUnnumbered"))
self.fmtUnnumbered = QLineEdit("") self.fmtUnnumbered = QLineEdit("")
self.fmtUnnumbered.setEnabled(False) self.fmtUnnumbered.setEnabled(False)
self.btnUnnumbered = QToolButton() self.btnUnnumbered = QToolButton()
@@ -601,14 +610,17 @@ class GuiBuildHeadingsTab(QWidget):
self.formatBox.addLayout(wrapUnnumbered, 2, 1, Qt.AlignLeft) self.formatBox.addLayout(wrapUnnumbered, 2, 1, Qt.AlignLeft)
# Scene Heading # Scene Heading
self.lblScene = QLabel(BuildSettings.getLabel("headings.fmtScene")) sceneHideTip = self._build.getLabel("headings.hideScene")
self.lblScene = QLabel(self._build.getLabel("headings.fmtScene"))
self.fmtScene = QLineEdit("") self.fmtScene = QLineEdit("")
self.fmtScene.setEnabled(False) self.fmtScene.setEnabled(False)
self.btnScene = QToolButton() self.btnScene = QToolButton()
self.btnScene.setIcon(self.mainTheme.getIcon("edit")) self.btnScene.setIcon(self.mainTheme.getIcon("edit"))
self.btnScene.clicked.connect(lambda: self._editHeading(self.EDIT_SCENE)) self.btnScene.clicked.connect(lambda: self._editHeading(self.EDIT_SCENE))
self.hdeScene = QLabel(self.tr("Hide"))
self.hdeScene.setToolTip(sceneHideTip)
self.swtScene = NSwitch(width=2*iPx, height=iPx) self.swtScene = NSwitch(width=2*iPx, height=iPx)
self.swtScene.toggled.connect(self._hideScene) self.swtScene.setToolTip(sceneHideTip)
wrapScene = QHBoxLayout() wrapScene = QHBoxLayout()
wrapScene.addWidget(self.fmtScene) wrapScene.addWidget(self.fmtScene)
@@ -616,7 +628,7 @@ class GuiBuildHeadingsTab(QWidget):
wrapScene.setSpacing(bSp) wrapScene.setSpacing(bSp)
wrapSceneHide = QHBoxLayout() wrapSceneHide = QHBoxLayout()
wrapSceneHide.addWidget(QLabel(self.tr("Hide"))) wrapSceneHide.addWidget(self.hdeScene)
wrapSceneHide.addWidget(self.swtScene) wrapSceneHide.addWidget(self.swtScene)
wrapSceneHide.setSpacing(bSp) wrapSceneHide.setSpacing(bSp)
@@ -625,14 +637,17 @@ class GuiBuildHeadingsTab(QWidget):
self.formatBox.addLayout(wrapSceneHide, 3, 2, Qt.AlignLeft) self.formatBox.addLayout(wrapSceneHide, 3, 2, Qt.AlignLeft)
# Section Heading # Section Heading
self.lblSection = QLabel(BuildSettings.getLabel("headings.fmtSection")) sectionHideTip = self._build.getLabel("headings.hideSection")
self.lblSection = QLabel(self._build.getLabel("headings.fmtSection"))
self.fmtSection = QLineEdit("") self.fmtSection = QLineEdit("")
self.fmtSection.setEnabled(False) self.fmtSection.setEnabled(False)
self.btnSection = QToolButton() self.btnSection = QToolButton()
self.btnSection.setIcon(self.mainTheme.getIcon("edit")) self.btnSection.setIcon(self.mainTheme.getIcon("edit"))
self.btnSection.clicked.connect(lambda: self._editHeading(self.EDIT_SECTION)) self.btnSection.clicked.connect(lambda: self._editHeading(self.EDIT_SECTION))
self.hdeSection = QLabel(self.tr("Hide"))
self.hdeSection.setToolTip(sectionHideTip)
self.swtSection = NSwitch(width=2*iPx, height=iPx) self.swtSection = NSwitch(width=2*iPx, height=iPx)
self.swtSection.toggled.connect(self._hideSection) self.swtSection.setToolTip(sectionHideTip)
wrapSection = QHBoxLayout() wrapSection = QHBoxLayout()
wrapSection.addWidget(self.fmtSection) wrapSection.addWidget(self.fmtSection)
@@ -640,7 +655,7 @@ class GuiBuildHeadingsTab(QWidget):
wrapSection.setSpacing(bSp) wrapSection.setSpacing(bSp)
wrapSectionHide = QHBoxLayout() wrapSectionHide = QHBoxLayout()
wrapSectionHide.addWidget(QLabel(self.tr("Hide"))) wrapSectionHide.addWidget(self.hdeSection)
wrapSectionHide.addWidget(self.swtSection) wrapSectionHide.addWidget(self.swtSection)
wrapSectionHide.setSpacing(bSp) wrapSectionHide.setSpacing(bSp)
@@ -717,6 +732,13 @@ class GuiBuildHeadingsTab(QWidget):
self.swtSection.setChecked(self._build.getBool("headings.hideSection")) self.swtSection.setChecked(self._build.getBool("headings.hideSection"))
return return
def saveContent(self):
"""Save choices back into build object.
"""
self._build.setValue("headings.hideScene", self.swtScene.isChecked())
self._build.setValue("headings.hideSection", self.swtSection.isChecked())
return
## ##
# Internal Functions # Internal Functions
## ##
@@ -793,59 +815,9 @@ class GuiBuildHeadingsTab(QWidget):
return return
@pyqtSlot(bool)
def _hideScene(self, status):
"""Hide scene heading
"""
self._build.setValue("headings.hideScene", status)
return
@pyqtSlot(bool)
def _hideSection(self, status):
"""Hide section heading
"""
self._build.setValue("headings.hideSection", status)
return
# END Class GuiBuildHeadingsTab # END Class GuiBuildHeadingsTab
class GuiBuildFormatTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
self._build = build
return
# END Class GuiBuildFormatTab
class GuiBuildContentTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
self._build = build
return
# END Class GuiBuildContentTab
class GuiBuildOutputTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
self._build = build
return
# END Class GuiBuildOutputTab
class GuiHeadingSyntax(QSyntaxHighlighter): class GuiHeadingSyntax(QSyntaxHighlighter):
def __init__(self, document: QTextDocument, mainTheme: GuiTheme): def __init__(self, document: QTextDocument, mainTheme: GuiTheme):
@@ -885,3 +857,224 @@ class GuiHeadingSyntax(QSyntaxHighlighter):
return return
# END Class GuiHeadingSyntax # END Class GuiHeadingSyntax
class GuiBuildContentTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
self.mainGui = buildMain.mainGui
self.mainTheme = buildMain.mainGui.mainTheme
self._build = build
iPx = self.mainTheme.baseIconSize
# Left Form
# =========
self.formLeft = NSimpleLayout()
self.formLeft.addGroupLabel(self._build.getLabel("text.grpContent"))
self.incSynopsis = NSwitch(width=2*iPx, height=iPx)
self.incComments = NSwitch(width=2*iPx, height=iPx)
self.incKeywords = NSwitch(width=2*iPx, height=iPx)
self.incBodyText = NSwitch(width=2*iPx, height=iPx)
self.formLeft.addRow(self._build.getLabel("text.includeSynopsis"), self.incSynopsis)
self.formLeft.addRow(self._build.getLabel("text.includeComments"), self.incComments)
self.formLeft.addRow(self._build.getLabel("text.includeKeywords"), self.incKeywords)
self.formLeft.addRow(self._build.getLabel("text.includeBodyText"), self.incBodyText)
# Right Form
# ==========
self.formRight = NSimpleLayout()
self.formRight.addGroupLabel(self._build.getLabel("text.grpInsert"))
self.addNoteHead = NSwitch(width=2*iPx, height=iPx)
self.formRight.addRow(self._build.getLabel("text.addNoteHeadings"), self.addNoteHead)
# Assemble GUI
# ============
self.outerBox = QHBoxLayout()
self.outerBox.addLayout(self.formLeft, 1)
self.outerBox.addLayout(self.formRight, 1)
self.outerBox.setContentsMargins(0, 0, 0, 0)
self.outerBox.setSpacing(CONFIG.pxInt(16))
self.setLayout(self.outerBox)
return
def loadContent(self):
"""Populate the widgets.
"""
self.incSynopsis.setChecked(self._build.getBool("text.includeSynopsis"))
self.incComments.setChecked(self._build.getBool("text.includeComments"))
self.incKeywords.setChecked(self._build.getBool("text.includeKeywords"))
self.incBodyText.setChecked(self._build.getBool("text.includeBodyText"))
self.addNoteHead.setChecked(self._build.getBool("text.addNoteHeadings"))
return
def saveContent(self):
"""Save choices back into build object.
"""
self._build.setValue("text.includeSynopsis", self.incSynopsis.isChecked())
self._build.setValue("text.includeComments", self.incComments.isChecked())
self._build.setValue("text.includeKeywords", self.incKeywords.isChecked())
self._build.setValue("text.includeBodyText", self.incBodyText.isChecked())
self._build.setValue("text.addNoteHeadings", self.addNoteHead.isChecked())
return
# END Class GuiBuildContentTab
class GuiBuildFormatTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
self.mainGui = buildMain.mainGui
self.mainTheme = buildMain.mainGui.mainTheme
self._build = build
iPx = self.mainTheme.baseIconSize
# Form
# ====
self.mainForm = NConfigLayout()
self.mainForm.addGroupLabel(self._build.getLabel("format.grpFormat"))
# Build Language
self.buildLang = QComboBox()
self.buildLang.setMinimumWidth(CONFIG.pxInt(250))
langauges = CONFIG.listLanguages(CONFIG.LANG_PROJ)
self.buildLang.addItem("[%s]" % self.tr("Not Set"), "None")
for langID, langName in langauges:
self.buildLang.addItem(langName, langID)
self.mainForm.addRow(self._build.getLabel("format.buildLang"), self.buildLang)
# Font Family
self.textFont = QLineEdit()
self.textFont.setReadOnly(True)
self.textFont.setMinimumWidth(CONFIG.pxInt(200))
self.btnTextFont = QPushButton("...")
self.btnTextFont.setMaximumWidth(int(2.5*self.mainTheme.getTextWidth("...")))
self.btnTextFont.clicked.connect(self._selectFont)
self.mainForm.addRow(
self._build.getLabel("format.textFont"), self.textFont, button=self.btnTextFont
)
# Font Size
self.textSize = QSpinBox(self)
self.textSize.setMinimum(8)
self.textSize.setMaximum(60)
self.textSize.setSingleStep(1)
self.textSize.setMinimumWidth(CONFIG.pxInt(60))
self.mainForm.addRow(
self._build.getLabel("format.textSize"), self.textSize, unit="pt"
)
# Line Height
self.lineHeight = QDoubleSpinBox(self)
self.lineHeight.setFixedWidth(6*self.mainTheme.textNWidth)
self.lineHeight.setMinimum(0.75)
self.lineHeight.setMaximum(3.0)
self.lineHeight.setSingleStep(0.05)
self.lineHeight.setDecimals(2)
self.lineHeight.setMinimumWidth(CONFIG.pxInt(60))
self.mainForm.addRow(
self._build.getLabel("format.lineHeight"), self.lineHeight, unit="em"
)
# Switches
self.mainForm.addGroupLabel(self._build.getLabel("format.grpOptions"))
self.mainForm.setContentsMargins(0, 0, 0, 0)
self.justifyText = NSwitch(width=2*iPx, height=iPx)
self.stripUnicode = NSwitch(width=2*iPx, height=iPx)
self.replaceTabs = NSwitch(width=2*iPx, height=iPx)
self.mainForm.addRow(self._build.getLabel("format.justifyText"), self.justifyText)
self.mainForm.addRow(self._build.getLabel("format.stripUnicode"), self.stripUnicode)
self.mainForm.addRow(self._build.getLabel("format.replaceTabs"), self.replaceTabs)
# Assemble GUI
# ============
self.setLayout(self.mainForm)
return
def loadContent(self):
"""Populate the widgets.
"""
langIdx = self.buildLang.findData(self._build.getStr("format.buildLang"))
if langIdx != -1:
self.buildLang.setCurrentIndex(langIdx)
textFont = self._build.getStr("format.textFont")
if not textFont:
textFont = str(CONFIG.textFont)
if not textFont:
textFont = nwConst.SYSTEM_FONT
self.textFont.setText(textFont)
self.textSize.setValue(self._build.getInt("format.textSize"))
self.lineHeight.setValue(self._build.getFloat("format.lineHeight"))
self.justifyText.setChecked(self._build.getBool("format.justifyText"))
self.stripUnicode.setChecked(self._build.getBool("format.stripUnicode"))
self.replaceTabs.setChecked(self._build.getBool("format.replaceTabs"))
return
def saveContent(self):
"""Save choices back into build object.
"""
self._build.setValue("format.buildLang", str(self.buildLang.currentData()))
self._build.setValue("format.textFont", self.textFont.text())
self._build.setValue("format.textSize", self.textSize.value())
self._build.setValue("format.lineHeight", self.lineHeight.value())
self._build.setValue("format.justifyText", self.justifyText.isChecked())
self._build.setValue("format.stripUnicode", self.stripUnicode.isChecked())
self._build.setValue("format.replaceTabs", self.replaceTabs.isChecked())
return
##
# Private Slots
##
@pyqtSlot()
def _selectFont(self):
"""Open the QFontDialog and set a font for the font style.
"""
currFont = QFont()
currFont.setFamily(self.textFont.text())
currFont.setPointSize(self.textSize.value())
theFont, theStatus = QFontDialog.getFont(currFont, self)
if theStatus:
self.textFont.setText(theFont.family())
self.textSize.setValue(theFont.pointSize())
return
# END Class GuiBuildFormatTab
class GuiBuildOutputTab(QWidget):
def __init__(self, buildMain: GuiBuildSettings, build: BuildSettings):
super().__init__(parent=buildMain)
self._build = build
return
# END Class GuiBuildOutputTab