novelWriter 2.1.1__py3-none-any.whl → 2.2rc1__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 (109) hide show
  1. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/METADATA +3 -3
  2. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/RECORD +105 -76
  3. novelwriter/__init__.py +6 -24
  4. novelwriter/assets/i18n/project_de_DE.json +10 -0
  5. novelwriter/assets/i18n/project_en_GB.json +11 -0
  6. novelwriter/assets/i18n/project_en_US.json +10 -0
  7. novelwriter/assets/i18n/project_ja_JP.json +11 -1
  8. novelwriter/assets/i18n/project_nb_NO.json +10 -0
  9. novelwriter/assets/i18n/project_nn_NO.json +10 -0
  10. novelwriter/assets/icons/novelwriter.ico +0 -0
  11. novelwriter/assets/icons/novelwriter.svg +8 -183
  12. novelwriter/assets/icons/typicons_dark/icons.conf +17 -2
  13. novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +4 -0
  14. novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +4 -0
  15. novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +4 -0
  16. novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +4 -0
  17. novelwriter/assets/icons/typicons_dark/nw_panel.svg +4 -0
  18. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +4 -0
  19. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +4 -0
  20. novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +8 -0
  21. novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +8 -0
  22. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +4 -0
  23. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +5 -0
  24. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +5 -0
  25. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +5 -0
  26. novelwriter/assets/icons/typicons_dark/typ_eye.svg +4 -0
  27. novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +4 -0
  28. novelwriter/assets/icons/typicons_light/icons.conf +17 -2
  29. novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +4 -0
  30. novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +4 -0
  31. novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +4 -0
  32. novelwriter/assets/icons/typicons_light/nw_deco-note.svg +4 -0
  33. novelwriter/assets/icons/typicons_light/nw_panel.svg +4 -0
  34. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +4 -0
  35. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +4 -0
  36. novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +8 -0
  37. novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +8 -0
  38. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +4 -0
  39. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +5 -0
  40. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +5 -0
  41. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +5 -0
  42. novelwriter/assets/icons/typicons_light/typ_eye.svg +4 -0
  43. novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +4 -0
  44. novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
  45. novelwriter/assets/icons/x-novelwriter-project.svg +7 -206
  46. novelwriter/assets/manual.pdf +0 -0
  47. novelwriter/assets/sample.zip +0 -0
  48. novelwriter/assets/syntax/default_dark.conf +1 -0
  49. novelwriter/assets/syntax/default_light.conf +1 -0
  50. novelwriter/assets/syntax/grey_dark.conf +1 -0
  51. novelwriter/assets/syntax/grey_light.conf +1 -0
  52. novelwriter/assets/syntax/light_owl.conf +1 -0
  53. novelwriter/assets/syntax/night_owl.conf +1 -0
  54. novelwriter/assets/syntax/solarized_dark.conf +1 -0
  55. novelwriter/assets/syntax/solarized_light.conf +1 -0
  56. novelwriter/assets/syntax/tomorrow.conf +1 -0
  57. novelwriter/assets/syntax/tomorrow_night.conf +1 -0
  58. novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
  59. novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
  60. novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
  61. novelwriter/assets/text/credits_en.htm +7 -0
  62. novelwriter/assets/text/release_notes.htm +7 -37
  63. novelwriter/common.py +22 -1
  64. novelwriter/config.py +27 -42
  65. novelwriter/constants.py +45 -7
  66. novelwriter/core/buildsettings.py +40 -24
  67. novelwriter/core/coretools.py +8 -1
  68. novelwriter/core/docbuild.py +2 -6
  69. novelwriter/core/index.py +264 -175
  70. novelwriter/core/options.py +8 -3
  71. novelwriter/core/project.py +2 -2
  72. novelwriter/core/projectdata.py +3 -3
  73. novelwriter/core/tohtml.py +60 -59
  74. novelwriter/core/tokenizer.py +110 -70
  75. novelwriter/core/tomd.py +51 -38
  76. novelwriter/core/toodt.py +184 -147
  77. novelwriter/dialogs/preferences.py +75 -106
  78. novelwriter/dialogs/projsettings.py +101 -110
  79. novelwriter/dialogs/updates.py +25 -14
  80. novelwriter/enum.py +28 -3
  81. novelwriter/extensions/novelselector.py +1 -1
  82. novelwriter/gui/doceditor.py +1345 -1235
  83. novelwriter/gui/dochighlight.py +98 -62
  84. novelwriter/gui/docviewer.py +151 -340
  85. novelwriter/gui/docviewerpanel.py +457 -0
  86. novelwriter/gui/editordocument.py +126 -0
  87. novelwriter/gui/mainmenu.py +350 -300
  88. novelwriter/gui/noveltree.py +101 -125
  89. novelwriter/gui/outline.py +154 -171
  90. novelwriter/gui/projtree.py +480 -380
  91. novelwriter/gui/sidebar.py +106 -75
  92. novelwriter/gui/statusbar.py +1 -1
  93. novelwriter/gui/theme.py +114 -75
  94. novelwriter/guimain.py +353 -254
  95. novelwriter/shared.py +36 -3
  96. novelwriter/tools/dictionaries.py +268 -0
  97. novelwriter/tools/manusbuild.py +17 -6
  98. novelwriter/tools/manuscript.py +11 -3
  99. novelwriter/tools/manussettings.py +0 -14
  100. novelwriter/tools/projwizard.py +16 -2
  101. novelwriter/tools/writingstats.py +1 -1
  102. novelwriter/assets/icons/typicons_dark/typ_at.svg +0 -4
  103. novelwriter/assets/icons/typicons_dark/typ_th-menu.svg +0 -4
  104. novelwriter/assets/icons/typicons_light/typ_at.svg +0 -4
  105. novelwriter/assets/icons/typicons_light/typ_th-menu.svg +0 -4
  106. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/LICENSE.md +0 -0
  107. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/WHEEL +0 -0
  108. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/entry_points.txt +0 -0
  109. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/top_level.txt +0 -0
@@ -27,15 +27,14 @@ import logging
27
27
 
28
28
  from typing import TYPE_CHECKING
29
29
  from pathlib import Path
30
- from urllib.parse import urljoin
31
- from urllib.request import pathname2url
32
30
 
33
- from PyQt5.QtCore import QUrl, pyqtSlot
34
31
  from PyQt5.QtGui import QDesktopServices
32
+ from PyQt5.QtCore import QUrl, pyqtSignal, pyqtSlot
35
33
  from PyQt5.QtWidgets import QMenuBar, QAction
36
34
 
37
35
  from novelwriter import CONFIG, SHARED
38
36
  from novelwriter.enum import nwDocAction, nwDocInsert, nwWidget
37
+ from novelwriter.common import openExternalPath
39
38
  from novelwriter.constants import nwConst, trConst, nwKeyWords, nwLabels, nwUnicode
40
39
 
41
40
  if TYPE_CHECKING: # pragma: no cover
@@ -50,6 +49,12 @@ class GuiMainMenu(QMenuBar):
50
49
  add them from this class.
