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.
Files changed (89) hide show
  1. {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/METADATA +5 -6
  2. {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/RECORD +79 -83
  3. novelwriter/__init__.py +15 -8
  4. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  5. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  6. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  7. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  8. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  9. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  10. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  11. novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  12. novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  13. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  14. novelwriter/assets/icons/none.svg +4 -0
  15. novelwriter/assets/icons/typicons_dark/icons.conf +2 -2
  16. novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +4 -0
  17. novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +4 -0
  18. novelwriter/assets/icons/typicons_light/icons.conf +2 -2
  19. novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +4 -0
  20. novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +4 -0
  21. novelwriter/assets/manual.pdf +0 -0
  22. novelwriter/assets/sample.zip +0 -0
  23. novelwriter/common.py +11 -3
  24. novelwriter/config.py +12 -4
  25. novelwriter/core/buildsettings.py +7 -7
  26. novelwriter/core/coretools.py +21 -22
  27. novelwriter/core/docbuild.py +2 -2
  28. novelwriter/core/projectxml.py +1 -1
  29. novelwriter/core/spellcheck.py +3 -3
  30. novelwriter/core/status.py +3 -2
  31. novelwriter/core/tokenizer.py +3 -3
  32. novelwriter/core/toodt.py +333 -356
  33. novelwriter/dialogs/about.py +9 -11
  34. novelwriter/dialogs/docmerge.py +17 -14
  35. novelwriter/dialogs/docsplit.py +14 -12
  36. novelwriter/dialogs/editlabel.py +5 -4
  37. novelwriter/dialogs/preferences.py +29 -34
  38. novelwriter/dialogs/projectsettings.py +31 -28
  39. novelwriter/dialogs/quotes.py +10 -9
  40. novelwriter/dialogs/wordlist.py +17 -14
  41. novelwriter/error.py +14 -12
  42. novelwriter/extensions/circularprogress.py +12 -8
  43. novelwriter/extensions/configlayout.py +1 -3
  44. novelwriter/extensions/modified.py +33 -2
  45. novelwriter/extensions/pagedsidebar.py +16 -14
  46. novelwriter/extensions/simpleprogress.py +3 -1
  47. novelwriter/extensions/statusled.py +3 -1
  48. novelwriter/extensions/switch.py +10 -9
  49. novelwriter/extensions/switchbox.py +14 -13
  50. novelwriter/gui/doceditor.py +205 -246
  51. novelwriter/gui/dochighlight.py +26 -9
  52. novelwriter/gui/docviewer.py +55 -59
  53. novelwriter/gui/docviewerpanel.py +16 -13
  54. novelwriter/gui/editordocument.py +4 -4
  55. novelwriter/gui/itemdetails.py +45 -48
  56. novelwriter/gui/mainmenu.py +2 -2
  57. novelwriter/gui/noveltree.py +23 -21
  58. novelwriter/gui/outline.py +93 -94
  59. novelwriter/gui/projtree.py +32 -30
  60. novelwriter/gui/search.py +75 -29
  61. novelwriter/gui/sidebar.py +24 -28
  62. novelwriter/gui/statusbar.py +14 -14
  63. novelwriter/gui/theme.py +61 -39
  64. novelwriter/guimain.py +37 -33
  65. novelwriter/shared.py +21 -9
  66. novelwriter/text/counting.py +1 -0
  67. novelwriter/tools/dictionaries.py +15 -14
  68. novelwriter/tools/lipsum.py +20 -17
  69. novelwriter/tools/manusbuild.py +44 -35
  70. novelwriter/tools/manuscript.py +112 -112
  71. novelwriter/tools/manussettings.py +91 -98
  72. novelwriter/tools/noveldetails.py +20 -18
  73. novelwriter/tools/welcome.py +51 -48
  74. novelwriter/tools/writingstats.py +61 -55
  75. novelwriter/types.py +90 -0
  76. novelwriter/assets/icons/typicons_dark/typ_arrow-down.svg +0 -4
  77. novelwriter/assets/icons/typicons_dark/typ_arrow-right.svg +0 -4
  78. novelwriter/assets/icons/typicons_light/typ_arrow-down.svg +0 -4
  79. novelwriter/assets/icons/typicons_light/typ_arrow-right.svg +0 -4
  80. novelwriter/core/__init__.py +0 -3
  81. novelwriter/dialogs/__init__.py +0 -3
  82. novelwriter/extensions/__init__.py +0 -3
  83. novelwriter/gui/__init__.py +0 -3
  84. novelwriter/text/__init__.py +0 -3
  85. novelwriter/tools/__init__.py +0 -3
  86. {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/LICENSE.md +0 -0
  87. {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/WHEEL +0 -0
  88. {novelWriter-2.4b1.dist-info → novelWriter-2.4.1.dist-info}/entry_points.txt +0 -0
  89. {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.4b1
3
+ Version: 2.4.1
4
4
  Summary: A markdown-like text editor for planning and writing novels
5
- Home-page: https://novelwriter.io
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: Bug Tracker, https://github.com/vkbo/novelWriter/issues
7
+ Project-URL: Homepage, https://novelwriter.io
10
8
  Project-URL: Documentation, https://docs.novelwriter.io
11
- Project-URL: Source Code, https://github.com/vkbo/novelWriter
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=NHPln8CwazK8WOh7hOQjQvxvbIxG2xOQKymp1eK_5ZQ,7594
2
- novelwriter/common.py,sha256=4Dm9wp6ZEi4OI7zXXM83yoeBd-EJ3wJKgOHS56I5gBQ,17157
3
- novelwriter/config.py,sha256=yx0kChXoAiwmnbYW9KCx2lIPUogiJYkr8-nJTQ-ctD0,35635
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=jKIAB6pxWnin4CSaX0DCRUMeZRtwnieIuV5fsW6MW50,7136
7
- novelwriter/guimain.py,sha256=9DWr_y6lrck1BK6hCW4hct1C3ypZJU4sxfXobYjGLb4,53059
8
- novelwriter/shared.py,sha256=VVfqS4xOV4PiP4P8UIHvoEb572M2XxaeYnL3a_d8Xbc,14280
9
- novelwriter/assets/manual.pdf,sha256=moN_pQwrBrEzZTEDSbJlWxqAgxYP-p1oCvUm4mYO3R8,2605110
10
- novelwriter/assets/sample.zip,sha256=Bg8odwm4nQtfzKUiGPBysvjkuhFNatzGza9CvTsD08I,27360
11
- novelwriter/assets/i18n/nw_de_DE.qm,sha256=oUV9VMrFuS14SLfe49xe53_o4KfnBUqdwSF5m6AXQb8,95974
12
- novelwriter/assets/i18n/nw_en_US.qm,sha256=rCB443fatkLrRxsd3hVSn6VoX19SpNqR0zv4O1_wm1c,88824
13
- novelwriter/assets/i18n/nw_es_419.qm,sha256=-4pEroJn4WDR3LeTO4XEvMKOxNrR4-ve-qKgq8FPWn8,98227
14
- novelwriter/assets/i18n/nw_fr_FR.qm,sha256=-Purmgg9FcXme_VI39akAMw2GMPi0xTozzhyOXlED5Q,98674
15
- novelwriter/assets/i18n/nw_it_IT.qm,sha256=eJkz6DdSa3KGm7HUBxUuW07z18ZIckpLrU9F1YGewdQ,98500
16
- novelwriter/assets/i18n/nw_ja_JP.qm,sha256=TXxc0jQErWEljuoFB3TUCWywoNRd90WUUmGrul-gtUc,73429
17
- novelwriter/assets/i18n/nw_nb_NO.qm,sha256=buzXAzjbLAZTinX60tD_wHMR9cxlc6uIEuaYVqgQy9Q,91346
18
- novelwriter/assets/i18n/nw_nl_NL.qm,sha256=2og-KUjwTLI5wlCARIQv320h39-3cllJUruK3M1hV_A,95182
19
- novelwriter/assets/i18n/nw_pt_BR.qm,sha256=JvZ2tXyDdhlfnm25zIq13pcxbvnch5cGte44ENix3LE,103080
20
- novelwriter/assets/i18n/nw_zh_CN.qm,sha256=2sgQgLwMig9h2VGgcJExjrmzaIb0BFwyCyqmY7RpLPM,71433
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=CMl1UP6q7CDyGDBsIDQnh2LLOhwXhpJGcfi39isJiPs,4425
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=CJMM9T4s_x02Drirlf49b3UCTvKA_W30uEm4JWo6r2w,4428
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/__init__.py,sha256=IrBU9r8-lBnwqAD79xtpaDMortj23X-t6zQ1RIWluY4,39
262
- novelwriter/core/buildsettings.py,sha256=mNJ8v5Rn-lXiqtlFYQ8bzAtQ7JsibktPFiiiTXidHpQ,22385
263
- novelwriter/core/coretools.py,sha256=R1Mhg9cGJnhXFYd3kauSY95gCuRMJ9OGcMOQOdasBeo,21519
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=o4sn_Hzn3A-DMlHevjieWoTMaJKJW60HYOWbVfaambs,21936
272
+ novelwriter/core/projectxml.py,sha256=0qylTwEsgoKRlSmDyBgOU4XpGvA3nPMipYs1dNkc-hA,21948
272
273
  novelwriter/core/sessions.py,sha256=k13qaHO0oAyKBlMrhDogO0dFoAROBA8WNgUULGtIhIA,4431
273
- novelwriter/core/spellcheck.py,sha256=AfNOymVlJULF6tSz9ldAj5gyY_k1fHyKzsTivXxQJXg,7235
274
- novelwriter/core/status.py,sha256=CTqsGhTo-TVvX9n1_fbz0nyRFCFUrwioHJ23tu4lJoI,8717
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=XHjsZVlBt-S5jNyN-i7FrkYenwxFT3-NBNjB-qmazIA,40974
278
+ novelwriter/core/tokenizer.py,sha256=mwcwUojDL7DW8W4wbXZbtnyPnOdN9soJb11dShrdtbk,40993
278
279
  novelwriter/core/tomd.py,sha256=xk5r3oyHkz6LOouiPaQLGVJWp6bT0HLe3upr4JmWjG4,7386
279
- novelwriter/core/toodt.py,sha256=olx9ogsSrFh1LOndVpI_DK_5E0Bgzd9VFrC2RzNL--k,58700
280
+ novelwriter/core/toodt.py,sha256=nPslo_bEsUaGWk0YCPaPHak41dXS9PpzNKClGOF_cA0,58662
280
281
  novelwriter/core/tree.py,sha256=bwLJHhNkd2DOKoE-rIwfWwWgaYBlw9xZ8BaQeC0LUJw,18701
281
- novelwriter/dialogs/__init__.py,sha256=8a0BuN7-dtzkgPhkwX2KNq8gG2rqpyCAwI-U06KhU5Y,42
282
- novelwriter/dialogs/about.py,sha256=9ApVMNAo0x9OXBAb_N6kV7NUERIU-niXjBrd9XIQPbk,4980
283
- novelwriter/dialogs/docmerge.py,sha256=MbXjyr_ho_NiJPZEnlZjwWiH_8McxOOAFlGJs0DbmDQ,5960
284
- novelwriter/dialogs/docsplit.py,sha256=wGnIpvzx0GzePsLC9KJwuqsH9k8PvX2kf4vATHKEaFA,9053
285
- novelwriter/dialogs/editlabel.py,sha256=LdnWaSExZcdOZv52ks2PjKBzuzHX2XXOTZ9u-SW_brs,2903
286
- novelwriter/dialogs/preferences.py,sha256=Up7qkjaqKHCJt4mQlTWsI4QzwAwfV03zriwt5cUcjAU,36578
287
- novelwriter/dialogs/projectsettings.py,sha256=tmiVoDp45kVAmk-kBdn8FE8NhWJMflQS9_k5k2bzlas,25712
288
- novelwriter/dialogs/quotes.py,sha256=uCxCraABVaaCaNR_s0VpSFNAztdA0ykdjKQUyDalDY8,4561
289
- novelwriter/dialogs/wordlist.py,sha256=dxdT6cZ5nmGs22Qlw3Gbvt8stftLrKWRXwuzmtPG2wQ,8520
290
- novelwriter/extensions/__init__.py,sha256=ybwq7BzrU1QYw7pd-QC9iCKoB6MIh_FysriNkkHOSMo,51
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=eCgKpq3epPQEPLtqk2ZXYtKgQyKPSbJ29ysgYSeLOLk,2981
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=-6aIeuIVcZSbAGr_yheneyt9MEfVsCpYYFqjHdP5I-A,7234
297
- novelwriter/extensions/simpleprogress.py,sha256=kOnzYgkY1O8SB4u9MRufAHqA0hu5_2kM1A-ecw-CGvI,1793
298
- novelwriter/extensions/statusled.py,sha256=2mhx6UDoCzB9h1stluQaNT9xVWv63F7-82qFUwlhEms,2272
299
- novelwriter/extensions/switch.py,sha256=8OJ2T7CCBVQxBQqRa39t6ndoBRIKGrDaaggpUIwrA5E,4259
300
- novelwriter/extensions/switchbox.py,sha256=HFoU2Xd6C04nBsOE0HjQQy7OmQthvlHBgTETWyu0btQ,4116
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/__init__.py,sha256=8afC6rASWwWCc7KS_6s2whwTpboQt_495AvyGMLLatQ,38
303
- novelwriter/gui/doceditor.py,sha256=t_tfICvV7Xf7y_4LaIMx-Ry9nEU39gTWJTNNEBASwyE,115832
304
- novelwriter/gui/dochighlight.py,sha256=vOJ4iD8xELf_X4x0rnZlCg6tR-f4H5hdrXg-kTDDbQE,16531
305
- novelwriter/gui/docviewer.py,sha256=MzkNOhr9F0sTviFaqnUbtkAgD-CMZjedMVWcPez2Gh4,33718
306
- novelwriter/gui/docviewerpanel.py,sha256=GZRfA5y486ZMv-_PDQXsrgr4PGJtpT9OO1OUB15UEiM,19975
307
- novelwriter/gui/editordocument.py,sha256=B7jHeELoCsyqsBEyD09eN_rAD3Ybm4BKiwuupAjGwWo,4100
308
- novelwriter/gui/itemdetails.py,sha256=NJUieAG_uadQIySk2Gpawgv0Rpq_XA0On8yeAwOTZJw,9789
309
- novelwriter/gui/mainmenu.py,sha256=63rvJgvqFtMQGDR0d_p-Z7zSTHyW6ioATlO6U_61MTg,38693
310
- novelwriter/gui/noveltree.py,sha256=1xme5LZIs0QiSysXrNvkKyMBFl3wDdhXZ6sMoPZHofs,28030
311
- novelwriter/gui/outline.py,sha256=PrMHkLs0tLUkuAkHeB5mx8Z56X2mKBC0To2xvDQRV24,42051
312
- novelwriter/gui/projtree.py,sha256=SzMIjJL3KdjsAvj-Tf5LQsOdz4As743ahZZwY-I0TJ0,77958
313
- novelwriter/gui/search.py,sha256=LiSVi6vQmUp0eDusX32Fgwg70MxkXcDJJFF2RzKGBHo,11031
314
- novelwriter/gui/sidebar.py,sha256=TwZOxDsStzzfcvJveOKGIghmeFwFJbD2ATFujrsCvbw,6325
315
- novelwriter/gui/statusbar.py,sha256=gl2sT2pmlv-QVhqkiQPHxHEholu-WBfvNJykzyOjBUo,9281
316
- novelwriter/gui/theme.py,sha256=evlctSE6_QIBm81joLSlQqbHOAGIy5CJ5q6flpjzlLA,31928
317
- novelwriter/text/__init__.py,sha256=oZj7LkFht3O2jjVKqZP3QtWNdpjG5mlXo5aOjp040fk,44
318
- novelwriter/text/counting.py,sha256=TTQoXgK_RThdOkDcM1B3u0X80HxFgKLgvhBgZkNLefM,4236
319
- novelwriter/tools/__init__.py,sha256=1MVOieA7WQw_xjH7d944hko81I4OM7gPAdSomN8zz3M,40
320
- novelwriter/tools/dictionaries.py,sha256=Pa9w0buzLoXDLmaCRGOGXc7Fd1qj55PVThGK5jqFMFY,9132
321
- novelwriter/tools/lipsum.py,sha256=hKp5siA5TC_KGDufTGy0j0fqSjSwPDdiNvOAuVsMImk,4784
322
- novelwriter/tools/manusbuild.py,sha256=Jg0B8MgGI_wqDtzkJvOVD2VB_ow5GotFqsEIbG03RHo,13773
323
- novelwriter/tools/manuscript.py,sha256=TdWwcNstZP_QZ3tr6HLKcTrNFp5JETcwS-RGLL-Btzw,40200
324
- novelwriter/tools/manussettings.py,sha256=znuiyVXufaXEhnfCg1KJgXRJPeqfa1PBwk7j3-bjx-0,56016
325
- novelwriter/tools/noveldetails.py,sha256=dSewn6DfniVcFKF3h50Fpyu3a7GA_oClOlJhUa2BbVM,18481
326
- novelwriter/tools/welcome.py,sha256=Moo-krPjwtQMO0jRKXlwyRQNulMgdNxZfZVLXT41thk,27960
327
- novelwriter/tools/writingstats.py,sha256=ukgQJRtIKij0bF13Z0Vo-KMkxkTjk7OzOQrjBZIbrJ8,22557
328
- novelWriter-2.4b1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
329
- novelWriter-2.4b1.dist-info/METADATA,sha256=CIhwqC13mWfDRq1gptYmOff7HJL4C3hsrKR3sHur3jA,2582
330
- novelWriter-2.4b1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
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.4b1"
46
- __hexversion__ = "0x020400b1"
47
- __date__ = "2024-03-26"
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.exec_()
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.exec_())
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
@@ -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="m0 0v4l8 8-8 8v4h4l8-8 8 8h4v-4l-8-8 8-8v-4h-4l-8 8-8-8h-4z" fill="#f00" stroke-width=".70711"/>
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 = typ_arrow-right.svg
104
- unfold-show = typ_arrow-down.svg
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 = typ_arrow-right.svg
104
- unfold-show = typ_arrow-down.svg
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>
Binary file
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(QStandardPaths.ConfigLocation))
65
- dataRoot = Path(QStandardPaths.writableLocation(QStandardPaths.AppDataLocation))
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.fmtHardScene": (str, ""),
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.hideHardScene": (bool, False),
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.fmtHardScene": QT_TRANSLATE_NOOP("Builds", "Hard Scene Format"),
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 = Path.home()
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 Path.home()
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 = Path.home()
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)