novelWriter 2.6.2__py3-none-any.whl → 2.7__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 (348) hide show
  1. novelwriter/__init__.py +98 -75
  2. novelwriter/assets/i18n/nw_cs_CZ.qm +0 -0
  3. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  4. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  5. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  6. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  7. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  8. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  9. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  10. novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  11. novelwriter/assets/i18n/nw_pl_PL.qm +0 -0
  12. novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  13. novelwriter/assets/i18n/nw_ru_RU.qm +0 -0
  14. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  15. novelwriter/assets/i18n/project_de_DE.json +3 -1
  16. novelwriter/assets/i18n/project_en_GB.json +2 -0
  17. novelwriter/assets/i18n/project_en_US.json +2 -0
  18. novelwriter/assets/i18n/project_it_IT.json +2 -0
  19. novelwriter/assets/i18n/project_ja_JP.json +2 -0
  20. novelwriter/assets/i18n/project_nb_NO.json +2 -0
  21. novelwriter/assets/i18n/project_nn_NO.json +5 -0
  22. novelwriter/assets/i18n/project_pl_PL.json +2 -0
  23. novelwriter/assets/i18n/project_pt_BR.json +2 -0
  24. novelwriter/assets/i18n/project_ru_RU.json +2 -0
  25. novelwriter/assets/i18n/project_zh_CN.json +2 -0
  26. novelwriter/assets/icons/font_awesome.icons +109 -0
  27. novelwriter/assets/icons/material_filled_bold.icons +109 -0
  28. novelwriter/assets/icons/material_filled_normal.icons +109 -0
  29. novelwriter/assets/icons/material_filled_thin.icons +109 -0
  30. novelwriter/assets/icons/material_rounded_bold.icons +109 -0
  31. novelwriter/assets/icons/material_rounded_normal.icons +109 -0
  32. novelwriter/assets/icons/material_rounded_thin.icons +109 -0
  33. novelwriter/assets/icons/remix_filled.icons +109 -0
  34. novelwriter/assets/icons/remix_outline.icons +109 -0
  35. novelwriter/assets/images/splash.png +0 -0
  36. novelwriter/assets/manual.pdf +0 -0
  37. novelwriter/assets/{manual_fr_FR.pdf → manual_fr.pdf} +0 -0
  38. novelwriter/assets/sample.zip +0 -0
  39. novelwriter/assets/syntax/cyberpunk_night.conf +1 -1
  40. novelwriter/assets/syntax/snazzy.conf +3 -3
  41. novelwriter/assets/text/credits_en.htm +12 -6
  42. novelwriter/assets/themes/cyberpunk_night.conf +23 -7
  43. novelwriter/assets/themes/default_dark.conf +20 -4
  44. novelwriter/assets/themes/default_light.conf +21 -5
  45. novelwriter/assets/themes/dracula.conf +20 -4
  46. novelwriter/assets/themes/snazzy.conf +48 -0
  47. novelwriter/assets/themes/solarized_dark.conf +24 -8
  48. novelwriter/assets/themes/solarized_light.conf +22 -6
  49. novelwriter/common.py +43 -27
  50. novelwriter/config.py +201 -139
  51. novelwriter/constants.py +92 -56
  52. novelwriter/core/buildsettings.py +26 -17
  53. novelwriter/core/coretools.py +52 -41
  54. novelwriter/core/docbuild.py +20 -13
  55. novelwriter/core/document.py +2 -2
  56. novelwriter/core/index.py +166 -432
  57. novelwriter/core/indexdata.py +406 -0
  58. novelwriter/core/item.py +50 -32
  59. novelwriter/core/itemmodel.py +43 -38
  60. novelwriter/core/novelmodel.py +225 -0
  61. novelwriter/core/options.py +1 -1
  62. novelwriter/core/project.py +24 -25
  63. novelwriter/core/projectdata.py +47 -29
  64. novelwriter/core/projectxml.py +18 -8
  65. novelwriter/core/sessions.py +32 -15
  66. novelwriter/core/spellcheck.py +4 -3
  67. novelwriter/core/status.py +12 -15
  68. novelwriter/core/storage.py +1 -1
  69. novelwriter/core/tree.py +55 -13
  70. novelwriter/dialogs/about.py +19 -22
  71. novelwriter/dialogs/docmerge.py +23 -24
  72. novelwriter/dialogs/docsplit.py +26 -26
  73. novelwriter/dialogs/editlabel.py +19 -20
  74. novelwriter/dialogs/preferences.py +143 -69
  75. novelwriter/dialogs/projectsettings.py +51 -54
  76. novelwriter/dialogs/quotes.py +14 -19
  77. novelwriter/dialogs/wordlist.py +25 -30
  78. novelwriter/enum.py +8 -0
  79. novelwriter/error.py +16 -16
  80. novelwriter/extensions/configlayout.py +24 -20
  81. novelwriter/extensions/eventfilters.py +9 -5
  82. novelwriter/extensions/modified.py +34 -15
  83. novelwriter/extensions/novelselector.py +18 -5
  84. novelwriter/extensions/pagedsidebar.py +39 -49
  85. novelwriter/extensions/progressbars.py +10 -8
  86. novelwriter/extensions/statusled.py +6 -13
  87. novelwriter/extensions/switch.py +31 -41
  88. novelwriter/extensions/switchbox.py +8 -3
  89. novelwriter/extensions/versioninfo.py +4 -4
  90. novelwriter/formats/shared.py +1 -1
  91. novelwriter/formats/todocx.py +14 -10
  92. novelwriter/formats/tohtml.py +7 -5
  93. novelwriter/formats/tokenizer.py +37 -33
  94. novelwriter/formats/tomarkdown.py +6 -2
  95. novelwriter/formats/toodt.py +27 -22
  96. novelwriter/formats/toqdoc.py +19 -14
  97. novelwriter/formats/toraw.py +6 -2
  98. novelwriter/gui/doceditor.py +314 -305
  99. novelwriter/gui/dochighlight.py +46 -45
  100. novelwriter/gui/docviewer.py +102 -104
  101. novelwriter/gui/docviewerpanel.py +47 -51
  102. novelwriter/gui/editordocument.py +8 -5
  103. novelwriter/gui/itemdetails.py +15 -18
  104. novelwriter/gui/mainmenu.py +147 -146
  105. novelwriter/gui/noveltree.py +246 -406
  106. novelwriter/gui/outline.py +145 -76
  107. novelwriter/gui/projtree.py +139 -132
  108. novelwriter/gui/search.py +34 -31
  109. novelwriter/gui/sidebar.py +13 -18
  110. novelwriter/gui/statusbar.py +27 -21
  111. novelwriter/gui/theme.py +554 -436
  112. novelwriter/guimain.py +56 -38
  113. novelwriter/shared.py +32 -23
  114. novelwriter/splash.py +74 -0
  115. novelwriter/text/comments.py +70 -0
  116. novelwriter/text/patterns.py +4 -4
  117. novelwriter/tools/dictionaries.py +20 -29
  118. novelwriter/tools/lipsum.py +18 -18
  119. novelwriter/tools/manusbuild.py +39 -42
  120. novelwriter/tools/manuscript.py +114 -127
  121. novelwriter/tools/manussettings.py +129 -102
  122. novelwriter/tools/noveldetails.py +60 -72
  123. novelwriter/tools/welcome.py +57 -75
  124. novelwriter/tools/writingstats.py +112 -102
  125. novelwriter/types.py +5 -7
  126. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/METADATA +6 -6
  127. novelwriter-2.7.dist-info/RECORD +162 -0
  128. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/WHEEL +1 -1
  129. novelWriter-2.6.2.dist-info/RECORD +0 -363
  130. novelwriter/assets/icons/typicons_dark/README.md +0 -29
  131. novelwriter/assets/icons/typicons_dark/icons.conf +0 -134
  132. novelwriter/assets/icons/typicons_dark/mixed_copy.svg +0 -4
  133. novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg +0 -12
  134. novelwriter/assets/icons/typicons_dark/mixed_document-new.svg +0 -6
  135. novelwriter/assets/icons/typicons_dark/mixed_document-note.svg +0 -12
  136. novelwriter/assets/icons/typicons_dark/mixed_document-scene.svg +0 -12
  137. novelwriter/assets/icons/typicons_dark/mixed_document-section.svg +0 -12
  138. novelwriter/assets/icons/typicons_dark/mixed_document-title.svg +0 -12
  139. novelwriter/assets/icons/typicons_dark/mixed_edit.svg +0 -4
  140. novelwriter/assets/icons/typicons_dark/mixed_import.svg +0 -5
  141. novelwriter/assets/icons/typicons_dark/mixed_input-checked.svg +0 -5
  142. novelwriter/assets/icons/typicons_dark/mixed_input-none.svg +0 -5
  143. novelwriter/assets/icons/typicons_dark/mixed_input-unchecked.svg +0 -5
  144. novelwriter/assets/icons/typicons_dark/mixed_margin-bottom.svg +0 -6
  145. novelwriter/assets/icons/typicons_dark/mixed_margin-left.svg +0 -6
  146. novelwriter/assets/icons/typicons_dark/mixed_margin-right.svg +0 -6
  147. novelwriter/assets/icons/typicons_dark/mixed_margin-top.svg +0 -6
  148. novelwriter/assets/icons/typicons_dark/mixed_search-replace.svg +0 -6
  149. novelwriter/assets/icons/typicons_dark/mixed_size-height.svg +0 -6
  150. novelwriter/assets/icons/typicons_dark/mixed_size-width.svg +0 -6
  151. novelwriter/assets/icons/typicons_dark/nw_deco-h0.svg +0 -4
  152. novelwriter/assets/icons/typicons_dark/nw_deco-h1.svg +0 -4
  153. novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +0 -4
  154. novelwriter/assets/icons/typicons_dark/nw_deco-h2.svg +0 -4
  155. novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +0 -4
  156. novelwriter/assets/icons/typicons_dark/nw_deco-h3.svg +0 -4
  157. novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +0 -4
  158. novelwriter/assets/icons/typicons_dark/nw_deco-h4.svg +0 -4
  159. novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +0 -4
  160. novelwriter/assets/icons/typicons_dark/nw_deco-noveltree-more.svg +0 -4
  161. novelwriter/assets/icons/typicons_dark/nw_font.svg +0 -4
  162. novelwriter/assets/icons/typicons_dark/nw_panel.svg +0 -4
  163. novelwriter/assets/icons/typicons_dark/nw_quote.svg +0 -4
  164. novelwriter/assets/icons/typicons_dark/nw_search-case.svg +0 -4
  165. novelwriter/assets/icons/typicons_dark/nw_search-preserve.svg +0 -4
  166. novelwriter/assets/icons/typicons_dark/nw_search-regex.svg +0 -4
  167. novelwriter/assets/icons/typicons_dark/nw_search-word.svg +0 -4
  168. novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +0 -4
  169. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +0 -6
  170. novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +0 -4
  171. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +0 -6
  172. novelwriter/assets/icons/typicons_dark/nw_tb-mark.svg +0 -7
  173. novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +0 -4
  174. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +0 -6
  175. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +0 -7
  176. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +0 -7
  177. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +0 -7
  178. novelwriter/assets/icons/typicons_dark/nw_toolbar.svg +0 -5
  179. novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg +0 -4
  180. novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg +0 -4
  181. novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg +0 -4
  182. novelwriter/assets/icons/typicons_dark/typ_arrow-minimise.svg +0 -4
  183. novelwriter/assets/icons/typicons_dark/typ_arrow-repeat-grey.svg +0 -4
  184. novelwriter/assets/icons/typicons_dark/typ_book-grey.svg +0 -4
  185. novelwriter/assets/icons/typicons_dark/typ_book.svg +0 -6
  186. novelwriter/assets/icons/typicons_dark/typ_bookmark.svg +0 -4
  187. novelwriter/assets/icons/typicons_dark/typ_calendar.svg +0 -4
  188. novelwriter/assets/icons/typicons_dark/typ_cancel-grey.svg +0 -4
  189. novelwriter/assets/icons/typicons_dark/typ_cancel.svg +0 -4
  190. novelwriter/assets/icons/typicons_dark/typ_chart-bar-grey.svg +0 -4
  191. novelwriter/assets/icons/typicons_dark/typ_chevron-down.svg +0 -4
  192. novelwriter/assets/icons/typicons_dark/typ_chevron-left.svg +0 -4
  193. novelwriter/assets/icons/typicons_dark/typ_chevron-right.svg +0 -4
  194. novelwriter/assets/icons/typicons_dark/typ_chevron-up.svg +0 -4
  195. novelwriter/assets/icons/typicons_dark/typ_cog.svg +0 -4
  196. novelwriter/assets/icons/typicons_dark/typ_delete-full.svg +0 -4
  197. novelwriter/assets/icons/typicons_dark/typ_delete.svg +0 -4
  198. novelwriter/assets/icons/typicons_dark/typ_directions-full.svg +0 -4
  199. novelwriter/assets/icons/typicons_dark/typ_document-add.svg +0 -4
  200. novelwriter/assets/icons/typicons_dark/typ_document-text.svg +0 -8
  201. novelwriter/assets/icons/typicons_dark/typ_document.svg +0 -4
  202. novelwriter/assets/icons/typicons_dark/typ_export-grey.svg +0 -4
  203. novelwriter/assets/icons/typicons_dark/typ_export.svg +0 -4
  204. novelwriter/assets/icons/typicons_dark/typ_eye.svg +0 -4
  205. novelwriter/assets/icons/typicons_dark/typ_flag.svg +0 -4
  206. novelwriter/assets/icons/typicons_dark/typ_folder-open.svg +0 -4
  207. novelwriter/assets/icons/typicons_dark/typ_folder.svg +0 -5
  208. novelwriter/assets/icons/typicons_dark/typ_globe-grey.svg +0 -4
  209. novelwriter/assets/icons/typicons_dark/typ_key.svg +0 -4
  210. novelwriter/assets/icons/typicons_dark/typ_lightbulb-full.svg +0 -4
  211. novelwriter/assets/icons/typicons_dark/typ_location.svg +0 -4
  212. novelwriter/assets/icons/typicons_dark/typ_media-pause-grey.svg +0 -4
  213. novelwriter/assets/icons/typicons_dark/typ_media-record-outline.svg +0 -4
  214. novelwriter/assets/icons/typicons_dark/typ_media-record.svg +0 -4
  215. novelwriter/assets/icons/typicons_dark/typ_minus.svg +0 -4
  216. novelwriter/assets/icons/typicons_dark/typ_pencil.svg +0 -5
  217. novelwriter/assets/icons/typicons_dark/typ_pin-outline.svg +0 -4
  218. novelwriter/assets/icons/typicons_dark/typ_pin.svg +0 -4
  219. novelwriter/assets/icons/typicons_dark/typ_plus.svg +0 -4
  220. novelwriter/assets/icons/typicons_dark/typ_puzzle-outline.svg +0 -4
  221. novelwriter/assets/icons/typicons_dark/typ_puzzle.svg +0 -4
  222. novelwriter/assets/icons/typicons_dark/typ_refresh-flipped.svg +0 -4
  223. novelwriter/assets/icons/typicons_dark/typ_refresh.svg +0 -4
  224. novelwriter/assets/icons/typicons_dark/typ_search-grey.svg +0 -4
  225. novelwriter/assets/icons/typicons_dark/typ_search.svg +0 -4
  226. novelwriter/assets/icons/typicons_dark/typ_star.svg +0 -4
  227. novelwriter/assets/icons/typicons_dark/typ_stopwatch-grey.svg +0 -4
  228. novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +0 -4
  229. novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +0 -4
  230. novelwriter/assets/icons/typicons_dark/typ_th-list-grey.svg +0 -4
  231. novelwriter/assets/icons/typicons_dark/typ_th-list.svg +0 -9
  232. novelwriter/assets/icons/typicons_dark/typ_times.svg +0 -4
  233. novelwriter/assets/icons/typicons_dark/typ_trash.svg +0 -5
  234. novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +0 -4
  235. novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +0 -4
  236. novelwriter/assets/icons/typicons_dark/typ_user.svg +0 -5
  237. novelwriter/assets/icons/typicons_dark/typ_warning-full.svg +0 -4
  238. novelwriter/assets/icons/typicons_light/README.md +0 -29
  239. novelwriter/assets/icons/typicons_light/icons.conf +0 -134
  240. novelwriter/assets/icons/typicons_light/mixed_copy.svg +0 -4
  241. novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg +0 -12
  242. novelwriter/assets/icons/typicons_light/mixed_document-new.svg +0 -6
  243. novelwriter/assets/icons/typicons_light/mixed_document-note.svg +0 -12
  244. novelwriter/assets/icons/typicons_light/mixed_document-scene.svg +0 -12
  245. novelwriter/assets/icons/typicons_light/mixed_document-section.svg +0 -12
  246. novelwriter/assets/icons/typicons_light/mixed_document-title.svg +0 -12
  247. novelwriter/assets/icons/typicons_light/mixed_edit.svg +0 -4
  248. novelwriter/assets/icons/typicons_light/mixed_import.svg +0 -5
  249. novelwriter/assets/icons/typicons_light/mixed_input-checked.svg +0 -5
  250. novelwriter/assets/icons/typicons_light/mixed_input-none.svg +0 -5
  251. novelwriter/assets/icons/typicons_light/mixed_input-unchecked.svg +0 -5
  252. novelwriter/assets/icons/typicons_light/mixed_margin-bottom.svg +0 -6
  253. novelwriter/assets/icons/typicons_light/mixed_margin-left.svg +0 -6
  254. novelwriter/assets/icons/typicons_light/mixed_margin-right.svg +0 -6
  255. novelwriter/assets/icons/typicons_light/mixed_margin-top.svg +0 -6
  256. novelwriter/assets/icons/typicons_light/mixed_search-replace.svg +0 -6
  257. novelwriter/assets/icons/typicons_light/mixed_size-height.svg +0 -6
  258. novelwriter/assets/icons/typicons_light/mixed_size-width.svg +0 -6
  259. novelwriter/assets/icons/typicons_light/nw_deco-h0.svg +0 -4
  260. novelwriter/assets/icons/typicons_light/nw_deco-h1.svg +0 -4
  261. novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +0 -4
  262. novelwriter/assets/icons/typicons_light/nw_deco-h2.svg +0 -4
  263. novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +0 -4
  264. novelwriter/assets/icons/typicons_light/nw_deco-h3.svg +0 -4
  265. novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +0 -4
  266. novelwriter/assets/icons/typicons_light/nw_deco-h4.svg +0 -4
  267. novelwriter/assets/icons/typicons_light/nw_deco-note.svg +0 -4
  268. novelwriter/assets/icons/typicons_light/nw_deco-noveltree-more.svg +0 -4
  269. novelwriter/assets/icons/typicons_light/nw_font.svg +0 -4
  270. novelwriter/assets/icons/typicons_light/nw_panel.svg +0 -4
  271. novelwriter/assets/icons/typicons_light/nw_quote.svg +0 -4
  272. novelwriter/assets/icons/typicons_light/nw_search-case.svg +0 -4
  273. novelwriter/assets/icons/typicons_light/nw_search-preserve.svg +0 -4
  274. novelwriter/assets/icons/typicons_light/nw_search-regex.svg +0 -4
  275. novelwriter/assets/icons/typicons_light/nw_search-word.svg +0 -4
  276. novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +0 -4
  277. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +0 -6
  278. novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +0 -4
  279. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +0 -6
  280. novelwriter/assets/icons/typicons_light/nw_tb-mark.svg +0 -7
  281. novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +0 -4
  282. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +0 -6
  283. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +0 -7
  284. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +0 -7
  285. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +0 -7
  286. novelwriter/assets/icons/typicons_light/nw_toolbar.svg +0 -5
  287. novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg +0 -4
  288. novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg +0 -4
  289. novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg +0 -4
  290. novelwriter/assets/icons/typicons_light/typ_arrow-minimise.svg +0 -4
  291. novelwriter/assets/icons/typicons_light/typ_arrow-repeat-grey.svg +0 -4
  292. novelwriter/assets/icons/typicons_light/typ_book-grey.svg +0 -4
  293. novelwriter/assets/icons/typicons_light/typ_book.svg +0 -6
  294. novelwriter/assets/icons/typicons_light/typ_bookmark.svg +0 -4
  295. novelwriter/assets/icons/typicons_light/typ_calendar.svg +0 -4
  296. novelwriter/assets/icons/typicons_light/typ_cancel-grey.svg +0 -4
  297. novelwriter/assets/icons/typicons_light/typ_cancel.svg +0 -4
  298. novelwriter/assets/icons/typicons_light/typ_chart-bar-grey.svg +0 -4
  299. novelwriter/assets/icons/typicons_light/typ_chevron-down.svg +0 -4
  300. novelwriter/assets/icons/typicons_light/typ_chevron-left.svg +0 -4
  301. novelwriter/assets/icons/typicons_light/typ_chevron-right.svg +0 -4
  302. novelwriter/assets/icons/typicons_light/typ_chevron-up.svg +0 -4
  303. novelwriter/assets/icons/typicons_light/typ_cog.svg +0 -4
  304. novelwriter/assets/icons/typicons_light/typ_delete-full.svg +0 -4
  305. novelwriter/assets/icons/typicons_light/typ_delete.svg +0 -4
  306. novelwriter/assets/icons/typicons_light/typ_directions-full.svg +0 -4
  307. novelwriter/assets/icons/typicons_light/typ_document-add.svg +0 -4
  308. novelwriter/assets/icons/typicons_light/typ_document-text.svg +0 -5
  309. novelwriter/assets/icons/typicons_light/typ_document.svg +0 -4
  310. novelwriter/assets/icons/typicons_light/typ_export-grey.svg +0 -4
  311. novelwriter/assets/icons/typicons_light/typ_export.svg +0 -4
  312. novelwriter/assets/icons/typicons_light/typ_eye.svg +0 -4
  313. novelwriter/assets/icons/typicons_light/typ_flag.svg +0 -4
  314. novelwriter/assets/icons/typicons_light/typ_folder-open.svg +0 -4
  315. novelwriter/assets/icons/typicons_light/typ_folder.svg +0 -5
  316. novelwriter/assets/icons/typicons_light/typ_globe-grey.svg +0 -4
  317. novelwriter/assets/icons/typicons_light/typ_key.svg +0 -4
  318. novelwriter/assets/icons/typicons_light/typ_lightbulb-full.svg +0 -4
  319. novelwriter/assets/icons/typicons_light/typ_location.svg +0 -4
  320. novelwriter/assets/icons/typicons_light/typ_media-pause-grey.svg +0 -4
  321. novelwriter/assets/icons/typicons_light/typ_media-record-outline.svg +0 -4
  322. novelwriter/assets/icons/typicons_light/typ_media-record.svg +0 -4
  323. novelwriter/assets/icons/typicons_light/typ_minus.svg +0 -4
  324. novelwriter/assets/icons/typicons_light/typ_pencil.svg +0 -5
  325. novelwriter/assets/icons/typicons_light/typ_pin-outline.svg +0 -4
  326. novelwriter/assets/icons/typicons_light/typ_pin.svg +0 -4
  327. novelwriter/assets/icons/typicons_light/typ_plus.svg +0 -4
  328. novelwriter/assets/icons/typicons_light/typ_puzzle-outline.svg +0 -4
  329. novelwriter/assets/icons/typicons_light/typ_puzzle.svg +0 -4
  330. novelwriter/assets/icons/typicons_light/typ_refresh-flipped.svg +0 -4
  331. novelwriter/assets/icons/typicons_light/typ_refresh.svg +0 -4
  332. novelwriter/assets/icons/typicons_light/typ_search-grey.svg +0 -4
  333. novelwriter/assets/icons/typicons_light/typ_search.svg +0 -4
  334. novelwriter/assets/icons/typicons_light/typ_star.svg +0 -4
  335. novelwriter/assets/icons/typicons_light/typ_stopwatch-grey.svg +0 -4
  336. novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +0 -4
  337. novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +0 -4
  338. novelwriter/assets/icons/typicons_light/typ_th-list-grey.svg +0 -4
  339. novelwriter/assets/icons/typicons_light/typ_th-list.svg +0 -9
  340. novelwriter/assets/icons/typicons_light/typ_times.svg +0 -4
  341. novelwriter/assets/icons/typicons_light/typ_trash.svg +0 -5
  342. novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +0 -4
  343. novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +0 -4
  344. novelwriter/assets/icons/typicons_light/typ_user.svg +0 -5
  345. novelwriter/assets/icons/typicons_light/typ_warning-full.svg +0 -4
  346. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/entry_points.txt +0 -0
  347. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info/licenses}/LICENSE.md +0 -0
  348. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/top_level.txt +0 -0
novelwriter/__init__.py CHANGED
@@ -25,31 +25,33 @@ from __future__ import annotations
25
25
 
26
26
  import getopt
27
27
  import logging
28
+ import os
28
29
  import sys
29
30
 
30
31
  from typing import TYPE_CHECKING
31
32
 
32
- from PyQt5.QtWidgets import QApplication, QErrorMessage
33
+ from PyQt6.QtWidgets import QApplication, QErrorMessage
33
34
 
34
35
  from novelwriter.config import Config
35
36
  from novelwriter.error import exceptionHandler
36
37
  from novelwriter.shared import SharedData
38
+ from novelwriter.splash import NSplashScreen
37
39
 
38
- if TYPE_CHECKING: # pragma: no cover
40
+ if TYPE_CHECKING:
39
41
  from novelwriter.guimain import GuiMain
40
42
 
41
43
  # Package Meta
42
44
  # ============
43
45
 
44
46
  __package__ = "novelwriter"
45
- __copyright__ = "Copyright 2018–2024, Veronica Berglyd Olsen"
47
+ __copyright__ = "Copyright 2018-2025 Veronica Berglyd Olsen"
46
48
  __license__ = "GPLv3"
47
49
  __author__ = "Veronica Berglyd Olsen"
48
50
  __maintainer__ = "Veronica Berglyd Olsen"
