novelWriter 2.7.4__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 +207 -245
  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 +25 -13
  169. {novelwriter-2.7.4.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.4.dist-info/RECORD +0 -163
  192. {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/WHEEL +0 -0
  193. {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/entry_points.txt +0 -0
  194. {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/licenses/LICENSE.md +0 -0
  195. {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/licenses/setup/LICENSE-Apache-2.0.txt +0 -0
  196. {novelwriter-2.7.4.dist-info → novelwriter-2.8b1.dist-info}/top_level.txt +0 -0
@@ -24,7 +24,7 @@ General Public License for more details.
24
24
 
25
25
  You should have received a copy of the GNU General Public License
26
26
  along with this program. If not, see <https://www.gnu.org/licenses/>.
27
- """
27
+ """ # noqa
28
28
  from __future__ import annotations
29
29
 
30
30
  import csv
@@ -58,6 +58,7 @@ logger = logging.getLogger(__name__)
58
58
 
59
59
 
60
60
  class GuiOutlineView(QWidget):
61
+ """GUI: Project Outline Panel."""
61
62
 
62
63
  loadDocumentTagRequest = pyqtSignal(str, Enum)
63
64
  openDocumentRequest = pyqtSignal(str, Enum, str, bool)
@@ -96,37 +97,33 @@ class GuiOutlineView(QWidget):
96
97
  # Function Mappings
97
98
  self.getSelectedHandle = self.outlineTree.getSelectedHandle
98
99
 
99
- return
100
-
101
100
  ##
102
101
  # Methods
103
102
  ##
104
103
 
105
104
  def updateTheme(self) -> None:
106
105
  """Update theme elements."""
106
+ logger.debug("Theme Update: GuiOutlineView")
107
+
107
108
  self.outlineBar.updateTheme()
108
109
  self.outlineTree.updateTheme()
109
110
  self.outlineTree.refreshTree(
110
111
  rootHandle=SHARED.project.data.getLastHandle("outline"), overRide=True
111
112
  )
112
- return
113
113
 
114
114
  def initSettings(self) -> None:
115
115
  """Initialise GUI elements that depend on specific settings."""
116
116
  self.outlineTree.initSettings()
117
117
  self.outlineData.initSettings()
118
- return
119
118
 
120
119
  def refreshTree(self) -> None:
121
120
  """Refresh the current tree."""
122
121
  self.outlineTree.refreshTree(rootHandle=SHARED.project.data.getLastHandle("outline"))
123
- return
124
122
 
125
123
  def clearOutline(self) -> None:
126
124
  """Clear project-related GUI content."""
127
125
  self.outlineData.clearDetails()
128
126
  self.outlineBar.setEnabled(False)
129
- return
130
127
 
131
128
  def openProjectTasks(self) -> None:
132
129
  """Run open project tasks."""
@@ -142,8 +139,6 @@ class GuiOutlineView(QWidget):
142
139
  self.outlineBar.setEnabled(True)
143
140
  self.outlineData.loadGuiSettings()
144
141
 
145
- return
146
-
147
142
  def closeProjectTasks(self) -> None:
148
143
  """Run closing project tasks."""
149
144
  if self.outlineTree.wasRendered:
@@ -152,7 +147,6 @@ class GuiOutlineView(QWidget):
152
147
  self.outlineTree.closeProjectTasks()
153
148
  self.outlineData.updateClasses()
154
149
  self.clearOutline()
155
- return
156
150
 
157
151
  def splitSizes(self) -> list[int]:
158
152
  """Get the sizes of the splitter widget."""
@@ -175,7 +169,6 @@ class GuiOutlineView(QWidget):
175
169
  """Handle tasks whenever a root folders changes."""
176
170
  self.outlineBar.populateNovelList()
177
171
  self.outlineData.updateClasses()
178
- return
179
172
 
180
173
  ##
181
174
  # Private Slots
@@ -188,23 +181,21 @@ class GuiOutlineView(QWidget):
188
181
  of columns has changed.
189
182
  """
190
183
  self.outlineBar.setColumnHiddenState(self.outlineTree.hiddenColumns)
191
- return
192
184
 
193
185
  @pyqtSlot(str)
194
186
  def _tagClicked(self, link: str) -> None:
195
187
  """Capture the click of a tag in the details panel."""
196
188
  if link:
197
189
  self.loadDocumentTagRequest.emit(link, nwDocMode.VIEW)
198
- return
199
190
 
200
191
  @pyqtSlot(str)
201
192
  def _rootItemChanged(self, tHandle: str) -> None:
202
193
  """Handle root novel changed or needs to be refreshed."""
203
194
  self.outlineTree.refreshTree(rootHandle=(tHandle or None), overRide=True)
204
- return
205
195
 
206
196
 
207
197
  class GuiOutlineToolBar(QToolBar):
198
+ """GUI: Project Outline Panel ToolBar."""
208
199
 
209
200
  loadNovelRootRequest = pyqtSignal(str)
210
201
  outlineExportRequest = pyqtSignal()
@@ -263,37 +254,33 @@ class GuiOutlineToolBar(QToolBar):
263
254
 
264
255
  logger.debug("Ready: GuiOutlineToolBar")
265
256
 
266
- return
267
-
268
257
  ##
269
258
  # Methods
270
259
  ##
271
260
 
272
261
  def updateTheme(self) -> None:
273
262
  """Update theme elements."""
263
+ logger.debug("Theme Update: GuiOutlineToolBar")
264
+
274
265
  self.setStyleSheet("QToolBar {border: 0px;}")
275
266
  self.novelValue.refreshNovelList()
276
- self.aRefresh.setIcon(SHARED.theme.getIcon("refresh", "green"))
277
- self.aExport.setIcon(SHARED.theme.getIcon("export", "blue"))
278
- self.tbColumns.setIcon(SHARED.theme.getIcon("more_vertical"))
267
+ self.aRefresh.setIcon(SHARED.theme.getIcon("refresh", "change"))
268
+ self.aExport.setIcon(SHARED.theme.getIcon("export", "action"))
269
+ self.tbColumns.setIcon(SHARED.theme.getIcon("more_vertical", "default"))
279
270
  self.tbColumns.setStyleSheet("QToolButton::menu-indicator {image: none;}")
280
271
  self.novelLabel.setTextColors(color=self.palette().windowText().color())
281
- return
282
272
 
283
273
  def populateNovelList(self) -> None:
284
274
  """Reload the content of the novel list."""
285
275
  self.novelValue.refreshNovelList()
286
- return
287
276
 
288
277
  def setCurrentRoot(self, rootHandle: str | None) -> None:
289
278
  """Set the current active root handle."""
290
279
  self.novelValue.setHandle(rootHandle)
291
- return
292
280
 
293
281
  def setColumnHiddenState(self, hiddenState: dict[nwOutline, bool]) -> None:
294
282
  """Forward the change of column hidden states to the menu."""
295
283
  self.mColumns.setHiddenState(hiddenState)
296
- return
297
284
 
298
285
  ##
299
286
  # Private Slots
@@ -303,22 +290,20 @@ class GuiOutlineToolBar(QToolBar):
303
290
  def _novelValueChanged(self, tHandle: str) -> None:
304
291
  """Emit a signal containing the handle of the selected item."""
305
292
  self.loadNovelRootRequest.emit(tHandle)
306
- return
307
293
 
308
294
  @pyqtSlot()
309
295
  def _refreshRequested(self) -> None:
310
296
  """Emit a signal containing the handle of the selected item."""
311
297
  self.loadNovelRootRequest.emit(self.novelValue.handle)
312
- return
313
298
 
314
299
  @pyqtSlot()
315
300
  def _exportRequested(self) -> None:
316
301
  """Emit a signal that an export of the outline was requested."""
317
302
  self.outlineExportRequest.emit()
318
- return
319
303
 
320
304
 
321
305
  class GuiOutlineTree(QTreeWidget):
306
+ """GUI: Project Outline Panel Tree."""
322
307
 
323
308
  DEF_WIDTH: Final[dict[nwOutline, int]] = {
324
309
  nwOutline.TITLE: 200,
@@ -422,8 +407,6 @@ class GuiOutlineTree(QTreeWidget):
422
407
 
423
408
  logger.debug("Ready: GuiOutlineTree")
424
409
 
425
- return
426
-
427
410
  ##
428
411
  # Properties
429
412
  ##
@@ -451,7 +434,6 @@ class GuiOutlineTree(QTreeWidget):
451
434
  self.setHorizontalScrollBarPolicy(QtScrollAlwaysOff)
452
435
  else:
453
436
  self.setHorizontalScrollBarPolicy(QtScrollAsNeeded)
454
- return
455
437
 
456
438
  def clearContent(self) -> None:
457
439
  """Clear the tree and header and set the default values for the
@@ -474,10 +456,10 @@ class GuiOutlineTree(QTreeWidget):
474
456
 
475
457
  self._treeNCols = len(self._treeOrder)
476
458
 
477
- return
478
-
479
459
  def updateTheme(self) -> None:
480
460
  """Update theme elements."""
461
+ logger.debug("Theme Update: GuiOutlineTree")
462
+
481
463
  iType = nwItemType.FILE
482
464
  iClass = nwItemClass.NO_CLASS
483
465
  iLayout = nwItemLayout.DOCUMENT
@@ -488,15 +470,14 @@ class GuiOutlineTree(QTreeWidget):
488
470
  "H3": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H3"),
489
471
  "H4": SHARED.theme.getItemIcon(iType, iClass, iLayout, "H4"),
490
472
  }
491
- return
492
473
 
493
474
  def refreshTree(
494
475
  self, rootHandle: str | None = None,
495
476
  overRide: bool = False, novelChanged: bool = False
496
477
  ) -> None:
497
- """Called whenever the Outline tab is activated and controls
498
- what data to load, and if necessary, force a rebuild of the
499
- tree.
478
+ """Refresh the outline tree. Called whenever the Outline tab is
479
+ activated and controls what data to load, and if necessary,
480
+ force a rebuild of the tree.
500
481
  """
501
482
  # If it's the first time, we always build
502
483
  if self._firstView or (self._firstView and overRide):
@@ -518,11 +499,10 @@ class GuiOutlineTree(QTreeWidget):
518
499
  return
519
500
 
520
501
  def closeProjectTasks(self) -> None:
521
- """Called before a project is closed."""
502
+ """Call before a project is closed."""
522
503
  self._saveHeaderState()
523
504
  self.clearContent()
524
505
  self._firstView = True
525
- return
526
506
 
527
507
  def getSelectedHandle(self) -> tuple[str | None, str | None]:
528
508
  """Get the currently selected handle. If multiple items are
@@ -546,7 +526,6 @@ class GuiOutlineTree(QTreeWidget):
546
526
  if hItem in self._colIdx:
547
527
  self.setColumnHidden(self._colIdx[hItem], not isChecked)
548
528
  self._saveHeaderState()
549
- return
550
529
 
551
530
  @pyqtSlot()
552
531
  def exportOutline(self) -> None:
@@ -562,7 +541,6 @@ class GuiOutlineTree(QTreeWidget):
562
541
  writer.writerows(
563
542
  self._dumpNovelData(self.outlineView.outlineBar.novelValue.handle)
564
543
  )
565
- return
566
544
 
567
545
  ##
568
546
  # Private Slots
@@ -577,7 +555,6 @@ class GuiOutlineTree(QTreeWidget):
577
555
  tHandle, sTitle = self.getSelectedHandle()
578
556
  if tHandle:
579
557
  self.outlineView.openDocumentRequest.emit(tHandle, nwDocMode.EDIT, sTitle or "", True)
580
- return
581
558
 
582
559
  @pyqtSlot()
583
560
  def _onItemSelectionChanged(self) -> None:
@@ -588,7 +565,6 @@ class GuiOutlineTree(QTreeWidget):
588
565
  tHandle = items[0].data(self._colIdx[nwOutline.TITLE], self.D_HANDLE)
589
566
  sTitle = items[0].data(self._colIdx[nwOutline.TITLE], self.D_TITLE)
590
567
  self.activeItemChanged.emit(tHandle, sTitle)
591
- return
592
568
 
593
569
  @pyqtSlot(int, int, int)
594
570
  def _columnMoved(self, logIdx: int, oldVisualIdx: int, newVisualIdx: int) -> None:
@@ -597,7 +573,6 @@ class GuiOutlineTree(QTreeWidget):
597
573
  """
598
574
  self._treeOrder.insert(newVisualIdx, self._treeOrder.pop(oldVisualIdx))
599
575
  self._saveHeaderState()
600
- return
601
576
 
602
577
  ##
603
578
  # Internal Functions
@@ -617,7 +592,7 @@ class GuiOutlineTree(QTreeWidget):
617
592
  try:
618
593
  for name, (hidden, width) in colState.items():
619
594
  if name not in nwOutline.__members__:
620
- logger.warning("Ignored unknown outline column '%s'", str(name))
595
+ logger.warning("Ignored unknown outline column '%s'", name)
621
596
  continue
622
597
  tmpOrder.append(nwOutline[name])
623
598
  tmpHidden[nwOutline[name]] = hidden
@@ -637,8 +612,6 @@ class GuiOutlineTree(QTreeWidget):
637
612
 
638
613
  self.hiddenStateChanged.emit()
639
614
 
640
- return
641
-
642
615
  def _saveHeaderState(self) -> None:
643
616
  """Save the state of the main tree header, that is, column
644
617
  order, column width and column hidden state. We don't want to
@@ -661,7 +634,6 @@ class GuiOutlineTree(QTreeWidget):
661
634
  pOptions = SHARED.project.options
662
635
  pOptions.setValue("GuiOutline", "columnState", colState)
663
636
  pOptions.saveSettings()
664
- return
665
637
 
666
638
  def _populateTree(self, rootHandle: str | None) -> None:
667
639
  """Build the tree based on the project index, and the header
@@ -746,8 +718,6 @@ class GuiOutlineTree(QTreeWidget):
746
718
  self._lastBuild = time()
747
719
  logger.debug("Project outline built in %.3f ms", 1000.0*(time() - tStart))
748
720
 
749
- return
750
-
751
721
  def _dumpNovelData(self, rootHandle: str | None) -> list[list[str | int]]:
752
722
  """Dump all novel data into a table."""
753
723
  sLabel = SHARED.project.localLookup("Story Structure")
@@ -821,6 +791,7 @@ class GuiOutlineTree(QTreeWidget):
821
791
 
822
792
 
823
793
  class GuiOutlineHeaderMenu(QMenu):
794
+ """GUI: Project Outline Panel Header Selection Menu."""
824
795
 
825
796
  columnToggled = pyqtSignal(bool, Enum)
826
797
 
@@ -844,8 +815,6 @@ class GuiOutlineHeaderMenu(QMenu):
844
815
  )
845
816
  self.addAction(self.actionMap[hItem])
846
817
 
847
- return
848
-
849
818
  def setHiddenState(self, hiddenState: dict[nwOutline, bool]) -> None:
850
819
  """Overwrite the checked state of the columns as the inverse of
851
820
  the hidden state. Skip the TITLE column as it cannot be hidden.
@@ -859,10 +828,9 @@ class GuiOutlineHeaderMenu(QMenu):
859
828
 
860
829
  self.acceptToggle = True
861
830
 
862
- return
863
-
864
831
 
865
832
  class GuiOutlineDetails(QScrollArea):
833
+ """GUI: Project Outline Panel Details View."""
866
834
 
867
835
  LVL_MAP: Final[dict[str, str]] = {
868
836
  "H1": QT_TRANSLATE_NOOP("GuiOutlineDetails", "Title"),
@@ -1007,8 +975,6 @@ class GuiOutlineDetails(QScrollArea):
1007
975
 
1008
976
  logger.debug("Ready: GuiOutlineDetails")
1009
977
 
1010
- return
1011
-
1012
978
  def initSettings(self) -> None:
1013
979
  """Set or update outline settings."""
1014
980
  if CONFIG.hideVScroll:
@@ -1020,7 +986,6 @@ class GuiOutlineDetails(QScrollArea):
1020
986
  else:
1021
987
  self.setHorizontalScrollBarPolicy(QtScrollAsNeeded)
1022
988
  self.updateClasses()
1023
- return
1024
989
 
1025
990
  def loadGuiSettings(self) -> None:
1026
991
  """Run open project tasks."""
@@ -1031,7 +996,6 @@ class GuiOutlineDetails(QScrollArea):
1031
996
  pOptions.getInt("GuiOutlineDetails", "detailsWidth", width//3),
1032
997
  pOptions.getInt("GuiOutlineDetails", "tagsWidth", 2*width//3),
1033
998
  ])
1034
- return
1035
999
 
1036
1000
  def saveGuiSettings(self) -> None:
1037
1001
  """Run close project tasks."""
@@ -1040,7 +1004,6 @@ class GuiOutlineDetails(QScrollArea):
1040
1004
  pOptions = SHARED.project.options
1041
1005
  pOptions.setValue("GuiOutlineDetails", "detailsWidth", mainSplit[0])
1042
1006
  pOptions.setValue("GuiOutlineDetails", "tagsWidth", mainSplit[1])
1043
- return
1044
1007
 
1045
1008
  def clearDetails(self) -> None:
1046
1009
  """Clear all the data labels."""
@@ -1057,7 +1020,6 @@ class GuiOutlineDetails(QScrollArea):
1057
1020
  value.clear()
1058
1021
 
1059
1022
  self.updateClasses()
1060
- return
1061
1023
 
1062
1024
  ##
1063
1025
  # Slots
@@ -1090,8 +1052,6 @@ class GuiOutlineDetails(QScrollArea):
1090
1052
  for key, (_, value) in self.tagValues.items():
1091
1053
  value.setText(self._formatTags(novRefs, key))
1092
1054
 
1093
- return
1094
-
1095
1055
  @pyqtSlot()
1096
1056
  def updateClasses(self) -> None:
1097
1057
  """Update the visibility status of class details."""
@@ -1102,7 +1062,6 @@ class GuiOutlineDetails(QScrollArea):
1102
1062
  label, value = self.tagValues[key]
1103
1063
  label.setVisible(visible)
1104
1064
  value.setVisible(visible)
1105
- return
1106
1065
 
1107
1066
  @staticmethod
1108
1067
  def _formatTags(refs: dict[str, list[str]], key: str) -> str: