Reset to default font style after emphasis in QTextDocuments (#2121)

This commit is contained in:
Veronica Berglyd Olsen
2024-11-25 23:36:35 +01:00
parent ff34112532
commit 00017e8065
3 changed files with 38 additions and 21 deletions
+28 -11
View File
@@ -74,11 +74,15 @@ class ToQTextDocument(Tokenizer):
self._usedFields: list[tuple[int, str]] = [] self._usedFields: list[tuple[int, str]] = []
self._init = False self._init = False
self._bold = QFont.Weight.Bold
self._normal = QFont.Weight.Normal
self._newPage = False self._newPage = False
self._anchors = True self._anchors = True
self._hWeight = QFont.Weight.Bold
self._dWeight = QFont.Weight.Normal
self._dItalic = False
self._dStrike = False
self._dUnderline = False
self._pageSize = QPageSize(QPageSize.PageSizeId.A4) self._pageSize = QPageSize(QPageSize.PageSizeId.A4)
self._pageMargins = QMarginsF(20.0, 20.0, 20.0, 20.0) self._pageMargins = QMarginsF(20.0, 20.0, 20.0, 20.0)
@@ -128,12 +132,21 @@ class ToQTextDocument(Tokenizer):
self._document.clear() self._document.clear()
self._document.setDefaultFont(self._textFont) self._document.setDefaultFont(self._textFont)
fPt = self._textFont.pointSizeF() # Default Styles
fPx = fPt*96.0/72.0 # 1 em in pixels self._dWeight = self._textFont.weight()
self._dItalic = self._textFont.italic()
self._dStrike = self._textFont.strikeOut()
self._dUnderline = self._textFont.underline()
# Header Weight
self._hWeight = QFont.Weight.Bold if self._boldHeads else self._dWeight
# Scaled Sizes # Scaled Sizes
# ============ # ============
fPt = self._textFont.pointSizeF()
fPx = fPt*4.0/3.0 # 1 em in pixels
self._mHead = { self._mHead = {
BlockTyp.TITLE: (fPx * self._marginTitle[0], fPx * self._marginTitle[1]), BlockTyp.TITLE: (fPx * self._marginTitle[0], fPx * self._marginTitle[1]),
BlockTyp.HEAD1: (fPx * self._marginHead1[0], fPx * self._marginHead1[1]), BlockTyp.HEAD1: (fPx * self._marginHead1[0], fPx * self._marginHead1[1]),
@@ -318,21 +331,21 @@ class ToQTextDocument(Tokenizer):
# Construct next format # Construct next format
if fmt == TextFmt.B_B: if fmt == TextFmt.B_B:
cFmt.setFontWeight(self._bold) cFmt.setFontWeight(QFont.Weight.Bold)
elif fmt == TextFmt.B_E: elif fmt == TextFmt.B_E:
cFmt.setFontWeight(self._normal) cFmt.setFontWeight(self._dWeight)
elif fmt == TextFmt.I_B: elif fmt == TextFmt.I_B:
cFmt.setFontItalic(True) cFmt.setFontItalic(True)
elif fmt == TextFmt.I_E: elif fmt == TextFmt.I_E:
cFmt.setFontItalic(False) cFmt.setFontItalic(self._dItalic)
elif fmt == TextFmt.D_B: elif fmt == TextFmt.D_B:
cFmt.setFontStrikeOut(True) cFmt.setFontStrikeOut(True)
elif fmt == TextFmt.D_E: elif fmt == TextFmt.D_E:
cFmt.setFontStrikeOut(False) cFmt.setFontStrikeOut(self._dStrike)
elif fmt == TextFmt.U_B: elif fmt == TextFmt.U_B:
cFmt.setFontUnderline(True) cFmt.setFontUnderline(True)
elif fmt == TextFmt.U_E: elif fmt == TextFmt.U_E:
cFmt.setFontUnderline(False) cFmt.setFontUnderline(self._dUnderline)
elif fmt == TextFmt.M_B: elif fmt == TextFmt.M_B:
cFmt.setBackground(self._theme.highlight) cFmt.setBackground(self._theme.highlight)
elif fmt == TextFmt.M_E: elif fmt == TextFmt.M_E:
@@ -376,7 +389,7 @@ class ToQTextDocument(Tokenizer):
cFmt.setAnchorHref(data) cFmt.setAnchorHref(data)
elif fmt == TextFmt.HRF_E: elif fmt == TextFmt.HRF_E:
cFmt.setForeground(primary or self._theme.text) cFmt.setForeground(primary or self._theme.text)
cFmt.setFontUnderline(False) cFmt.setFontUnderline(self._dUnderline)
cFmt.setAnchor(False) cFmt.setAnchor(False)
cFmt.setAnchorHref("") cFmt.setAnchorHref("")
elif fmt == TextFmt.FNOTE: elif fmt == TextFmt.FNOTE:
@@ -422,6 +435,10 @@ class ToQTextDocument(Tokenizer):
bFmt.setLineHeight(75.0, QtPropLineHeight) bFmt.setLineHeight(75.0, QtPropLineHeight)
cFmt = QTextCharFormat(self._charFmt) cFmt = QTextCharFormat(self._charFmt)
cFmt.setFontItalic(False)
cFmt.setFontUnderline(False)
cFmt.setFontStrikeOut(False)
cFmt.setFontWeight(QFont.Weight.Normal)
cFmt.setFontPointSize(0.75*self._textFont.pointSizeF()) cFmt.setFontPointSize(0.75*self._textFont.pointSizeF())
cFmt.setForeground(self._theme.comment) cFmt.setForeground(self._theme.comment)
@@ -440,7 +457,7 @@ class ToQTextDocument(Tokenizer):
hCol = self._colorHeads and hType != BlockTyp.TITLE hCol = self._colorHeads and hType != BlockTyp.TITLE
cFmt = QTextCharFormat(self._charFmt) cFmt = QTextCharFormat(self._charFmt)
cFmt.setForeground(self._theme.head if hCol else self._theme.text) cFmt.setForeground(self._theme.head if hCol else self._theme.text)
cFmt.setFontWeight(self._bold if self._boldHeads else self._normal) cFmt.setFontWeight(self._hWeight)
cFmt.setFontPointSize(self._sHead.get(hType, 1.0)) cFmt.setFontPointSize(self._sHead.get(hType, 1.0))
if hKey and self._anchors: if hKey and self._anchors:
cFmt.setAnchorNames([hKey]) cFmt.setAnchorNames([hKey])
+1 -1
View File
@@ -101,7 +101,7 @@ def testBaseError_Handler(qtbot, monkeypatch, nwGUI):
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(NWErrorMessage, "exec", lambda *a: None) mp.setattr(NWErrorMessage, "exec", lambda *a: None)
mp.setattr("PyQt5.QtWidgets.QApplication.exit", lambda *a: None) mp.setattr("PyQt5.QtWidgets.QApplication.exit", lambda *a: None)
mp.setattr(nwGUI, "closeMain", causeException) mp.setattr("novelwriter.guimain.GuiMain.closeMain", causeException)
exceptionHandler(Exception, "Error Message", None) # type: ignore exceptionHandler(Exception, "Error Message", None) # type: ignore
nwGUI.closeMain() nwGUI.closeMain()
+9 -9
View File
@@ -22,7 +22,7 @@ from __future__ import annotations
import pytest import pytest
from PyQt5.QtGui import QTextBlock, QTextCharFormat, QTextCursor from PyQt5.QtGui import QFont, QTextBlock, QTextCharFormat, QTextCursor
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.constants import nwUnicode from novelwriter.constants import nwUnicode
@@ -71,7 +71,7 @@ def testFmtToQTextDocument_ConvertHeaders(mockGUI):
assert bFmt.topMargin() == doc._mHead[BlockTyp.TITLE][0] assert bFmt.topMargin() == doc._mHead[BlockTyp.TITLE][0]
assert bFmt.bottomMargin() == doc._mHead[BlockTyp.TITLE][1] assert bFmt.bottomMargin() == doc._mHead[BlockTyp.TITLE][1]
cFmt = charFmtInBlock(block, 1) cFmt = charFmtInBlock(block, 1)
assert cFmt.fontWeight() == doc._bold assert cFmt.fontWeight() == QFont.Weight.Bold
assert cFmt.fontPointSize() == doc._sHead[BlockTyp.TITLE] assert cFmt.fontPointSize() == doc._sHead[BlockTyp.TITLE]
assert cFmt.foreground().color() == THEME.text assert cFmt.foreground().color() == THEME.text
@@ -82,7 +82,7 @@ def testFmtToQTextDocument_ConvertHeaders(mockGUI):
assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD1][0] assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD1][0]
assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD1][1] assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD1][1]
cFmt = charFmtInBlock(block, 1) cFmt = charFmtInBlock(block, 1)
assert cFmt.fontWeight() == doc._bold assert cFmt.fontWeight() == QFont.Weight.Bold
assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD1] assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD1]
assert cFmt.foreground().color() == THEME.head assert cFmt.foreground().color() == THEME.head
@@ -93,7 +93,7 @@ def testFmtToQTextDocument_ConvertHeaders(mockGUI):
assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD2][0] assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD2][0]
assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD2][1] assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD2][1]
cFmt = charFmtInBlock(block, 1) cFmt = charFmtInBlock(block, 1)
assert cFmt.fontWeight() == doc._bold assert cFmt.fontWeight() == QFont.Weight.Bold
assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD2] assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD2]
assert cFmt.foreground().color() == THEME.head assert cFmt.foreground().color() == THEME.head
@@ -104,7 +104,7 @@ def testFmtToQTextDocument_ConvertHeaders(mockGUI):
assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD3][0] assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD3][0]
assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD3][1] assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD3][1]
cFmt = charFmtInBlock(block, 1) cFmt = charFmtInBlock(block, 1)
assert cFmt.fontWeight() == doc._bold assert cFmt.fontWeight() == QFont.Weight.Bold
assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD3] assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD3]
assert cFmt.foreground().color() == THEME.head assert cFmt.foreground().color() == THEME.head
@@ -115,7 +115,7 @@ def testFmtToQTextDocument_ConvertHeaders(mockGUI):
assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD4][0] assert bFmt.topMargin() == doc._mHead[BlockTyp.HEAD4][0]
assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD4][1] assert bFmt.bottomMargin() == doc._mHead[BlockTyp.HEAD4][1]
cFmt = charFmtInBlock(block, 1) cFmt = charFmtInBlock(block, 1)
assert cFmt.fontWeight() == doc._bold assert cFmt.fontWeight() == QFont.Weight.Bold
assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD4] assert cFmt.fontPointSize() == doc._sHead[BlockTyp.HEAD4]
assert cFmt.foreground().color() == THEME.head assert cFmt.foreground().color() == THEME.head
@@ -478,11 +478,11 @@ def testFmtToQTextDocument_TextCharFormats(mockGUI):
block = doc.document.findBlockByNumber(1) block = doc.document.findBlockByNumber(1)
assert block.text() == "With bold text" assert block.text() == "With bold text"
cFmt = charFmtInBlock(block, 1) cFmt = charFmtInBlock(block, 1)
assert cFmt.fontWeight() == doc._normal assert cFmt.fontWeight() == doc._dWeight
cFmt = charFmtInBlock(block, 6) cFmt = charFmtInBlock(block, 6)
assert cFmt.fontWeight() == doc._bold assert cFmt.fontWeight() == QFont.Weight.Bold
cFmt = charFmtInBlock(block, 10) cFmt = charFmtInBlock(block, 10)
assert cFmt.fontWeight() == doc._normal assert cFmt.fontWeight() == doc._dWeight
# 2: Italic # 2: Italic
block = doc.document.findBlockByNumber(2) block = doc.document.findBlockByNumber(2)