novelWriter 2.7.5__py3-none-any.whl → 2.8b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. novelwriter/__init__.py +8 -7
  2. novelwriter/assets/icons/font_awesome.icons +22 -4
  3. novelwriter/assets/icons/material_filled_normal.icons +20 -2
  4. novelwriter/assets/icons/material_filled_thin.icons +20 -2
  5. novelwriter/assets/icons/material_rounded_normal.icons +20 -2
  6. novelwriter/assets/icons/material_rounded_thin.icons +20 -2
  7. novelwriter/assets/icons/material_sharp_normal.icons +20 -2
  8. novelwriter/assets/icons/material_sharp_thin.icons +20 -2
  9. novelwriter/assets/icons/remix_filled.icons +20 -2
  10. novelwriter/assets/icons/remix_outline.icons +20 -2
  11. novelwriter/assets/images/welcome.webp +0 -0
  12. novelwriter/assets/manual.pdf +0 -0
  13. novelwriter/assets/manual_fr.pdf +0 -0
  14. novelwriter/assets/sample.zip +0 -0
  15. novelwriter/assets/text/credits_en.htm +61 -11
  16. novelwriter/assets/themes/aura.conf +97 -0
  17. novelwriter/assets/themes/aura_bright.conf +95 -0
  18. novelwriter/assets/themes/aura_soft.conf +97 -0
  19. novelwriter/assets/themes/b2t_garden_dark.conf +97 -0
  20. novelwriter/assets/themes/b2t_garden_light.conf +97 -0
  21. novelwriter/assets/themes/b2t_suburb_dark.conf +97 -0
  22. novelwriter/assets/themes/b2t_suburb_light.conf +97 -0
  23. novelwriter/assets/themes/b4t_classic_o_dark.conf +97 -0
  24. novelwriter/assets/themes/b4t_classic_o_light.conf +97 -0
  25. novelwriter/assets/themes/b4t_modern_c_dark.conf +97 -0
  26. novelwriter/assets/themes/b4t_modern_c_light.conf +97 -0
  27. novelwriter/assets/themes/blue_streak_dark.conf +97 -0
  28. novelwriter/assets/themes/blue_streak_light.conf +97 -0
  29. novelwriter/assets/themes/castle_day.conf +95 -0
  30. novelwriter/assets/themes/castle_night.conf +95 -0
  31. novelwriter/assets/themes/catppuccin_latte.conf +97 -0
  32. novelwriter/assets/themes/catppuccin_mocha.conf +97 -0
  33. novelwriter/assets/themes/chalky_soil.conf +95 -0
  34. novelwriter/assets/themes/chernozem.conf +95 -0
  35. novelwriter/assets/themes/cyberpunk_night.conf +88 -40
  36. novelwriter/assets/themes/default_dark.conf +89 -41
  37. novelwriter/assets/themes/default_light.conf +89 -41
  38. novelwriter/assets/themes/dracula.conf +91 -42
  39. novelwriter/assets/themes/espresso.conf +97 -0
  40. novelwriter/assets/themes/everforest_dark.conf +97 -0
  41. novelwriter/assets/themes/everforest_light.conf +97 -0
  42. novelwriter/assets/themes/floral_daydream.conf +95 -0
  43. novelwriter/assets/themes/floral_midnight.conf +95 -0
  44. novelwriter/assets/themes/full_moon.conf +95 -0
  45. novelwriter/assets/themes/grey_dark.conf +97 -0
  46. novelwriter/assets/themes/grey_light.conf +97 -0
  47. novelwriter/assets/themes/horizon_dark.conf +97 -0
  48. novelwriter/assets/themes/horizon_light.conf +97 -0
  49. novelwriter/assets/themes/jewel_case_dark.conf +95 -0
  50. novelwriter/assets/themes/jewel_case_light.conf +95 -0
  51. novelwriter/assets/themes/lcars.conf +97 -0
  52. novelwriter/assets/themes/light_owl.conf +117 -0
  53. novelwriter/assets/themes/new_moon.conf +97 -0
  54. novelwriter/assets/themes/night_owl.conf +117 -0
  55. novelwriter/assets/themes/noctis.conf +129 -0
  56. novelwriter/assets/themes/noctis_lux.conf +129 -0
  57. novelwriter/assets/themes/nord.conf +97 -0
  58. novelwriter/assets/themes/nordlicht.conf +95 -0
  59. novelwriter/assets/themes/otium_dark.conf +95 -0
  60. novelwriter/assets/themes/otium_light.conf +95 -0
  61. novelwriter/assets/themes/paragon.conf +96 -0
  62. novelwriter/assets/themes/primer_light.conf +97 -0
  63. novelwriter/assets/themes/primer_night.conf +97 -0
  64. novelwriter/assets/themes/rose_pine.conf +97 -0
  65. novelwriter/assets/themes/rose_pine_dawn.conf +97 -0
  66. novelwriter/assets/themes/ruby_day.conf +95 -0
  67. novelwriter/assets/themes/ruby_night.conf +95 -0
  68. novelwriter/assets/themes/selenium_dark.conf +95 -0
  69. novelwriter/assets/themes/selenium_light.conf +95 -0
  70. novelwriter/assets/themes/sepia_dark.conf +95 -0
  71. novelwriter/assets/themes/sepia_light.conf +95 -0
  72. novelwriter/assets/themes/snazzy.conf +102 -40
  73. novelwriter/assets/themes/solarized_dark.conf +108 -40
  74. novelwriter/assets/themes/solarized_light.conf +108 -40
  75. novelwriter/assets/themes/sultana_light.conf +95 -0
  76. novelwriter/assets/themes/sultana_night.conf +95 -0
  77. novelwriter/assets/themes/tango_dark.conf +111 -0
  78. novelwriter/assets/themes/tango_light.conf +111 -0
  79. novelwriter/assets/themes/tomorrow.conf +117 -0
  80. novelwriter/assets/themes/tomorrow_night.conf +117 -0
  81. novelwriter/assets/themes/tomorrow_night_blue.conf +117 -0
  82. novelwriter/assets/themes/tomorrow_night_bright.conf +117 -0
  83. novelwriter/assets/themes/tomorrow_night_eighties.conf +117 -0
  84. novelwriter/assets/themes/vivid_black_green.conf +97 -0
  85. novelwriter/assets/themes/vivid_black_red.conf +97 -0
  86. novelwriter/assets/themes/vivid_white_green.conf +97 -0
  87. novelwriter/assets/themes/vivid_white_red.conf +97 -0
  88. novelwriter/assets/themes/warpgate.conf +96 -0
  89. novelwriter/assets/themes/waterlily_dark.conf +95 -0
  90. novelwriter/assets/themes/waterlily_light.conf +95 -0
  91. novelwriter/common.py +47 -17
  92. novelwriter/config.py +57 -62
  93. novelwriter/constants.py +32 -6
  94. novelwriter/core/buildsettings.py +3 -23
  95. novelwriter/core/coretools.py +21 -25
  96. novelwriter/core/docbuild.py +4 -9
  97. novelwriter/core/document.py +2 -6
  98. novelwriter/core/index.py +33 -53
  99. novelwriter/core/indexdata.py +17 -22
  100. novelwriter/core/item.py +11 -35
  101. novelwriter/core/itemmodel.py +5 -21
  102. novelwriter/core/novelmodel.py +3 -7
  103. novelwriter/core/options.py +3 -4
  104. novelwriter/core/project.py +31 -21
  105. novelwriter/core/projectdata.py +2 -21
  106. novelwriter/core/projectxml.py +13 -21
  107. novelwriter/core/sessions.py +2 -4
  108. novelwriter/core/spellcheck.py +12 -13
  109. novelwriter/core/status.py +27 -20
  110. novelwriter/core/storage.py +5 -10
  111. novelwriter/core/tree.py +6 -15
  112. novelwriter/dialogs/about.py +9 -10
  113. novelwriter/dialogs/docmerge.py +17 -14
  114. novelwriter/dialogs/docsplit.py +18 -14
  115. novelwriter/dialogs/editlabel.py +15 -9
  116. novelwriter/dialogs/preferences.py +69 -68
  117. novelwriter/dialogs/projectsettings.py +88 -67
  118. novelwriter/dialogs/quotes.py +15 -10
  119. novelwriter/dialogs/wordlist.py +18 -21
  120. novelwriter/enum.py +75 -30
  121. novelwriter/error.py +6 -11
  122. novelwriter/extensions/configlayout.py +8 -34
  123. novelwriter/extensions/eventfilters.py +3 -3
  124. novelwriter/extensions/modified.py +87 -32
  125. novelwriter/extensions/novelselector.py +13 -12
  126. novelwriter/extensions/pagedsidebar.py +10 -18
  127. novelwriter/extensions/progressbars.py +5 -11
  128. novelwriter/extensions/statusled.py +3 -6
  129. novelwriter/extensions/switch.py +8 -11
  130. novelwriter/extensions/switchbox.py +2 -11
  131. novelwriter/extensions/versioninfo.py +6 -7
  132. novelwriter/formats/shared.py +10 -2
  133. novelwriter/formats/todocx.py +15 -37
  134. novelwriter/formats/tohtml.py +52 -61
  135. novelwriter/formats/tokenizer.py +33 -64
  136. novelwriter/formats/tomarkdown.py +4 -11
  137. novelwriter/formats/toodt.py +12 -71
  138. novelwriter/formats/toqdoc.py +11 -21
  139. novelwriter/formats/toraw.py +2 -6
  140. novelwriter/gui/doceditor.py +160 -225
  141. novelwriter/gui/dochighlight.py +142 -101
  142. novelwriter/gui/docviewer.py +53 -84
  143. novelwriter/gui/docviewerpanel.py +18 -41
  144. novelwriter/gui/editordocument.py +12 -17
  145. novelwriter/gui/itemdetails.py +5 -14
  146. novelwriter/gui/mainmenu.py +24 -32
  147. novelwriter/gui/noveltree.py +13 -51
  148. novelwriter/gui/outline.py +20 -61
  149. novelwriter/gui/projtree.py +40 -96
  150. novelwriter/gui/search.py +9 -24
  151. novelwriter/gui/sidebar.py +54 -22
  152. novelwriter/gui/statusbar.py +7 -22
  153. novelwriter/gui/theme.py +482 -368
  154. novelwriter/guimain.py +87 -101
  155. novelwriter/shared.py +79 -48
  156. novelwriter/splash.py +9 -5
  157. novelwriter/text/comments.py +1 -1
  158. novelwriter/text/counting.py +9 -5
  159. novelwriter/text/patterns.py +20 -15
  160. novelwriter/tools/dictionaries.py +18 -16
  161. novelwriter/tools/lipsum.py +15 -17
  162. novelwriter/tools/manusbuild.py +25 -45
  163. novelwriter/tools/manuscript.py +94 -95
  164. novelwriter/tools/manussettings.py +149 -104
  165. novelwriter/tools/noveldetails.py +10 -24
  166. novelwriter/tools/welcome.py +24 -72
  167. novelwriter/tools/writingstats.py +17 -26
  168. novelwriter/types.py +23 -13
  169. {novelwriter-2.7.5.dist-info → novelwriter-2.8b1.dist-info}/METADATA +7 -7
  170. novelwriter-2.8b1.dist-info/RECORD +212 -0
  171. novelwriter/assets/images/welcome-dark.jpg +0 -0
  172. novelwriter/assets/images/welcome-light.jpg +0 -0
  173. novelwriter/assets/syntax/cyberpunk_night.conf +0 -28
  174. novelwriter/assets/syntax/default_dark.conf +0 -42
  175. novelwriter/assets/syntax/default_light.conf +0 -42
  176. novelwriter/assets/syntax/dracula.conf +0 -44
  177. novelwriter/assets/syntax/grey_dark.conf +0 -29
  178. novelwriter/assets/syntax/grey_light.conf +0 -29
  179. novelwriter/assets/syntax/light_owl.conf +0 -49
  180. novelwriter/assets/syntax/night_owl.conf +0 -49
  181. novelwriter/assets/syntax/snazzy.conf +0 -42
  182. novelwriter/assets/syntax/solarized_dark.conf +0 -29
  183. novelwriter/assets/syntax/solarized_light.conf +0 -29
  184. novelwriter/assets/syntax/tango.conf +0 -39
  185. novelwriter/assets/syntax/tomorrow.conf +0 -49
  186. novelwriter/assets/syntax/tomorrow_night.conf +0 -49
  187. novelwriter/assets/syntax/tomorrow_night_blue.conf +0 -49
  188. novelwriter/assets/syntax/tomorrow_night_bright.conf +0 -49
  189. novelwriter/assets/syntax/tomorrow_night_eighties.conf +0 -49
  190. novelwriter/assets/themes/default.conf +0 -3
  191. novelwriter-2.7.5.dist-info/RECORD +0 -163
  192. {novelwriter-2.7.5.dist-info → novelwriter-2.8b1.dist-info}/WHEEL +0 -0
  193. {novelwriter-2.7.5.dist-info → novelwriter-2.8b1.dist-info}/entry_points.txt +0 -0
  194. {novelwriter-2.7.5.dist-info → novelwriter-2.8b1.dist-info}/licenses/LICENSE.md +0 -0
  195. {novelwriter-2.7.5.dist-info → novelwriter-2.8b1.dist-info}/licenses/setup/LICENSE-Apache-2.0.txt +0 -0
  196. {novelwriter-2.7.5.dist-info → novelwriter-2.8b1.dist-info}/top_level.txt +0 -0