49
51
  __email__ = "code@vkbo.net"
50
- __version__ = "2.6.2"
51
- __hexversion__ = "0x020602f0"
52
- __date__ = "2025-02-16"
52
+ __version__ = "2.7"
53
+ __hexversion__ = "0x020700f0"
54
+ __date__ = "2025-06-01"
53
55
  __status__ = "Stable"
54
56
  __domain__ = "novelwriter.io"
55
57
 
@@ -65,20 +67,24 @@ CONFIG = Config()
65
67
  SHARED = SharedData()
66
68
 
67
69
  # ANSI Colours
68
- C_RED = "\033[91m"
69
- C_GREEN = "\033[92m"
70
- C_YELLOW = "\033[93m"
71
- C_BLUE = "\033[94m"
72
- C_WHITE = "\033[97m"
73
- C_END = "\033[0m"
74
-
75
- # Log Formats
76
- L_TIME = "[{asctime:}]"
77
- L_FILE = "{filename:>18}"
78
- L_LINE = "{lineno:<4d}"
79
- L_LVLP = "{levelname:8}"
80
- L_LVLC = "{levelname:17}"
81
- L_TEXT = "{message:}"
70
+ RED = "\033[91m"
71
+ GREEN = "\033[92m"
72
+ YELLOW = "\033[93m"
73
+ BLUE = "\033[94m"
74
+ WHITE = "\033[97m"
75
+ END = "\033[0m"
76
+
77
+ # Log Format Components
78
+ TIME = "[{asctime:}]"
79
+ FILE = "{filename:>18}"
80
+ LINE = "{lineno:<4d}"
81
+ LVLP = "{levelname:8}"
82
+ LVLC = "{levelname:17}"
83
+ TEXT = "{message:}"
84
+
85
+ # Read Environment
86
+ FORCE_COLOR = bool(os.environ.get("FORCE_COLOR"))
87
+ NO_COLOR = bool(os.environ.get("NO_COLOR"))
82
88
 
