diff --git a/novelwriter/core/buildsettings.py b/novelwriter/core/buildsettings.py index a9a8e18e..c5e0e9d8 100644 --- a/novelwriter/core/buildsettings.py +++ b/novelwriter/core/buildsettings.py @@ -97,6 +97,8 @@ SETTINGS_TEMPLATE: dict[str, tuple[type, T_Basic]] = { "format.leftMargin": (float, 2.0), "format.rightMargin": (float, 2.0), "odt.addColours": (bool, True), + "odt.scaleHeadings": (bool, True), + "odt.boldHeadings": (bool, True), "odt.pageHeader": (str, nwHeadFmt.ODT_AUTO), "odt.pageCountOffset": (int, 0), "html.addStyles": (bool, True), @@ -155,6 +157,8 @@ SETTINGS_LABELS = { "odt": QT_TRANSLATE_NOOP("Builds", "ODT Options"), "odt.addColours": QT_TRANSLATE_NOOP("Builds", "Add Highlight Colours"), + "odt.scaleHeadings": QT_TRANSLATE_NOOP("Builds", "Increase Size of Headings"), + "odt.boldHeadings": QT_TRANSLATE_NOOP("Builds", "Bold Headings"), "odt.pageHeader": QT_TRANSLATE_NOOP("Builds", "Page Header"), "odt.pageCountOffset": QT_TRANSLATE_NOOP("Builds", "Page Counter Offset"), diff --git a/novelwriter/core/docbuild.py b/novelwriter/core/docbuild.py index c0d1ca39..429bc92f 100644 --- a/novelwriter/core/docbuild.py +++ b/novelwriter/core/docbuild.py @@ -359,10 +359,15 @@ class NWBuildDocument: bldObj.setReplaceUnicode(self._build.getBool("format.stripUnicode")) if isinstance(bldObj, ToOdt): - bldObj.setColourHeaders(self._build.getBool("odt.addColours")) + bldObj.setColoursEnabled(self._build.getBool("odt.addColours")) + bldObj.setHeadingStyles( + self._build.getBool("odt.scaleHeadings"), + self._build.getBool("odt.boldHeadings"), + ) bldObj.setLanguage(self._project.data.language) bldObj.setHeaderFormat( - self._build.getStr("odt.pageHeader"), self._build.getInt("odt.pageCountOffset") + self._build.getStr("odt.pageHeader"), + self._build.getInt("odt.pageCountOffset"), ) scale = nwLabels.UNIT_SCALE.get(self._build.getStr("format.pageUnit"), 1.0) diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index dbf75be3..64b6579e 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -161,7 +161,9 @@ class ToOdt(Tokenizer): # Properties self._textFont = QFont("Liberation Serif", 12) - self._colourHead = False + self._addColours = False + self._scaleHeads = True + self._headWeight = "bold" self._headerFormat = "" self._pageOffset = 0 @@ -244,9 +246,15 @@ class ToOdt(Tokenizer): self._dCountry = country or self._dCountry return - def setColourHeaders(self, state: bool) -> None: + def setHeadingStyles(self, scale: bool, bold: bool) -> None: + """Set plain text style for headings.""" + self._scaleHeads = scale + self._headWeight = self._fontBold if bold else None + return + + def setColoursEnabled(self, state: bool) -> None: """Enable/disable coloured headings and comments.""" - self._colourHead = state + self._addColours = state return def setPageLayout( @@ -288,12 +296,13 @@ class ToOdt(Tokenizer): self._fontPitch = "fixed" if self._textFont.fixedPitch() else "variable" self._fontBold = FONT_WEIGHT_MAP.get(fontBold, fontBold) - self._fSizeTitle = f"{round(2.50 * self._fontSize):d}pt" - self._fSizeHead1 = f"{round(2.00 * self._fontSize):d}pt" - self._fSizeHead2 = f"{round(1.60 * self._fontSize):d}pt" - self._fSizeHead3 = f"{round(1.30 * self._fontSize):d}pt" - self._fSizeHead4 = f"{round(1.15 * self._fontSize):d}pt" - self._fSizeHead = f"{round(1.15 * self._fontSize):d}pt" + hScale = self._scaleHeads + self._fSizeTitle = f"{round((2.50 if hScale else 1.0) * self._fontSize):d}pt" + self._fSizeHead1 = f"{round((2.00 if hScale else 1.0) * self._fontSize):d}pt" + self._fSizeHead2 = f"{round((1.60 if hScale else 1.0) * self._fontSize):d}pt" + self._fSizeHead3 = f"{round((1.30 if hScale else 1.0) * self._fontSize):d}pt" + self._fSizeHead4 = f"{round((1.15 if hScale else 1.0) * self._fontSize):d}pt" + self._fSizeHead = f"{round((1.15 if hScale else 1.0) * self._fontSize):d}pt" self._fSizeText = f"{self._fontSize:d}pt" self._fSizeFoot = f"{round(0.8*self._fontSize):d}pt" @@ -322,7 +331,7 @@ class ToOdt(Tokenizer): self._mLeftFoot = self._emToCm(self._marginFoot[0]) self._mBotFoot = self._emToCm(self._marginFoot[1]) - if self._colourHead: + if self._addColours: self._colHead12 = "#2a6099" self._opaHead12 = "100%" self._colHead34 = "#444444" @@ -965,7 +974,7 @@ class ToOdt(Tokenizer): style.setFontName(self._fontFamily) style.setFontFamily(self._fontFamily) style.setFontSize(self._fSizeTitle) - style.setFontWeight(self._fontBold) + style.setFontWeight(self._headWeight) style.packXML(self._xStyl) self._mainPara[style.name] = style @@ -998,7 +1007,7 @@ class ToOdt(Tokenizer): style.setFontName(self._fontFamily) style.setFontFamily(self._fontFamily) style.setFontSize(self._fSizeHead1) - style.setFontWeight(self._fontBold) + style.setFontWeight(self._headWeight) style.setColour(self._colHead12) style.setOpacity(self._opaHead12) style.packXML(self._xStyl) @@ -1016,7 +1025,7 @@ class ToOdt(Tokenizer): style.setFontName(self._fontFamily) style.setFontFamily(self._fontFamily) style.setFontSize(self._fSizeHead2) - style.setFontWeight(self._fontBold) + style.setFontWeight(self._headWeight) style.setColour(self._colHead12) style.setOpacity(self._opaHead12) style.packXML(self._xStyl) @@ -1034,7 +1043,7 @@ class ToOdt(Tokenizer): style.setFontName(self._fontFamily) style.setFontFamily(self._fontFamily) style.setFontSize(self._fSizeHead3) - style.setFontWeight(self._fontBold) + style.setFontWeight(self._headWeight) style.setColour(self._colHead34) style.setOpacity(self._opaHead34) style.packXML(self._xStyl) @@ -1052,7 +1061,7 @@ class ToOdt(Tokenizer): style.setFontName(self._fontFamily) style.setFontFamily(self._fontFamily) style.setFontSize(self._fSizeHead4) - style.setFontWeight(self._fontBold) + style.setFontWeight(self._headWeight) style.setColour(self._colHead34) style.setOpacity(self._opaHead34) style.packXML(self._xStyl) diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py index 8d552f54..c459a013 100644 --- a/novelwriter/tools/manussettings.py +++ b/novelwriter/tools/manussettings.py @@ -1123,7 +1123,12 @@ class _FormattingTab(NScrollableForm): self.addGroupLabel(title, section) self.odtAddColours = NSwitch(self, height=iPx) + self.scaleHeadings = NSwitch(self, height=iPx) + self.boldHeadings = NSwitch(self, height=iPx) + self.addRow(self._build.getLabel("odt.addColours"), self.odtAddColours) + self.addRow(self._build.getLabel("odt.scaleHeadings"), self.scaleHeadings) + self.addRow(self._build.getLabel("odt.boldHeadings"), self.boldHeadings) self.odtPageHeader = QLineEdit(self) self.odtPageHeader.setMinimumWidth(CONFIG.pxInt(200)) @@ -1226,6 +1231,8 @@ class _FormattingTab(NScrollableForm): # ============ self.odtAddColours.setChecked(self._build.getBool("odt.addColours")) + self.scaleHeadings.setChecked(self._build.getBool("odt.scaleHeadings")) + self.boldHeadings.setChecked(self._build.getBool("odt.boldHeadings")) self.odtPageHeader.setText(self._build.getStr("odt.pageHeader")) self.odtPageCountOffset.setValue(self._build.getInt("odt.pageCountOffset")) self.odtPageHeader.setCursorPosition(0) @@ -1276,6 +1283,8 @@ class _FormattingTab(NScrollableForm): # ODT Document self._build.setValue("odt.addColours", self.odtAddColours.isChecked()) + self._build.setValue("odt.scaleHeadings", self.scaleHeadings.isChecked()) + self._build.setValue("odt.boldHeadings", self.boldHeadings.isChecked()) self._build.setValue("odt.pageHeader", self.odtPageHeader.text()) self._build.setValue("odt.pageCountOffset", self.odtPageCountOffset.value()) diff --git a/tests/test_core/test_core_toodt.py b/tests/test_core/test_core_toodt.py index 77f17a0d..d1c524c8 100644 --- a/tests/test_core/test_core_toodt.py +++ b/tests/test_core/test_core_toodt.py @@ -772,8 +772,8 @@ def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths): assert odt._dLanguage == "" odt.setLanguage("nb_NO") assert odt._dLanguage == "nb" - odt.setColourHeaders(True) - assert odt._colourHead is True + odt.setColoursEnabled(True) + assert odt._addColours is True odt.setHeaderFormat(nwHeadFmt.ODT_AUTO, 1) assert odt._headerFormat == nwHeadFmt.ODT_AUTO odt.setFirstLineIndent(True, 1.4, False) diff --git a/tests/test_tools/test_tools_manussettings.py b/tests/test_tools/test_tools_manussettings.py index 2d7ddb12..fcce0352 100644 --- a/tests/test_tools/test_tools_manussettings.py +++ b/tests/test_tools/test_tools_manussettings.py @@ -707,7 +707,9 @@ def testToolBuildSettings_FormatOutput(qtbot, nwGUI): """Test the format-specific settings.""" build = BuildSettings() - build.setValue("odt.addColours", False) + build.setValue("odt.addColours", True) + build.setValue("odt.scaleHeadings", True) + build.setValue("odt.boldHeadings", True) build.setValue("odt.pageHeader", nwHeadFmt.ODT_AUTO) build.setValue("odt.pageCountOffset", 0) @@ -724,7 +726,9 @@ def testToolBuildSettings_FormatOutput(qtbot, nwGUI): assert bSettings.toolStack.currentWidget() is fmtTab # Check initial values - assert fmtTab.odtAddColours.isChecked() is False + assert fmtTab.odtAddColours.isChecked() is True + assert fmtTab.scaleHeadings.isChecked() is True + assert fmtTab.boldHeadings.isChecked() is True assert fmtTab.odtPageHeader.text() == nwHeadFmt.ODT_AUTO assert fmtTab.odtPageCountOffset.value() == 0 @@ -732,7 +736,9 @@ def testToolBuildSettings_FormatOutput(qtbot, nwGUI): assert fmtTab.htmlPreserveTabs.isChecked() is False # Toggle all - fmtTab.odtAddColours.setChecked(True) + fmtTab.odtAddColours.setChecked(False) + fmtTab.scaleHeadings.setChecked(False) + fmtTab.boldHeadings.setChecked(False) fmtTab.htmlAddStyles.setChecked(True) fmtTab.htmlPreserveTabs.setChecked(True) @@ -743,7 +749,9 @@ def testToolBuildSettings_FormatOutput(qtbot, nwGUI): # Save values fmtTab.saveContent() - assert build.getBool("odt.addColours") is True + assert build.getBool("odt.addColours") is False + assert build.getBool("odt.scaleHeadings") is False + assert build.getBool("odt.boldHeadings") is False assert build.getStr("odt.pageHeader") == "Stuff" assert build.getInt("odt.pageCountOffset") == 1