@@ -20,7 +20,7 @@ General Public License for more details.
20
20
 
21
21
  You should have received a copy of the GNU General Public License
22
22
  along with this program. If not, see <https://www.gnu.org/licenses/>.
23
- """
23
+ """ # noqa
24
24
  from __future__ import annotations
25
25
 
26
26
  import logging
@@ -40,6 +40,7 @@ from novelwriter import CONFIG, SHARED
40
40
  from novelwriter.common import describeFont, fontMatcher, qtAddAction, qtLambda
41
41
  from novelwriter.constants import nwHeadFmt, nwKeyWords, nwLabels, nwUnicode, trConst
42
42
  from novelwriter.core.buildsettings import BuildSettings, FilterMode
43
+ from novelwriter.enum import nwStandardButton
43
44
  from novelwriter.extensions.configlayout import (
44
45
  NColorLabel, NFixedPage, NScrollableForm, NScrollablePage
45
46
  )
@@ -50,9 +51,8 @@ from novelwriter.extensions.pagedsidebar import NPagedSideBar
50
51
  from novelwriter.extensions.switch import NSwitch
51
52
  from novelwriter.extensions.switchbox import NSwitchBox
52
53
  from novelwriter.types import (
53
- QtAlignCenter, QtAlignLeft, QtDialogApply, QtDialogClose, QtDialogSave,
54
- QtHeaderFixed, QtHeaderStretch, QtRoleAccept, QtRoleApply, QtRoleReject,
55
- QtUserRole
54
+ QtAlignCenter, QtAlignLeft, QtHeaderFixed, QtHeaderStretch, QtRoleAccept,
55
+ QtRoleApply, QtRoleDestruct, QtUserRole
56
56
  )