83
89
 
84
90
  def main(sysArgs: list | None = None) -> GuiMain | None:
@@ -87,7 +93,7 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
87
93
  sysArgs = sys.argv[1:]
88
94
 
89
95
  # Valid Input Options
90
- shortOpt = "hv"
96
+ shortOpt = "hvidc"
91
97
  longOpt = [
92
98
  "help",
93
99
  "version",
@@ -97,7 +103,6 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
97
103
  "style=",
98
104
  "config=",
99
105
  "data=",
100
- "testmode",
101
106
  "meminfo"
102
107
  ]
103
108
 
@@ -105,29 +110,37 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
105
110
  f"novelWriter {__version__} ({__date__})\n"
106
111
  f"{__copyright__}\n"
107
112
  "\n"
113
+ "This program is free software: you can redistribute it and/or modify\n"
114
+ "it under the terms of the GNU General Public License as published by\n"
115
+ "the Free Software Foundation, either version 3 of the License, or\n"
116
+ "(at your option) any later version.\n"
117
+ "\n"
108
118
  "This program is distributed in the hope that it will be useful,\n"
109
119
  "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
110
120
  "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
111
121
  "GNU General Public Licence for more details.\n"
112
122
  "\n"
123
+ "You should have received a copy of the GNU General Public License\n"
124
+ "along with this program. If not, see <https://www.gnu.org/licenses/>.\n"
125
+ "\n"
113
126
  "Usage:\n"
