novelWriter 2.2rc1__py3-none-any.whl → 2.3__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.
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3.dist-info}/METADATA +1 -1
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3.dist-info}/RECORD +149 -132
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3.dist-info}/WHEEL +1 -1
- novelWriter-2.3.dist-info/entry_points.txt +2 -0
- novelwriter/__init__.py +11 -6
- novelwriter/assets/i18n/nw_de_DE.qm +0 -0
- novelwriter/assets/i18n/nw_en_US.qm +0 -0
- novelwriter/assets/i18n/nw_es_419.qm +0 -0
- novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
- novelwriter/assets/i18n/nw_it_IT.qm +0 -0
- novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
- novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
- novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
- novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
- novelwriter/assets/i18n/project_de_DE.json +1 -0
- novelwriter/assets/i18n/project_en_US.json +1 -0
- novelwriter/assets/i18n/project_es_419.json +11 -0
- novelwriter/assets/i18n/project_fr_FR.json +11 -0
- novelwriter/assets/i18n/project_it_IT.json +11 -0
- novelwriter/assets/i18n/project_ja_JP.json +2 -1
- novelwriter/assets/i18n/project_nb_NO.json +1 -0
- novelwriter/assets/i18n/project_nl_NL.json +11 -0
- novelwriter/assets/i18n/project_pt_BR.json +11 -0
- novelwriter/assets/i18n/project_zh_CN.json +11 -0
- novelwriter/assets/icons/typicons_dark/icons.conf +11 -2
- novelwriter/assets/icons/typicons_dark/mixed_document-new.svg +6 -0
- novelwriter/assets/icons/typicons_dark/mixed_import.svg +5 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +3 -1
- novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +3 -1
- novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +3 -1
- novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +4 -2
- novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +4 -2
- novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +4 -2
- novelwriter/assets/icons/typicons_dark/typ_document-add.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_document.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_th-list.svg +9 -0
- novelwriter/assets/icons/typicons_light/icons.conf +11 -2
- novelwriter/assets/icons/typicons_light/mixed_document-new.svg +6 -0
- novelwriter/assets/icons/typicons_light/mixed_import.svg +5 -0
- novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +3 -1
- novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +3 -1
- novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +3 -1
- novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +4 -2
- novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +4 -2
- novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +4 -2
- novelwriter/assets/icons/typicons_light/typ_document-add.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_document.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_th-list.svg +9 -0
- novelwriter/assets/images/novelwriter-text-dark.svg +4 -0
- novelwriter/assets/images/novelwriter-text-light.svg +4 -0
- novelwriter/assets/images/welcome-dark.jpg +0 -0
- novelwriter/assets/images/welcome-light.jpg +0 -0
- novelwriter/assets/manual.pdf +0 -0
- novelwriter/assets/sample.zip +0 -0
- novelwriter/assets/syntax/cyberpunk_night.conf +26 -0
- novelwriter/assets/syntax/default_dark.conf +1 -0
- novelwriter/assets/syntax/default_light.conf +1 -0
- novelwriter/assets/syntax/grey_dark.conf +1 -0
- novelwriter/assets/syntax/grey_light.conf +1 -0
- novelwriter/assets/syntax/light_owl.conf +1 -0
- novelwriter/assets/syntax/night_owl.conf +1 -0
- novelwriter/assets/syntax/solarized_dark.conf +1 -0
- novelwriter/assets/syntax/solarized_light.conf +1 -0
- novelwriter/assets/syntax/tango.conf +23 -0
- novelwriter/assets/syntax/tomorrow.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
- novelwriter/assets/text/credits_en.htm +4 -2
- novelwriter/assets/themes/cyberpunk_night.conf +29 -0
- novelwriter/assets/themes/default_dark.conf +2 -2
- novelwriter/assets/themes/default_light.conf +2 -2
- novelwriter/common.py +64 -66
- novelwriter/config.py +39 -44
- novelwriter/constants.py +39 -17
- novelwriter/core/buildsettings.py +8 -8
- novelwriter/core/coretools.py +198 -157
- novelwriter/core/docbuild.py +7 -4
- novelwriter/core/document.py +7 -7
- novelwriter/core/index.py +90 -57
- novelwriter/core/item.py +23 -5
- novelwriter/core/options.py +11 -10
- novelwriter/core/project.py +73 -47
- novelwriter/core/projectdata.py +3 -16
- novelwriter/core/projectxml.py +14 -42
- novelwriter/core/sessions.py +4 -3
- novelwriter/core/spellcheck.py +6 -4
- novelwriter/core/status.py +5 -4
- novelwriter/core/storage.py +183 -141
- novelwriter/core/tohtml.py +6 -4
- novelwriter/core/tokenizer.py +110 -83
- novelwriter/core/tomd.py +2 -2
- novelwriter/core/toodt.py +41 -31
- novelwriter/core/tree.py +5 -4
- novelwriter/dialogs/about.py +88 -179
- novelwriter/dialogs/docmerge.py +30 -20
- novelwriter/dialogs/docsplit.py +33 -22
- novelwriter/dialogs/editlabel.py +20 -8
- novelwriter/dialogs/preferences.py +562 -725
- novelwriter/dialogs/{projsettings.py → projectsettings.py} +301 -270
- novelwriter/dialogs/quotes.py +47 -36
- novelwriter/dialogs/wordlist.py +128 -59
- novelwriter/enum.py +25 -22
- novelwriter/error.py +2 -2
- novelwriter/extensions/circularprogress.py +12 -12
- novelwriter/extensions/configlayout.py +185 -146
- novelwriter/extensions/{wheeleventfilter.py → eventfilters.py} +15 -5
- novelwriter/extensions/modified.py +81 -0
- novelwriter/extensions/novelselector.py +27 -13
- novelwriter/extensions/pagedsidebar.py +15 -20
- novelwriter/extensions/simpleprogress.py +8 -9
- novelwriter/extensions/statusled.py +9 -9
- novelwriter/extensions/switch.py +32 -64
- novelwriter/extensions/switchbox.py +2 -7
- novelwriter/extensions/versioninfo.py +153 -0
- novelwriter/gui/doceditor.py +250 -214
- novelwriter/gui/dochighlight.py +66 -94
- novelwriter/gui/docviewer.py +71 -98
- novelwriter/gui/docviewerpanel.py +140 -47
- novelwriter/gui/editordocument.py +3 -3
- novelwriter/gui/itemdetails.py +9 -9
- novelwriter/gui/mainmenu.py +47 -47
- novelwriter/gui/noveltree.py +53 -61
- novelwriter/gui/outline.py +100 -76
- novelwriter/gui/projtree.py +246 -112
- novelwriter/gui/sidebar.py +9 -8
- novelwriter/gui/statusbar.py +49 -7
- novelwriter/gui/theme.py +74 -76
- novelwriter/guimain.py +175 -330
- novelwriter/shared.py +68 -30
- novelwriter/tools/dictionaries.py +7 -8
- novelwriter/tools/lipsum.py +34 -28
- novelwriter/tools/manusbuild.py +3 -4
- novelwriter/tools/manuscript.py +25 -32
- novelwriter/tools/manussettings.py +194 -225
- novelwriter/tools/noveldetails.py +525 -0
- novelwriter/tools/welcome.py +819 -0
- novelwriter/tools/writingstats.py +26 -13
- novelWriter-2.2rc1.dist-info/entry_points.txt +0 -5
- novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +0 -8
- novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +0 -8
- novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +0 -8
- novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +0 -8
- novelwriter/assets/images/wizard-back.jpg +0 -0
- novelwriter/assets/text/gplv3_en.htm +0 -641
- novelwriter/assets/text/release_notes.htm +0 -17
- novelwriter/dialogs/projdetails.py +0 -525
- novelwriter/dialogs/projload.py +0 -298
- novelwriter/dialogs/updates.py +0 -182
- novelwriter/extensions/pageddialog.py +0 -130
- novelwriter/tools/projwizard.py +0 -478
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3.dist-info}/LICENSE.md +0 -0
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3.dist-info}/top_level.txt +0 -0
@@ -6,7 +6,7 @@ File History:
|
|
6
6
|
Created: 2023-11-14 [2.2rc1] GuiDocViewerPanel
|
7
7
|
|
8
8
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
9
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
10
|
|
11
11
|
This program is free software: you can redistribute it and/or modify
|
12
12
|
it under the terms of the GNU General Public License as published by
|
@@ -29,8 +29,8 @@ from enum import Enum
|
|
29
29
|
|
30
30
|
from PyQt5.QtCore import QModelIndex, QSize, Qt, pyqtSignal, pyqtSlot
|
31
31
|
from PyQt5.QtWidgets import (
|
32
|
-
QAbstractItemView, QFrame, QHeaderView, QTabWidget,
|
33
|
-
QTreeWidgetItem, QVBoxLayout, QWidget
|
32
|
+
QAbstractItemView, QFrame, QHeaderView, QMenu, QTabWidget, QToolButton,
|
33
|
+
QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
|
34
34
|
)
|
35
35
|
|
36
36
|
from novelwriter import CONFIG, SHARED
|
@@ -54,10 +54,24 @@ class GuiDocViewerPanel(QWidget):
|
|
54
54
|
|
55
55
|
self._lastHandle = None
|
56
56
|
|
57
|
+
iPx = int(1.0*SHARED.theme.baseIconSize)
|
58
|
+
|
57
59
|
self.tabBackRefs = _ViewPanelBackRefs(self)
|
58
60
|
|
61
|
+
self.optsMenu = QMenu(self)
|
62
|
+
|
63
|
+
self.aInactive = self.optsMenu.addAction(self.tr("Hide Inactive Tags"))
|
64
|
+
self.aInactive.setCheckable(True)
|
65
|
+
self.aInactive.toggled.connect(self._toggleHideInactive)
|
66
|
+
|
67
|
+
self.optsButton = QToolButton(self)
|
68
|
+
self.optsButton.setIconSize(QSize(iPx, iPx))
|
69
|
+
self.optsButton.setMenu(self.optsMenu)
|
70
|
+
self.optsButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
|
71
|
+
|
59
72
|
self.mainTabs = QTabWidget(self)
|
60
|
-
self.mainTabs.addTab(self.tabBackRefs, self.tr("
|
73
|
+
self.mainTabs.addTab(self.tabBackRefs, self.tr("References"))
|
74
|
+
self.mainTabs.setCornerWidget(self.optsButton, Qt.Corner.TopLeftCorner)
|
61
75
|
|
62
76
|
self.kwTabs: dict[str, _ViewPanelKeyWords] = {}
|
63
77
|
self.idTabs: dict[str, int] = {}
|
@@ -73,7 +87,7 @@ class GuiDocViewerPanel(QWidget):
|
|
73
87
|
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
74
88
|
|
75
89
|
self.setLayout(self.outerBox)
|
76
|
-
self.updateTheme()
|
90
|
+
self.updateTheme(updateTabs=False)
|
77
91
|
|
78
92
|
logger.debug("Ready: GuiDocViewerPanel")
|
79
93
|
|
@@ -83,42 +97,57 @@ class GuiDocViewerPanel(QWidget):
|
|
83
97
|
# Methods
|
84
98
|
##
|
85
99
|
|
86
|
-
def updateTheme(self) -> None:
|
100
|
+
def updateTheme(self, updateTabs: bool = True) -> None:
|
87
101
|
"""Update theme elements."""
|
102
|
+
qPalette = self.palette()
|
103
|
+
mPx = CONFIG.pxInt(2)
|
88
104
|
vPx = CONFIG.pxInt(4)
|
89
|
-
|
90
|
-
|
91
|
-
|
105
|
+
hPx = CONFIG.pxInt(8)
|
106
|
+
hCol = qPalette.highlight().color()
|
107
|
+
fCol = qPalette.text().color()
|
108
|
+
|
109
|
+
buttonStyle = (
|
110
|
+
"QToolButton {{padding: {0}px; margin: 0 0 {1}px 0; border: none; "
|
111
|
+
"background: transparent;}} "
|
112
|
+
"QToolButton:hover {{border: none; background: rgba({2}, {3}, {4}, 0.2);}} "
|
113
|
+
"QToolButton::menu-indicator {{image: none;}} "
|
114
|
+
).format(mPx, mPx, fCol.red(), fCol.green(), fCol.blue())
|
115
|
+
self.optsButton.setIcon(SHARED.theme.getIcon("menu"))
|
116
|
+
self.optsButton.setStyleSheet(buttonStyle)
|
92
117
|
|
93
118
|
styleSheet = (
|
94
|
-
"QTabWidget::pane {border: 0;} "
|
95
|
-
"QTabWidget QTabBar::tab {"
|
96
|
-
|
97
|
-
|
98
|
-
"QTabWidget QTabBar::tab:selected {"
|
99
|
-
f"color: rgb({hCol.red()}, {hCol.green()}, {hCol.blue()});"
|
100
|
-
"} "
|
101
|
-
)
|
119
|
+
"QTabWidget::pane {{border: 0;}} "
|
120
|
+
"QTabWidget QTabBar::tab {{border: 0; padding: {0}px {1}px;}} "
|
121
|
+
"QTabWidget QTabBar::tab:selected {{color: rgb({2}, {3}, {4});}} "
|
122
|
+
).format(vPx, hPx, hCol.red(), hCol.green(), hCol.blue())
|
102
123
|
self.mainTabs.setStyleSheet(styleSheet)
|
103
124
|
self.updateHandle(self._lastHandle)
|
104
125
|
|
126
|
+
if updateTabs:
|
127
|
+
self.tabBackRefs.updateTheme()
|
128
|
+
for tab in self.kwTabs.values():
|
129
|
+
tab.updateTheme()
|
130
|
+
|
105
131
|
return
|
106
132
|
|
107
133
|
def openProjectTasks(self) -> None:
|
108
134
|
"""Run open project tasks."""
|
109
|
-
|
110
|
-
|
111
|
-
|
135
|
+
colWidths = SHARED.project.options.getValue("GuiDocViewerPanel", "colWidths", {})
|
136
|
+
hideInactive = SHARED.project.options.getBool("GuiDocViewerPanel", "hideInactive", False)
|
137
|
+
self.aInactive.setChecked(hideInactive)
|
138
|
+
if isinstance(colWidths, dict):
|
139
|
+
for key, value in colWidths.items():
|
112
140
|
if key in self.kwTabs and isinstance(value, list):
|
113
141
|
self.kwTabs[key].setColumnWidths(value)
|
114
142
|
return
|
115
143
|
|
116
144
|
def closeProjectTasks(self) -> None:
|
117
145
|
"""Run close project tasks."""
|
118
|
-
|
119
|
-
for
|
120
|
-
|
121
|
-
SHARED.project.options.setValue("GuiDocViewerPanel", "colWidths",
|
146
|
+
logger.debug("Saving State: GuiDocViewerPanel")
|
147
|
+
colWidths = {k: t.getColumnWidths() for k, t in self.kwTabs.items()}
|
148
|
+
hideInactive = self.aInactive.isChecked()
|
149
|
+
SHARED.project.options.setValue("GuiDocViewerPanel", "colWidths", colWidths)
|
150
|
+
SHARED.project.options.setValue("GuiDocViewerPanel", "hideInactive", hideInactive)
|
122
151
|
return
|
123
152
|
|
124
153
|
##
|
@@ -136,9 +165,7 @@ class GuiDocViewerPanel(QWidget):
|
|
136
165
|
@pyqtSlot()
|
137
166
|
def indexHasAppeared(self) -> None:
|
138
167
|
"""Handle event when the index has appeared."""
|
139
|
-
|
140
|
-
if tClass in self.kwTabs and iItem and hItem:
|
141
|
-
self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem)
|
168
|
+
self._loadAllTags()
|
142
169
|
self._updateTabVisibility()
|
143
170
|
self.updateHandle(self._lastHandle)
|
144
171
|
return
|
@@ -147,10 +174,15 @@ class GuiDocViewerPanel(QWidget):
|
|
147
174
|
def projectItemChanged(self, tHandle: str) -> None:
|
148
175
|
"""Update meta data for project item."""
|
149
176
|
self.tabBackRefs.refreshDocument(tHandle)
|
177
|
+
activeOnly = self.aInactive.isChecked()
|
150
178
|
for key in SHARED.project.index.getDocumentTags(tHandle):
|
151
179
|
name, tClass, iItem, hItem = SHARED.project.index.getSingleTag(key)
|
152
180
|
if tClass in self.kwTabs and iItem and hItem:
|
153
|
-
|
181
|
+
if not activeOnly or (iItem and iItem.item.isActive):
|
182
|
+
self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem)
|
183
|
+
else:
|
184
|
+
self.kwTabs[tClass].removeEntry(key)
|
185
|
+
self._updateTabVisibility()
|
154
186
|
return
|
155
187
|
|
156
188
|
@pyqtSlot(str)
|
@@ -176,6 +208,20 @@ class GuiDocViewerPanel(QWidget):
|
|
176
208
|
self._updateTabVisibility()
|
177
209
|
return
|
178
210
|
|
211
|
+
##
|
212
|
+
# Private Slots
|
213
|
+
##
|
214
|
+
|
215
|
+
@pyqtSlot(bool)
|
216
|
+
def _toggleHideInactive(self, state: bool) -> None:
|
217
|
+
"""Process toggling of active/inactive visibility."""
|
218
|
+
logger.debug("Setting inactive items to %s", "hidden" if state else "visible")
|
219
|
+
for cTab in self.kwTabs.values():
|
220
|
+
cTab.clearContent()
|
221
|
+
self._loadAllTags()
|
222
|
+
self._updateTabVisibility()
|
223
|
+
return
|
224
|
+
|
179
225
|
##
|
180
226
|
# Internal Functions
|
181
227
|
##
|
@@ -187,6 +233,14 @@ class GuiDocViewerPanel(QWidget):
|
|
187
233
|
self.mainTabs.setTabVisible(self.idTabs[tClass], cTab.countEntries() > 0)
|
188
234
|
return
|
189
235
|
|
236
|
+
def _loadAllTags(self) -> None:
|
237
|
+
"""Load all tags into the tabs."""
|
238
|
+
data = SHARED.project.index.getTagsData(activeOnly=self.aInactive.isChecked())
|
239
|
+
for key, name, tClass, iItem, hItem in data:
|
240
|
+
if tClass in self.kwTabs and iItem and hItem:
|
241
|
+
self.kwTabs[tClass].addUpdateEntry(key, name, iItem, hItem)
|
242
|
+
return
|
243
|
+
|
190
244
|
# END Class GuiDocViewerPanel
|
191
245
|
|
192
246
|
|
@@ -218,12 +272,14 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|
218
272
|
# Set Header Sizes
|
219
273
|
treeHeader = self.header()
|
220
274
|
treeHeader.setStretchLastSection(True)
|
275
|
+
treeHeader.setMinimumSectionSize(iPx + cMg) # See Issue #1627
|
221
276
|
treeHeader.setSectionResizeMode(self.C_DOC, QHeaderView.ResizeMode.ResizeToContents)
|
222
277
|
treeHeader.setSectionResizeMode(self.C_EDIT, QHeaderView.ResizeMode.Fixed)
|
223
278
|
treeHeader.setSectionResizeMode(self.C_VIEW, QHeaderView.ResizeMode.Fixed)
|
224
279
|
treeHeader.setSectionResizeMode(self.C_TITLE, QHeaderView.ResizeMode.ResizeToContents)
|
225
280
|
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
|
226
281
|
treeHeader.resizeSection(self.C_VIEW, iPx + cMg)
|
282
|
+
treeHeader.setSectionsMovable(False)
|
227
283
|
|
228
284
|
# Cache Icons Locally
|
229
285
|
self._editIcon = SHARED.theme.getIcon("edit")
|
@@ -235,6 +291,16 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|
235
291
|
|
236
292
|
return
|
237
293
|
|
294
|
+
def updateTheme(self) -> None:
|
295
|
+
"""Update theme elements."""
|
296
|
+
self._editIcon = SHARED.theme.getIcon("edit")
|
297
|
+
self._viewIcon = SHARED.theme.getIcon("view")
|
298
|
+
for i in range(self.topLevelItemCount()):
|
299
|
+
if item := self.topLevelItem(i):
|
300
|
+
item.setIcon(self.C_EDIT, self._editIcon)
|
301
|
+
item.setIcon(self.C_VIEW, self._viewIcon)
|
302
|
+
return
|
303
|
+
|
238
304
|
def clearContent(self) -> None:
|
239
305
|
"""Clear the widget."""
|
240
306
|
self.clear()
|
@@ -276,7 +342,7 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|
276
342
|
def _treeItemDoubleClicked(self, index: QModelIndex) -> None:
|
277
343
|
"""Emit follow tag signal on user double click."""
|
278
344
|
tHandle = index.siblingAtColumn(self.C_DATA).data(self.D_HANDLE)
|
279
|
-
if index.column()
|
345
|
+
if index.column() not in (self.C_EDIT, self.C_VIEW):
|
280
346
|
self._parent.openDocumentRequest.emit(tHandle, nwDocMode.VIEW, "", True)
|
281
347
|
return
|
282
348
|
|
@@ -299,10 +365,12 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|
299
365
|
|
300
366
|
trItem.setIcon(self.C_DOC, docIcon)
|
301
367
|
trItem.setText(self.C_DOC, nwItem.itemName)
|
368
|
+
trItem.setToolTip(self.C_DOC, nwItem.itemName)
|
302
369
|
trItem.setIcon(self.C_EDIT, self._editIcon)
|
303
370
|
trItem.setIcon(self.C_VIEW, self._viewIcon)
|
304
|
-
trItem.setText(self.C_TITLE, hItem.title)
|
305
371
|
trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec)
|
372
|
+
trItem.setText(self.C_TITLE, hItem.title)
|
373
|
+
trItem.setToolTip(self.C_TITLE, hItem.title)
|
306
374
|
trItem.setData(self.C_DATA, self.D_HANDLE, tHandle)
|
307
375
|
|
308
376
|
if tKey not in self._treeMap:
|
@@ -316,13 +384,14 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|
316
384
|
|
317
385
|
class _ViewPanelKeyWords(QTreeWidget):
|
318
386
|
|
319
|
-
C_DATA
|
320
|
-
C_NAME
|
321
|
-
C_EDIT
|
322
|
-
C_VIEW
|
323
|
-
|
324
|
-
|
325
|
-
|
387
|
+
C_DATA = 0
|
388
|
+
C_NAME = 0
|
389
|
+
C_EDIT = 1
|
390
|
+
C_VIEW = 2
|
391
|
+
C_IMPORT = 3
|
392
|
+
C_DOC = 4
|
393
|
+
C_TITLE = 5
|
394
|
+
C_SHORT = 6
|
326
395
|
|
327
396
|
D_TAG = Qt.ItemDataRole.UserRole
|
328
397
|
|
@@ -330,13 +399,14 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|
330
399
|
super().__init__(parent=parent)
|
331
400
|
|
332
401
|
self._parent = parent
|
402
|
+
self._class = itemClass
|
333
403
|
self._treeMap: dict[str, QTreeWidgetItem] = {}
|
334
404
|
|
335
405
|
iPx = SHARED.theme.baseIconSize
|
336
406
|
cMg = CONFIG.pxInt(6)
|
337
407
|
|
338
408
|
self.setHeaderLabels([
|
339
|
-
self.tr("Tag"), "", "", self.tr("Document"),
|
409
|
+
self.tr("Tag"), "", "", self.tr("Importance"), self.tr("Document"),
|
340
410
|
self.tr("Heading"), self.tr("Short Description")
|
341
411
|
])
|
342
412
|
self.setIndentation(0)
|
@@ -351,7 +421,7 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|
351
421
|
# Set Header Sizes
|
352
422
|
treeHeader = self.header()
|
353
423
|
treeHeader.setStretchLastSection(True)
|
354
|
-
treeHeader.
|
424
|
+
treeHeader.setMinimumSectionSize(iPx + cMg) # See Issue #1627
|
355
425
|
treeHeader.setSectionResizeMode(self.C_EDIT, QHeaderView.ResizeMode.Fixed)
|
356
426
|
treeHeader.setSectionResizeMode(self.C_VIEW, QHeaderView.ResizeMode.Fixed)
|
357
427
|
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
|
@@ -369,6 +439,17 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|
369
439
|
|
370
440
|
return
|
371
441
|
|
442
|
+
def updateTheme(self) -> None:
|
443
|
+
"""Update theme elements."""
|
444
|
+
self._classIcon = SHARED.theme.getIcon(nwLabels.CLASS_ICON[self._class])
|
445
|
+
self._editIcon = SHARED.theme.getIcon("edit")
|
446
|
+
self._viewIcon = SHARED.theme.getIcon("view")
|
447
|
+
for i in range(self.topLevelItemCount()):
|
448
|
+
if item := self.topLevelItem(i):
|
449
|
+
item.setIcon(self.C_EDIT, self._editIcon)
|
450
|
+
item.setIcon(self.C_VIEW, self._viewIcon)
|
451
|
+
return
|
452
|
+
|
372
453
|
def countEntries(self) -> int:
|
373
454
|
"""Return the number of items in the list."""
|
374
455
|
return self.topLevelItemCount()
|
@@ -386,22 +467,30 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|
386
467
|
nwItem.itemType, nwItem.itemClass,
|
387
468
|
nwItem.itemLayout, nwItem.mainHeading
|
388
469
|
)
|
470
|
+
impLabel, impIcon = nwItem.getImportStatus(incIcon=True)
|
389
471
|
iLevel = nwHeaders.H_LEVEL.get(hItem.level, 0) if nwItem.isDocumentLayout() else 5
|
390
472
|
hDec = SHARED.theme.getHeaderDecorationNarrow(iLevel)
|
391
473
|
|
392
|
-
# This can not use a get call to the dictionary as that
|
393
|
-
#
|
474
|
+
# This can not use a get call to the dictionary as that would create an
|
475
|
+
# instance of the QTreeWidgetItem, which has some weird side effects
|
394
476
|
trItem = self._treeMap[tag] if tag in self._treeMap else QTreeWidgetItem()
|
395
477
|
|
396
|
-
trItem.setText(self.C_NAME, name)
|
397
478
|
trItem.setIcon(self.C_NAME, self._classIcon)
|
479
|
+
trItem.setText(self.C_NAME, name)
|
480
|
+
trItem.setToolTip(self.C_NAME, name)
|
398
481
|
trItem.setIcon(self.C_EDIT, self._editIcon)
|
399
482
|
trItem.setIcon(self.C_VIEW, self._viewIcon)
|
483
|
+
trItem.setIcon(self.C_IMPORT, impIcon)
|
484
|
+
trItem.setText(self.C_IMPORT, impLabel)
|
485
|
+
trItem.setToolTip(self.C_IMPORT, impLabel)
|
400
486
|
trItem.setIcon(self.C_DOC, docIcon)
|
401
487
|
trItem.setText(self.C_DOC, nwItem.itemName)
|
402
|
-
trItem.
|
488
|
+
trItem.setToolTip(self.C_DOC, nwItem.itemName)
|
403
489
|
trItem.setData(self.C_TITLE, Qt.ItemDataRole.DecorationRole, hDec)
|
490
|
+
trItem.setText(self.C_TITLE, hItem.title)
|
491
|
+
trItem.setToolTip(self.C_TITLE, hItem.title)
|
404
492
|
trItem.setText(self.C_SHORT, hItem.synopsis)
|
493
|
+
trItem.setToolTip(self.C_SHORT, hItem.synopsis)
|
405
494
|
trItem.setData(self.C_DATA, self.D_TAG, tag)
|
406
495
|
|
407
496
|
if tag not in self._treeMap:
|
@@ -420,14 +509,18 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|
420
509
|
|
421
510
|
def setColumnWidths(self, widths: list[int]) -> None:
|
422
511
|
"""Set the column widths."""
|
423
|
-
if isinstance(widths, list) and len(widths) >=
|
424
|
-
self.setColumnWidth(self.
|
425
|
-
self.setColumnWidth(self.
|
512
|
+
if isinstance(widths, list) and len(widths) >= 4:
|
513
|
+
self.setColumnWidth(self.C_NAME, CONFIG.pxInt(checkInt(widths[0], 100)))
|
514
|
+
self.setColumnWidth(self.C_IMPORT, CONFIG.pxInt(checkInt(widths[1], 100)))
|
515
|
+
self.setColumnWidth(self.C_DOC, CONFIG.pxInt(checkInt(widths[2], 100)))
|
516
|
+
self.setColumnWidth(self.C_TITLE, CONFIG.pxInt(checkInt(widths[3], 100)))
|
426
517
|
return
|
427
518
|
|
428
519
|
def getColumnWidths(self) -> list[int]:
|
429
520
|
"""Get the widths of the user-adjustable columns."""
|
430
521
|
return [
|
522
|
+
CONFIG.rpxInt(self.columnWidth(self.C_NAME)),
|
523
|
+
CONFIG.rpxInt(self.columnWidth(self.C_IMPORT)),
|
431
524
|
CONFIG.rpxInt(self.columnWidth(self.C_DOC)),
|
432
525
|
CONFIG.rpxInt(self.columnWidth(self.C_TITLE)),
|
433
526
|
]
|
@@ -450,7 +543,7 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|
450
543
|
def _treeItemDoubleClicked(self, index: QModelIndex) -> None:
|
451
544
|
"""Emit follow tag signal on user double click."""
|
452
545
|
tag = index.siblingAtColumn(self.C_DATA).data(self.D_TAG)
|
453
|
-
if index.column()
|
546
|
+
if index.column() not in (self.C_EDIT, self.C_VIEW):
|
454
547
|
self._parent.loadDocumentTagRequest.emit(tag, nwDocMode.VIEW)
|
455
548
|
return
|
456
549
|
|
@@ -3,10 +3,10 @@ novelWriter – GUI Text Document
|
|
3
3
|
===============================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created: 2023-09-07 [2.2b1]
|
6
|
+
Created: 2023-09-07 [2.2b1] GuiTextDocument
|
7
7
|
|
8
8
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
9
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
10
|
|
11
11
|
This program is free software: you can redistribute it and/or modify
|
12
12
|
it under the terms of the GNU General Public License as published by
|
@@ -50,7 +50,7 @@ class GuiTextDocument(QTextDocument):
|
|
50
50
|
|
51
51
|
return
|
52
52
|
|
53
|
-
def __del__(self): # pragma: no cover
|
53
|
+
def __del__(self) -> None: # pragma: no cover
|
54
54
|
logger.debug("Delete: GuiTextDocument")
|
55
55
|
return
|
56
56
|
|
novelwriter/gui/itemdetails.py
CHANGED
@@ -3,10 +3,10 @@ novelWriter – GUI Item Details Panel
|
|
3
3
|
====================================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created: 2019-04-24 [0.0.1]
|
6
|
+
Created: 2019-04-24 [0.0.1] GuiItemDetails
|
7
7
|
|
8
8
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
9
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
10
|
|
11
11
|
This program is free software: you can redistribute it and/or modify
|
12
12
|
it under the terms of the GNU General Public License as published by
|
@@ -239,9 +239,9 @@ class GuiItemDetails(QWidget):
|
|
239
239
|
# Label
|
240
240
|
# =====
|
241
241
|
|
242
|
-
|
243
|
-
if len(
|
244
|
-
|
242
|
+
label = nwItem.itemName
|
243
|
+
if len(label) > 100:
|
244
|
+
label = label[:96].rstrip()+" ..."
|
245
245
|
|
246
246
|
if nwItem.isFileType():
|
247
247
|
if nwItem.isActive:
|
@@ -251,14 +251,14 @@ class GuiItemDetails(QWidget):
|
|
251
251
|
else:
|
252
252
|
self.labelIcon.setPixmap(SHARED.theme.getPixmap("noncheckable", (iPx, iPx)))
|
253
253
|
|
254
|
-
self.labelData.setText(
|
254
|
+
self.labelData.setText(label)
|
255
255
|
|
256
256
|
# Status
|
257
257
|
# ======
|
258
258
|
|
259
|
-
|
260
|
-
self.statusIcon.setPixmap(
|
261
|
-
self.statusData.setText(
|
259
|
+
status, icon = nwItem.getImportStatus(incIcon=True)
|
260
|
+
self.statusIcon.setPixmap(icon.pixmap(iPx, iPx))
|
261
|
+
self.statusData.setText(status)
|
262
262
|
|
263
263
|
# Class
|
264
264
|
# =====
|
novelwriter/gui/mainmenu.py
CHANGED
@@ -3,10 +3,10 @@ novelWriter – GUI Main Menu
|
|
3
3
|
===========================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created: 2019-04-27 [0.0.1]
|
6
|
+
Created: 2019-04-27 [0.0.1] GuiMainMenu
|
7
7
|
|
8
8
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
9
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
10
|
|
11
11
|
This program is free software: you can redistribute it and/or modify
|
12
12
|
it under the terms of the GNU General Public License as published by
|
@@ -36,6 +36,7 @@ from novelwriter import CONFIG, SHARED
|
|
36
36
|
from novelwriter.enum import nwDocAction, nwDocInsert, nwWidget
|
37
37
|
from novelwriter.common import openExternalPath
|
38
38
|
from novelwriter.constants import nwConst, trConst, nwKeyWords, nwLabels, nwUnicode
|
39
|
+
from novelwriter.extensions.eventfilters import StatusTipFilter
|
39
40
|
|
40
41
|
if TYPE_CHECKING: # pragma: no cover
|
41
42
|
from novelwriter.guimain import GuiMain
|
@@ -73,6 +74,8 @@ class GuiMainMenu(QMenuBar):
|
|
73
74
|
self._buildToolsMenu()
|
74
75
|
self._buildHelpMenu()
|
75
76
|
|
77
|
+
self.installEventFilter(StatusTipFilter(mainGui))
|
78
|
+
|
76
79
|
logger.debug("Ready: GuiMainMenu")
|
77
80
|
|
78
81
|
return
|
@@ -129,14 +132,10 @@ class GuiMainMenu(QMenuBar):
|
|
129
132
|
# Project
|
130
133
|
self.projMenu = self.addMenu(self.tr("&Project"))
|
131
134
|
|
132
|
-
# Project >
|
133
|
-
self.
|
134
|
-
self.aNewProject.triggered.connect(lambda: self.mainGui.newProject(None))
|
135
|
-
|
136
|
-
# Project > Open Project
|
137
|
-
self.aOpenProject = self.projMenu.addAction(self.tr("Open Project"))
|
135
|
+
# Project > Create or Open Project
|
136
|
+
self.aOpenProject = self.projMenu.addAction(self.tr("Create or Open Project"))
|
138
137
|
self.aOpenProject.setShortcut("Ctrl+Shift+O")
|
139
|
-
self.aOpenProject.triggered.connect(
|
138
|
+
self.aOpenProject.triggered.connect(self.mainGui.showWelcomeDialog)
|
140
139
|
|
141
140
|
# Project > Save Project
|
142
141
|
self.aSaveProject = self.projMenu.addAction(self.tr("Save Project"))
|
@@ -154,12 +153,12 @@ class GuiMainMenu(QMenuBar):
|
|
154
153
|
# Project > Project Settings
|
155
154
|
self.aProjectSettings = self.projMenu.addAction(self.tr("Project Settings"))
|
156
155
|
self.aProjectSettings.setShortcut("Ctrl+Shift+,")
|
157
|
-
self.aProjectSettings.triggered.connect(
|
156
|
+
self.aProjectSettings.triggered.connect(self.mainGui.showProjectSettingsDialog)
|
158
157
|
|
159
|
-
# Project >
|
160
|
-
self.
|
161
|
-
self.
|
162
|
-
self.
|
158
|
+
# Project > Novel Details
|
159
|
+
self.aNovelDetails = self.projMenu.addAction(self.tr("Novel Details"))
|
160
|
+
self.aNovelDetails.setShortcut("Shift+F6")
|
161
|
+
self.aNovelDetails.triggered.connect(self.mainGui.showNovelDetailsDialog)
|
163
162
|
|
164
163
|
# Project > Separator
|
165
164
|
self.projMenu.addSeparator()
|
@@ -231,7 +230,6 @@ class GuiMainMenu(QMenuBar):
|
|
231
230
|
|
232
231
|
# Document > Import From File
|
233
232
|
self.aImportFile = self.docuMenu.addAction(self.tr("Import Text from File"))
|
234
|
-
self.aImportFile.setShortcut("Ctrl+Shift+I")
|
235
233
|
self.aImportFile.triggered.connect(lambda: self.mainGui.importDocument())
|
236
234
|
|
237
235
|
return
|
@@ -566,7 +564,7 @@ class GuiMainMenu(QMenuBar):
|
|
566
564
|
|
567
565
|
# Insert > Short Description Comment
|
568
566
|
self.aInsShort = self.mInsComments.addAction(self.tr("Short Description Comment"))
|
569
|
-
self.aInsShort.setShortcut("Ctrl+K,
|
567
|
+
self.aInsShort.setShortcut("Ctrl+K, H")
|
570
568
|
self.aInsShort.triggered.connect(
|
571
569
|
lambda: self.requestDocInsert.emit(nwDocInsert.SHORT)
|
572
570
|
)
|
@@ -593,8 +591,10 @@ class GuiMainMenu(QMenuBar):
|
|
593
591
|
)
|
594
592
|
|
595
593
|
# Insert > Placeholder Text
|
596
|
-
self.aLipsumText = self.
|
597
|
-
self.aLipsumText.triggered.connect(
|
594
|
+
self.aLipsumText = self.insMenu.addAction(self.tr("Placeholder Text"))
|
595
|
+
self.aLipsumText.triggered.connect(
|
596
|
+
lambda: self.requestDocInsert.emit(nwDocInsert.LIPSUM)
|
597
|
+
)
|
598
598
|
|
599
599
|
return
|
600
600
|
|
@@ -603,25 +603,25 @@ class GuiMainMenu(QMenuBar):
|
|
603
603
|
# Format
|
604
604
|
self.fmtMenu = self.addMenu(self.tr("&Format"))
|
605
605
|
|
606
|
-
# Format >
|
607
|
-
self.
|
608
|
-
self.
|
609
|
-
self.
|
610
|
-
lambda: self.requestDocAction.emit(nwDocAction.
|
606
|
+
# Format > Bold
|
607
|
+
self.aFmtBold = self.fmtMenu.addAction(self.tr("Bold"))
|
608
|
+
self.aFmtBold.setShortcut("Ctrl+B")
|
609
|
+
self.aFmtBold.triggered.connect(
|
610
|
+
lambda: self.requestDocAction.emit(nwDocAction.MD_BOLD)
|
611
611
|
)
|
612
612
|
|
613
|
-
# Format >
|
614
|
-
self.
|
615
|
-
self.
|
616
|
-
self.
|
617
|
-
lambda: self.requestDocAction.emit(nwDocAction.
|
613
|
+
# Format > Italic
|
614
|
+
self.aFmtItalic = self.fmtMenu.addAction(self.tr("Italic"))
|
615
|
+
self.aFmtItalic.setShortcut("Ctrl+I")
|
616
|
+
self.aFmtItalic.triggered.connect(
|
617
|
+
lambda: self.requestDocAction.emit(nwDocAction.MD_ITALIC)
|
618
618
|
)
|
619
619
|
|
620
620
|
# Format > Strikethrough
|
621
621
|
self.aFmtStrike = self.fmtMenu.addAction(self.tr("Strikethrough"))
|
622
622
|
self.aFmtStrike.setShortcut("Ctrl+D")
|
623
623
|
self.aFmtStrike.triggered.connect(
|
624
|
-
lambda: self.requestDocAction.emit(nwDocAction.
|
624
|
+
lambda: self.requestDocAction.emit(nwDocAction.MD_STRIKE)
|
625
625
|
)
|
626
626
|
|
627
627
|
# Edit > Separator
|
@@ -647,18 +647,18 @@ class GuiMainMenu(QMenuBar):
|
|
647
647
|
# Shortcodes
|
648
648
|
self.mShortcodes = self.fmtMenu.addMenu(self.tr("More Formats ..."))
|
649
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
650
|
# Shortcode Bold
|
657
651
|
self.aScBold = self.mShortcodes.addAction(self.tr("Bold (Shortcode)"))
|
658
652
|
self.aScBold.triggered.connect(
|
659
653
|
lambda: self.requestDocAction.emit(nwDocAction.SC_BOLD)
|
660
654
|
)
|
661
655
|
|
656
|
+
# Shortcode Italic
|
657
|
+
self.aScItalic = self.mShortcodes.addAction(self.tr("Italics (Shortcode)"))
|
658
|
+
self.aScItalic.triggered.connect(
|
659
|
+
lambda: self.requestDocAction.emit(nwDocAction.SC_ITALIC)
|
660
|
+
)
|
661
|
+
|
662
662
|
# Shortcode Strikethrough
|
663
663
|
self.aScStrike = self.mShortcodes.addAction(self.tr("Strikethrough (Shortcode)"))
|
664
664
|
self.aScStrike.triggered.connect(
|
@@ -780,6 +780,13 @@ class GuiMainMenu(QMenuBar):
|
|
780
780
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_COM)
|
781
781
|
)
|
782
782
|
|
783
|
+
# Format > Ignore Text
|
784
|
+
self.aFmtIgnore = self.fmtMenu.addAction(self.tr("Toggle Ignore Text"))
|
785
|
+
self.aFmtIgnore.setShortcut("Ctrl+Shift+D")
|
786
|
+
self.aFmtIgnore.triggered.connect(
|
787
|
+
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_IGN)
|
788
|
+
)
|
789
|
+
|
783
790
|
# Format > Remove Block Format
|
784
791
|
self.aFmtNoFormat = self.fmtMenu.addAction(self.tr("Remove Block Format"))
|
785
792
|
self.aFmtNoFormat.setShortcuts(["Ctrl+0", "Ctrl+Shift+/"])
|
@@ -872,7 +879,7 @@ class GuiMainMenu(QMenuBar):
|
|
872
879
|
|
873
880
|
# Tools > Project Word List
|
874
881
|
self.aEditWordList = self.toolsMenu.addAction(self.tr("Project Word List"))
|
875
|
-
self.aEditWordList.triggered.connect(
|
882
|
+
self.aEditWordList.triggered.connect(self.mainGui.showProjectWordListDialog)
|
876
883
|
|
877
884
|
# Tools > Add Dictionaries
|
878
885
|
if CONFIG.osWindows or CONFIG.isDebug:
|
@@ -902,13 +909,13 @@ class GuiMainMenu(QMenuBar):
|
|
902
909
|
# Tools > Writing Statistics
|
903
910
|
self.aWritingStats = self.toolsMenu.addAction(self.tr("Writing Statistics"))
|
904
911
|
self.aWritingStats.setShortcut("F6")
|
905
|
-
self.aWritingStats.triggered.connect(
|
912
|
+
self.aWritingStats.triggered.connect(self.mainGui.showWritingStatsDialog)
|
906
913
|
|
907
914
|
# Tools > Preferences
|
908
915
|
self.aPreferences = self.toolsMenu.addAction(self.tr("Preferences"))
|
909
916
|
self.aPreferences.setShortcut("Ctrl+,")
|
910
917
|
self.aPreferences.setMenuRole(QAction.PreferencesRole)
|
911
|
-
self.aPreferences.triggered.connect(
|
918
|
+
self.aPreferences.triggered.connect(self.mainGui.showPreferencesDialog)
|
912
919
|
|
913
920
|
return
|
914
921
|
|
@@ -920,12 +927,12 @@ class GuiMainMenu(QMenuBar):
|
|
920
927
|
# Help > About
|
921
928
|
self.aAboutNW = self.helpMenu.addAction(self.tr("About novelWriter"))
|
922
929
|
self.aAboutNW.setMenuRole(QAction.AboutRole)
|
923
|
-
self.aAboutNW.triggered.connect(
|
930
|
+
self.aAboutNW.triggered.connect(self.mainGui.showAboutNWDialog)
|
924
931
|
|
925
932
|
# Help > About Qt5
|
926
933
|
self.aAboutQt = self.helpMenu.addAction(self.tr("About Qt5"))
|
927
934
|
self.aAboutQt.setMenuRole(QAction.AboutQtRole)
|
928
|
-
self.aAboutQt.triggered.connect(
|
935
|
+
self.aAboutQt.triggered.connect(self.mainGui.showAboutQtDialog)
|
929
936
|
|
930
937
|
# Help > Separator
|
931
938
|
self.helpMenu.addSeparator()
|
@@ -956,13 +963,6 @@ class GuiMainMenu(QMenuBar):
|
|
956
963
|
self.aWebsite = self.helpMenu.addAction(self.tr("The novelWriter Website"))
|
957
964
|
self.aWebsite.triggered.connect(lambda: self._openWebsite(nwConst.URL_WEB))
|
958
965
|
|
959
|
-
# Help > Separator
|
960
|
-
self.helpMenu.addSeparator()
|
961
|
-
|
962
|
-
# Document > Check for Updates
|
963
|
-
self.aUpdates = self.helpMenu.addAction(self.tr("Check for New Release"))
|
964
|
-
self.aUpdates.triggered.connect(lambda: self.mainGui.showUpdatesDialog())
|
965
|
-
|
966
966
|
return
|
967
967
|
|
968
968
|
# END Class GuiMainMenu
|