57
57
 
58
58
  if TYPE_CHECKING:
@@ -62,7 +62,7 @@ logger = logging.getLogger(__name__)
62
62
 
63
63
 
64
64
  class GuiBuildSettings(NToolDialog):
65
- """GUI Tools: Manuscript Build Settings Dialog
65
+ """GUI Tools: Manuscript Build Settings Dialog.
66
66
 
67
67
  The main tool for configuring manuscript builds. It's a GUI tool for
68
68
  editing JSON build definitions, wrapped as a BuildSettings object.
@@ -72,7 +72,7 @@ class GuiBuildSettings(NToolDialog):
72
72
  OPT_HEADINGS = 2
73
73
  OPT_FORMATTING = 10
74
74
 
75
- newSettingsReady = pyqtSignal(BuildSettings)
75
+ newSettingsReady = pyqtSignal(BuildSettings, bool)
76
76
 
77
77
  def __init__(self, parent: GuiMain, build: BuildSettings) -> None:
78
78
  super().__init__(parent=parent)
@@ -86,6 +86,7 @@ class GuiBuildSettings(NToolDialog):
86
86
  self.setWindowTitle(self.tr("Manuscript Build Settings"))
87
87
  self.setMinimumSize(700, 400)
88
88
 
89
+ iPx = SHARED.theme.baseIconHeight
89
90
  options = SHARED.project.options
90
91
  self.resize(
91
92
  options.getInt("GuiBuildSettings", "winWidth", 750),
@@ -124,9 +125,23 @@ class GuiBuildSettings(NToolDialog):
124
125
  self.toolStack.addWidget(self.optTabHeadings)
125
126
  self.toolStack.addWidget(self.optTabFormatting)
126
127
 
128
+ # Preview
129
+ self.swtAutoPreview = NSwitch(self, height=iPx)
130
+ self.swtAutoPreview.setChecked(options.getBool("GuiBuildSettings", "autoPreview", True))
131
+
132
+ self.lblAutoPreview = QLabel(self.tr("Auro-Update Preview"), self)
133
+ self.lblAutoPreview.setBuddy(self.swtAutoPreview)
134
+
127
135
  # Buttons
128
- self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose, self)
129
- self.buttonBox.clicked.connect(self._dialogButtonClicked)
136
+ self.btnApply = SHARED.theme.getStandardButton(nwStandardButton.APPLY, self)
137
+ self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self)
138
+ self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self)
139
+
140
+ self.btnBox = QDialogButtonBox(self)
141
+ self.btnBox.addButton(self.btnApply, QtRoleApply)
142
+ self.btnBox.addButton(self.btnSave, QtRoleAccept)
143
+ self.btnBox.addButton(self.btnClose, QtRoleDestruct)
144
+ self.btnBox.clicked.connect(self._dialogButtonClicked)
130
145
 
131
146
  # Assemble
132
147
  self.topBox = QHBoxLayout()
@@ -140,24 +155,29 @@ class GuiBuildSettings(NToolDialog):
140
155
  self.mainBox.addWidget(self.toolStack)
141
156
  self.mainBox.setContentsMargins(0, 0, 0, 0)
142
157
 
158
+ self.bottomBox = QHBoxLayout()
159
+ self.bottomBox.addWidget(self.lblAutoPreview, 0)
160
+ self.bottomBox.addWidget(self.swtAutoPreview, 0)
161
+ self.bottomBox.addSpacing(8)
162
+ self.bottomBox.addWidget(self.btnBox, 1)
163
+ self.bottomBox.setContentsMargins(0, 0, 0, 0)
164
+
143
165
  self.outerBox = QVBoxLayout()
144
166
  self.outerBox.addLayout(self.topBox)
145
167
  self.outerBox.addLayout(self.mainBox)
146
- self.outerBox.addWidget(self.buttonBox)
168
+ self.outerBox.addLayout(self.bottomBox)
147
169
  self.outerBox.setSpacing(12)
148
170
 
149
171
  self.setLayout(self.outerBox)
172
+ self.updateTheme(init=True)
150
173
 
151
174
  # Set Default Tab
152
175
  self.sidebar.setSelected(self.OPT_FILTERS)
153
176
 
154
177
  logger.debug("Ready: GuiBuildSettings")
155
178
 
156
- return
157
-
158
179
  def __del__(self) -> None: # pragma: no cover
159
180
  logger.debug("Delete: GuiBuildSettings")