114
127
  " -h, --help Print this message.\n"
115
128
  " -v, --version Print program version and exit.\n"
116
- " --info Print additional runtime information.\n"
117
- " --debug Print debug output. Includes --info.\n"
118
- " --color Add ANSI colors to log output.\n"
129
+ " -i, --info Print additional runtime information.\n"
130
+ " -d, --debug Print debug output. Includes --info.\n"
131
+ " -c, --color Add ANSI colors to log output.\n"
119
132
  " --meminfo Show memory usage information in the status bar.\n"
120
- " --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n"
133
+ " --style= Sets Qt style flag. Defaults to 'Fusion'.\n"
121
134
  " --config= Alternative config file.\n"
122
135
  " --data= Alternative user data path.\n"
123
136
  )
124
137
 
125
138
  # Defaults
126
139
  logLevel = logging.WARN
127
- fmtFlags = 0b00
140
+ fmtColor = FORCE_COLOR
141
+ fmtLong = False
128
142
  confPath = None
129
143
  dataPath = None
130
- testMode = False
131
144
  qtStyle = "Fusion"
132
145
  cmdOpen = None
133
146
 
@@ -136,7 +149,7 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
136
149
  inOpts, inRemain = getopt.getopt(sysArgs, shortOpt, longOpt)
137
150
  except getopt.GetoptError as exc:
138
151
  print(helpMsg)
139
- print(f"ERROR: {str(exc)}")
152
+ print(f"ERROR: {exc!s}")
140
153
  sys.exit(2)
141
154
 
142
155
  if len(inRemain) > 0:
@@ -147,45 +160,37 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
147
160
  print(helpMsg)
148
161
  sys.exit(0)
149
162
  elif inOpt in ("-v", "--version"):
150
- print("novelWriter Version %s [%s]" % (__version__, __date__))
163
+ print(f"novelWriter Version {__version__} [{__date__}]")
151
164
  sys.exit(0)
152
- elif inOpt == "--info":
165
+ elif inOpt in ("-i", "--info"):
153
166
  logLevel = logging.INFO
154
- elif inOpt == "--debug":
167
+ elif inOpt in ("-d", "--debug"):
155
168
  CONFIG.isDebug = True
156
- fmtFlags = fmtFlags | 0b10
169
+ fmtLong = True
157
170
  logLevel = logging.DEBUG
158
- elif inOpt == "--color":
159
- fmtFlags = fmtFlags | 0b01
171
+ elif inOpt in ("-c", "--color"):
172
+ fmtColor = not NO_COLOR
173
+ elif inOpt == "--meminfo":
174
+ CONFIG.memInfo = True
160
175
  elif inOpt == "--style":
161
176
  qtStyle = inArg
162
177
  elif inOpt == "--config":
163
178
  confPath = inArg
164
179
  elif inOpt == "--data":
165
180
  dataPath = inArg
166
- elif inOpt == "--testmode":
167
- testMode = True
168
- elif inOpt == "--meminfo":
169
- CONFIG.memInfo = True
170
181
 
