novelWriter 2.4b1__py3-none-any.whl → 2.4.1__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.4b1.dist-info → novelWriter-2.4.1.dist-info}/METADATA +5 -6
- {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/RECORD +79 -83
- novelwriter/__init__.py +15 -8
- 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_pt_BR.qm +0 -0
- novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
- novelwriter/assets/icons/none.svg +4 -0
- novelwriter/assets/icons/typicons_dark/icons.conf +2 -2
- novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +4 -0
- novelwriter/assets/icons/typicons_light/icons.conf +2 -2
- novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +4 -0
- novelwriter/assets/manual.pdf +0 -0
- novelwriter/assets/sample.zip +0 -0
- novelwriter/common.py +11 -3
- novelwriter/config.py +12 -4
- novelwriter/core/buildsettings.py +7 -7
- novelwriter/core/coretools.py +21 -22
- novelwriter/core/docbuild.py +2 -2
- novelwriter/core/projectxml.py +1 -1
- novelwriter/core/spellcheck.py +3 -3
- novelwriter/core/status.py +3 -2
- novelwriter/core/tokenizer.py +3 -3
- novelwriter/core/toodt.py +333 -356
- novelwriter/dialogs/about.py +9 -11
- novelwriter/dialogs/docmerge.py +17 -14
- novelwriter/dialogs/docsplit.py +14 -12
- novelwriter/dialogs/editlabel.py +5 -4
- novelwriter/dialogs/preferences.py +29 -34
- novelwriter/dialogs/projectsettings.py +31 -28
- novelwriter/dialogs/quotes.py +10 -9
- novelwriter/dialogs/wordlist.py +17 -14
- novelwriter/error.py +14 -12
- novelwriter/extensions/circularprogress.py +12 -8
- novelwriter/extensions/configlayout.py +1 -3
- novelwriter/extensions/modified.py +33 -2
- novelwriter/extensions/pagedsidebar.py +16 -14
- novelwriter/extensions/simpleprogress.py +3 -1
- novelwriter/extensions/statusled.py +3 -1
- novelwriter/extensions/switch.py +10 -9
- novelwriter/extensions/switchbox.py +14 -13
- novelwriter/gui/doceditor.py +205 -246
- novelwriter/gui/dochighlight.py +26 -9
- novelwriter/gui/docviewer.py +55 -59
- novelwriter/gui/docviewerpanel.py +16 -13
- novelwriter/gui/editordocument.py +4 -4
- novelwriter/gui/itemdetails.py +45 -48
- novelwriter/gui/mainmenu.py +2 -2
- novelwriter/gui/noveltree.py +23 -21
- novelwriter/gui/outline.py +93 -94
- novelwriter/gui/projtree.py +32 -30
- novelwriter/gui/search.py +75 -29
- novelwriter/gui/sidebar.py +24 -28
- novelwriter/gui/statusbar.py +14 -14
- novelwriter/gui/theme.py +61 -39
- novelwriter/guimain.py +37 -33
- novelwriter/shared.py +21 -9
- novelwriter/text/counting.py +1 -0
- novelwriter/tools/dictionaries.py +15 -14
- novelwriter/tools/lipsum.py +20 -17
- novelwriter/tools/manusbuild.py +44 -35
- novelwriter/tools/manuscript.py +112 -112
- novelwriter/tools/manussettings.py +91 -98
- novelwriter/tools/noveldetails.py +20 -18
- novelwriter/tools/welcome.py +51 -48
- novelwriter/tools/writingstats.py +61 -55
- novelwriter/types.py +90 -0
- novelwriter/assets/icons/typicons_dark/typ_arrow-down.svg +0 -4
- novelwriter/assets/icons/typicons_dark/typ_arrow-right.svg +0 -4
- novelwriter/assets/icons/typicons_light/typ_arrow-down.svg +0 -4
- novelwriter/assets/icons/typicons_light/typ_arrow-right.svg +0 -4
- novelwriter/core/__init__.py +0 -3
- novelwriter/dialogs/__init__.py +0 -3
- novelwriter/extensions/__init__.py +0 -3
- novelwriter/gui/__init__.py +0 -3
- novelwriter/text/__init__.py +0 -3
- novelwriter/tools/__init__.py +0 -3
- {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/LICENSE.md +0 -0
- {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/WHEEL +0 -0
- {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/entry_points.txt +0 -0
- {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/top_level.txt +0 -0
@@ -1,14 +1,13 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: novelWriter
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.4.1
|
4
4
|
Summary: A markdown-like text editor for planning and writing novels
|
5
|
-
|
6
|
-
Author: Veronica Berglyd Olsen
|
7
|
-
Author-email: code@vkbo.net
|
5
|
+
Author-email: Veronica Berglyd Olsen <code@vkbo.net>
|
8
6
|
License: GNU General Public License v3
|
9
|
-
Project-URL:
|
7
|
+
Project-URL: Homepage, https://novelwriter.io
|
10
8
|
Project-URL: Documentation, https://docs.novelwriter.io
|
11
|
-
Project-URL:
|
9
|
+
Project-URL: Repository, https://github.com/vkbo/novelWriter
|
10
|
+
Project-URL: Issues, https://github.com/vkbo/novelWriter/issues
|
12
11
|
Classifier: Programming Language :: Python :: 3 :: Only
|
13
12
|
Classifier: Programming Language :: Python :: 3.8
|
14
13
|
Classifier: Programming Language :: Python :: 3.9
|
@@ -1,23 +1,24 @@
|
|
1
|
-
novelwriter/__init__.py,sha256=
|
2
|
-
novelwriter/common.py,sha256=
|
3
|
-
novelwriter/config.py,sha256=
|
1
|
+
novelwriter/__init__.py,sha256=VtDemSGMjXbDNaryCq50iLeWntpICLjlDPNRcXqHPFs,7744
|
2
|
+
novelwriter/common.py,sha256=oarn4-2Ezm595b-dHD4MVrytxMFFB_QhITbTMIKD40M,17440
|
3
|
+
novelwriter/config.py,sha256=Y0c3-0xfmDE-IDcFYW0U_x_WGPMoU2T0sqtNZ8CT4zQ,35841
|
4
4
|
novelwriter/constants.py,sha256=UIxiF-23cB_gmRfxbQPYmObn8Ib-ygm46uOIG329RLY,19818
|
5
5
|
novelwriter/enum.py,sha256=MP-nz3vDRp4bWxXitqjdLWO2_RvrDAlRxngiMON9mb8,3305
|
6
|
-
novelwriter/error.py,sha256=
|
7
|
-
novelwriter/guimain.py,sha256=
|
8
|
-
novelwriter/shared.py,sha256=
|
9
|
-
novelwriter/
|
10
|
-
novelwriter/assets/
|
11
|
-
novelwriter/assets/
|
12
|
-
novelwriter/assets/i18n/
|
13
|
-
novelwriter/assets/i18n/
|
14
|
-
novelwriter/assets/i18n/
|
15
|
-
novelwriter/assets/i18n/
|
16
|
-
novelwriter/assets/i18n/
|
17
|
-
novelwriter/assets/i18n/
|
18
|
-
novelwriter/assets/i18n/
|
19
|
-
novelwriter/assets/i18n/
|
20
|
-
novelwriter/assets/i18n/
|
6
|
+
novelwriter/error.py,sha256=rY3kHVkt7W0MM9iKOBkMY-9qhStlESGlyeOOXwT4BGM,7278
|
7
|
+
novelwriter/guimain.py,sha256=Be32lkJv1ZF-aOSOQTPBfcH7TFrk3KvpLBmwIl20eRc,53477
|
8
|
+
novelwriter/shared.py,sha256=t-0ZwgnT7KNHDtz4fBV-uPxh9P0Nw1R0Sj-VW4To6sc,14678
|
9
|
+
novelwriter/types.py,sha256=6aP2hZraPEolYqBgj5R_5bah3NgelASBfKol6yYOi4g,3316
|
10
|
+
novelwriter/assets/manual.pdf,sha256=0bUs25-k9yYEmGN_ewDhu1uDeiura4vxtKL-JaAGePw,2691280
|
11
|
+
novelwriter/assets/sample.zip,sha256=di-PLXbCqee6yDFwNrTjRJV621zM3XmRqM7GtvFR6aM,27360
|
12
|
+
novelwriter/assets/i18n/nw_de_DE.qm,sha256=PPBpHJ3M0jL0t4xSY8zr3CKaO0umGW4K4Tb7bj0gtlA,97532
|
13
|
+
novelwriter/assets/i18n/nw_en_US.qm,sha256=sZKjLkT2CcPhGAS3WUgKm9XO3ugbBrx2zbwVyhP7vSE,90470
|
14
|
+
novelwriter/assets/i18n/nw_es_419.qm,sha256=8saaQ1As_hOgBI-oyEIqV5KCmLaMg_ldkOT9Q1uJmaY,99857
|
15
|
+
novelwriter/assets/i18n/nw_fr_FR.qm,sha256=-hpWyPhLqC-Ri8Zp9mCnfhc5CrCy1_p69E71pxxncuk,100316
|
16
|
+
novelwriter/assets/i18n/nw_it_IT.qm,sha256=mRgsonFCjm6bgG2sldQtMrRDAfqNIpiq9ebp1Sfl-gM,100250
|
17
|
+
novelwriter/assets/i18n/nw_ja_JP.qm,sha256=kbZKcnRDKralChIDOqsnK8Sn0NdcjlTDf03fOLVPxxY,74895
|
18
|
+
novelwriter/assets/i18n/nw_nb_NO.qm,sha256=cuQLRkvGXIFYsK7a4j1wxKY3H7JQIfjObkVvFbVFt-Q,92928
|
19
|
+
novelwriter/assets/i18n/nw_nl_NL.qm,sha256=YYHRQdi1aCwpvqc-RdF-uGZR9mXBtRHAohThSbtGYr8,93011
|
20
|
+
novelwriter/assets/i18n/nw_pt_BR.qm,sha256=2pW_7MFG152nN3Yc721qvvcG01XSRTVe21BvvqdBQvk,79257
|
21
|
+
novelwriter/assets/i18n/nw_zh_CN.qm,sha256=vfFnDRqurhO4_rkNww4psJY1dVOwx6jxUAOAoYNDc6w,57700
|
21
22
|
novelwriter/assets/i18n/project_de_DE.json,sha256=85ud9rxRHyXm85QDmW_LKcUE8h0L1Bvukaf5Tjt-wpg,2818
|
22
23
|
novelwriter/assets/i18n/project_en_GB.json,sha256=EcQAVEiQgRL3qobuzkPTfOWIxAc3Om-tA7nXUFFXEdI,2483
|
23
24
|
novelwriter/assets/i18n/project_en_US.json,sha256=EcQAVEiQgRL3qobuzkPTfOWIxAc3Om-tA7nXUFFXEdI,2483
|
@@ -31,12 +32,13 @@ novelwriter/assets/i18n/project_nn_NO.json,sha256=7ZfmtFWHcDMiLVqdOEDHQWHbpoC_bv
|
|
31
32
|
novelwriter/assets/i18n/project_pt_BR.json,sha256=oZ7jdSF1h-kuGhKYZOWbuwVCRgakgs9HzeMSiLPnTns,2763
|
32
33
|
novelwriter/assets/i18n/project_ru_RU.json,sha256=F4QkD6VVDCtGdil7uoXCmuczvUpe9tv-1L-3Eyc8sKE,3699
|
33
34
|
novelwriter/assets/i18n/project_zh_CN.json,sha256=cfl0TsnbISYUvygOw015y0x0REDG97xR0yjyJ85Jm34,2322
|
35
|
+
novelwriter/assets/icons/none.svg,sha256=NRN9vMzohg7Ner71GwPthrCG0uA81TpY8UmKb8-L-pM,251
|
34
36
|
novelwriter/assets/icons/novelwriter.ico,sha256=OJRIeeUcmS7Di51NA3uF5_Ov4V8T47gQ9qWv6C7qDeA,171059
|
35
37
|
novelwriter/assets/icons/novelwriter.svg,sha256=Ad_SgOdXSDJtFR3DLCx6Afme15I78r38_YxCfO9F2z4,8511
|
36
38
|
novelwriter/assets/icons/x-novelwriter-project.ico,sha256=MXdZSYi3j95aIsT5bZo6CkhxmS75cThP9O_38UR7sjg,170697
|
37
39
|
novelwriter/assets/icons/x-novelwriter-project.svg,sha256=VHf1aClkA91tZVYb3LFk9bi_Dw25QBVSjUJAjSD-YX4,5143
|
38
40
|
novelwriter/assets/icons/typicons_dark/README.md,sha256=6ZxJq-19PNrMdeuVeVg84aLjxhr9oF7dLwuMFVGQyq0,1065
|
39
|
-
novelwriter/assets/icons/typicons_dark/icons.conf,sha256=
|
41
|
+
novelwriter/assets/icons/typicons_dark/icons.conf,sha256=b-OYPcmJe1CBXRa62AFm75XIWev4cfeFarJF5mGgpiY,4431
|
40
42
|
novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg,sha256=POP_Cs3bkkKAmrS_fTgjj90eyNK0bipNGgOhDDlXKu0,1650
|
41
43
|
novelwriter/assets/icons/typicons_dark/mixed_document-new.svg,sha256=EIVU3_ecC0d6rpCHXBfKoA_mWJyilqe7iA6XLQb9oRw,1849
|
42
44
|
novelwriter/assets/icons/typicons_dark/mixed_document-note.svg,sha256=OaPRbvkA7h4GA4mnFXJRORv80h2nAsJTmlIR8Msrwt8,1650
|
@@ -75,12 +77,10 @@ novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg,sha256=dOhhKxlsdWuQ7t
|
|
75
77
|
novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg,sha256=0TpY0nIinD4dwgwh0Nyfs0C4rJDcc2JsgxnXSE0flco,1549
|
76
78
|
novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg,sha256=Z0ooKzRV_g298UX22uuUxZPC21Z9DN-1y4sY3vVIaZE,1121
|
77
79
|
novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg,sha256=PsEm_GCebnkMvtVm1OUbVU0hvA2nL8bWlrlyrAWh0tE,519
|
78
|
-
novelwriter/assets/icons/typicons_dark/typ_arrow-down.svg,sha256=NlOj7VaHnlfBwU8M63eVzdepIbvtVbuPCgQ1Rwdu67Q,511
|
79
80
|
novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg,sha256=Io2wWbs2Z0z5GHzDkmf3AkNZZqyfSC0ilWVDvGv5Q5U,538
|
80
81
|
novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg,sha256=m4w3ZUHy3R2aTtvLKZpmd6FPijjkaG6A5jhiqfTp9mg,1029
|
81
82
|
novelwriter/assets/icons/typicons_dark/typ_arrow-minimise.svg,sha256=4XVXvgIN00s6UfHmL3jXSTu5cRjeTKH_WtbS1ZRcCuM,1135
|
82
83
|
novelwriter/assets/icons/typicons_dark/typ_arrow-repeat-grey.svg,sha256=RNhpFR1pmej9rKW-kvxHZa8zFFK3nVfdyP5NksUDDqM,1217
|
83
|
-
novelwriter/assets/icons/typicons_dark/typ_arrow-right.svg,sha256=rUATnt0QnEMegajflkfRWlT3Tcqu0Y7FVpdmZU6Seb0,510
|
84
84
|
novelwriter/assets/icons/typicons_dark/typ_book-grey.svg,sha256=Nl-pghkCn8BG28Cga1vyVtLMDNgMDjL15Tc4s4DVz7k,807
|
85
85
|
novelwriter/assets/icons/typicons_dark/typ_book.svg,sha256=MaUaVtd_hXt6yGGj2C1UUZGqhkEUzDWL5wmByT4UE7U,1490
|
86
86
|
novelwriter/assets/icons/typicons_dark/typ_bookmark.svg,sha256=I2KqO-t22-kA4ELUYnkKLge3HHcQSH3Lw02PsWRsiq0,909
|
@@ -131,10 +131,12 @@ novelwriter/assets/icons/typicons_dark/typ_th-list-grey.svg,sha256=zx4iK9nlfDFaY
|
|
131
131
|
novelwriter/assets/icons/typicons_dark/typ_th-list.svg,sha256=0qsmBzD9ySWA9G3cuB_BAetuzx4qxaNvQ6TcL8c0d4A,846
|
132
132
|
novelwriter/assets/icons/typicons_dark/typ_times.svg,sha256=kcd-4tz9DmCMikIaSohdt4EzutDYUsTVBr8w2vqn1SE,703
|
133
133
|
novelwriter/assets/icons/typicons_dark/typ_trash.svg,sha256=XjO0SRcnPDrg9Qe8zR5W1k20liKKRop4O2liv2KILQY,2456
|
134
|
+
novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg,sha256=V_yKCUxFOmm7LpadefaSgmi1MTKIzD5GgIS8inPtUJo,516
|
135
|
+
novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg,sha256=IvVXmxlkrTyNwl0NG_HCpaqv29_9EopjQvpH56ZInZk,517
|
134
136
|
novelwriter/assets/icons/typicons_dark/typ_user.svg,sha256=00gZEDr59B1A7A4o0w5VjCJOHnQHANsgXBhnB_VTMU4,733
|
135
137
|
novelwriter/assets/icons/typicons_dark/typ_warning-full.svg,sha256=zqqV82C37dWH_yHoSuPo-BLsErg0sl8_VlB6fzXL4VE,970
|
136
138
|
novelwriter/assets/icons/typicons_light/README.md,sha256=nyGvWLJ8cusLYP8YsjX_l213NkDE_GHrwctZ-I_JQUg,1066
|
137
|
-
novelwriter/assets/icons/typicons_light/icons.conf,sha256=
|
139
|
+
novelwriter/assets/icons/typicons_light/icons.conf,sha256=rG7V9Vc0Jx0T7YUD2PpGA_Dg-i6zPPBK-mH-PmUnFCA,4434
|
138
140
|
novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg,sha256=kXNwPbeKR3eupIrqtDQrNGq5sL8vdExLfPMrMX2sEsw,1650
|
139
141
|
novelwriter/assets/icons/typicons_light/mixed_document-new.svg,sha256=u0YYfp6hTUEYLsrPleUqYocaG2hl62w-B85INvkm6S4,1825
|
140
142
|
novelwriter/assets/icons/typicons_light/mixed_document-note.svg,sha256=XpKQ2Fj7J3I3BT9mAQkjk_A4eP7uy94vPeDBA62fOYI,1650
|
@@ -173,12 +175,10 @@ novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg,sha256=j8qncFQqiC5vZ
|
|
173
175
|
novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg,sha256=-B-iVCPsoCaz9ZiVkHN6em2BJOI65_ssjFqZM75wxZ0,1550
|
174
176
|
novelwriter/assets/icons/typicons_light/nw_tb-underline.svg,sha256=rxSFWY2lNpSuF2jbUk_jyfoHk_B5d2bLncaCY-2LT7w,1141
|
175
177
|
novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg,sha256=FZFt51KLkvqrP0nM_bnCjKkELcLT7KMWB059gvSMKk4,523
|
176
|
-
novelwriter/assets/icons/typicons_light/typ_arrow-down.svg,sha256=o4yUzSExKLMwb1bL5gBCtUhruzFLQQY0bTwwFcYgllI,518
|
177
178
|
novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg,sha256=vDYZrsNe2Afo8-MqS9HV_gsz6aFraYZUyJeAdOXaE4Y,541
|
178
179
|
novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg,sha256=bz93DwuiB_2Baf-oG5SsMdWGccYogyNqR2Yq3OQ4bDY,1032
|
179
180
|
novelwriter/assets/icons/typicons_light/typ_arrow-minimise.svg,sha256=PcnZfvRheewpelAsfj_OF09a0JmB0PPuU_3Yn4buztc,1138
|
180
181
|
novelwriter/assets/icons/typicons_light/typ_arrow-repeat-grey.svg,sha256=HV86TeWDyw24qRllBsIpxn1bT2Oj74hrHJuSKfyLx_0,1224
|
181
|
-
novelwriter/assets/icons/typicons_light/typ_arrow-right.svg,sha256=Z7FD8rKc96Q34oW7by4TjLZMizlD78V8NVTYgvRauW0,517
|
182
182
|
novelwriter/assets/icons/typicons_light/typ_book-grey.svg,sha256=T4pOeWLJxx-Z-gNPTCiIZzryHQ7efwbRcdMcL8pil-g,814
|
183
183
|
novelwriter/assets/icons/typicons_light/typ_book.svg,sha256=vRlJHH06q1982IZHCx56ouOezyVw31SJ2uogs2xUj2k,1490
|
184
184
|
novelwriter/assets/icons/typicons_light/typ_bookmark.svg,sha256=q3I2j4AsNN12OGwr2zvtFXPVmnLAMoPuKw69wW4SnrM,912
|
@@ -229,6 +229,8 @@ novelwriter/assets/icons/typicons_light/typ_th-list-grey.svg,sha256=XKAdaWypd1hg
|
|
229
229
|
novelwriter/assets/icons/typicons_light/typ_th-list.svg,sha256=fq8gazMyrkUC8qzpmSFz8QufTEDd5X6qNBb09to-j5g,849
|
230
230
|
novelwriter/assets/icons/typicons_light/typ_times.svg,sha256=Z48b7czxZUTrmDZxX2NWMGIFyvqsYe7GTvSPV4T4oPs,703
|
231
231
|
novelwriter/assets/icons/typicons_light/typ_trash.svg,sha256=THerHUXB4l6qjcnIdFCzA7eZxOVhcODDQMtYeDj-z5s,2453
|
232
|
+
novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg,sha256=hPxAI0WjRnalqYlHn1NNKpA9JbE5t7sR1DbIOj6MnkM,523
|
233
|
+
novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg,sha256=eD-_42AnjRRhQ1EIRAFEkJKguVVzDBltbJQR4Wnq8Zk,523
|
232
234
|
novelwriter/assets/icons/typicons_light/typ_user.svg,sha256=q4a-kdXIABSyYlk2BEGPuxnyaM4vTpvLwQNv5-rQ6mQ,736
|
233
235
|
novelwriter/assets/icons/typicons_light/typ_warning-full.svg,sha256=5pCnfBPckrRDznMAOGj2-zmMxUSQi4nK4i07jAVkc_c,970
|
234
236
|
novelwriter/assets/images/novelwriter-text-dark.svg,sha256=gbbDiXd92OV5c6qGREDkAnTnEApxYPbqyrbUHB8mtiM,5976
|
@@ -258,76 +260,70 @@ novelwriter/assets/themes/default_dark.conf,sha256=L6xHLbgVb4E4SkQRSgCV7yEoxH9Rx
|
|
258
260
|
novelwriter/assets/themes/default_light.conf,sha256=o_FJRMidFo-DJYK8bB-jdelcD5qg7MwW4J8lL9nlZUY,928
|
259
261
|
novelwriter/assets/themes/solarized_dark.conf,sha256=HIP9icMtRljUmMH7PmU0IrcLGUSXVDaG97070Hc0UVM,852
|
260
262
|
novelwriter/assets/themes/solarized_light.conf,sha256=jUfaCnWXM4GAOI1eUioj_nP0RiMrnr8MEOprSg7qUU4,854
|
261
|
-
novelwriter/core/
|
262
|
-
novelwriter/core/
|
263
|
-
novelwriter/core/
|
264
|
-
novelwriter/core/docbuild.py,sha256=vn47y9aYf7lsu-A5vmlmSjlWxI82X6at5rB-fEH0pl0,13844
|
263
|
+
novelwriter/core/buildsettings.py,sha256=SVRYtmsneUlidzoHlmXebgpVPW7ZTei8mwTfVug3o4E,22423
|
264
|
+
novelwriter/core/coretools.py,sha256=mNrFL7R3dAAQhe3aGT9QTha4rX4XXF5JOlmXykNCJh0,21467
|
265
|
+
novelwriter/core/docbuild.py,sha256=cvvIe3w3ptY3VE_ak3ppzVkBMvoGS5o0CdzS0ifAVRw,13842
|
265
266
|
novelwriter/core/document.py,sha256=ERU3GCZ1CHkIE3bV-NQ5G8HZlH5C4bWqa-OxyPgFu4w,12154
|
266
267
|
novelwriter/core/index.py,sha256=e-Iov2NyeeLWiWsx_UCD758UIw_6KGe1FZ-jegkRgmU,45951
|
267
268
|
novelwriter/core/item.py,sha256=6a-9Aty4_RIFE-90IxR8t19Fjyl_uHJAwz_TzUn8oRI,18104
|
268
269
|
novelwriter/core/options.py,sha256=6gMe3cXq4U-oSN3zSoGtfiCOW6hX9xtjDssrbZYrtGY,7397
|
269
270
|
novelwriter/core/project.py,sha256=dl8mx6uCjPUzb9H-pOcwYbDahQ6rxB5D-rkeb8CX-Kk,22718
|
270
271
|
novelwriter/core/projectdata.py,sha256=NYhTL6qIbJxJX98-_zZdV4LzI2-tqdWaMvGYi0Xi4WU,9826
|
271
|
-
novelwriter/core/projectxml.py,sha256=
|
272
|
+
novelwriter/core/projectxml.py,sha256=0qylTwEsgoKRlSmDyBgOU4XpGvA3nPMipYs1dNkc-hA,21948
|
272
273
|
novelwriter/core/sessions.py,sha256=k13qaHO0oAyKBlMrhDogO0dFoAROBA8WNgUULGtIhIA,4431
|
273
|
-
novelwriter/core/spellcheck.py,sha256=
|
274
|
-
novelwriter/core/status.py,sha256=
|
274
|
+
novelwriter/core/spellcheck.py,sha256=FuTPjunG3DpXZzVrpSp3cHCJR1s72MYiSjOm6ok2ZiE,7256
|
275
|
+
novelwriter/core/status.py,sha256=TNeEapa-MLJexXPosoHs0UmHgZrK63vQEOegYOD8uuE,8769
|
275
276
|
novelwriter/core/storage.py,sha256=eJgGL0cvfeQHhGYjc6FiojJ-dnGU-IQJ6FOWa8hFzJQ,20880
|
276
277
|
novelwriter/core/tohtml.py,sha256=zybIc2qMAQhmWBNVVtcHRijmvqDK_DHidgAYwKUGQP0,17236
|
277
|
-
novelwriter/core/tokenizer.py,sha256=
|
278
|
+
novelwriter/core/tokenizer.py,sha256=mwcwUojDL7DW8W4wbXZbtnyPnOdN9soJb11dShrdtbk,40993
|
278
279
|
novelwriter/core/tomd.py,sha256=xk5r3oyHkz6LOouiPaQLGVJWp6bT0HLe3upr4JmWjG4,7386
|
279
|
-
novelwriter/core/toodt.py,sha256=
|
280
|
+
novelwriter/core/toodt.py,sha256=nPslo_bEsUaGWk0YCPaPHak41dXS9PpzNKClGOF_cA0,58662
|
280
281
|
novelwriter/core/tree.py,sha256=bwLJHhNkd2DOKoE-rIwfWwWgaYBlw9xZ8BaQeC0LUJw,18701
|
281
|
-
novelwriter/dialogs/
|
282
|
-
novelwriter/dialogs/
|
283
|
-
novelwriter/dialogs/
|
284
|
-
novelwriter/dialogs/
|
285
|
-
novelwriter/dialogs/
|
286
|
-
novelwriter/dialogs/
|
287
|
-
novelwriter/dialogs/
|
288
|
-
novelwriter/dialogs/
|
289
|
-
novelwriter/
|
290
|
-
novelwriter/extensions/
|
291
|
-
novelwriter/extensions/circularprogress.py,sha256=UrqZCgnJgFVuUvUV0V-9noWKCROJWkDtaC44ijvuJPA,3747
|
292
|
-
novelwriter/extensions/configlayout.py,sha256=z-Z-RGLB9NtTJGJF6WwTH4IAHbkH-0LnanmeixL0LK0,9377
|
282
|
+
novelwriter/dialogs/about.py,sha256=6FF9ssrP8G9TNWYAoZ1Z-Bd0gBrJsc8uPBVAulyDd_U,4888
|
283
|
+
novelwriter/dialogs/docmerge.py,sha256=FzOmKQnKW8p1fc_z6pvDlP2LlJQgDG_BV355oB1MKzc,6148
|
284
|
+
novelwriter/dialogs/docsplit.py,sha256=q4kt_lIqrz6-5VpBnCZOeTfvwcZMORZtjO3qrGEynPg,9140
|
285
|
+
novelwriter/dialogs/editlabel.py,sha256=715nMbwexvqaxPRp2rJThyC3Sokp70zztpCg2ZxGKPw,2964
|
286
|
+
novelwriter/dialogs/preferences.py,sha256=hQv70JmrQDTXDY5onrkeQVCZ1UiProi4i8c2xQsXTfk,36440
|
287
|
+
novelwriter/dialogs/projectsettings.py,sha256=IbZkb0oFU9C5PtQxtrY5DJSfdaUoeb_A2qhpZJWG4KY,25750
|
288
|
+
novelwriter/dialogs/quotes.py,sha256=iDtkACeCnaCQOTXQtW1H75BjeOJIm0SsrP4EzLsFq0E,4647
|
289
|
+
novelwriter/dialogs/wordlist.py,sha256=EfjKQn_SZ8qUCXXw5WHgqe6hWLAn02cD23mWUTTaxkc,8646
|
290
|
+
novelwriter/extensions/circularprogress.py,sha256=H0btKccdnvVfijU8ZudYvv4AgrvPYvx7IgznIxASBY0,3856
|
291
|
+
novelwriter/extensions/configlayout.py,sha256=xHUE_HckNwJsfPKZ3hJjAKAYhxzQFRmNCmBrIh6QtTs,9253
|
293
292
|
novelwriter/extensions/eventfilters.py,sha256=XehDoXwsnCvI1D3uieuYu5J3kxZggdV6Teo7Z0xZw7E,2581
|
294
|
-
novelwriter/extensions/modified.py,sha256=
|
293
|
+
novelwriter/extensions/modified.py,sha256=s8HbGumHA0mAspnYo-ADIiwOXkccL-w1ThimxywdlNc,4038
|
295
294
|
novelwriter/extensions/novelselector.py,sha256=5ccEDvqrbvrG7khZBrOiJwxsjjRnkFX-A4ZT-lj_z_g,3821
|
296
|
-
novelwriter/extensions/pagedsidebar.py,sha256
|
297
|
-
novelwriter/extensions/simpleprogress.py,sha256=
|
298
|
-
novelwriter/extensions/statusled.py,sha256=
|
299
|
-
novelwriter/extensions/switch.py,sha256=
|
300
|
-
novelwriter/extensions/switchbox.py,sha256=
|
295
|
+
novelwriter/extensions/pagedsidebar.py,sha256=X0AYo6oKM7gKr57662v-ZZWUTCVf5AbvIUCoLQai8fk,7369
|
296
|
+
novelwriter/extensions/simpleprogress.py,sha256=13SrFQ9TZTDICyXCdTHeCX0MOtpw4UbBEgxiAmSOjyQ,1836
|
297
|
+
novelwriter/extensions/statusled.py,sha256=640phDm3ZcLvM9EC_uwVPjG9LD5W3pAjtoqU4QbsZUU,2315
|
298
|
+
novelwriter/extensions/switch.py,sha256=sZBNX5Wj1qkVA6cHh04GjuWOTbejaatHgLZ5yGzXGv4,4346
|
299
|
+
novelwriter/extensions/switchbox.py,sha256=y6yuoCAZYYL7miaFlC8h5ymtuB0Xyk2AMmxAFYOYPDA,4210
|
301
300
|
novelwriter/extensions/versioninfo.py,sha256=eUJzO6eV6SFXgp71uxr9696rjUQctGm84CA7XqxFhGc,5120
|
302
|
-
novelwriter/gui/
|
303
|
-
novelwriter/gui/
|
304
|
-
novelwriter/gui/
|
305
|
-
novelwriter/gui/
|
306
|
-
novelwriter/gui/
|
307
|
-
novelwriter/gui/
|
308
|
-
novelwriter/gui/
|
309
|
-
novelwriter/gui/
|
310
|
-
novelwriter/gui/
|
311
|
-
novelwriter/gui/
|
312
|
-
novelwriter/gui/
|
313
|
-
novelwriter/gui/
|
314
|
-
novelwriter/gui/
|
315
|
-
novelwriter/gui/
|
316
|
-
novelwriter/
|
317
|
-
novelwriter/
|
318
|
-
novelwriter/
|
319
|
-
novelwriter/tools/
|
320
|
-
novelwriter/tools/
|
321
|
-
novelwriter/tools/
|
322
|
-
novelwriter/tools/
|
323
|
-
novelwriter/tools/
|
324
|
-
novelwriter/tools/
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
novelWriter-2.
|
329
|
-
novelWriter-2.
|
330
|
-
novelWriter-2.
|
331
|
-
novelWriter-2.4b1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
|
332
|
-
novelWriter-2.4b1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
|
333
|
-
novelWriter-2.4b1.dist-info/RECORD,,
|
301
|
+
novelwriter/gui/doceditor.py,sha256=INnIlhwe517h1Q1MluaEksin2INn4cIduGSWhowGCOs,113802
|
302
|
+
novelwriter/gui/dochighlight.py,sha256=9-OP0YrMmljOCsdY-rqZe0G27gkBP7Fzk_R_f3iGGVE,17394
|
303
|
+
novelwriter/gui/docviewer.py,sha256=9KvGhEMLqmqibhdIgJ7lmoQ28oTnOfT08sdlBo4WV24,33107
|
304
|
+
novelwriter/gui/docviewerpanel.py,sha256=IcQGLN49MmVGfIPg-8IzLGKYn9DbJqfdXWG6jd_JaAI,20009
|
305
|
+
novelwriter/gui/editordocument.py,sha256=jxODONgq80Kf63lRezzbYtyEelaC-GpvgPEMKQ3m_sg,4116
|
306
|
+
novelwriter/gui/itemdetails.py,sha256=VIfWDtn9g0IRBYSDFT_AhZgluQ0d7sK5C14lENyvzHg,9774
|
307
|
+
novelwriter/gui/mainmenu.py,sha256=iTXNqmhEZqVDA6XkIAhpIq-cc1fF5-rZVe2g9z7v8_c,38707
|
308
|
+
novelwriter/gui/noveltree.py,sha256=F-r6vdgCoIzxFwOI9kvsLEnz7nX2uOs30LOHHijN7NY,27988
|
309
|
+
novelwriter/gui/outline.py,sha256=q0d21UI2r4K4D9jPARKc3ibWsdpiEnartAHfwxE2AgY,42410
|
310
|
+
novelwriter/gui/projtree.py,sha256=21B1-NJFYf724oIH5xX0b35YX3YX-zxRcLdYopMdRy8,77888
|
311
|
+
novelwriter/gui/search.py,sha256=PYsSIhe77PCuXj1fRXb2_7GF1gxLDv_vyq8JsgW5UfY,12996
|
312
|
+
novelwriter/gui/sidebar.py,sha256=kidGGzXQ5RNQvKuH0kFh-lwoUSlkXffBucEoL15RMd4,6258
|
313
|
+
novelwriter/gui/statusbar.py,sha256=ru-4pyg8owWkwkXGgj5GEupfq9fbIykYwGpomwzaINk,9353
|
314
|
+
novelwriter/gui/theme.py,sha256=P2EI79WMGulYBhkADqVOWW13DfFOOoCUeBf7Kxku-wM,32670
|
315
|
+
novelwriter/text/counting.py,sha256=tkWKWS_scPYmBG8xLpIL1KLIjyF2HOlkrloQa5PZmDc,4304
|
316
|
+
novelwriter/tools/dictionaries.py,sha256=Xy5or2yejJbUv9ptwqsz1-R4pxDYQATiHCZaqorUXdY,9231
|
317
|
+
novelwriter/tools/lipsum.py,sha256=d-qdRSrXLfTkTdzi7vhjeBlWawwGwWQ9Qd_zRSwzgpQ,4901
|
318
|
+
novelwriter/tools/manusbuild.py,sha256=80kRr4OfvW2lqjhLpnAWO8HiTX7Y3HSivcjT48v_KUE,14101
|
319
|
+
novelwriter/tools/manuscript.py,sha256=KbaeQaF4dKC2Zs5O1aIprFJL3oKE6h2j1dDR9cm_aL0,40218
|
320
|
+
novelwriter/tools/manussettings.py,sha256=ak4m6cKk8NAg2OmsQJv-x8Ui-jcUtZe-RkyzotXbqRM,55747
|
321
|
+
novelwriter/tools/noveldetails.py,sha256=KoENyz0hH3TlXfRCEJvRTZ0h7ruOgTIv85AgCl1Ur5o,18503
|
322
|
+
novelwriter/tools/welcome.py,sha256=BxORHBPjqumEVNZC7SytE3kUasx01GMOKS5QQSagP-M,27954
|
323
|
+
novelwriter/tools/writingstats.py,sha256=IubrbbLB_Qlnwp9B3muKkeD84xtckPvmTax7E4LnI5g,22797
|
324
|
+
novelWriter-2.4.1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
|
325
|
+
novelWriter-2.4.1.dist-info/METADATA,sha256=YIcyEXmUSxGL1ibrWZPbaaHKSDy77G1IwIP12GPVgrk,2582
|
326
|
+
novelWriter-2.4.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
327
|
+
novelWriter-2.4.1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
|
328
|
+
novelWriter-2.4.1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
|
329
|
+
novelWriter-2.4.1.dist-info/RECORD,,
|
novelwriter/__init__.py
CHANGED
@@ -23,16 +23,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
23
23
|
"""
|
24
24
|
from __future__ import annotations
|
25
25
|
|
26
|
-
import sys
|
27
26
|
import getopt
|
28
27
|
import logging
|
28
|
+
import sys
|
29
|
+
|
30
|
+
from typing import TYPE_CHECKING
|
29
31
|
|
30
32
|
from PyQt5.QtWidgets import QApplication, QErrorMessage
|
31
33
|
|
32
|
-
from novelwriter.error import exceptionHandler, logException
|
33
34
|
from novelwriter.config import Config
|
35
|
+
from novelwriter.error import exceptionHandler, logException
|
34
36
|
from novelwriter.shared import SharedData
|
35
37
|
|
38
|
+
if TYPE_CHECKING: # pragma: no cover
|
39
|
+
from novelwriter.guimain import GuiMain
|
40
|
+
|
36
41
|
# Package Meta
|
37
42
|
# ============
|
38
43
|
|
@@ -42,9 +47,9 @@ __license__ = "GPLv3"
|
|
42
47
|
__author__ = "Veronica Berglyd Olsen"
|
43
48
|
__maintainer__ = "Veronica Berglyd Olsen"
|
44
49
|
__email__ = "code@vkbo.net"
|
45
|
-
__version__ = "2.
|
46
|
-
__hexversion__ = "
|
47
|
-
__date__ = "2024-
|
50
|
+
__version__ = "2.4.1"
|
51
|
+
__hexversion__ = "0x020401f0"
|
52
|
+
__date__ = "2024-05-06"
|
48
53
|
__status__ = "Stable"
|
49
54
|
__domain__ = "novelwriter.io"
|
50
55
|
|
@@ -60,7 +65,7 @@ CONFIG = Config()
|
|
60
65
|
SHARED = SharedData()
|
61
66
|
|
62
67
|
|
63
|
-
def main(sysArgs: list | None = None):
|
68
|
+
def main(sysArgs: list | None = None) -> GuiMain | None:
|
64
69
|
"""Parse command line, set up logging, and launch main GUI."""
|
65
70
|
if sysArgs is None:
|
66
71
|
sysArgs = sys.argv[1:]
|
@@ -187,7 +192,7 @@ def main(sysArgs: list | None = None):
|
|
187
192
|
))
|
188
193
|
for errLine in errorData:
|
189
194
|
logger.critical(errLine)
|
190
|
-
errApp.
|
195
|
+
errApp.exec()
|
191
196
|
sys.exit(errorCode)
|
192
197
|
|
193
198
|
# Finish initialising config
|
@@ -237,6 +242,8 @@ def main(sysArgs: list | None = None):
|
|
237
242
|
nwGUI = GuiMain()
|
238
243
|
nwGUI.postLaunchTasks(cmdOpen)
|
239
244
|
|
240
|
-
sys.exit(nwApp.
|
245
|
+
sys.exit(nwApp.exec())
|
246
|
+
|
247
|
+
return None
|
241
248
|
|
242
249
|
# END Function main
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -100,8 +100,8 @@ status_time = typ_stopwatch-grey.svg
|
|
100
100
|
sticky-off = typ_pin-outline.svg
|
101
101
|
sticky-on = typ_pin.svg
|
102
102
|
unchecked = mixed_input-unchecked.svg
|
103
|
-
unfold-hide =
|
104
|
-
unfold-show =
|
103
|
+
unfold-hide = typ_unfold-hidden.svg
|
104
|
+
unfold-show = typ_unfold-visible.svg
|
105
105
|
up = typ_chevron-up.svg
|
106
106
|
view = typ_eye.svg
|
107
107
|
view_build = typ_export-grey.svg
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
3
|
+
<path d="m9.8767 17.723 5.8157-5.723-5.8157-5.723c-0.18462-0.18462-0.46155-0.27693-0.64616-0.27693-0.18462 0-0.46155 0.092309-0.64616 0.27693-0.18462 0.18462-0.27693 0.36924-0.27693 0.64616v10.154c0 0.27693 0.092309 0.46154 0.27693 0.64616 0.18462 0.18462 0.46155 0.27693 0.64616 0.27693 0.18462 0 0.46155-0.09231 0.64616-0.27693z" fill="#aeaeae" stroke-width=".92309"/>
|
4
|
+
</svg>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
3
|
+
<path d="m6.277 9.8767 5.723 5.8157 5.723-5.8157c0.18462-0.18462 0.27693-0.46155 0.27693-0.64616 0-0.18462-0.092309-0.46155-0.27693-0.64616-0.18462-0.18462-0.36924-0.27693-0.64616-0.27693h-10.154c-0.27693 0-0.46155 0.092309-0.64616 0.27693-0.18462 0.18462-0.27693 0.46155-0.27693 0.64616 0 0.18462 0.092309 0.46155 0.27693 0.64616z" fill="#aeaeae" stroke-width=".92309"/>
|
4
|
+
</svg>
|
@@ -100,8 +100,8 @@ status_time = typ_stopwatch-grey.svg
|
|
100
100
|
sticky-off = typ_pin-outline.svg
|
101
101
|
sticky-on = typ_pin.svg
|
102
102
|
unchecked = mixed_input-unchecked.svg
|
103
|
-
unfold-hide =
|
104
|
-
unfold-show =
|
103
|
+
unfold-hide = typ_unfold-hidden.svg
|
104
|
+
unfold-show = typ_unfold-visible.svg
|
105
105
|
up = typ_chevron-up.svg
|
106
106
|
view = typ_eye.svg
|
107
107
|
view_build = typ_export-grey.svg
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
3
|
+
<path d="m9.8767 17.723 5.8157-5.723-5.8157-5.723c-0.18462-0.18462-0.46155-0.27693-0.64616-0.27693-0.18462 0-0.46155 0.092309-0.64616 0.27693-0.18462 0.18462-0.27693 0.36924-0.27693 0.64616v10.154c0 0.27693 0.092309 0.46154 0.27693 0.64616 0.18462 0.18462 0.46155 0.27693 0.64616 0.27693 0.18462 0 0.46155-0.09231 0.64616-0.27693z" fill-opacity=".78039" stroke-width="1.6923"/>
|
4
|
+
</svg>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
3
|
+
<path d="m6.277 9.8767 5.723 5.8157 5.723-5.8157c0.18462-0.18462 0.27693-0.46155 0.27693-0.64616 0-0.18462-0.09231-0.46155-0.27693-0.64616-0.18462-0.18462-0.36924-0.27693-0.64616-0.27693h-10.154c-0.27693 0-0.46155 0.092309-0.64616 0.27693-0.18462 0.18462-0.27693 0.46155-0.27693 0.64616 0 0.18462 0.092309 0.46155 0.27693 0.64616z" fill-opacity=".78039" stroke-width="1.6923"/>
|
4
|
+
</svg>
|
novelwriter/assets/manual.pdf
CHANGED
Binary file
|
novelwriter/assets/sample.zip
CHANGED
Binary file
|
novelwriter/common.py
CHANGED
@@ -36,7 +36,7 @@ from configparser import ConfigParser
|
|
36
36
|
from urllib.parse import urljoin
|
37
37
|
from urllib.request import pathname2url
|
38
38
|
|
39
|
-
from PyQt5.QtGui import QDesktopServices
|
39
|
+
from PyQt5.QtGui import QColor, QDesktopServices
|
40
40
|
from PyQt5.QtCore import QCoreApplication, QUrl
|
41
41
|
|
42
42
|
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
|
@@ -382,6 +382,11 @@ def numberToRoman(value: int, toLower: bool = False) -> str:
|
|
382
382
|
return roman.lower() if toLower else roman
|
383
383
|
|
384
384
|
|
385
|
+
def cssCol(col: QColor, alpha: int | None = None) -> str:
|
386
|
+
"""Convert a QColor object to an rgba entry to use in CSS."""
|
387
|
+
return f"rgba({col.red()}, {col.green()}, {col.blue()}, {alpha or col.alpha()})"
|
388
|
+
|
389
|
+
|
385
390
|
##
|
386
391
|
# Encoder Functions
|
387
392
|
##
|
@@ -444,7 +449,7 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
|
|
444
449
|
|
445
450
|
indentations = ["\n"]
|
446
451
|
|
447
|
-
def indentChildren(elem, level):
|
452
|
+
def indentChildren(elem: ET.Element, level: int) -> None:
|
448
453
|
chLevel = level + 1
|
449
454
|
try:
|
450
455
|
chIndent = indentations[chLevel]
|
@@ -467,6 +472,8 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
|
|
467
472
|
if last is not None:
|
468
473
|
last.tail = indentations[level]
|
469
474
|
|
475
|
+
return
|
476
|
+
|
470
477
|
if len(tree):
|
471
478
|
indentChildren(tree, 0)
|
472
479
|
tree.tail = "\n"
|
@@ -529,8 +536,9 @@ class NWConfigParser(ConfigParser):
|
|
529
536
|
helper functions, and support for lists.
|
530
537
|
"""
|
531
538
|
|
532
|
-
def __init__(self):
|
539
|
+
def __init__(self) -> None:
|
533
540
|
super().__init__()
|
541
|
+
return
|
534
542
|
|
535
543
|
def rdStr(self, section: str, option: str, default: str) -> str:
|
536
544
|
"""Read string value."""
|
novelwriter/config.py
CHANGED
@@ -61,8 +61,12 @@ class Config:
|
|
61
61
|
self.appHandle = "novelwriter"
|
62
62
|
|
63
63
|
# Set Paths
|
64
|
-
confRoot = Path(QStandardPaths.writableLocation(
|
65
|
-
|
64
|
+
confRoot = Path(QStandardPaths.writableLocation(
|
65
|
+
QStandardPaths.StandardLocation.ConfigLocation)
|
66
|
+
)
|
67
|
+
dataRoot = Path(QStandardPaths.writableLocation(
|
68
|
+
QStandardPaths.StandardLocation.AppDataLocation)
|
69
|
+
)
|
66
70
|
|
67
71
|
self._confPath = confRoot.absolute() / self.appHandle # The user config location
|
68
72
|
self._dataPath = dataRoot.absolute() / self.appHandle # The user data location
|
@@ -83,7 +87,7 @@ class Config:
|
|
83
87
|
# Localisation
|
84
88
|
# Note that these paths must be strings
|
85
89
|
self._nwLangPath = self._appPath / "assets" / "i18n"
|
86
|
-
self._qtLangPath = QLibraryInfo.location(QLibraryInfo.TranslationsPath)
|
90
|
+
self._qtLangPath = QLibraryInfo.location(QLibraryInfo.LibraryLocation.TranslationsPath)
|
87
91
|
|
88
92
|
hasLocale = (self._nwLangPath / f"nw_{QLocale.system().name()}.qm").exists()
|
89
93
|
self._qLocale = QLocale.system() if hasLocale else QLocale("en_GB")
|
@@ -369,7 +373,7 @@ class Config:
|
|
369
373
|
elif self.osDarwin and "Helvetica" in fontFam:
|
370
374
|
self.textFont = "Helvetica"
|
371
375
|
else:
|
372
|
-
self.textFont = fontDB.systemFont(QFontDatabase.GeneralFont).family()
|
376
|
+
self.textFont = fontDB.systemFont(QFontDatabase.SystemFont.GeneralFont).family()
|
373
377
|
else:
|
374
378
|
self.textFont = family
|
375
379
|
return
|
@@ -386,6 +390,10 @@ class Config:
|
|
386
390
|
"""Un-scale fixed gui sizes by the screen scale factor."""
|
387
391
|
return int(value/self.guiScale)
|
388
392
|
|
393
|
+
def homePath(self) -> Path:
|
394
|
+
"""The user's home folder."""
|
395
|
+
return self._homePath
|
396
|
+
|
389
397
|
def dataPath(self, target: str | None = None) -> Path:
|
390
398
|
"""Return a path in the data folder."""
|
391
399
|
if isinstance(target, str):
|
@@ -56,13 +56,13 @@ SETTINGS_TEMPLATE = {
|
|
56
56
|
"headings.fmtChapter": (str, nwHeadFmt.TITLE),
|
57
57
|
"headings.fmtUnnumbered": (str, nwHeadFmt.TITLE),
|
58
58
|
"headings.fmtScene": (str, "* * *"),
|
59
|
-
"headings.
|
59
|
+
"headings.fmtAltScene": (str, ""),
|
60
60
|
"headings.fmtSection": (str, ""),
|
61
61
|
"headings.hideTitle": (bool, False),
|
62
62
|
"headings.hideChapter": (bool, False),
|
63
63
|
"headings.hideUnnumbered": (bool, False),
|
64
64
|
"headings.hideScene": (bool, False),
|
65
|
-
"headings.
|
65
|
+
"headings.hideAltScene": (bool, False),
|
66
66
|
"headings.hideSection": (bool, True),
|
67
67
|
"headings.centerTitle": (bool, True),
|
68
68
|
"headings.centerChapter": (bool, False),
|
@@ -110,7 +110,7 @@ SETTINGS_LABELS = {
|
|
110
110
|
"headings.fmtChapter": QT_TRANSLATE_NOOP("Builds", "Chapter Format"),
|
111
111
|
"headings.fmtUnnumbered": QT_TRANSLATE_NOOP("Builds", "Unnumbered Format"),
|
112
112
|
"headings.fmtScene": QT_TRANSLATE_NOOP("Builds", "Scene Format"),
|
113
|
-
"headings.
|
113
|
+
"headings.fmtAltScene": QT_TRANSLATE_NOOP("Builds", "Alt. Scene Format"),
|
114
114
|
"headings.fmtSection": QT_TRANSLATE_NOOP("Builds", "Section Format"),
|
115
115
|
|
116
116
|
"text.grpContent": QT_TRANSLATE_NOOP("Builds", "Text Content"),
|
@@ -178,7 +178,7 @@ class BuildSettings:
|
|
178
178
|
def __init__(self) -> None:
|
179
179
|
self._name = ""
|
180
180
|
self._uuid = str(uuid.uuid4())
|
181
|
-
self._path =
|
181
|
+
self._path = CONFIG.homePath()
|
182
182
|
self._build = ""
|
183
183
|
self._order = 0
|
184
184
|
self._format = nwBuildFmt.ODT
|
@@ -220,7 +220,7 @@ class BuildSettings:
|
|
220
220
|
"""The last used build path."""
|
221
221
|
if self._path.is_dir():
|
222
222
|
return self._path
|
223
|
-
return
|
223
|
+
return CONFIG.homePath()
|
224
224
|
|
225
225
|
@property
|
226
226
|
def lastBuildName(self) -> str:
|
@@ -297,7 +297,7 @@ class BuildSettings:
|
|
297
297
|
if isinstance(path, Path) and path.is_dir():
|
298
298
|
self._path = path
|
299
299
|
else:
|
300
|
-
self._path =
|
300
|
+
self._path = CONFIG.homePath()
|
301
301
|
self._changed = True
|
302
302
|
return
|
303
303
|
|
@@ -382,7 +382,7 @@ class BuildSettings:
|
|
382
382
|
|
383
383
|
postponed = []
|
384
384
|
|
385
|
-
def allowRoot(rHandle):
|
385
|
+
def allowRoot(rHandle: str | None) -> None:
|
386
386
|
if rHandle in postponed and rHandle in result and rHandle is not None:
|
387
387
|
result[rHandle] = (True, FilterMode.ROOT)
|
388
388
|
postponed.remove(rHandle)
|