160
- return
161
181
 
162
182
  def loadContent(self) -> None:
163
183
  """Populate the child widgets."""
@@ -165,7 +185,22 @@ class GuiBuildSettings(NToolDialog):
165
185
  self.optTabSelect.loadContent()
166
186
  self.optTabHeadings.loadContent()
167
187
  self.optTabFormatting.loadContent()
168
- return
188
+
189
+ def updateTheme(self, *, init: bool = False) -> None:
190
+ """Update theme elements."""
191
+ logger.debug("Theme Update: GuiBuildSettings, init=%s", init)
192
+
193
+ if not init:
194
+ self.btnApply.updateIcon()
195
+ self.btnSave.updateIcon()
196
+ self.btnClose.updateIcon()
197
+
198
+ self.optTabSelect.updateTheme()
199
+ self.optTabHeadings.updateTheme()
200
+ self.optTabFormatting.updateTheme()
201
+
202
+ self.titleLabel.setTextColors(color=SHARED.theme.helpText)
203
+ self.sidebar.setLabelColor(SHARED.theme.helpText)
169
204
 
170
205
  ##
171
206
  # Properties
@@ -190,7 +225,6 @@ class GuiBuildSettings(NToolDialog):
190
225
  self._saveSettings()
191
226
  event.accept()
192
227
  self.softDelete()
193
- return
194
228
 
195
229
  ##
196
230
  # Private Slots
@@ -206,23 +240,20 @@ class GuiBuildSettings(NToolDialog):
206
240
  elif pageId >= self.OPT_FORMATTING:
207
241
  self.toolStack.setCurrentWidget(self.optTabFormatting)
208
242
  self.optTabFormatting.scrollToSection(pageId)
209
- return
210
243
 
211
244
  @pyqtSlot("QAbstractButton*")
212
245
  def _dialogButtonClicked(self, button: QAbstractButton) -> None:
213
246
  """Handle button clicks from the dialog button box."""
214
- role = self.buttonBox.buttonRole(button)
215
- if role == QtRoleApply:
247
+ if button == self.btnApply:
216
248
  self._applyChanges()
217
249
  self._emitBuildData()
218
- elif role == QtRoleAccept:
250
+ elif button == self.btnSave:
219
251
  self._applyChanges()
220
252
  self._emitBuildData()
221
253
  self.close()
222
- elif role == QtRoleReject:
254
+ elif button == self.btnClose:
223
255
  self._build.resetChangedState()
224
256
  self.close()
225
- return
226
257
 
227
258
  ##
228
259
  # Internal Functions
@@ -238,32 +269,29 @@ class GuiBuildSettings(NToolDialog):
238
269
  ).format(self._build.name)):
239
270
  self._emitBuildData()
240
271
  self._build.resetChangedState()
241
- return
242
272
 
243
273
  def _saveSettings(self) -> None:
244
274
  """Save the various user settings."""
245
275
  treeWidth, filterWidth = self.optTabSelect.mainSplitSizes()
246
276
  logger.debug("Saving State: GuiBuildSettings")
247
- pOptions = SHARED.project.options
248
- pOptions.setValue("GuiBuildSettings", "winWidth", self.width())
249
- pOptions.setValue("GuiBuildSettings", "winHeight", self.height())
250
- pOptions.setValue("GuiBuildSettings", "treeWidth", treeWidth)
251
- pOptions.setValue("GuiBuildSettings", "filterWidth", filterWidth)
252
- pOptions.saveSettings()
253
- return
277
+ options = SHARED.project.options
278
+ options.setValue("GuiBuildSettings", "winWidth", self.width())
279
+ options.setValue("GuiBuildSettings", "winHeight", self.height())
280
+ options.setValue("GuiBuildSettings", "treeWidth", treeWidth)
281
+ options.setValue("GuiBuildSettings", "filterWidth", filterWidth)
282
+ options.setValue("GuiBuildSettings", "autoPreview", self.swtAutoPreview.isChecked())
283
+ options.saveSettings()
254
284
 
255
285
  def _applyChanges(self) -> None:
256
286
  """Apply all settings changes to the build object."""
257
287
  self._build.setName(self.editBuildName.text())
258
288
  self.optTabHeadings.saveContent()
259
289
  self.optTabFormatting.saveContent()
260
- return
261
290
 
262
291
  def _emitBuildData(self) -> None:
263
292
  """Assemble the build data and emit the signal."""
264
- self.newSettingsReady.emit(self._build)
293
+ self.newSettingsReady.emit(self._build, self.swtAutoPreview.isChecked())
265
294
  self._build.resetChangedState()
266
- return
267
295
 
268
296
 
269
297
  class _FilterTab(NFixedPage):
@@ -289,9 +317,9 @@ class _FilterTab(NFixedPage):
289
317
 
290
318
  self._statusFlags: dict[int, QIcon] = {
291
319
  self.F_NONE: QIcon(),
292
- self.F_FILTERED: SHARED.theme.getIcon("filter", "orange"),
293
- self.F_INCLUDED: SHARED.theme.getIcon("pin", "blue"),
294
- self.F_EXCLUDED: SHARED.theme.getIcon("exclude", "red"),
320
+ self.F_FILTERED: SHARED.theme.getIcon("filter", "altaction"),
321
+ self.F_INCLUDED: SHARED.theme.getIcon("pin", "action"),
322
+ self.F_EXCLUDED: SHARED.theme.getIcon("exclude", "reject"),
295
323
  }
296
324
 
297
325
  self._trIncluded = self.tr("Included in manuscript")
@@ -330,15 +358,13 @@ class _FilterTab(NFixedPage):
330
358
 
331
359
  self.includedButton = NIconToolButton(self, iSz)
332
360
  self.includedButton.setToolTip(self.tr("Always included"))
333
- self.includedButton.setIcon(self._statusFlags[self.F_INCLUDED])
334
361
  self.includedButton.clicked.connect(qtLambda(self._setSelectedMode, self.F_INCLUDED))
335
362
 
336
363
  self.excludedButton = NIconToolButton(self, iSz)
337
364
  self.excludedButton.setToolTip(self.tr("Always excluded"))
338
- self.excludedButton.setIcon(self._statusFlags[self.F_EXCLUDED])
339
365
  self.excludedButton.clicked.connect(qtLambda(self._setSelectedMode, self.F_EXCLUDED))
340
366
 
341
- self.resetButton = NIconToolButton(self, iSz, "revert", "green")
367
+ self.resetButton = NIconToolButton(self, iSz)
342
368
  self.resetButton.setToolTip(self.tr("Reset to default"))