171
- if fmtFlags & 0b01:
182
+ if fmtColor:
172
183
  # This will overwrite the default level names, and also ensure that
173
184
  # they can be converted back to integer levels
174
- logging.addLevelName(logging.DEBUG, f"{C_BLUE}DEBUG{C_END}")
175
- logging.addLevelName(logging.INFO, f"{C_GREEN}INFO{C_END}")
176
- logging.addLevelName(logging.WARNING, f"{C_YELLOW}WARNING{C_END}")
177
- logging.addLevelName(logging.ERROR, f"{C_RED}ERROR{C_END}")
178
- logging.addLevelName(logging.CRITICAL, f"{C_RED}CRITICAL{C_END}")
179
-
180
- # Determine Log Format
181
- if fmtFlags == 0b00:
182
- logFmt = f"{L_LVLP} {L_TEXT}"
183
- elif fmtFlags == 0b01:
184
- logFmt = f"{L_LVLC} {L_TEXT}"
185
- elif fmtFlags == 0b10:
186
- logFmt = f"{L_TIME} {L_FILE}:{L_LINE} {L_LVLP} {L_TEXT}"
187
- elif fmtFlags == 0b11:
188
- logFmt = f"{L_TIME} {C_BLUE}{L_FILE}{C_END}:{C_WHITE}{L_LINE}{C_END} {L_LVLC} {L_TEXT}"
185
+ logging.addLevelName(logging.DEBUG, f"{BLUE}DEBUG{END}")
186
+ logging.addLevelName(logging.INFO, f"{GREEN}INFO{END}")
187
+ logging.addLevelName(logging.WARNING, f"{YELLOW}WARNING{END}")
188
+ logging.addLevelName(logging.ERROR, f"{RED}ERROR{END}")
189
+ logging.addLevelName(logging.CRITICAL, f"{RED}CRITICAL{END}")
190
+
191
+ logTxt = f"{LVLC} {TEXT}" if fmtColor else f"{LVLP} {TEXT}"
192
+ logPos = f"{BLUE}{FILE}{END}:{WHITE}{LINE}{END}" if fmtColor else f"{FILE}:{LINE}"
193
+ logFmt = f"{TIME} {logPos} {logTxt}" if fmtLong else logTxt
189
194
 
190
195
  # Setup Logging
191
196
  pkgLogger = logging.getLogger(__package__)
@@ -201,19 +206,19 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
201
206
  # Check Packages and Versions
202
207
  errorData = []
203
208
  errorCode = 0
204
- if sys.hexversion < 0x030900f0:
209
+ if sys.hexversion < 0x030a00f0:
205
210
  errorData.append(
206
- "At least Python 3.9 is required, found %s" % CONFIG.verPyString
211
+ f"At least Python 3.10 is required, found {CONFIG.verPyString}"
207
212
  )
208
213
  errorCode |= 0x04
209
- if CONFIG.verQtValue < 0x050f00:
214
+ if CONFIG.verQtValue < 0x060400:
210
215
  errorData.append(
211
- "At least Qt5 version 5.15.0 is required, found %s" % CONFIG.verQtString
216
+ f"At least Qt6 version 6.4 is required, found {CONFIG.verQtString}"
212
217
  )
213
218
  errorCode |= 0x08
214
- if CONFIG.verPyQtValue < 0x050f00:
219
+ if CONFIG.verPyQtValue < 0x060400:
215
220
  errorData.append(
216
- "At least PyQt5 version 5.15.0 is required, found %s" % CONFIG.verPyQtString
221
+ f"At least PyQt6 version 6.4 is required, found {CONFIG.verPyQtString}"
217
222
  )
218
223
  errorCode |= 0x10
219
224
 
@@ -224,9 +229,9 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
224
229
  errDlg.showMessage((
225
230
  "<h3>A critical error was encountered</h3>"
226
231
  "<p>novelWriter cannot start due to the following issues:<p>"
227
- "<p>&nbsp;-&nbsp;%s</p>"
232
+ "<p>&nbsp;-&nbsp;{0}</p>"
228
233
  "<p>Shutting down ...</p>"
229
- ) % (
234
+ ).format(
230
235
  "<br>&nbsp;-&nbsp;".join(errorData)
231
236
  ))
232
237
  for errLine in errorData:
@@ -254,29 +259,47 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
254
259
  pass # Quietly ignore error
255
260
 
256
261
  # Import GUI (after dependency checks), and launch
262
+ from novelwriter.gui.theme import GuiTheme
257
263
  from novelwriter.guimain import GuiMain
258
264
 
259
- if testMode:
260
- # Only used for testing where the test framework creates the app
261
- CONFIG.loadConfig()
262
- return GuiMain()
263
-
264
- app = QApplication([CONFIG.appName, (f"-style={qtStyle}")])
265
- app.setApplicationName(CONFIG.appName)
266
- app.setApplicationVersion(__version__)
267
- app.setOrganizationDomain(__domain__)
268
- app.setOrganizationName(__domain__)
269
- app.setDesktopFileName(CONFIG.appName)
265
+ # Create App
266
+ app = _createApp(qtStyle)
270
267
 
271
268
  # Connect the exception handler before making the main GUI
272
269
  sys.excepthook = exceptionHandler
273
270
 
271
+ splash = NSplashScreen()
272
+ splash.show()
273
+
274
+ splash.showStatus("")
275
+ splash.showStatus("Starting novelWriter ...")
276
+
274
277
  # Run Config steps that require the QApplication