51
50
  """
52
51
 
52
+ requestDocAction = pyqtSignal(nwDocAction)
53
+ requestDocInsert = pyqtSignal(nwDocInsert)
54
+ requestDocInsertText = pyqtSignal(str)
55
+ requestDocKeyWordInsert = pyqtSignal(str)
56
+ requestFocusChange = pyqtSignal(nwWidget)
57
+
53
58
  def __init__(self, mainGui: GuiMain) -> None:
54
59
  super().__init__(parent=mainGui)
55
60
 
@@ -68,20 +73,16 @@ class GuiMainMenu(QMenuBar):
68
73
  self._buildToolsMenu()
69
74
  self._buildHelpMenu()
70
75
 
71
- # Function Pointers
72
- self._docAction = self.mainGui.passDocumentAction
73
- self._docInsert = self.mainGui.docEditor.insertText
74
- self._insertKeyWord = self.mainGui.docEditor.insertKeyWord
75
-
76
76
  logger.debug("Ready: GuiMainMenu")
77
77
 
78
78
  return
79
79
 
80
80
  ##
81
- # Update Menu on Settings Changed
81
+ # Public Slots
82
82
  ##
83
83
 
84
- def setSpellCheck(self, state: bool) -> None:
84
+ @pyqtSlot(bool)
85
+ def setSpellCheckState(self, state: bool) -> None:
85
86
  """Forward spell check check state to its action."""
86
87
  self.aSpellCheck.setChecked(state)
87
88
  return
@@ -109,9 +110,7 @@ class GuiMainMenu(QMenuBar):
109
110
  def _openUserManualFile(self) -> None:
110
111
  """Open the documentation in PDF format."""
111
112
  if isinstance(CONFIG.pdfDocs, Path):
112
- QDesktopServices.openUrl(
113
- QUrl(urljoin("file:", pathname2url(str(CONFIG.pdfDocs))))
114
- )
113
+ openExternalPath(CONFIG.pdfDocs)
115
114
  return
116
115
 
117
116
  @pyqtSlot(str)
@@ -131,72 +130,62 @@ class GuiMainMenu(QMenuBar):
131
130
  self.projMenu = self.addMenu(self.tr("&Project"))
132
131
 
133
132
  # Project > New Project
134
- self.aNewProject = QAction(self.tr("New Project"), self)
133
+ self.aNewProject = self.projMenu.addAction(self.tr("New Project"))
135
134
  self.aNewProject.triggered.connect(lambda: self.mainGui.newProject(None))
136
- self.projMenu.addAction(self.aNewProject)
137
135
 
138
136
  # Project > Open Project
139
- self.aOpenProject = QAction(self.tr("Open Project"), self)
137
+ self.aOpenProject = self.projMenu.addAction(self.tr("Open Project"))
140
138
  self.aOpenProject.setShortcut("Ctrl+Shift+O")
141
139
  self.aOpenProject.triggered.connect(lambda: self.mainGui.showProjectLoadDialog())
142
- self.projMenu.addAction(self.aOpenProject)
143
140
 
144
141
  # Project > Save Project
145
- self.aSaveProject = QAction(self.tr("Save Project"), self)
142
+ self.aSaveProject = self.projMenu.addAction(self.tr("Save Project"))
146
143
  self.aSaveProject.setShortcut("Ctrl+Shift+S")
147
144
  self.aSaveProject.triggered.connect(lambda: self.mainGui.saveProject())
148
- self.projMenu.addAction(self.aSaveProject)
149
145
 
150
146
  # Project > Close Project
151
- self.aCloseProject = QAction(self.tr("Close Project"), self)
147
+ self.aCloseProject = self.projMenu.addAction(self.tr("Close Project"))
152
148
  self.aCloseProject.setShortcut("Ctrl+Shift+W")
153
149
  self.aCloseProject.triggered.connect(lambda: self.mainGui.closeProject(False))
154
- self.projMenu.addAction(self.aCloseProject)
155
150
 
156
151
  # Project > Separator
157
152
  self.projMenu.addSeparator()
158
153
 
159
154
  # Project > Project Settings
160
- self.aProjectSettings = QAction(self.tr("Project Settings"), self)
155
+ self.aProjectSettings = self.projMenu.addAction(self.tr("Project Settings"))
161
156
  self.aProjectSettings.setShortcut("Ctrl+Shift+,")
162
157
  self.aProjectSettings.triggered.connect(lambda: self.mainGui.showProjectSettingsDialog())
163
- self.projMenu.addAction(self.aProjectSettings)
164
158
 
165
159
  # Project > Project Details
166
- self.aProjectDetails = QAction(self.tr("Project Details"), self)
160
+ self.aProjectDetails = self.projMenu.addAction(self.tr("Project Details"))
167
161
  self.aProjectDetails.setShortcut("Shift+F6")
168
162
  self.aProjectDetails.triggered.connect(lambda: self.mainGui.showProjectDetailsDialog())
169
- self.projMenu.addAction(self.aProjectDetails)
170
163
 
171
164
  # Project > Separator
172
165
  self.projMenu.addSeparator()
173
166
 
174
167
  # Project > Edit
175
- self.aEditItem = QAction(self.tr("Rename Item"), self)
168
+ self.aEditItem = self.projMenu.addAction(self.tr("Rename Item"))
176
169
  self.aEditItem.setShortcut("F2")
177
170
  self.aEditItem.triggered.connect(lambda: self.mainGui.editItemLabel(None))
178
- self.projMenu.addAction(self.aEditItem)
179
171
 
180
172
  # Project > Delete
181
- self.aDeleteItem = QAction(self.tr("Delete Item"), self)
182
- self.aDeleteItem.setShortcut("Ctrl+Shift+Del")
173
+ self.aDeleteItem = self.projMenu.addAction(self.tr("Delete Item"))
174
+ self.aDeleteItem.setShortcut("Ctrl+Shift+Del") # Cannot be Ctrl+Del, see #629
183
175
  self.aDeleteItem.triggered.connect(lambda: self.mainGui.projView.requestDeleteItem(None))
184
- self.projMenu.addAction(self.aDeleteItem)
185
176
 
186
177
  # Project > Empty Trash
187
- self.aEmptyTrash = QAction(self.tr("Empty Trash"), self)
178
+ self.aEmptyTrash = self.projMenu.addAction(self.tr("Empty Trash"))
188
179
  self.aEmptyTrash.triggered.connect(lambda: self.mainGui.projView.emptyTrash())
189
- self.projMenu.addAction(self.aEmptyTrash)
190
180
 
191
181
  # Project > Separator
192
182
  self.projMenu.addSeparator()
193
183
 
194
184
  # Project > Exit
195
- self.aExitNW = QAction(self.tr("Exit"), self)
185
+ self.aExitNW = self.projMenu.addAction(self.tr("Exit"))
196
186
  self.aExitNW.setShortcut("Ctrl+Q")
197
187
  self.aExitNW.setMenuRole(QAction.QuitRole)
198
188
  self.aExitNW.triggered.connect(lambda: self.mainGui.closeMain())
199
- self.projMenu.addAction(self.aExitNW)
200
189
 
201
190
  return
202
191
 
@@ -206,51 +195,44 @@ class GuiMainMenu(QMenuBar):
206
195
  self.docuMenu = self.addMenu(self.tr("&Document"))
207
196
 
208
197
  # Document > Open
209
- self.aOpenDoc = QAction(self.tr("Open Document"), self)
198
+ self.aOpenDoc = self.docuMenu.addAction(self.tr("Open Document"))
210
199
  self.aOpenDoc.setShortcut("Ctrl+O")
211
200
  self.aOpenDoc.triggered.connect(lambda: self.mainGui.openSelectedItem())
212
- self.docuMenu.addAction(self.aOpenDoc)
213
201
 
214
202
  # Document > Save
215
- self.aSaveDoc = QAction(self.tr("Save Document"), self)
203
+ self.aSaveDoc = self.docuMenu.addAction(self.tr("Save Document"))
216
204
  self.aSaveDoc.setShortcut("Ctrl+S")
217
205
  self.aSaveDoc.triggered.connect(lambda: self.mainGui.saveDocument())
218
- self.docuMenu.addAction(self.aSaveDoc)
219
206
 
220
207
  # Document > Close
221
- self.aCloseDoc = QAction(self.tr("Close Document"), self)
208
+ self.aCloseDoc = self.docuMenu.addAction(self.tr("Close Document"))
222
209
  self.aCloseDoc.setShortcut("Ctrl+W")
223
- self.aCloseDoc.triggered.connect(lambda: self.mainGui.closeDocEditor())
224
- self.docuMenu.addAction(self.aCloseDoc)
210
+ self.aCloseDoc.triggered.connect(self.mainGui.closeDocEditor)
225
211
 
226
212
  # Document > Separator
227
213
  self.docuMenu.addSeparator()
228
214
 
229
215
  # Document > Preview
230
- self.aViewDoc = QAction(self.tr("View Document"), self)
216
+ self.aViewDoc = self.docuMenu.addAction(self.tr("View Document"))
231
217
  self.aViewDoc.setShortcut("Ctrl+R")
232
218
  self.aViewDoc.triggered.connect(lambda: self.mainGui.viewDocument(None))
233
- self.docuMenu.addAction(self.aViewDoc)
234
219
 
235
220
  # Document > Close Preview
236
- self.aCloseView = QAction(self.tr("Close Document View"), self)
221
+ self.aCloseView = self.docuMenu.addAction(self.tr("Close Document View"))
237
222
  self.aCloseView.setShortcut("Ctrl+Shift+R")
238
223
  self.aCloseView.triggered.connect(lambda: self.mainGui.closeDocViewer())
239
- self.docuMenu.addAction(self.aCloseView)
240
224
 
241
225
  # Document > Separator
242
226
  self.docuMenu.addSeparator()
243
227
 
244
228
  # Document > Show File Details
245
- self.aFileDetails = QAction(self.tr("Show File Details"), self)
229
+ self.aFileDetails = self.docuMenu.addAction(self.tr("Show File Details"))
246
230
  self.aFileDetails.triggered.connect(lambda: self.mainGui.docEditor.revealLocation())
247
- self.docuMenu.addAction(self.aFileDetails)
248
231
 
249
232
  # Document > Import From File
250
- self.aImportFile = QAction(self.tr("Import Text from File"), self)
233
+ self.aImportFile = self.docuMenu.addAction(self.tr("Import Text from File"))
251
234
  self.aImportFile.setShortcut("Ctrl+Shift+I")
252
235
  self.aImportFile.triggered.connect(lambda: self.mainGui.importDocument())
253
- self.docuMenu.addAction(self.aImportFile)
254
236
 
255
237
  return
256
238
 
@@ -260,52 +242,59 @@ class GuiMainMenu(QMenuBar):
260
242
  self.editMenu = self.addMenu(self.tr("&Edit"))
261
243
 
262
244
  # Edit > Undo
263
- self.aEditUndo = QAction(self.tr("Undo"), self)
245
+ self.aEditUndo = self.editMenu.addAction(self.tr("Undo"))
264
246
  self.aEditUndo.setShortcut("Ctrl+Z")
265
- self.aEditUndo.triggered.connect(lambda: self._docAction(nwDocAction.UNDO))
266
- self.editMenu.addAction(self.aEditUndo)
247
+ self.aEditUndo.triggered.connect(
248
+ lambda: self.requestDocAction.emit(nwDocAction.UNDO)
249
+ )
267
250
 
268
251
  # Edit > Redo
269
- self.aEditRedo = QAction(self.tr("Redo"), self)
252
+ self.aEditRedo = self.editMenu.addAction(self.tr("Redo"))
270
253
  self.aEditRedo.setShortcut("Ctrl+Y")
271
- self.aEditRedo.triggered.connect(lambda: self._docAction(nwDocAction.REDO))
272
- self.editMenu.addAction(self.aEditRedo)
254
+ self.aEditRedo.triggered.connect(
255
+ lambda: self.requestDocAction.emit(nwDocAction.REDO)
256
+ )
273
257
 
274
258
  # Edit > Separator
275
259
  self.editMenu.addSeparator()
276
260
 
277
261
  # Edit > Cut
278
- self.aEditCut = QAction(self.tr("Cut"), self)
262
+ self.aEditCut = self.editMenu.addAction(self.tr("Cut"))
279
263
  self.aEditCut.setShortcut("Ctrl+X")
280
- self.aEditCut.triggered.connect(lambda: self._docAction(nwDocAction.CUT))
281
- self.editMenu.addAction(self.aEditCut)
264
+ self.aEditCut.triggered.connect(
265
+ lambda: self.requestDocAction.emit(nwDocAction.CUT)
266
+ )
282
267
 
283
268
  # Edit > Copy
284
- self.aEditCopy = QAction(self.tr("Copy"), self)
269
+ self.aEditCopy = self.editMenu.addAction(self.tr("Copy"))
285
270
  self.aEditCopy.setShortcut("Ctrl+C")
286
- self.aEditCopy.triggered.connect(lambda: self._docAction(nwDocAction.COPY))
287
- self.editMenu.addAction(self.aEditCopy)
271
+ self.aEditCopy.triggered.connect(
272
+ lambda: self.requestDocAction.emit(nwDocAction.COPY)
273
+ )
288
274
 
289
275
  # Edit > Paste
290
- self.aEditPaste = QAction(self.tr("Paste"), self)
276
+ self.aEditPaste = self.editMenu.addAction(self.tr("Paste"))
291
277
  self.aEditPaste.setShortcut("Ctrl+V")
292
- self.aEditPaste.triggered.connect(lambda: self._docAction(nwDocAction.PASTE))
293
- self.editMenu.addAction(self.aEditPaste)
278
+ self.aEditPaste.triggered.connect(
279
+ lambda: self.requestDocAction.emit(nwDocAction.PASTE)
280
+ )
294
281
 
295
282
  # Edit > Separator
296
283
  self.editMenu.addSeparator()
297
284
 
298
285
  # Edit > Select All
299
- self.aSelectAll = QAction(self.tr("Select All"), self)
286
+ self.aSelectAll = self.editMenu.addAction(self.tr("Select All"))
300
287
  self.aSelectAll.setShortcut("Ctrl+A")
301
- self.aSelectAll.triggered.connect(lambda: self._docAction(nwDocAction.SEL_ALL))
302
- self.editMenu.addAction(self.aSelectAll)
288
+ self.aSelectAll.triggered.connect(
289
+ lambda: self.requestDocAction.emit(nwDocAction.SEL_ALL)
290
+ )
303
291
 
304
292
  # Edit > Select Paragraph
305
- self.aSelectPar = QAction(self.tr("Select Paragraph"), self)
293
+ self.aSelectPar = self.editMenu.addAction(self.tr("Select Paragraph"))
306
294
  self.aSelectPar.setShortcut("Ctrl+Shift+A")
307
- self.aSelectPar.triggered.connect(lambda: self._docAction(nwDocAction.SEL_PARA))
308
- self.editMenu.addAction(self.aSelectPar)
295
+ self.aSelectPar.triggered.connect(
296
+ lambda: self.requestDocAction.emit(nwDocAction.SEL_PARA)
297
+ )
309
298
 
310
299
  return
311
300
 
@@ -315,70 +304,51 @@ class GuiMainMenu(QMenuBar):
315
304
  self.viewMenu = self.addMenu(self.tr("&View"))
316
305
 
317
306
  # View > TreeView
318
- self.aFocusTree = QAction(self.tr("Go to Project Tree"), self)
319
- if CONFIG.osWindows:
320
- self.aFocusTree.setShortcut("Ctrl+Alt+1")
321
- else:
322
- self.aFocusTree.setShortcut("Alt+1")
323
- self.aFocusTree.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.TREE))
324
- self.viewMenu.addAction(self.aFocusTree)
325
-
326
- # View > Document Pane 1
327
- self.aFocusEditor = QAction(self.tr("Go to Document Editor"), self)
328
- if CONFIG.osWindows:
329
- self.aFocusEditor.setShortcut("Ctrl+Alt+2")
330
- else:
331
- self.aFocusEditor.setShortcut("Alt+2")
332
- self.aFocusEditor.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.EDITOR))
333
- self.viewMenu.addAction(self.aFocusEditor)
334
-
335
- # View > Document Pane 2
336
- self.aFocusView = QAction(self.tr("Go to Document Viewer"), self)
337
- if CONFIG.osWindows:
338
- self.aFocusView.setShortcut("Ctrl+Alt+3")
339
- else:
340
- self.aFocusView.setShortcut("Alt+3")
341
- self.aFocusView.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.VIEWER))
342
- self.viewMenu.addAction(self.aFocusView)
307
+ self.aFocusTree = self.viewMenu.addAction(self.tr("Go to Project Tree"))
308
+ self.aFocusTree.setShortcut("Ctrl+T")
309
+ self.aFocusTree.triggered.connect(
310
+ lambda: self.requestFocusChange.emit(nwWidget.TREE)
311
+ )
312
+
313
+ # View > Document Editor
314
+ self.aFocusEditor = self.viewMenu.addAction(self.tr("Go to Document Editor"))
315
+ self.aFocusEditor.setShortcut("Ctrl+E")
316
+ self.aFocusEditor.triggered.connect(
317
+ lambda: self.requestFocusChange.emit(nwWidget.EDITOR)
318
+ )
343
319
 
344
320
  # View > Outline
345
- self.aFocusOutline = QAction(self.tr("Go to Outline"), self)
346
- if CONFIG.osWindows:
347
- self.aFocusOutline.setShortcut("Ctrl+Alt+4")
348
- else:
349
- self.aFocusOutline.setShortcut("Alt+4")
350
- self.aFocusOutline.triggered.connect(lambda: self.mainGui.switchFocus(nwWidget.OUTLINE))
351
- self.viewMenu.addAction(self.aFocusOutline)
321
+ self.aFocusOutline = self.viewMenu.addAction(self.tr("Go to Outline"))
322
+ self.aFocusOutline.setShortcut("Ctrl+Shift+T")
323
+ self.aFocusOutline.triggered.connect(
324
+ lambda: self.requestFocusChange.emit(nwWidget.OUTLINE)
325
+ )
352
326
 
353
327
  # View > Separator
354
328
  self.viewMenu.addSeparator()
355
329
 
356
330
  # View > Go Backward
357
- self.aViewPrev = QAction(self.tr("Navigate Backward"), self)
331
+ self.aViewPrev = self.viewMenu.addAction(self.tr("Navigate Backward"))
358
332
  self.aViewPrev.setShortcut("Alt+Left")
359
333
  self.aViewPrev.triggered.connect(self.mainGui.docViewer.navBackward)
360
- self.viewMenu.addAction(self.aViewPrev)
361
334
 
362
335
  # View > Go Forward
363
- self.aViewNext = QAction(self.tr("Navigate Forward"), self)
336
+ self.aViewNext = self.viewMenu.addAction(self.tr("Navigate Forward"))
364
337
  self.aViewNext.setShortcut("Alt+Right")
365
338
  self.aViewNext.triggered.connect(self.mainGui.docViewer.navForward)
366
- self.viewMenu.addAction(self.aViewNext)
367
339
 
368
340
  # View > Separator
369
341
  self.viewMenu.addSeparator()
370
342
 
371
343
  # View > Focus Mode
372
- self.aFocusMode = QAction(self.tr("Focus Mode"), self)
344
+ self.aFocusMode = self.viewMenu.addAction(self.tr("Focus Mode"))
373
345
  self.aFocusMode.setShortcut("F8")
374
- self.aFocusMode.triggered.connect(lambda: self.mainGui.toggleFocusMode())
375
- self.viewMenu.addAction(self.aFocusMode)
346
+ self.aFocusMode.triggered.connect(self.mainGui.toggleFocusMode)
376
347
 
377
348
  # View > Toggle Full Screen
378
- self.aFullScreen = QAction(self.tr("Full Screen Mode"), self)
349
+ self.aFullScreen = self.viewMenu.addAction(self.tr("Full Screen Mode"))
379
350
  self.aFullScreen.setShortcut("F11")
380
351
  self.aFullScreen.triggered.connect(lambda: self.mainGui.toggleFullScreenMode())
381
- self.viewMenu.addAction(self.aFullScreen)
382
352
 
383
353
  return
384
354
 
@@ -391,154 +361,177 @@ class GuiMainMenu(QMenuBar):
391
361
  self.mInsDashes = self.insMenu.addMenu(self.tr("Dashes"))
392
362
 
393
363
  # Insert > Short Dash
394
- self.aInsENDash = QAction(self.tr("Short Dash"), self)
364
+ self.aInsENDash = self.mInsDashes.addAction(self.tr("Short Dash"))
395
365
  self.aInsENDash.setShortcut("Ctrl+K, -")
396
- self.aInsENDash.triggered.connect(lambda: self._docInsert(nwUnicode.U_ENDASH))
397
- self.mInsDashes.addAction(self.aInsENDash)
366
+ self.aInsENDash.triggered.connect(
367
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_ENDASH)
368
+ )
398
369
 
399
370
  # Insert > Long Dash
400
- self.aInsEMDash = QAction(self.tr("Long Dash"), self)
371
+ self.aInsEMDash = self.mInsDashes.addAction(self.tr("Long Dash"))
401
372
  self.aInsEMDash.setShortcut("Ctrl+K, _")
402
- self.aInsEMDash.triggered.connect(lambda: self._docInsert(nwUnicode.U_EMDASH))
403
- self.mInsDashes.addAction(self.aInsEMDash)
373
+ self.aInsEMDash.triggered.connect(
374
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_EMDASH)
375
+ )
404
376
 
405
377
  # Insert > Long Dash
406
- self.aInsHorBar = QAction(self.tr("Horizontal Bar"), self)
378
+ self.aInsHorBar = self.mInsDashes.addAction(self.tr("Horizontal Bar"))
407
379
  self.aInsHorBar.setShortcut("Ctrl+K, Ctrl+_")
408
- self.aInsHorBar.triggered.connect(lambda: self._docInsert(nwUnicode.U_HBAR))
409
- self.mInsDashes.addAction(self.aInsHorBar)
380
+ self.aInsHorBar.triggered.connect(
381
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_HBAR)
382
+ )
410
383
 
411
384
  # Insert > Figure Dash
412
- self.aInsFigDash = QAction(self.tr("Figure Dash"), self)
385
+ self.aInsFigDash = self.mInsDashes.addAction(self.tr("Figure Dash"))
413
386
  self.aInsFigDash.setShortcut("Ctrl+K, ~")
414
- self.aInsFigDash.triggered.connect(lambda: self._docInsert(nwUnicode.U_FGDASH))
415
- self.mInsDashes.addAction(self.aInsFigDash)
387
+ self.aInsFigDash.triggered.connect(
388
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_FGDASH)
389
+ )
416
390
 
417
391
  # Insert > Quote Marks
418
392
  self.mInsQuotes = self.insMenu.addMenu(self.tr("Quote Marks"))
419
393
 
420
394
  # Insert > Left Single Quote
421
- self.aInsQuoteLS = QAction(self.tr("Left Single Quote"), self)
395
+ self.aInsQuoteLS = self.mInsQuotes.addAction(self.tr("Left Single Quote"))
422
396
  self.aInsQuoteLS.setShortcut("Ctrl+K, 1")
423
- self.aInsQuoteLS.triggered.connect(lambda: self._docInsert(nwDocInsert.QUOTE_LS))
424
- self.mInsQuotes.addAction(self.aInsQuoteLS)
397
+ self.aInsQuoteLS.triggered.connect(
398
+ lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_LS)
399
+ )
425
400
 
426
401
  # Insert > Right Single Quote
427
- self.aInsQuoteRS = QAction(self.tr("Right Single Quote"), self)
402
+ self.aInsQuoteRS = self.mInsQuotes.addAction(self.tr("Right Single Quote"))
428
403
  self.aInsQuoteRS.setShortcut("Ctrl+K, 2")
429
- self.aInsQuoteRS.triggered.connect(lambda: self._docInsert(nwDocInsert.QUOTE_RS))
430
- self.mInsQuotes.addAction(self.aInsQuoteRS)
404
+ self.aInsQuoteRS.triggered.connect(
405
+ lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_RS)
406
+ )
431
407
 
432
408
  # Insert > Left Double Quote
433
- self.aInsQuoteLD = QAction(self.tr("Left Double Quote"), self)
409
+ self.aInsQuoteLD = self.mInsQuotes.addAction(self.tr("Left Double Quote"))
434
410
  self.aInsQuoteLD.setShortcut("Ctrl+K, 3")
435
- self.aInsQuoteLD.triggered.connect(lambda: self._docInsert(nwDocInsert.QUOTE_LD))
436
- self.mInsQuotes.addAction(self.aInsQuoteLD)
411
+ self.aInsQuoteLD.triggered.connect(
412
+ lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_LD)
413
+ )
437
414
 
438
415
  # Insert > Right Double Quote
439
- self.aInsQuoteRD = QAction(self.tr("Right Double Quote"), self)
416
+ self.aInsQuoteRD = self.mInsQuotes.addAction(self.tr("Right Double Quote"))
440
417
  self.aInsQuoteRD.setShortcut("Ctrl+K, 4")
441
- self.aInsQuoteRD.triggered.connect(lambda: self._docInsert(nwDocInsert.QUOTE_RD))
442
- self.mInsQuotes.addAction(self.aInsQuoteRD)
418
+ self.aInsQuoteRD.triggered.connect(
419
+ lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_RD)
420
+ )
443
421
 
444
422
  # Insert > Alternative Apostrophe
445
- self.aInsMSApos = QAction(self.tr("Alternative Apostrophe"), self)
423
+ self.aInsMSApos = self.mInsQuotes.addAction(self.tr("Alternative Apostrophe"))
446
424
  self.aInsMSApos.setShortcut("Ctrl+K, '")
447
- self.aInsMSApos.triggered.connect(lambda: self._docInsert(nwUnicode.U_MAPOSS))
448
- self.mInsQuotes.addAction(self.aInsMSApos)
425
+ self.aInsMSApos.triggered.connect(
426
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_MAPOSS)
427
+ )
449
428
 
450
429
  # Insert > Symbols
451
430
  self.mInsPunct = self.insMenu.addMenu(self.tr("General Punctuation"))
452
431
 
453
432
  # Insert > Ellipsis
454
- self.aInsEllipsis = QAction(self.tr("Ellipsis"), self)
433
+ self.aInsEllipsis = self.mInsPunct.addAction(self.tr("Ellipsis"))
455
434
  self.aInsEllipsis.setShortcut("Ctrl+K, .")
456
- self.aInsEllipsis.triggered.connect(lambda: self._docInsert(nwUnicode.U_HELLIP))
457
- self.mInsPunct.addAction(self.aInsEllipsis)
435
+ self.aInsEllipsis.triggered.connect(
436
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_HELLIP)
437
+ )
458
438
 
459
439
  # Insert > Prime
460
- self.aInsPrime = QAction(self.tr("Prime"), self)
440
+ self.aInsPrime = self.mInsPunct.addAction(self.tr("Prime"))
461
441
  self.aInsPrime.setShortcut("Ctrl+K, Ctrl+'")
462
- self.aInsPrime.triggered.connect(lambda: self._docInsert(nwUnicode.U_PRIME))
463
- self.mInsPunct.addAction(self.aInsPrime)
442
+ self.aInsPrime.triggered.connect(
443
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_PRIME)
444
+ )
464
445
 
465
446
  # Insert > Double Prime
466
- self.aInsDPrime = QAction(self.tr("Double Prime"), self)
447
+ self.aInsDPrime = self.mInsPunct.addAction(self.tr("Double Prime"))
467
448
  self.aInsDPrime.setShortcut("Ctrl+K, Ctrl+\"")
468
- self.aInsDPrime.triggered.connect(lambda: self._docInsert(nwUnicode.U_DPRIME))
469
- self.mInsPunct.addAction(self.aInsDPrime)
449
+ self.aInsDPrime.triggered.connect(
450
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_DPRIME)
451
+ )
470
452
 
471
453
  # Insert > White Spaces
472
454
  self.mInsSpace = self.insMenu.addMenu(self.tr("White Spaces"))
473
455
 
474
456
  # Insert > Non-Breaking Space
475
- self.aInsNBSpace = QAction(self.tr("Non-Breaking Space"), self)
457
+ self.aInsNBSpace = self.mInsSpace.addAction(self.tr("Non-Breaking Space"))
476
458
  self.aInsNBSpace.setShortcut("Ctrl+K, Space")
477
- self.aInsNBSpace.triggered.connect(lambda: self._docInsert(nwUnicode.U_NBSP))
478
- self.mInsSpace.addAction(self.aInsNBSpace)
459
+ self.aInsNBSpace.triggered.connect(
460
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_NBSP)
461
+ )
479
462
 
480
463
  # Insert > Thin Space
481
- self.aInsThinSpace = QAction(self.tr("Thin Space"), self)
464
+ self.aInsThinSpace = self.mInsSpace.addAction(self.tr("Thin Space"))
482
465
  self.aInsThinSpace.setShortcut("Ctrl+K, Shift+Space")
483
- self.aInsThinSpace.triggered.connect(lambda: self._docInsert(nwUnicode.U_THSP))
484
- self.mInsSpace.addAction(self.aInsThinSpace)
466
+ self.aInsThinSpace.triggered.connect(
467
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_THSP)
468
+ )
485
469
 
486
470
  # Insert > Thin Non-Breaking Space
487
- self.aInsThinNBSpace = QAction(self.tr("Thin Non-Breaking Space"), self)
471
+ self.aInsThinNBSpace = self.mInsSpace.addAction(self.tr("Thin Non-Breaking Space"))
488
472
  self.aInsThinNBSpace.setShortcut("Ctrl+K, Ctrl+Space")
489
- self.aInsThinNBSpace.triggered.connect(lambda: self._docInsert(nwUnicode.U_THNBSP))
490
- self.mInsSpace.addAction(self.aInsThinNBSpace)
473
+ self.aInsThinNBSpace.triggered.connect(
474
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_THNBSP)
475
+ )
491
476
 
492
477
  # Insert > Symbols
493
478
  self.mInsSymbol = self.insMenu.addMenu(self.tr("Other Symbols"))
494
479
 
495
480
  # Insert > List Bullet
496
- self.aInsBullet = QAction(self.tr("List Bullet"), self)
481
+ self.aInsBullet = self.mInsSymbol.addAction(self.tr("List Bullet"))
497
482
  self.aInsBullet.setShortcut("Ctrl+K, *")
498
- self.aInsBullet.triggered.connect(lambda: self._docInsert(nwUnicode.U_BULL))
499
- self.mInsSymbol.addAction(self.aInsBullet)
483
+ self.aInsBullet.triggered.connect(
484
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_BULL)
485
+ )
500
486
 
501
487
  # Insert > Hyphen Bullet
502
- self.aInsHyBull = QAction(self.tr("Hyphen Bullet"), self)
488
+ self.aInsHyBull = self.mInsSymbol.addAction(self.tr("Hyphen Bullet"))
503
489
  self.aInsHyBull.setShortcut("Ctrl+K, Ctrl+-")
504
- self.aInsHyBull.triggered.connect(lambda: self._docInsert(nwUnicode.U_HYBULL))
505
- self.mInsSymbol.addAction(self.aInsHyBull)
490
+ self.aInsHyBull.triggered.connect(
491
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_HYBULL)
492
+ )
506
493
 
507
494
  # Insert > Flower Mark
508
- self.aInsFlower = QAction(self.tr("Flower Mark"), self)
495
+ self.aInsFlower = self.mInsSymbol.addAction(self.tr("Flower Mark"))
509
496
  self.aInsFlower.setShortcut("Ctrl+K, Ctrl+*")
510
- self.aInsFlower.triggered.connect(lambda: self._docInsert(nwUnicode.U_FLOWER))
511
- self.mInsSymbol.addAction(self.aInsFlower)
497
+ self.aInsFlower.triggered.connect(
498
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_FLOWER)
499
+ )
512
500
 
513
501
  # Insert > Per Mille
514
- self.aInsPerMille = QAction(self.tr("Per Mille"), self)
502
+ self.aInsPerMille = self.mInsSymbol.addAction(self.tr("Per Mille"))
515
503
  self.aInsPerMille.setShortcut("Ctrl+K, %")
516
- self.aInsPerMille.triggered.connect(lambda: self._docInsert(nwUnicode.U_PERMIL))
517
- self.mInsSymbol.addAction(self.aInsPerMille)
504
+ self.aInsPerMille.triggered.connect(
505
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_PERMIL)
506
+ )
518
507
 
519
508
  # Insert > Degree Symbol
520
- self.aInsDegree = QAction(self.tr("Degree Symbol"), self)
509
+ self.aInsDegree = self.mInsSymbol.addAction(self.tr("Degree Symbol"))
521
510
  self.aInsDegree.setShortcut("Ctrl+K, Ctrl+O")
522
- self.aInsDegree.triggered.connect(lambda: self._docInsert(nwUnicode.U_DEGREE))
523
- self.mInsSymbol.addAction(self.aInsDegree)
511
+ self.aInsDegree.triggered.connect(
512
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_DEGREE)
513
+ )
524
514
 
525
515
  # Insert > Minus Sign
526
- self.aInsMinus = QAction(self.tr("Minus Sign"), self)
516
+ self.aInsMinus = self.mInsSymbol.addAction(self.tr("Minus Sign"))
527
517
  self.aInsMinus.setShortcut("Ctrl+K, Ctrl+M")
528
- self.aInsMinus.triggered.connect(lambda: self._docInsert(nwUnicode.U_MINUS))
529
- self.mInsSymbol.addAction(self.aInsMinus)
518
+ self.aInsMinus.triggered.connect(
519
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_MINUS)
520
+ )
530
521
 
531
522
  # Insert > Times Sign
532
- self.aInsTimes = QAction(self.tr("Times Sign"), self)
523
+ self.aInsTimes = self.mInsSymbol.addAction(self.tr("Times Sign"))
533
524
  self.aInsTimes.setShortcut("Ctrl+K, Ctrl+X")
534
- self.aInsTimes.triggered.connect(lambda: self._docInsert(nwUnicode.U_TIMES))
535
- self.mInsSymbol.addAction(self.aInsTimes)
525
+ self.aInsTimes.triggered.connect(
526
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_TIMES)
527
+ )
536
528
 
537
529
  # Insert > Division
538
- self.aInsDivide = QAction(self.tr("Division Sign"), self)
530
+ self.aInsDivide = self.mInsSymbol.addAction(self.tr("Division Sign"))
539
531
  self.aInsDivide.setShortcut("Ctrl+K, Ctrl+D")
540
- self.aInsDivide.triggered.connect(lambda: self._docInsert(nwUnicode.U_DIVIDE))
541
- self.mInsSymbol.addAction(self.aInsDivide)
532
+ self.aInsDivide.triggered.connect(
533
+ lambda: self.requestDocInsertText.emit(nwUnicode.U_DIVIDE)
534
+ )
542
535
 
543
536
  # Insert > Tags and References
544
537
  self.mInsKeywords = self.insMenu.addMenu(self.tr("Tags and References"))
@@ -557,7 +550,7 @@ class GuiMainMenu(QMenuBar):
557
550
  self.mInsKWItems[keyWord][0].setText(trConst(nwLabels.KEY_NAME[keyWord]))
558
551
  self.mInsKWItems[keyWord][0].setShortcut(self.mInsKWItems[keyWord][1])
559
552
  self.mInsKWItems[keyWord][0].triggered.connect(
560
- lambda n, keyWord=keyWord: self._insertKeyWord(keyWord)
553
+ lambda n, keyWord=keyWord: self.requestDocKeyWordInsert.emit(keyWord)
561
554
  )
562
555
  self.mInsKeywords.addAction(self.mInsKWItems[keyWord][0])
563
556
 
@@ -565,33 +558,43 @@ class GuiMainMenu(QMenuBar):
565
558
  self.mInsComments = self.insMenu.addMenu(self.tr("Special Comments"))
566
559
 
567
560
  # Insert > Synopsis Comment
568
- self.aInsSynopsis = QAction(self.tr("Synopsis Comment"), self)
561
+ self.aInsSynopsis = self.mInsComments.addAction(self.tr("Synopsis Comment"))
569
562
  self.aInsSynopsis.setShortcut("Ctrl+K, S")
570
- self.aInsSynopsis.triggered.connect(lambda: self._docInsert(nwDocInsert.SYNOPSIS))
571
- self.mInsComments.addAction(self.aInsSynopsis)
563
+ self.aInsSynopsis.triggered.connect(
564
+ lambda: self.requestDocInsert.emit(nwDocInsert.SYNOPSIS)
565
+ )
566
+
567
+ # Insert > Short Description Comment
568
+ self.aInsShort = self.mInsComments.addAction(self.tr("Short Description Comment"))
569
+ self.aInsShort.setShortcut("Ctrl+K, U")
570
+ self.aInsShort.triggered.connect(
571
+ lambda: self.requestDocInsert.emit(nwDocInsert.SHORT)
572
+ )
572
573
 
573
574
  # Insert > Symbols
574
575
  self.mInsBreaks = self.insMenu.addMenu(self.tr("Page Break and Space"))
575
576
 
576
577
  # Insert > New Page
577
- self.aInsNewPage = QAction(self.tr("Page Break"), self)
578
- self.aInsNewPage.triggered.connect(lambda: self._docInsert(nwDocInsert.NEW_PAGE))
579
- self.mInsBreaks.addAction(self.aInsNewPage)
578
+ self.aInsNewPage = self.mInsBreaks.addAction(self.tr("Page Break"))
579
+ self.aInsNewPage.triggered.connect(
580
+ lambda: self.requestDocInsert.emit(nwDocInsert.NEW_PAGE)
581
+ )
580
582
 
581
583
  # Insert > Vertical Space (Single)
582
- self.aInsVSpaceS = QAction(self.tr("Vertical Space (Single)"), self)
583
- self.aInsVSpaceS.triggered.connect(lambda: self._docInsert(nwDocInsert.VSPACE_S))
584
- self.mInsBreaks.addAction(self.aInsVSpaceS)
584
+ self.aInsVSpaceS = self.mInsBreaks.addAction(self.tr("Vertical Space (Single)"))
585
+ self.aInsVSpaceS.triggered.connect(
586
+ lambda: self.requestDocInsert.emit(nwDocInsert.VSPACE_S)
587
+ )
585
588
 
586
589
  # Insert > Vertical Space (Multi)
587
- self.aInsVSpaceM = QAction(self.tr("Vertical Space (Multi)"), self)
588
- self.aInsVSpaceM.triggered.connect(lambda: self._docInsert(nwDocInsert.VSPACE_M))
589
- self.mInsBreaks.addAction(self.aInsVSpaceM)
590
+ self.aInsVSpaceM = self.mInsBreaks.addAction(self.tr("Vertical Space (Multi)"))
591
+ self.aInsVSpaceM.triggered.connect(
592
+ lambda: self.requestDocInsert.emit(nwDocInsert.VSPACE_M)
593
+ )
590
594
 
591
595
  # Insert > Placeholder Text
592
- self.aLipsumText = QAction(self.tr("Placeholder Text"), self)
596
+ self.aLipsumText = self.mInsBreaks.addAction(self.tr("Placeholder Text"))
593
597
  self.aLipsumText.triggered.connect(lambda: self.mainGui.showLoremIpsumDialog())
594
- self.insMenu.addAction(self.aLipsumText)
595
598
 
596
599
  return
597
600
 
@@ -601,146 +604,209 @@ class GuiMainMenu(QMenuBar):
601
604
  self.fmtMenu = self.addMenu(self.tr("&Format"))
602
605
 
603
606
  # Format > Emphasis
604
- self.aFmtEmph = QAction(self.tr("Emphasis"), self)
607
+ self.aFmtEmph = self.fmtMenu.addAction(self.tr("Emphasis"))
605
608
  self.aFmtEmph.setShortcut("Ctrl+I")
606
- self.aFmtEmph.triggered.connect(lambda: self._docAction(nwDocAction.EMPH))
607
- self.fmtMenu.addAction(self.aFmtEmph)
609
+ self.aFmtEmph.triggered.connect(
610
+ lambda: self.requestDocAction.emit(nwDocAction.EMPH)
611
+ )
608
612
 
609
613
  # Format > Strong Emphasis
610
- self.aFmtStrong = QAction(self.tr("Strong Emphasis"), self)
614
+ self.aFmtStrong = self.fmtMenu.addAction(self.tr("Strong Emphasis"))
611
615
  self.aFmtStrong.setShortcut("Ctrl+B")
612
- self.aFmtStrong.triggered.connect(lambda: self._docAction(nwDocAction.STRONG))
613
- self.fmtMenu.addAction(self.aFmtStrong)
616
+ self.aFmtStrong.triggered.connect(
617
+ lambda: self.requestDocAction.emit(nwDocAction.STRONG)
618
+ )
614
619
 
615
620
  # Format > Strikethrough
616
- self.aFmtStrike = QAction(self.tr("Strikethrough"), self)
621
+ self.aFmtStrike = self.fmtMenu.addAction(self.tr("Strikethrough"))
617
622
  self.aFmtStrike.setShortcut("Ctrl+D")
618
- self.aFmtStrike.triggered.connect(lambda: self._docAction(nwDocAction.STRIKE))
619
- self.fmtMenu.addAction(self.aFmtStrike)
623
+ self.aFmtStrike.triggered.connect(
624
+ lambda: self.requestDocAction.emit(nwDocAction.STRIKE)
625
+ )
620
626
 
621
627
  # Edit > Separator
622
628
  self.fmtMenu.addSeparator()
623
629
 
624
630
  # Format > Double Quotes
625
- self.aFmtDQuote = QAction(self.tr("Wrap Double Quotes"), self)
631
+ self.aFmtDQuote = self.fmtMenu.addAction(self.tr("Wrap Double Quotes"))
626
632
  self.aFmtDQuote.setShortcut("Ctrl+\"")
627
- self.aFmtDQuote.triggered.connect(lambda: self._docAction(nwDocAction.D_QUOTE))
628
- self.fmtMenu.addAction(self.aFmtDQuote)
633
+ self.aFmtDQuote.triggered.connect(
634
+ lambda: self.requestDocAction.emit(nwDocAction.D_QUOTE)
635
+ )
629
636
 
630
637
  # Format > Single Quotes
631
- self.aFmtSQuote = QAction(self.tr("Wrap Single Quotes"), self)
638
+ self.aFmtSQuote = self.fmtMenu.addAction(self.tr("Wrap Single Quotes"))
632
639
  self.aFmtSQuote.setShortcut("Ctrl+'")
633
- self.aFmtSQuote.triggered.connect(lambda: self._docAction(nwDocAction.S_QUOTE))
634
- self.fmtMenu.addAction(self.aFmtSQuote)
640
+ self.aFmtSQuote.triggered.connect(
641
+ lambda: self.requestDocAction.emit(nwDocAction.S_QUOTE)
642
+ )
643
+
644
+ # Format > Separator
645
+ self.fmtMenu.addSeparator()
646
+
647
+ # Shortcodes
648
+ self.mShortcodes = self.fmtMenu.addMenu(self.tr("More Formats ..."))
649
+
650
+ # Shortcode Italic
651
+ self.aScItalic = self.mShortcodes.addAction(self.tr("Italics (Shortcode)"))
652
+ self.aScItalic.triggered.connect(
653
+ lambda: self.requestDocAction.emit(nwDocAction.SC_ITALIC)
654
+ )
655
+
656
+ # Shortcode Bold
657
+ self.aScBold = self.mShortcodes.addAction(self.tr("Bold (Shortcode)"))
658
+ self.aScBold.triggered.connect(
659
+ lambda: self.requestDocAction.emit(nwDocAction.SC_BOLD)
660
+ )
661
+
662
+ # Shortcode Strikethrough
663
+ self.aScStrike = self.mShortcodes.addAction(self.tr("Strikethrough (Shortcode)"))
664
+ self.aScStrike.triggered.connect(
665
+ lambda: self.requestDocAction.emit(nwDocAction.SC_STRIKE)
666
+ )
667
+
668
+ # Shortcode Underline
669
+ self.aScULine = self.mShortcodes.addAction(self.tr("Underline"))
670
+ self.aScULine.triggered.connect(
671
+ lambda: self.requestDocAction.emit(nwDocAction.SC_ULINE)
672
+ )
673
+
674
+ # Shortcode Superscript
675
+ self.aScSuper = self.mShortcodes.addAction(self.tr("Superscript"))
676
+ self.aScSuper.triggered.connect(
677
+ lambda: self.requestDocAction.emit(nwDocAction.SC_SUP)
678
+ )
679
+
680
+ # Shortcode Subscript
681
+ self.aScSub = self.mShortcodes.addAction(self.tr("Subscript"))
682
+ self.aScSub.triggered.connect(
683
+ lambda: self.requestDocAction.emit(nwDocAction.SC_SUB)
684
+ )
635
685
 
636
686
  # Format > Separator
637
687
  self.fmtMenu.addSeparator()
638
688
 
639
689
  # Format > Header 1 (Partition)
640
- self.aFmtHead1 = QAction(self.tr("Header 1 (Partition)"), self)
690
+ self.aFmtHead1 = self.fmtMenu.addAction(self.tr("Header 1 (Partition)"))
641
691
  self.aFmtHead1.setShortcut("Ctrl+1")
642
- self.aFmtHead1.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_H1))
643
- self.fmtMenu.addAction(self.aFmtHead1)
692
+ self.aFmtHead1.triggered.connect(
693
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H1)
694
+ )
644
695
 
645
696
  # Format > Header 2 (Chapter)
646
- self.aFmtHead2 = QAction(self.tr("Header 2 (Chapter)"), self)
697
+ self.aFmtHead2 = self.fmtMenu.addAction(self.tr("Header 2 (Chapter)"))
647
698
  self.aFmtHead2.setShortcut("Ctrl+2")
648
- self.aFmtHead2.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_H2))
649
- self.fmtMenu.addAction(self.aFmtHead2)
699
+ self.aFmtHead2.triggered.connect(
700
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H2)
701
+ )
650
702
 
651
703
  # Format > Header 3 (Scene)
652
- self.aFmtHead3 = QAction(self.tr("Header 3 (Scene)"), self)
704
+ self.aFmtHead3 = self.fmtMenu.addAction(self.tr("Header 3 (Scene)"))
653
705
  self.aFmtHead3.setShortcut("Ctrl+3")
654
- self.aFmtHead3.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_H3))
655
- self.fmtMenu.addAction(self.aFmtHead3)
706
+ self.aFmtHead3.triggered.connect(
707
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H3)
708
+ )
656
709
 
657
710
  # Format > Header 4 (Section)
658
- self.aFmtHead4 = QAction(self.tr("Header 4 (Section)"), self)
711
+ self.aFmtHead4 = self.fmtMenu.addAction(self.tr("Header 4 (Section)"))
659
712
  self.aFmtHead4.setShortcut("Ctrl+4")
660
- self.aFmtHead4.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_H4))
661
- self.fmtMenu.addAction(self.aFmtHead4)
713
+ self.aFmtHead4.triggered.connect(
714
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H4)
715
+ )
662
716
 
663
717
  # Format > Separator
664
718
  self.fmtMenu.addSeparator()
665
719
 
666
720
  # Format > Novel Title
667
- self.aFmtTitle = QAction(self.tr("Novel Title"), self)
668
- self.aFmtTitle.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_TTL))
669
- self.fmtMenu.addAction(self.aFmtTitle)
721
+ self.aFmtTitle = self.fmtMenu.addAction(self.tr("Novel Title"))
722
+ self.aFmtTitle.triggered.connect(
723
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_TTL)
724
+ )
670
725
 
671
726
  # Format > Unnumbered Chapter
672
- self.aFmtUnNum = QAction(self.tr("Unnumbered Chapter"), self)
673
- self.aFmtUnNum.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_UNN))
674
- self.fmtMenu.addAction(self.aFmtUnNum)
727
+ self.aFmtUnNum = self.fmtMenu.addAction(self.tr("Unnumbered Chapter"))
728
+ self.aFmtUnNum.triggered.connect(
729
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_UNN)
730
+ )
675
731
 
676
732
  # Format > Separator
677
733
  self.fmtMenu.addSeparator()
678
734
 
679
735
  # Format > Align Left
680
- self.aFmtAlignLeft = QAction(self.tr("Align Left"), self)
736
+ self.aFmtAlignLeft = self.fmtMenu.addAction(self.tr("Align Left"))
681
737
  self.aFmtAlignLeft.setShortcut("Ctrl+5")
682
- self.aFmtAlignLeft.triggered.connect(lambda: self._docAction(nwDocAction.ALIGN_L))
683
- self.fmtMenu.addAction(self.aFmtAlignLeft)
738
+ self.aFmtAlignLeft.triggered.connect(
739
+ lambda: self.requestDocAction.emit(nwDocAction.ALIGN_L)
740
+ )
684
741
 
685
742
  # Format > Align Centre
686
- self.aFmtAlignCentre = QAction(self.tr("Align Centre"), self)
743
+ self.aFmtAlignCentre = self.fmtMenu.addAction(self.tr("Align Centre"))
687
744
  self.aFmtAlignCentre.setShortcut("Ctrl+6")
688
- self.aFmtAlignCentre.triggered.connect(lambda: self._docAction(nwDocAction.ALIGN_C))
689
- self.fmtMenu.addAction(self.aFmtAlignCentre)
745
+ self.aFmtAlignCentre.triggered.connect(
746
+ lambda: self.requestDocAction.emit(nwDocAction.ALIGN_C)
747
+ )
690
748
 
691
749
  # Format > Align Right
692
- self.aFmtAlignRight = QAction(self.tr("Align Right"), self)
750
+ self.aFmtAlignRight = self.fmtMenu.addAction(self.tr("Align Right"))
693
751
  self.aFmtAlignRight.setShortcut("Ctrl+7")
694
- self.aFmtAlignRight.triggered.connect(lambda: self._docAction(nwDocAction.ALIGN_R))
695
- self.fmtMenu.addAction(self.aFmtAlignRight)
752
+ self.aFmtAlignRight.triggered.connect(
753
+ lambda: self.requestDocAction.emit(nwDocAction.ALIGN_R)
754
+ )
696
755
 
697
756
  # Format > Separator
698
757
  self.fmtMenu.addSeparator()
699
758
 
700
759
  # Format > Indent Left
701
- self.aFmtIndentLeft = QAction(self.tr("Indent Left"), self)
760
+ self.aFmtIndentLeft = self.fmtMenu.addAction(self.tr("Indent Left"))
702
761
  self.aFmtIndentLeft.setShortcut("Ctrl+8")
703
- self.aFmtIndentLeft.triggered.connect(lambda: self._docAction(nwDocAction.INDENT_L))
704
- self.fmtMenu.addAction(self.aFmtIndentLeft)
762
+ self.aFmtIndentLeft.triggered.connect(
763
+ lambda: self.requestDocAction.emit(nwDocAction.INDENT_L)
764
+ )
705
765
 
706
766
  # Format > Indent Right
707
- self.aFmtIndentRight = QAction(self.tr("Indent Right"), self)
767
+ self.aFmtIndentRight = self.fmtMenu.addAction(self.tr("Indent Right"))
708
768
  self.aFmtIndentRight.setShortcut("Ctrl+9")
709
- self.aFmtIndentRight.triggered.connect(lambda: self._docAction(nwDocAction.INDENT_R))
710
- self.fmtMenu.addAction(self.aFmtIndentRight)
769
+ self.aFmtIndentRight.triggered.connect(
770
+ lambda: self.requestDocAction.emit(nwDocAction.INDENT_R)
771
+ )
711
772
 
712
773
  # Format > Separator
713
774
  self.fmtMenu.addSeparator()
714
775
 
715
776
  # Format > Comment
716
- self.aFmtComment = QAction(self.tr("Toggle Comment"), self)
777
+ self.aFmtComment = self.fmtMenu.addAction(self.tr("Toggle Comment"))
717
778
  self.aFmtComment.setShortcut("Ctrl+/")
718
- self.aFmtComment.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_COM))
719
- self.fmtMenu.addAction(self.aFmtComment)
779
+ self.aFmtComment.triggered.connect(
780
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_COM)
781
+ )
720
782
 
721
783
  # Format > Remove Block Format
722
- self.aFmtNoFormat = QAction(self.tr("Remove Block Format"), self)
784
+ self.aFmtNoFormat = self.fmtMenu.addAction(self.tr("Remove Block Format"))
723
785
  self.aFmtNoFormat.setShortcuts(["Ctrl+0", "Ctrl+Shift+/"])
724
- self.aFmtNoFormat.triggered.connect(lambda: self._docAction(nwDocAction.BLOCK_TXT))
725
- self.fmtMenu.addAction(self.aFmtNoFormat)
786
+ self.aFmtNoFormat.triggered.connect(
787
+ lambda: self.requestDocAction.emit(nwDocAction.BLOCK_TXT)
788
+ )
726
789
 
727
790
  # Format > Separator
728
791
  self.fmtMenu.addSeparator()
729
792
 
730
793
  # Format > Replace Single Quotes
731
- self.aFmtReplSng = QAction(self.tr("Convert Single Quotes"), self)
732
- self.aFmtReplSng.triggered.connect(lambda: self._docAction(nwDocAction.REPL_SNG))
733
- self.fmtMenu.addAction(self.aFmtReplSng)
794
+ self.aFmtReplSng = self.fmtMenu.addAction(self.tr("Convert Single Quotes"))
795
+ self.aFmtReplSng.triggered.connect(
796
+ lambda: self.requestDocAction.emit(nwDocAction.REPL_SNG)
797
+ )
734
798
 
735
799
  # Format > Replace Double Quotes
736
- self.aFmtReplDbl = QAction(self.tr("Convert Double Quotes"), self)
737
- self.aFmtReplDbl.triggered.connect(lambda: self._docAction(nwDocAction.REPL_DBL))
738
- self.fmtMenu.addAction(self.aFmtReplDbl)
800
+ self.aFmtReplDbl = self.fmtMenu.addAction(self.tr("Convert Double Quotes"))
801
+ self.aFmtReplDbl.triggered.connect(
802
+ lambda: self.requestDocAction.emit(nwDocAction.REPL_DBL)
803
+ )
739
804
 
740
805
  # Format > Remove In-Paragraph Breaks
741
- self.aFmtRmBreaks = QAction(self.tr("Remove In-Paragraph Breaks"), self)
742
- self.aFmtRmBreaks.triggered.connect(lambda: self._docAction(nwDocAction.RM_BREAKS))
743
- self.fmtMenu.addAction(self.aFmtRmBreaks)
806
+ self.aFmtRmBreaks = self.fmtMenu.addAction(self.tr("Remove In-Paragraph Breaks"))
807
+ self.aFmtRmBreaks.triggered.connect(
808
+ lambda: self.requestDocAction.emit(nwDocAction.RM_BREAKS)
809
+ )
744
810
 
745
811
  return
746
812
 
@@ -750,36 +816,31 @@ class GuiMainMenu(QMenuBar):
750
816
  self.srcMenu = self.addMenu(self.tr("&Search"))
751
817
 
752
818
  # Search > Find
753
- self.aFind = QAction(self.tr("Find"), self)
819
+ self.aFind = self.srcMenu.addAction(self.tr("Find"))
754
820
  self.aFind.setShortcut("Ctrl+F")
755
821
  self.aFind.triggered.connect(lambda: self.mainGui.docEditor.beginSearch())
756
- self.srcMenu.addAction(self.aFind)
757
822
 
758
823
  # Search > Replace
759
- self.aReplace = QAction(self.tr("Replace"), self)
824
+ self.aReplace = self.srcMenu.addAction(self.tr("Replace"))
760
825
  self.aReplace.setShortcut("Ctrl+=" if CONFIG.osDarwin else "Ctrl+H")
761
826
  self.aReplace.triggered.connect(lambda: self.mainGui.docEditor.beginReplace())
762
- self.srcMenu.addAction(self.aReplace)
763
827
 
764
828
  # Search > Find Next
765
- self.aFindNext = QAction(self.tr("Find Next"), self)
829
+ self.aFindNext = self.srcMenu.addAction(self.tr("Find Next"))
766
830
  self.aFindNext.setShortcuts(["Ctrl+G", "F3"] if CONFIG.osDarwin else ["F3", "Ctrl+G"])
767
831
  self.aFindNext.triggered.connect(lambda: self.mainGui.docEditor.findNext())
768
- self.srcMenu.addAction(self.aFindNext)
769
832
 
770
833
  # Search > Find Prev
771
- self.aFindPrev = QAction(self.tr("Find Previous"), self)
834
+ self.aFindPrev = self.srcMenu.addAction(self.tr("Find Previous"))
772
835
  self.aFindPrev.setShortcuts(
773
836
  ["Ctrl+Shift+G", "Shift+F3"] if CONFIG.osDarwin else ["Shift+F3", "Ctrl+Shift+G"]
774
837
  )
775
838
  self.aFindPrev.triggered.connect(lambda: self.mainGui.docEditor.findNext(goBack=True))
776
- self.srcMenu.addAction(self.aFindPrev)
777
839
 
778
840
  # Search > Replace Next
779
- self.aReplaceNext = QAction(self.tr("Replace Next"), self)
841
+ self.aReplaceNext = self.srcMenu.addAction(self.tr("Replace Next"))
780
842
  self.aReplaceNext.setShortcut("Ctrl+Shift+1")
781
843
  self.aReplaceNext.triggered.connect(lambda: self.mainGui.docEditor.replaceNext())
782
- self.srcMenu.addAction(self.aReplaceNext)
783
844
 
784
845
  return
785
846
 
@@ -789,12 +850,11 @@ class GuiMainMenu(QMenuBar):
789
850
  self.toolsMenu = self.addMenu(self.tr("&Tools"))
790
851
 
791
852
  # Tools > Check Spelling
792
- self.aSpellCheck = QAction(self.tr("Check Spelling"), self)
853
+ self.aSpellCheck = self.toolsMenu.addAction(self.tr("Check Spelling"))
793
854
  self.aSpellCheck.setCheckable(True)
794
855
  self.aSpellCheck.setChecked(SHARED.project.data.spellCheck)
795
856
  self.aSpellCheck.triggered.connect(self._toggleSpellCheck) # triggered, not toggled!
796
857
  self.aSpellCheck.setShortcut("Ctrl+F7")
797
- self.toolsMenu.addAction(self.aSpellCheck)
798
858
 
799
859
  self.mSelectLanguage = self.toolsMenu.addMenu(self.tr("Spell Check Language"))
800
860
  languages = SHARED.spelling.listDictionaries()
@@ -806,51 +866,49 @@ class GuiMainMenu(QMenuBar):
806
866
  self.mSelectLanguage.addAction(aSpell)
807
867
 
808
868
  # Tools > Re-Run Spell Check
809
- self.aReRunSpell = QAction(self.tr("Re-Run Spell Check"), self)
869
+ self.aReRunSpell = self.toolsMenu.addAction(self.tr("Re-Run Spell Check"))
810
870
  self.aReRunSpell.setShortcut("F7")
811
871
  self.aReRunSpell.triggered.connect(lambda: self.mainGui.docEditor.spellCheckDocument())
812
- self.toolsMenu.addAction(self.aReRunSpell)
813
872
 
814
873
  # Tools > Project Word List
815
- self.aEditWordList = QAction(self.tr("Project Word List"), self)
874
+ self.aEditWordList = self.toolsMenu.addAction(self.tr("Project Word List"))
816
875
  self.aEditWordList.triggered.connect(lambda: self.mainGui.showProjectWordListDialog())
817
- self.toolsMenu.addAction(self.aEditWordList)
876
+
877
+ # Tools > Add Dictionaries
878
+ if CONFIG.osWindows or CONFIG.isDebug:
879
+ self.aAddDicts = self.toolsMenu.addAction(self.tr("Add Dictionaries"))
880
+ self.aAddDicts.triggered.connect(self.mainGui.showDictionariesDialog)
818
881
 
819
882
  # Tools > Separator
820
883
  self.toolsMenu.addSeparator()
821
884
 
822
885
  # Tools > Rebuild Index
823
- self.aRebuildIndex = QAction(self.tr("Rebuild Index"), self)
886
+ self.aRebuildIndex = self.toolsMenu.addAction(self.tr("Rebuild Index"))
824
887
  self.aRebuildIndex.setShortcut("F9")
825
888
  self.aRebuildIndex.triggered.connect(lambda: self.mainGui.rebuildIndex())
826
- self.toolsMenu.addAction(self.aRebuildIndex)
827
889
 
828
890
  # Tools > Separator
829
891
  self.toolsMenu.addSeparator()
830
892
 
831
893
  # Tools > Backup Project
832
- self.aBackupProject = QAction(self.tr("Backup Project"), self)
894
+ self.aBackupProject = self.toolsMenu.addAction(self.tr("Backup Project"))
833
895
  self.aBackupProject.triggered.connect(lambda: SHARED.project.backupProject(True))
834
- self.toolsMenu.addAction(self.aBackupProject)
835
896
 
836
897
  # Tools > Build Manuscript
837
- self.aBuildManuscript = QAction(self.tr("Build Manuscript"), self)
898
+ self.aBuildManuscript = self.toolsMenu.addAction(self.tr("Build Manuscript"))
838
899
  self.aBuildManuscript.setShortcut("F5")
839
900
  self.aBuildManuscript.triggered.connect(self.mainGui.showBuildManuscriptDialog)
840
- self.toolsMenu.addAction(self.aBuildManuscript)
841
901
 
842
902
  # Tools > Writing Statistics
843
- self.aWritingStats = QAction(self.tr("Writing Statistics"), self)
903
+ self.aWritingStats = self.toolsMenu.addAction(self.tr("Writing Statistics"))
844
904
  self.aWritingStats.setShortcut("F6")
845
905
  self.aWritingStats.triggered.connect(lambda: self.mainGui.showWritingStatsDialog())
846
- self.toolsMenu.addAction(self.aWritingStats)
847
906
 
848
907
  # Tools > Preferences
849
- self.aPreferences = QAction(self.tr("Preferences"), self)
908
+ self.aPreferences = self.toolsMenu.addAction(self.tr("Preferences"))
850
909
  self.aPreferences.setShortcut("Ctrl+,")
851
910
  self.aPreferences.setMenuRole(QAction.PreferencesRole)
852
911
  self.aPreferences.triggered.connect(lambda: self.mainGui.showPreferencesDialog())
853
- self.toolsMenu.addAction(self.aPreferences)
854
912
 
855
913
  return
856
914
 
@@ -860,58 +918,50 @@ class GuiMainMenu(QMenuBar):
860
918
  self.helpMenu = self.addMenu(self.tr("&Help"))
861
919
 
862
920
  # Help > About
863
- self.aAboutNW = QAction(self.tr("About novelWriter"), self)
921
+ self.aAboutNW = self.helpMenu.addAction(self.tr("About novelWriter"))
864
922
  self.aAboutNW.setMenuRole(QAction.AboutRole)
865
923
  self.aAboutNW.triggered.connect(lambda: self.mainGui.showAboutNWDialog())
866
- self.helpMenu.addAction(self.aAboutNW)
867
924
 
868
925
  # Help > About Qt5
869
- self.aAboutQt = QAction(self.tr("About Qt5"), self)
926
+ self.aAboutQt = self.helpMenu.addAction(self.tr("About Qt5"))
870
927
  self.aAboutQt.setMenuRole(QAction.AboutQtRole)
871
928
  self.aAboutQt.triggered.connect(lambda: self.mainGui.showAboutQtDialog())
872
- self.helpMenu.addAction(self.aAboutQt)
873
929
 
874
930
  # Help > Separator
875
931
  self.helpMenu.addSeparator()
876
932
 
877
933
  # Help > User Manual (Online)
878
- self.aHelpDocs = QAction(self.tr("User Manual (Online)"), self)
934
+ self.aHelpDocs = self.helpMenu.addAction(self.tr("User Manual (Online)"))
879
935
  self.aHelpDocs.setShortcut("F1")
880
936
  self.aHelpDocs.triggered.connect(lambda: self._openWebsite(nwConst.URL_DOCS))
881
- self.helpMenu.addAction(self.aHelpDocs)
882
937
 
883
938
  # Help > User Manual (PDF)
884
939
  if isinstance(CONFIG.pdfDocs, Path):
885
- self.aPdfDocs = QAction(self.tr("User Manual (PDF)"), self)
940
+ self.aPdfDocs = self.helpMenu.addAction(self.tr("User Manual (PDF)"))
886
941
  self.aPdfDocs.setShortcut("Shift+F1")
887
942
  self.aPdfDocs.triggered.connect(self._openUserManualFile)
888
- self.helpMenu.addAction(self.aPdfDocs)
889
943
 
890
944
  # Help > Separator
891
945
  self.helpMenu.addSeparator()
892
946
 
893
947
  # Document > Report an Issue
894
- self.aIssue = QAction(self.tr("Report an Issue (GitHub)"), self)
948
+ self.aIssue = self.helpMenu.addAction(self.tr("Report an Issue (GitHub)"))
895
949
  self.aIssue.triggered.connect(lambda: self._openWebsite(nwConst.URL_REPORT))
896
- self.helpMenu.addAction(self.aIssue)
897
950
 
898
951
  # Document > Ask a Question
899
- self.aQuestion = QAction(self.tr("Ask a Question (GitHub)"), self)
952
+ self.aQuestion = self.helpMenu.addAction(self.tr("Ask a Question (GitHub)"))
900
953
  self.aQuestion.triggered.connect(lambda: self._openWebsite(nwConst.URL_HELP))
901
- self.helpMenu.addAction(self.aQuestion)
902
954
 
903
955
  # Document > Main Website
904
- self.aWebsite = QAction(self.tr("The novelWriter Website"), self)
956
+ self.aWebsite = self.helpMenu.addAction(self.tr("The novelWriter Website"))
905
957
  self.aWebsite.triggered.connect(lambda: self._openWebsite(nwConst.URL_WEB))
906
- self.helpMenu.addAction(self.aWebsite)
907
958
 
908
959
  # Help > Separator
909
960
  self.helpMenu.addSeparator()
910
961
 
911
962
  # Document > Check for Updates
912
- self.aUpdates = QAction(self.tr("Check for New Release"), self)
963
+ self.aUpdates = self.helpMenu.addAction(self.tr("Check for New Release"))
913
964
  self.aUpdates.triggered.connect(lambda: self.mainGui.showUpdatesDialog())
914
- self.helpMenu.addAction(self.aUpdates)
915
965
 
916
966
  return
917
967