From 912198cc40f52e8424eaf092e1c4e23949a3fff7 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:57:04 +0200 Subject: [PATCH] Add text margin settings --- novelwriter/constants.py | 7 ++ novelwriter/core/buildsettings.py | 18 ++++ novelwriter/core/docbuild.py | 29 +++++++ novelwriter/gui/mainmenu.py | 10 +-- novelwriter/tools/manussettings.py | 134 ++++++++++++++++++++++++++++- 5 files changed, 189 insertions(+), 9 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index 8f97ea2f..54e407a4 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -98,6 +98,13 @@ class nwHeaders: H_VALID = ("H0", "H1", "H2", "H3", "H4") H_LEVEL = {"H0": 0, "H1": 1, "H2": 2, "H3": 3, "H4": 4} H_SIZES = {0: 2.50, 1: 2.00, 2: 1.75, 3: 1.50, 4: 1.25} + H_LABEL = { + "H0": QT_TRANSLATE_NOOP("Constant", "Title"), + "H1": QT_TRANSLATE_NOOP("Constant", "Heading 1 (Partition)"), + "H2": QT_TRANSLATE_NOOP("Constant", "Heading 2 (Chapter)"), + "H3": QT_TRANSLATE_NOOP("Constant", "Heading 3 (Scene)"), + "H4": QT_TRANSLATE_NOOP("Constant", "Heading 4 (Section)"), + } class nwFiles: diff --git a/novelwriter/core/buildsettings.py b/novelwriter/core/buildsettings.py index 4664e34e..ee0a041d 100644 --- a/novelwriter/core/buildsettings.py +++ b/novelwriter/core/buildsettings.py @@ -87,6 +87,20 @@ SETTINGS_TEMPLATE: dict[str, tuple[type, str | int | float | bool]] = { "format.firstLineIndent": (bool, False), "format.firstIndentWidth": (float, 1.4), "format.indentFirstPar": (bool, False), + "format.titleMarginT": (float, 1.42), + "format.titleMarginB": (float, 0.50), + "format.h1MarginT": (float, 1.42), + "format.h1MarginB": (float, 0.50), + "format.h2MarginT": (float, 1.67), + "format.h2MarginB": (float, 0.50), + "format.h3MarginT": (float, 1.17), + "format.h3MarginB": (float, 0.50), + "format.h4MarginT": (float, 1.17), + "format.h4MarginB": (float, 0.50), + "format.textMarginT": (float, 0.00), + "format.textMarginB": (float, 0.50), + "format.sepMarginT": (float, 1.17), + "format.sepMarginB": (float, 1.17), "format.pageUnit": (str, "cm"), "format.pageSize": (str, "A4"), "format.pageWidth": (float, 21.0), @@ -144,6 +158,10 @@ SETTINGS_LABELS = { "format.firstIndentWidth": QT_TRANSLATE_NOOP("Builds", "Indent Width"), "format.indentFirstPar": QT_TRANSLATE_NOOP("Builds", "Indent First Paragraph"), + "format.grpMargins": QT_TRANSLATE_NOOP("Builds", "Text Margins"), + "format.textMargin": QT_TRANSLATE_NOOP("Builds", "Text Paragraph"), + "format.sepMargin": QT_TRANSLATE_NOOP("Builds", "Scene Separator"), + "format.grpPage": QT_TRANSLATE_NOOP("Builds", "Page Layout"), "format.pageUnit": QT_TRANSLATE_NOOP("Builds", "Unit"), "format.pageSize": QT_TRANSLATE_NOOP("Builds", "Page Size"), diff --git a/novelwriter/core/docbuild.py b/novelwriter/core/docbuild.py index cc9d1e50..732b2d76 100644 --- a/novelwriter/core/docbuild.py +++ b/novelwriter/core/docbuild.py @@ -287,6 +287,35 @@ class NWBuildDocument: self._build.getBool("odt.boldHeadings"), ) + bldObj.setTitleMargins( + self._build.getFloat("format.titleMarginT"), + self._build.getFloat("format.titleMarginB"), + ) + bldObj.setHead1Margins( + self._build.getFloat("format.h1MarginT"), + self._build.getFloat("format.h1MarginB"), + ) + bldObj.setHead2Margins( + self._build.getFloat("format.h2MarginT"), + self._build.getFloat("format.h2MarginB"), + ) + bldObj.setHead3Margins( + self._build.getFloat("format.h3MarginT"), + self._build.getFloat("format.h3MarginB"), + ) + bldObj.setHead4Margins( + self._build.getFloat("format.h4MarginT"), + self._build.getFloat("format.h4MarginB"), + ) + bldObj.setTextMargins( + self._build.getFloat("format.textMarginT"), + self._build.getFloat("format.textMarginB"), + ) + bldObj.setSeparatorMargins( + self._build.getFloat("format.sepMarginT"), + self._build.getFloat("format.sepMarginB"), + ) + bldObj.setBodyText(self._build.getBool("text.includeBodyText")) bldObj.setSynopsis(self._build.getBool("text.includeSynopsis")) bldObj.setComments(self._build.getBool("text.includeComments")) diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index 893129d1..25cd39ee 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -34,7 +34,7 @@ from PyQt5.QtWidgets import QAction, QMenuBar from novelwriter import CONFIG, SHARED from novelwriter.common import openExternalPath -from novelwriter.constants import nwConst, nwKeyWords, nwLabels, nwUnicode, trConst +from novelwriter.constants import nwConst, nwHeaders, nwKeyWords, nwLabels, nwUnicode, trConst from novelwriter.enum import nwDocAction, nwDocInsert, nwFocus, nwView from novelwriter.extensions.eventfilters import StatusTipFilter @@ -700,28 +700,28 @@ class GuiMainMenu(QMenuBar): self.fmtMenu.addSeparator() # Format > Heading 1 (Partition) - self.aFmtHead1 = self.fmtMenu.addAction(self.tr("Heading 1 (Partition)")) + self.aFmtHead1 = self.fmtMenu.addAction(trConst(nwHeaders.H_LABEL["H1"])) self.aFmtHead1.setShortcut("Ctrl+1") self.aFmtHead1.triggered.connect( lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H1) ) # Format > Heading 2 (Chapter) - self.aFmtHead2 = self.fmtMenu.addAction(self.tr("Heading 2 (Chapter)")) + self.aFmtHead2 = self.fmtMenu.addAction(trConst(nwHeaders.H_LABEL["H2"])) self.aFmtHead2.setShortcut("Ctrl+2") self.aFmtHead2.triggered.connect( lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H2) ) # Format > Heading 3 (Scene) - self.aFmtHead3 = self.fmtMenu.addAction(self.tr("Heading 3 (Scene)")) + self.aFmtHead3 = self.fmtMenu.addAction(trConst(nwHeaders.H_LABEL["H3"])) self.aFmtHead3.setShortcut("Ctrl+3") self.aFmtHead3.triggered.connect( lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H3) ) # Format > Heading 4 (Section) - self.aFmtHead4 = self.fmtMenu.addAction(self.tr("Heading 4 (Section)")) + self.aFmtHead4 = self.fmtMenu.addAction(trConst(nwHeaders.H_LABEL["H4"])) self.aFmtHead4.setShortcut("Ctrl+4") self.aFmtHead4.triggered.connect( lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H4) diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py index ca20cd06..0a7b93b0 100644 --- a/novelwriter/tools/manussettings.py +++ b/novelwriter/tools/manussettings.py @@ -38,7 +38,7 @@ from PyQt5.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import describeFont -from novelwriter.constants import nwHeadFmt, nwKeyWords, nwLabels, trConst +from novelwriter.constants import nwHeaders, nwHeadFmt, nwKeyWords, nwLabels, trConst from novelwriter.core.buildsettings import BuildSettings, FilterMode from novelwriter.extensions.configlayout import ( NColourLabel, NFixedPage, NScrollableForm, NScrollablePage @@ -1076,6 +1076,98 @@ class _FormattingTab(NScrollableForm): self.addRow(self._build.getLabel("format.firstIndentWidth"), self.indentWidth, unit="em") self.addRow(self._build.getLabel("format.indentFirstPar"), self.indentFirstPar) + # Text Margins + # ============ + + title = self._build.getLabel("format.grpMargins") + section += 1 + self._sidebar.addButton(title, section) + self.addGroupLabel(title, section) + + # Title + self.titleMarginT = NDoubleSpinBox(self) + self.titleMarginT.setFixedWidth(dbW) + + self.titleMarginB = NDoubleSpinBox(self) + self.titleMarginB.setFixedWidth(dbW) + + self.addRow( + trConst(nwHeaders.H_LABEL["H0"]), + [trT, self.titleMarginT, 6, trB, self.titleMarginB], + ) + + # Heading 1 + self.h1MarginT = NDoubleSpinBox(self) + self.h1MarginT.setFixedWidth(dbW) + + self.h1MarginB = NDoubleSpinBox(self) + self.h1MarginB.setFixedWidth(dbW) + + self.addRow( + trConst(nwHeaders.H_LABEL["H1"]), + [trT, self.h1MarginT, 6, trB, self.h1MarginB], + ) + + # Heading 2 + self.h2MarginT = NDoubleSpinBox(self) + self.h2MarginT.setFixedWidth(dbW) + + self.h2MarginB = NDoubleSpinBox(self) + self.h2MarginB.setFixedWidth(dbW) + + self.addRow( + trConst(nwHeaders.H_LABEL["H2"]), + [trT, self.h2MarginT, 6, trB, self.h2MarginB], + ) + + # Heading 3 + self.h3MarginT = NDoubleSpinBox(self) + self.h3MarginT.setFixedWidth(dbW) + + self.h3MarginB = NDoubleSpinBox(self) + self.h3MarginB.setFixedWidth(dbW) + + self.addRow( + trConst(nwHeaders.H_LABEL["H3"]), + [trT, self.h3MarginT, 6, trB, self.h3MarginB], + ) + + # Heading 4 + self.h4MarginT = NDoubleSpinBox(self) + self.h4MarginT.setFixedWidth(dbW) + + self.h4MarginB = NDoubleSpinBox(self) + self.h4MarginB.setFixedWidth(dbW) + + self.addRow( + trConst(nwHeaders.H_LABEL["H4"]), + [trT, self.h4MarginT, 6, trB, self.h4MarginB], + ) + + # Text + self.textMarginT = NDoubleSpinBox(self) + self.textMarginT.setFixedWidth(dbW) + + self.textMarginB = NDoubleSpinBox(self) + self.textMarginB.setFixedWidth(dbW) + + self.addRow( + self._build.getLabel("format.textMargin"), + [trT, self.textMarginT, 6, trB, self.textMarginB], + ) + + # Separator + self.sepMarginT = NDoubleSpinBox(self) + self.sepMarginT.setFixedWidth(dbW) + + self.sepMarginB = NDoubleSpinBox(self) + self.sepMarginB.setFixedWidth(dbW) + + self.addRow( + self._build.getLabel("format.sepMargin"), + [trT, self.sepMarginT, 6, trB, self.sepMarginB], + ) + # Page Layout # =========== @@ -1106,7 +1198,7 @@ class _FormattingTab(NScrollableForm): self.addRow( self._build.getLabel("format.pageSize"), - [self.pageSize, 8, trW, self.pageWidth, trH, self.pageHeight], + [self.pageSize, 6, trW, self.pageWidth, 6, trH, self.pageHeight], ) # Page Margins @@ -1124,11 +1216,11 @@ class _FormattingTab(NScrollableForm): self.addRow( self._build.getLabel("format.pageMargins"), - [trT, self.topMargin, trB, self.bottomMargin], + [trT, self.topMargin, 6, trB, self.bottomMargin], ) self.addRow( "", - [trL, self.leftMargin, trR, self.rightMargin], + [trL, self.leftMargin, 6, trR, self.rightMargin], ) # Open Document @@ -1220,6 +1312,24 @@ class _FormattingTab(NScrollableForm): self.indentWidth.setValue(self._build.getFloat("format.firstIndentWidth")) self.indentFirstPar.setChecked(self._build.getBool("format.indentFirstPar")) + # Text Margins + # ============ + + self.titleMarginT.setValue(self._build.getFloat("format.titleMarginT")) + self.titleMarginB.setValue(self._build.getFloat("format.titleMarginB")) + self.h1MarginT.setValue(self._build.getFloat("format.h1MarginT")) + self.h1MarginB.setValue(self._build.getFloat("format.h1MarginB")) + self.h2MarginT.setValue(self._build.getFloat("format.h2MarginT")) + self.h2MarginB.setValue(self._build.getFloat("format.h2MarginB")) + self.h3MarginT.setValue(self._build.getFloat("format.h3MarginT")) + self.h3MarginB.setValue(self._build.getFloat("format.h3MarginB")) + self.h4MarginT.setValue(self._build.getFloat("format.h4MarginT")) + self.h4MarginB.setValue(self._build.getFloat("format.h4MarginB")) + self.textMarginT.setValue(self._build.getFloat("format.textMarginT")) + self.textMarginB.setValue(self._build.getFloat("format.textMarginB")) + self.sepMarginT.setValue(self._build.getFloat("format.sepMarginT")) + self.sepMarginB.setValue(self._build.getFloat("format.sepMarginB")) + # Page Layout # =========== @@ -1290,6 +1400,22 @@ class _FormattingTab(NScrollableForm): self._build.setValue("format.firstIndentWidth", self.indentWidth.value()) self._build.setValue("format.indentFirstPar", self.indentFirstPar.isChecked()) + # Text Margins + self._build.setValue("format.titleMarginT", self.titleMarginT.value()) + self._build.setValue("format.titleMarginB", self.titleMarginB.value()) + self._build.setValue("format.h1MarginT", self.h1MarginT.value()) + self._build.setValue("format.h1MarginB", self.h1MarginB.value()) + self._build.setValue("format.h2MarginT", self.h2MarginT.value()) + self._build.setValue("format.h2MarginB", self.h2MarginB.value()) + self._build.setValue("format.h3MarginT", self.h3MarginT.value()) + self._build.setValue("format.h3MarginB", self.h3MarginB.value()) + self._build.setValue("format.h4MarginT", self.h4MarginT.value()) + self._build.setValue("format.h4MarginB", self.h4MarginB.value()) + self._build.setValue("format.textMarginT", self.textMarginT.value()) + self._build.setValue("format.textMarginB", self.textMarginB.value()) + self._build.setValue("format.sepMarginT", self.sepMarginT.value()) + self._build.setValue("format.sepMarginB", self.sepMarginB.value()) + # Page Layout self._build.setValue("format.pageUnit", str(self.pageUnit.currentData())) self._build.setValue("format.pageSize", str(self.pageSize.currentData()))