275
- CONFIG.loadConfig()
278
+ CONFIG.loadConfig(splash)
276
279
  CONFIG.initLocalisation(app)
280
+ SHARED.initTheme(GuiTheme())
277
281
 
278
282
  # Launch main GUI
279
283
  nwGUI = GuiMain()
284
+ nwGUI.showNormal()
285
+ splash.finish(nwGUI)
286
+
287
+ CONFIG.finishStartup()
288
+ del splash
289
+
280
290
  nwGUI.postLaunchTasks(cmdOpen)
281
291
 
282
292
  sys.exit(app.exec())
293
+
294
+
295
+ def _createApp(style: str) -> QApplication:
296
+ """Create the app. This is done in a function to make it easier to
297
+ block app creation during testing.
298
+ """
299
+ app = QApplication([CONFIG.appName, f"-style={style}"])
300
+ app.setApplicationName(CONFIG.appName)
301
+ app.setApplicationVersion(__version__)
302
+ app.setOrganizationDomain(__domain__)
303
+ app.setOrganizationName(__domain__)
304
+ app.setDesktopFileName(CONFIG.appName)
305
+ return app
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,8 +1,10 @@
1
1
  {
2
- "Synopsis": "Synopsis",
2
+ "Synopsis": "Zusammenfassung",
3
3
  "Short Description": "Kurzbeschreibung",
4
4
  "Footnotes": "Fußnoten",
5
5
  "Comment": "Kommentar",
6
+ "Story Structure": "Struktur",
7
+ "Note": "Notiz",
6
8
  "Notes": "Notizen",
7
9
  "Tag": "Schlagwort",
8
10
  "Point of View": "Perspektive",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Short Description",
4
4
  "Footnotes": "Footnotes",
5
5
  "Comment": "Comment",
6
+ "Story Structure": "Story Structure",
7
+ "Note": "Note",
6
8
  "Notes": "Notes",
7
9
  "Tag": "Tag",
8
10
  "Point of View": "Point of View",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Short Description",
4
4
  "Footnotes": "Footnotes",
5
5
  "Comment": "Comment",
6
+ "Story Structure": "Story Structure",
7
+ "Note": "Note",
6
8
  "Notes": "Notes",
7
9
  "Tag": "Tag",
8
10
  "Point of View": "Point of View",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Breve descrizione",
4
4
  "Footnotes": "Note a piè pagina",
5
5
  "Comment": "Commento",
6
+ "Story Structure": "Struttura della storia",
7
+ "Note": "Nota",
6
8
  "Notes": "Note",
7
9
  "Tag": "Etichetta",
8
10
  "Point of View": "Punto di vista",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "短い説明",
4
4
  "Footnotes": "脚注",
5
5
  "Comment": "コメント ",
6
+ "Story Structure": "ストーリー構造",
7
+ "Note": "ノート",
6
8
  "Notes": "ノート",
7
9
  "Tag": "タグ",
8
10
  "Point of View": "視点",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Kort beskrivelse",
4
4
  "Footnotes": "Fotnoter",
5
5
  "Comment": "Kommentar",
6
+ "Story Structure": "Tekst-element",
7
+ "Note": "Notat",
6
8
  "Notes": "Notat",
7
9
  "Tag": "Knagg",
8
10
  "Point of View": "Perspektiv",
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "Synopsis": "Samandrag",
3
+ "Short Description": "Kort beskriving",
4
+ "Footnotes": "Fotnotar",
3
5
  "Comment": "Kommentar",
6
+ "Story Structure": "Tekst-element",
7
+ "Note": "Notat",
4
8
  "Notes": "Notat",
5
9
  "Tag": "Knagg",
6
10
  "Point of View": "Perspektiv",
@@ -12,6 +16,7 @@
12
16
  "Objects": "Objekt",
13
17
  "Entities": "Eining",
14
18
  "Custom": "Anna",
19
+ "New Page": "Ny side",
15
20
  "0": "null",
16
21
  "1": "ein",
17
22
  "2": "to",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Krótki opis",
4
4
  "Footnotes": "Przypisy",
5
5
  "Comment": "Komentarz",
6
+ "Story Structure": "Struktura opowieści",
7
+ "Note": "Notatka",
6
8
  "Notes": "Notatki",
7
9
  "Tag": "Znacznik",
8
10
  "Point of View": "Punkt widzenia",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Descrição breve",
4
4
  "Footnotes": "Notas de rodapé",
5
5
  "Comment": "Comentário",
6
+ "Story Structure": "Estrutura narrativa",
7
+ "Note": "Nota",
6
8
  "Notes": "Notas",
7
9
  "Tag": "Etiqueta",
8
10
  "Point of View": "Ponto de vista",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "Synopsis": "Сводка",
3
3
  "Short Description": "Краткое описание",
4
+ "Footnotes": "Примечания",
4
5
  "Comment": "Комментарий",
5
6
  "Notes": "Заметки",
6
7
  "Tag": "Тэг",
@@ -13,6 +14,7 @@
13
14
  "Objects": "Объекты",
14
15
  "Entities": "Сущности",
15
16
  "Custom": "Другое",
17
+ "New Page": "Новая страница",
16
18
  "0": "Ноль",
17
19
  "1": "Один",
18
20
  "2": "Два",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "简短描述",
4
4
  "Footnotes": "注释",
5
5
  "Comment": "注释",
6
+ "Story Structure": "故事结构",
7
+ "Note": "笔记",
6
8
  "Notes": "笔记",
7
9
  "Tag": "标签",
8
10
  "Point of View": "视角",