343
369
  self.resetButton.clicked.connect(qtLambda(self._setSelectedMode, self.F_FILTERED))
344
370
 
@@ -380,15 +406,13 @@ class _FilterTab(NFixedPage):
380
406
  pOptions.getInt("GuiBuildSettings", "filterWidth", 300),
381
407
  ])
382
408
 
409
+ self.updateTheme(init=True)
383
410
  self.setCentralWidget(self.mainSplit)
384
411
 
385
- return
386
-
387
412
  def loadContent(self) -> None:
388
413
  """Populate the widgets."""
389
414
  self._populateTree()
390
415
  self._populateFilters()
391
- return
392
416
 
393
417
  def mainSplitSizes(self) -> tuple[int, int]:
394
418
  """Extract the sizes of the main splitter."""
@@ -396,6 +420,20 @@ class _FilterTab(NFixedPage):
396
420
  m, n = (sizes[0], sizes[1]) if len(sizes) >= 2 else (0, 0)
397
421
  return m, n
398
422
 
423
+ def updateTheme(self, *, init: bool = False) -> None:
424
+ """Update theme elements."""
425
+ logger.debug("Theme Update: _FilterTab, init=%s", init)
426
+
427
+ if not init:
428
+ self._statusFlags[self.F_FILTERED] = SHARED.theme.getIcon("filter", "altaction")
429
+ self._statusFlags[self.F_INCLUDED] = SHARED.theme.getIcon("pin", "action")
430
+ self._statusFlags[self.F_EXCLUDED] = SHARED.theme.getIcon("exclude", "reject")
431
+ self.loadContent()
432
+
433
+ self.includedButton.setIcon(self._statusFlags[self.F_INCLUDED])
434
+ self.excludedButton.setIcon(self._statusFlags[self.F_EXCLUDED])
435
+ self.resetButton.setThemeIcon("revert", "reset")
436
+
399
437
  ##
400
438
  # Slots
401
439
  ##
@@ -409,7 +447,6 @@ class _FilterTab(NFixedPage):
409
447
  elif key.startswith("root:"):
410
448
  self._build.setAllowRoot(key[5:], state)
411
449
  self._populateTree()
412
- return
413
450
 
414
451
  ##
415
452
  # Internal Functions
@@ -453,8 +490,6 @@ class _FilterTab(NFixedPage):
453
490
 
454
491
  self._setTreeItemMode()
455
492
 
456
- return
457
-
458
493
  def _populateFilters(self) -> None:
459
494
  """Populate the filter options switches."""
460
495
  self.filterOpt.clear()
@@ -472,7 +507,7 @@ class _FilterTab(NFixedPage):
472
507
  default=self._build.getBool("filter.includeNotes")
473
508
  )
474
509
  self.filterOpt.addItem(
475
- SHARED.theme.getIcon("unchecked", "red"),
510
+ SHARED.theme.getIcon("unchecked", "reject"),
476
511
  self._build.getLabel("filter.includeInactive"),
477
512
  "doc:filter.includeInactive",
478
513
  default=self._build.getBool("filter.includeInactive")
@@ -489,8 +524,6 @@ class _FilterTab(NFixedPage):
489
524
  default=self._build.isRootAllowed(tHandle)
490
525
  )
491
526
 
492
- return
493
-
494
527
  def _setSelectedMode(self, mode: int) -> None:
495
528
  """Set the mode for the selected items."""
496
529
  items = self.optTree.selectedItems()
@@ -511,8 +544,6 @@ class _FilterTab(NFixedPage):
511
544
 
512
545
  self._setTreeItemMode()
513
546
 
514
- return
515
-
516
547
  def _setTreeItemMode(self) -> None:
517
548
  """Update the filtered mode icon on all items."""
518
549
  filtered = self._build.buildItemFilter(SHARED.project)
@@ -529,11 +560,10 @@ class _FilterTab(NFixedPage):
529
560
  item.setToolTip(self.C_STATUS, self._trIncluded)
530
561
  else:
531
562
  item.setIcon(self.C_STATUS, self._statusFlags[self.F_NONE])
532
- return
533
563
 
534
564
  def _scanChildren(self, item: QTreeWidgetItem | None, items: list) -> list[QTreeWidgetItem]:
535
- """This is a recursive function returning all items in a tree
536
- starting at a given QTreeWidgetItem.
565
+ """Recursively return all items in a tree starting at a given
566
+ QTreeWidgetItem.
537
567
  """
538
568
  if isinstance(item, QTreeWidgetItem):
539
569
  items.append(item)
@@ -570,7 +600,7 @@ class _HeadingsTab(NScrollablePage):
570
600
  self.lblPart = QLabel(self._build.getLabel("headings.fmtPart"), self)
571
601
  self.fmtPart = QLineEdit("", self)
572
602
  self.fmtPart.setReadOnly(True)
573
- self.btnPart = NIconToolButton(self, iSz, "edit", "green")
603
+ self.btnPart = NIconToolButton(self, iSz)
574
604
  self.btnPart.clicked.connect(qtLambda(self._editHeading, self.EDIT_TITLE))
575
605
  self.swtPart = NSwitch(self, height=iPx)
576
606
  self.hdePart = QLabel(trHide, self)
@@ -587,7 +617,7 @@ class _HeadingsTab(NScrollablePage):
587
617
  self.lblChapter = QLabel(self._build.getLabel("headings.fmtChapter"), self)
588
618
  self.fmtChapter = QLineEdit("", self)
589
619
  self.fmtChapter.setReadOnly(True)
590
- self.btnChapter = NIconToolButton(self, iSz, "edit", "green")
620
+ self.btnChapter = NIconToolButton(self, iSz)
591
621
  self.btnChapter.clicked.connect(qtLambda(self._editHeading, self.EDIT_CHAPTER))
592
622
  self.swtChapter = NSwitch(self, height=iPx)
593
623
  self.hdeChapter = QLabel(trHide, self)
@@ -604,7 +634,7 @@ class _HeadingsTab(NScrollablePage):
604
634
  self.lblUnnumbered = QLabel(self._build.getLabel("headings.fmtUnnumbered"), self)
605
635
  self.fmtUnnumbered = QLineEdit("", self)
606
636
  self.fmtUnnumbered.setReadOnly(True)
607
- self.btnUnnumbered = NIconToolButton(self, iSz, "edit", "green")
637
+ self.btnUnnumbered = NIconToolButton(self, iSz)
608
638
  self.btnUnnumbered.clicked.connect(qtLambda(self._editHeading, self.EDIT_UNNUM))
609
639
  self.swtUnnumbered = NSwitch(self, height=iPx)
610
640
  self.hdeUnnumbered = QLabel(trHide, self)
@@ -621,7 +651,7 @@ class _HeadingsTab(NScrollablePage):
621
651
  self.lblScene = QLabel(self._build.getLabel("headings.fmtScene"), self)
622
652
  self.fmtScene = QLineEdit("", self)
623
653
  self.fmtScene.setReadOnly(True)
624
- self.btnScene = NIconToolButton(self, iSz, "edit", "green")
654
+ self.btnScene = NIconToolButton(self, iSz)
625
655
  self.btnScene.clicked.connect(qtLambda(self._editHeading, self.EDIT_SCENE))
626
656
  self.swtScene = NSwitch(self, height=iPx)
627
657
  self.hdeScene = QLabel(trHide, self)
@@ -638,7 +668,7 @@ class _HeadingsTab(NScrollablePage):
638
668
  self.lblAScene = QLabel(self._build.getLabel("headings.fmtAltScene"), self)
639
669
  self.fmtAScene = QLineEdit("", self)
640
670
  self.fmtAScene.setReadOnly(True)
641
- self.btnAScene = NIconToolButton(self, iSz, "edit", "green")
671
+ self.btnAScene = NIconToolButton(self, iSz)
642
672
  self.btnAScene.clicked.connect(qtLambda(self._editHeading, self.EDIT_HSCENE))
643
673
  self.swtAScene = NSwitch(self, height=iPx)
644
674
  self.hdeAScene = QLabel(trHide, self)
@@ -655,7 +685,7 @@ class _HeadingsTab(NScrollablePage):
655
685
  self.lblSection = QLabel(self._build.getLabel("headings.fmtSection"), self)
656
686
  self.fmtSection = QLineEdit("", self)
657
687
  self.fmtSection.setReadOnly(True)
658
- self.btnSection = NIconToolButton(self, iSz, "edit", "green")
688
+ self.btnSection = NIconToolButton(self, iSz)
659
689
  self.btnSection.clicked.connect(qtLambda(self._editHeading, self.EDIT_SECTION))
660
690
  self.swtSection = NSwitch(self, height=iPx)
661
691
  self.hdeSection = QLabel(trHide, self)
@@ -789,9 +819,22 @@ class _HeadingsTab(NScrollablePage):
789
819
  self.outerBox.addLayout(self.layoutMatrix)
790
820
  self.outerBox.addStretch(1)
791
821
 
822
+ self.updateTheme()
792
823
  self.setCentralLayout(self.outerBox)
793
824
 
794
- return
825
+ def updateTheme(self) -> None:
826
+ """Update theme elements."""
827
+ logger.debug("Theme Update: _HeadingsTab")
828
+
829
+ self.btnPart.setThemeIcon("edit", "change")
830
+ self.btnChapter.setThemeIcon("edit", "change")
831
+ self.btnUnnumbered.setThemeIcon("edit", "change")
832
+ self.btnScene.setThemeIcon("edit", "change")
833
+ self.btnAScene.setThemeIcon("edit", "change")
834
+ self.btnSection.setThemeIcon("edit", "change")
835
+
836
+ self.formSyntax.initHighlighter()
837
+ self.formSyntax.rehighlight()
795
838
 
796
839
  def loadContent(self) -> None:
797
840
  """Populate the widgets."""
@@ -821,7 +864,6 @@ class _HeadingsTab(NScrollablePage):
821
864
  self.breakPart.setChecked(self._build.getBool("headings.breakPart"))
822
865
  self.breakChapter.setChecked(self._build.getBool("headings.breakChapter"))
823
866
  self.breakScene.setChecked(self._build.getBool("headings.breakScene"))
824
- return
825
867
 
826
868
  def saveContent(self) -> None:
827
869
  """Save choices back into build object."""
@@ -841,7 +883,6 @@ class _HeadingsTab(NScrollablePage):
841
883
  self._build.setValue("headings.breakPart", self.breakPart.isChecked())
842
884
  self._build.setValue("headings.breakChapter", self.breakChapter.isChecked())
843
885
  self._build.setValue("headings.breakScene", self.breakScene.isChecked())
844
- return
845
886
 
846
887
  ##
847
888
  # Internal Functions
@@ -853,7 +894,6 @@ class _HeadingsTab(NScrollablePage):
853
894
  cursor = self.editTextBox.textCursor()
854
895
  cursor.insertText(text)
855
896
  self.editTextBox.setFocus()
856
- return
857
897
 
858
898
  def _editHeading(self, heading: int) -> None:
859
899
  """Populate the form with a specific heading format."""
@@ -886,8 +926,6 @@ class _HeadingsTab(NScrollablePage):
886
926
  self.editTextBox.setPlainText(text.replace(nwUnicode.U_LBREAK, "\n"))
887
927
  self.lblEditForm.setText(self.tr("Editing: {0}").format(label))
888
928
 
889
- return
890
-
891
929
  ##
892
930
  # Private Slots
893
931
  ##
@@ -929,12 +967,15 @@ class _HeadingSyntaxHighlighter(QSyntaxHighlighter):
929
967
 
930
968
  def __init__(self, document: QTextDocument | None) -> None:
931
969
  super().__init__(document)
932
- syntax = SHARED.theme.syntaxTheme
933
970
  self._fmtSymbol = QTextCharFormat()
934
- self._fmtSymbol.setForeground(syntax.head)
935
971
  self._fmtFormat = QTextCharFormat()
972
+ self.initHighlighter()
973
+
974
+ def initHighlighter(self) -> None:
975
+ """Update theme elements."""
976
+ syntax = SHARED.theme.syntaxTheme
977
+ self._fmtSymbol.setForeground(syntax.head)
936
978
  self._fmtFormat.setForeground(syntax.emph)
937
- return
938
979
 
939
980
  def highlightBlock(self, text: str) -> None:
940
981
  """Add syntax highlighting to the text block."""
@@ -947,7 +988,6 @@ class _HeadingSyntaxHighlighter(QSyntaxHighlighter):
947
988
  ddots = heading.find(":")
948
989
  if ddots > 0:
949
990
  self.setFormat(pos + ddots, 1, self._fmtSymbol)
950
- return
951
991
 
952
992
 
953
993
  class _FormattingTab(NScrollableForm):
@@ -960,8 +1000,7 @@ class _FormattingTab(NScrollableForm):
960
1000
 
961
1001
  self.setHelpTextStyle(SHARED.theme.helpText)
962
1002
  self.buildForm()
963
-
964
- return
1003
+ self.updateTheme()
965
1004
 
966
1005
  def buildForm(self) -> None:
967
1006
  """Build the formatting form."""
@@ -1005,7 +1044,7 @@ class _FormattingTab(NScrollableForm):
1005
1044
  lambda keyword=keyword: self._updateIgnoredKeywords(keyword)
1006
1045
  )
1007
1046
 
1008
- self.ignoredKeywordsButton = NIconToolButton(self, iSz, "add", "green")
1047
+ self.ignoredKeywordsButton = NIconToolButton(self, iSz)
1009
1048
  self.ignoredKeywordsButton.setMenu(self.mnKeywords)
1010
1049
  self.addRow(
1011
1050
  self._build.getLabel("text.ignoredKeywords"), self.ignoredKeywords,
@@ -1027,7 +1066,7 @@ class _FormattingTab(NScrollableForm):
1027
1066
  # Text Font
1028
1067
  self.textFont = QLineEdit(self)
1029
1068
  self.textFont.setReadOnly(True)
1030
- self.btnTextFont = NIconToolButton(self, iSz, "font")
1069
+ self.btnTextFont = NIconToolButton(self, iSz)
1031
1070
  self.btnTextFont.clicked.connect(self._selectFont)
1032
1071
  self.addRow(
1033
1072
  self._build.getLabel("format.textFont"), self.textFont,
@@ -1086,12 +1125,12 @@ class _FormattingTab(NScrollableForm):
1086
1125
  self._sidebar.addButton(title, section)
1087
1126
  self.addGroupLabel(title, section)
1088
1127
 
1089
- pixT = SHARED.theme.getPixmap("margin_top", (iPx, iPx))
1090
- pixB = SHARED.theme.getPixmap("margin_bottom", (iPx, iPx))
1091
- pixL = SHARED.theme.getPixmap("margin_left", (iPx, iPx))
1092
- pixR = SHARED.theme.getPixmap("margin_right", (iPx, iPx))
1093
- pixH = SHARED.theme.getPixmap("fit_height", (iPx, iPx))
1094
- pixW = SHARED.theme.getPixmap("fit_width", (iPx, iPx))
1128
+ self.pixT = QLabel(self)
1129
+ self.pixB = QLabel(self)
1130
+ self.pixL = QLabel(self)
1131
+ self.pixR = QLabel(self)
1132
+ self.pixH = QLabel(self)
1133
+ self.pixW = QLabel(self)
1095
1134
 
1096
1135
  # Title
1097
1136
  self.titleMarginT = NDoubleSpinBox(self)
@@ -1102,7 +1141,7 @@ class _FormattingTab(NScrollableForm):
1102
1141
 
1103
1142
  self.addRow(
1104
1143
  self._build.getLabel("format.titleMargin"),
1105
- [pixT, self.titleMarginT, 6, pixB, self.titleMarginB],
1144
+ [self.pixT, self.titleMarginT, 6, self.pixB, self.titleMarginB],
1106
1145
  unit="em",
1107
1146
  )
1108
1147
 
@@ -1115,7 +1154,7 @@ class _FormattingTab(NScrollableForm):
1115
1154
 
1116
1155
  self.addRow(
1117
1156
  self._build.getLabel("format.h1Margin"),
1118
- [pixT, self.h1MarginT, 6, pixB, self.h1MarginB],
1157
+ [self.pixT, self.h1MarginT, 6, self.pixB, self.h1MarginB],
1119
1158
  unit="em",
1120
1159
  )
1121
1160
 
@@ -1128,7 +1167,7 @@ class _FormattingTab(NScrollableForm):
1128
1167
 
1129
1168
  self.addRow(
1130
1169
  self._build.getLabel("format.h2Margin"),
1131
- [pixT, self.h2MarginT, 6, pixB, self.h2MarginB],
1170
+ [self.pixT, self.h2MarginT, 6, self.pixB, self.h2MarginB],
1132
1171
  unit="em",
1133
1172
  )
1134
1173
 
@@ -1141,7 +1180,7 @@ class _FormattingTab(NScrollableForm):
1141
1180
 
1142
1181
  self.addRow(
1143
1182
  self._build.getLabel("format.h3Margin"),
1144
- [pixT, self.h3MarginT, 6, pixB, self.h3MarginB],
1183
+ [self.pixT, self.h3MarginT, 6, self.pixB, self.h3MarginB],
1145
1184
  unit="em",
1146
1185
  )
1147
1186
 
@@ -1154,7 +1193,7 @@ class _FormattingTab(NScrollableForm):
1154
1193
 
1155
1194
  self.addRow(
1156
1195
  self._build.getLabel("format.h4Margin"),
1157
- [pixT, self.h4MarginT, 6, pixB, self.h4MarginB],
1196
+ [self.pixT, self.h4MarginT, 6, self.pixB, self.h4MarginB],
1158
1197
  unit="em",
1159
1198
  )
1160
1199
 
@@ -1167,7 +1206,7 @@ class _FormattingTab(NScrollableForm):
1167
1206
 
1168
1207
  self.addRow(
1169
1208
  self._build.getLabel("format.textMargin"),
1170
- [pixT, self.textMarginT, 6, pixB, self.textMarginB],
1209
+ [self.pixT, self.textMarginT, 6, self.pixB, self.textMarginB],
1171
1210
  unit="em",
1172
1211
  )
1173
1212
 
@@ -1180,7 +1219,7 @@ class _FormattingTab(NScrollableForm):
1180
1219
 
1181
1220
  self.addRow(
1182
1221
  self._build.getLabel("format.sepMargin"),
1183
- [pixT, self.sepMarginT, 6, pixB, self.sepMarginB],
1222
+ [self.pixT, self.sepMarginT, 6, self.pixB, self.sepMarginB],
1184
1223
  unit="em",
1185
1224
  )
1186
1225
 
@@ -1214,7 +1253,7 @@ class _FormattingTab(NScrollableForm):
1214
1253
 
1215
1254
  self.addRow(
1216
1255
  self._build.getLabel("format.pageSize"),
1217
- [self.pageSize, 6, pixW, self.pageWidth, 6, pixH, self.pageHeight],
1256
+ [self.pageSize, 6, self.pixW, self.pageWidth, 6, self.pixH, self.pageHeight],
1218
1257
  )
1219
1258
 
1220
1259
  # Page Margins
@@ -1232,11 +1271,11 @@ class _FormattingTab(NScrollableForm):
1232
1271
 
1233
1272
  self.addRow(
1234
1273
  self._build.getLabel("format.pageMargins"),
1235
- [pixT, self.topMargin, 6, pixB, self.bottomMargin],
1274
+ [self.pixT, self.topMargin, 6, self.pixB, self.bottomMargin],
1236
1275
  )
1237
1276
  self.addRow(
1238
1277
  "",
1239
- [pixL, self.leftMargin, 6, pixR, self.rightMargin],
1278
+ [self.pixL, self.leftMargin, 6, self.pixR, self.rightMargin],
1240
1279
  )
1241
1280
 
1242
1281
  # Open Document
@@ -1250,7 +1289,7 @@ class _FormattingTab(NScrollableForm):
1250
1289
  # Header
1251
1290
  self.odtPageHeader = QLineEdit(self)
1252
1291
  self.odtPageHeader.setMinimumWidth(200)
1253
- self.btnPageHeader = NIconToolButton(self, iSz, "revert", "green")
1292
+ self.btnPageHeader = NIconToolButton(self, iSz)
1254
1293
  self.btnPageHeader.clicked.connect(self._resetPageHeader)
1255
1294
  self.addRow(
1256
1295
  self._build.getLabel("doc.pageHeader"), self.odtPageHeader,
@@ -1290,7 +1329,24 @@ class _FormattingTab(NScrollableForm):
1290
1329
  # Finalise
1291
1330
  self.finalise()
1292
1331
 
1293
- return
1332
+ def updateTheme(self) -> None:
1333
+ """Update theme elements."""
1334
+ logger.debug("Theme Update: _FormattingTab")
1335
+
1336
+ self.ignoredKeywordsButton.setThemeIcon("add", "add")
1337
+ self.btnTextFont.setThemeIcon("font", "tool")
1338
+ self.btnPageHeader.setThemeIcon("revert", "reset")
1339
+
1340
+ iPx = SHARED.theme.baseIconHeight
1341
+ self.pixT.setPixmap(SHARED.theme.getPixmap("margin_top", (iPx, iPx)))
1342
+ self.pixB.setPixmap(SHARED.theme.getPixmap("margin_bottom", (iPx, iPx)))
1343
+ self.pixL.setPixmap(SHARED.theme.getPixmap("margin_left", (iPx, iPx)))
1344
+ self.pixR.setPixmap(SHARED.theme.getPixmap("margin_right", (iPx, iPx)))
1345
+ self.pixH.setPixmap(SHARED.theme.getPixmap("fit_height", (iPx, iPx)))
1346
+ self.pixW.setPixmap(SHARED.theme.getPixmap("fit_width", (iPx, iPx)))
1347
+
1348
+ self.pageSize.updateStyle()
1349
+ self.pageUnit.updateStyle()
1294
1350
 
1295
1351
  def loadContent(self) -> None:
1296
1352
  """Populate the widgets."""
@@ -1391,8 +1447,6 @@ class _FormattingTab(NScrollableForm):
1391
1447
  self.htmlAddStyles.setChecked(self._build.getBool("html.addStyles"))
1392
1448
  self.htmlPreserveTabs.setChecked(self._build.getBool("html.preserveTabs"))
1393
1449
 
1394
- return
1395
-
1396
1450
  def saveContent(self) -> None:
1397
1451
  """Save choices back into build object."""
1398
1452
  # Text Content
@@ -1458,8 +1512,6 @@ class _FormattingTab(NScrollableForm):
1458
1512
  self._build.setValue("html.addStyles", self.htmlAddStyles.isChecked())
1459
1513
  self._build.setValue("html.preserveTabs", self.htmlPreserveTabs.isChecked())
1460
1514
 
1461
- return
1462
-
1463
1515
  ##
1464
1516
  # Private Slots
1465
1517
  ##
@@ -1472,11 +1524,10 @@ class _FormattingTab(NScrollableForm):
1472
1524
  self._textFont = fontMatcher(font)
1473
1525
  self.textFont.setText(describeFont(self._textFont))
1474
1526
  self.textFont.setCursorPosition(0)
1475
- return
1476
1527
 
1477
1528
  @pyqtSlot(int)
1478
1529
  def _changeUnit(self, index: int) -> None:
1479
- """The current unit change, so recalculate sizes."""
1530
+ """Process current unit change to recalculate sizes."""
1480
1531
  newUnit = self.pageUnit.itemData(index)
1481
1532
  newScale = nwLabels.UNIT_SCALE.get(newUnit, 1.0)
1482
1533
  reScale = self._unitScale/newScale
@@ -1531,11 +1582,9 @@ class _FormattingTab(NScrollableForm):
1531
1582
  self._unitScale = newScale
1532
1583
  self._changePageSize(self.pageSize.currentIndex())
1533
1584
 
1534
- return
1535
-
1536
1585
  @pyqtSlot(int)
1537
1586
  def _changePageSize(self, index: int) -> None:
1538
- """The page size has changed."""
1587
+ """Process page size change."""
1539
1588
  w, h = nwLabels.PAPER_SIZE[self.pageSize.itemData(index)] if index >= 0 else (-1.0, -1.0)
1540
1589
  if w > 0.0 and h > 0.0:
1541
1590
  self.pageWidth.blockSignals(True)
@@ -1544,23 +1593,20 @@ class _FormattingTab(NScrollableForm):
1544
1593
  self.pageHeight.blockSignals(True)
1545
1594
  self.pageHeight.setValue(h/self._unitScale)
1546
1595
  self.pageHeight.blockSignals(False)
1547
- return
1548
1596
 
1549
1597
  @pyqtSlot()
1550
1598
  def _pageSizeValueChanged(self) -> None:
1551
- """The user has changed the page size spin boxes, so we flip
1552
- the page size box to Custom.
1599
+ """Process that the user has changed the page size spin boxes,
1600
+ so we flip the page size box to Custom.
1553
1601
  """
1554
1602
  index = self.pageSize.findData("Custom")
1555
1603
  if index >= 0:
1556
1604
  self.pageSize.setCurrentIndex(index)
1557
- return
1558
1605
 
1559
1606
  def _resetPageHeader(self) -> None:
1560
1607
  """Reset the ODT header format to default."""
1561
1608
  self.odtPageHeader.setText(nwHeadFmt.DOC_AUTO)
1562
1609
  self.odtPageHeader.setCursorPosition(0)
1563
- return
1564
1610
 
1565
1611
  ##
1566
1612
  # Internal Functions
@@ -1573,4 +1619,3 @@ class _FormattingTab(NScrollableForm):
1573
1619
  current.append(keyword)
1574
1620
  verified = set(x for x in current if x in nwKeyWords.VALID_KEYS)
1575
1621
  self.ignoredKeywords.setText(", ".join(verified))
1576
- return