novelWriter 2.6.3__py3-none-any.whl → 2.7rc1__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 (325) hide show
  1. novelwriter/__init__.py +98 -75
  2. novelwriter/assets/i18n/project_en_GB.json +2 -0
  3. novelwriter/assets/icons/font_awesome.icons +109 -0
  4. novelwriter/assets/icons/material_filled_bold.icons +109 -0
  5. novelwriter/assets/icons/material_filled_normal.icons +109 -0
  6. novelwriter/assets/icons/material_filled_thin.icons +109 -0
  7. novelwriter/assets/icons/material_rounded_bold.icons +109 -0
  8. novelwriter/assets/icons/material_rounded_normal.icons +109 -0
  9. novelwriter/assets/icons/material_rounded_thin.icons +109 -0
  10. novelwriter/assets/icons/remix_filled.icons +109 -0
  11. novelwriter/assets/icons/remix_outline.icons +109 -0
  12. novelwriter/assets/images/splash.png +0 -0
  13. novelwriter/assets/manual.pdf +0 -0
  14. novelwriter/assets/{manual_fr_FR.pdf → manual_fr.pdf} +0 -0
  15. novelwriter/assets/sample.zip +0 -0
  16. novelwriter/assets/syntax/cyberpunk_night.conf +1 -1
  17. novelwriter/assets/syntax/snazzy.conf +3 -3
  18. novelwriter/assets/text/credits_en.htm +6 -6
  19. novelwriter/assets/themes/cyberpunk_night.conf +23 -7
  20. novelwriter/assets/themes/default_dark.conf +20 -4
  21. novelwriter/assets/themes/default_light.conf +21 -5
  22. novelwriter/assets/themes/dracula.conf +20 -4
  23. novelwriter/assets/themes/snazzy.conf +48 -0
  24. novelwriter/assets/themes/solarized_dark.conf +24 -8
  25. novelwriter/assets/themes/solarized_light.conf +22 -6
  26. novelwriter/common.py +43 -27
  27. novelwriter/config.py +201 -139
  28. novelwriter/constants.py +67 -36
  29. novelwriter/core/buildsettings.py +25 -16
  30. novelwriter/core/coretools.py +52 -41
  31. novelwriter/core/docbuild.py +20 -13
  32. novelwriter/core/document.py +2 -2
  33. novelwriter/core/index.py +166 -432
  34. novelwriter/core/indexdata.py +406 -0
  35. novelwriter/core/item.py +50 -32
  36. novelwriter/core/itemmodel.py +43 -38
  37. novelwriter/core/novelmodel.py +225 -0
  38. novelwriter/core/options.py +1 -1
  39. novelwriter/core/project.py +24 -25
  40. novelwriter/core/projectdata.py +47 -29
  41. novelwriter/core/projectxml.py +18 -8
  42. novelwriter/core/sessions.py +32 -15
  43. novelwriter/core/spellcheck.py +4 -3
  44. novelwriter/core/status.py +12 -15
  45. novelwriter/core/storage.py +1 -1
  46. novelwriter/core/tree.py +55 -13
  47. novelwriter/dialogs/about.py +19 -22
  48. novelwriter/dialogs/docmerge.py +23 -24
  49. novelwriter/dialogs/docsplit.py +26 -26
  50. novelwriter/dialogs/editlabel.py +19 -20
  51. novelwriter/dialogs/preferences.py +143 -69
  52. novelwriter/dialogs/projectsettings.py +51 -54
  53. novelwriter/dialogs/quotes.py +14 -19
  54. novelwriter/dialogs/wordlist.py +25 -30
  55. novelwriter/enum.py +8 -0
  56. novelwriter/error.py +16 -16
  57. novelwriter/extensions/configlayout.py +24 -20
  58. novelwriter/extensions/eventfilters.py +9 -5
  59. novelwriter/extensions/modified.py +34 -15
  60. novelwriter/extensions/novelselector.py +18 -5
  61. novelwriter/extensions/pagedsidebar.py +39 -49
  62. novelwriter/extensions/progressbars.py +10 -8
  63. novelwriter/extensions/statusled.py +6 -13
  64. novelwriter/extensions/switch.py +31 -41
  65. novelwriter/extensions/switchbox.py +8 -3
  66. novelwriter/extensions/versioninfo.py +4 -4
  67. novelwriter/formats/shared.py +1 -1
  68. novelwriter/formats/todocx.py +14 -10
  69. novelwriter/formats/tohtml.py +7 -5
  70. novelwriter/formats/tokenizer.py +37 -33
  71. novelwriter/formats/tomarkdown.py +6 -2
  72. novelwriter/formats/toodt.py +27 -22
  73. novelwriter/formats/toqdoc.py +19 -14
  74. novelwriter/formats/toraw.py +6 -2
  75. novelwriter/gui/doceditor.py +314 -305
  76. novelwriter/gui/dochighlight.py +46 -45
  77. novelwriter/gui/docviewer.py +102 -104
  78. novelwriter/gui/docviewerpanel.py +47 -51
  79. novelwriter/gui/editordocument.py +8 -5
  80. novelwriter/gui/itemdetails.py +11 -14
  81. novelwriter/gui/mainmenu.py +146 -145
  82. novelwriter/gui/noveltree.py +246 -406
  83. novelwriter/gui/outline.py +141 -72
  84. novelwriter/gui/projtree.py +139 -132
  85. novelwriter/gui/search.py +34 -31
  86. novelwriter/gui/sidebar.py +13 -18
  87. novelwriter/gui/statusbar.py +27 -21
  88. novelwriter/gui/theme.py +554 -436
  89. novelwriter/guimain.py +56 -38
  90. novelwriter/shared.py +32 -23
  91. novelwriter/splash.py +74 -0
  92. novelwriter/text/comments.py +70 -0
  93. novelwriter/text/patterns.py +4 -4
  94. novelwriter/tools/dictionaries.py +20 -29
  95. novelwriter/tools/lipsum.py +18 -18
  96. novelwriter/tools/manusbuild.py +39 -42
  97. novelwriter/tools/manuscript.py +102 -115
  98. novelwriter/tools/manussettings.py +116 -96
  99. novelwriter/tools/noveldetails.py +60 -72
  100. novelwriter/tools/welcome.py +57 -75
  101. novelwriter/tools/writingstats.py +112 -102
  102. novelwriter/types.py +5 -7
  103. {novelWriter-2.6.3.dist-info → novelwriter-2.7rc1.dist-info}/METADATA +6 -6
  104. novelwriter-2.7rc1.dist-info/RECORD +162 -0
  105. {novelWriter-2.6.3.dist-info → novelwriter-2.7rc1.dist-info}/WHEEL +1 -1
  106. novelWriter-2.6.3.dist-info/RECORD +0 -363
  107. novelwriter/assets/icons/typicons_dark/README.md +0 -29
  108. novelwriter/assets/icons/typicons_dark/icons.conf +0 -134
  109. novelwriter/assets/icons/typicons_dark/mixed_copy.svg +0 -4
  110. novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg +0 -12
  111. novelwriter/assets/icons/typicons_dark/mixed_document-new.svg +0 -6
  112. novelwriter/assets/icons/typicons_dark/mixed_document-note.svg +0 -12
  113. novelwriter/assets/icons/typicons_dark/mixed_document-scene.svg +0 -12
  114. novelwriter/assets/icons/typicons_dark/mixed_document-section.svg +0 -12
  115. novelwriter/assets/icons/typicons_dark/mixed_document-title.svg +0 -12
  116. novelwriter/assets/icons/typicons_dark/mixed_edit.svg +0 -4
  117. novelwriter/assets/icons/typicons_dark/mixed_import.svg +0 -5
  118. novelwriter/assets/icons/typicons_dark/mixed_input-checked.svg +0 -5
  119. novelwriter/assets/icons/typicons_dark/mixed_input-none.svg +0 -5
  120. novelwriter/assets/icons/typicons_dark/mixed_input-unchecked.svg +0 -5
  121. novelwriter/assets/icons/typicons_dark/mixed_margin-bottom.svg +0 -6
  122. novelwriter/assets/icons/typicons_dark/mixed_margin-left.svg +0 -6
  123. novelwriter/assets/icons/typicons_dark/mixed_margin-right.svg +0 -6
  124. novelwriter/assets/icons/typicons_dark/mixed_margin-top.svg +0 -6
  125. novelwriter/assets/icons/typicons_dark/mixed_search-replace.svg +0 -6
  126. novelwriter/assets/icons/typicons_dark/mixed_size-height.svg +0 -6
  127. novelwriter/assets/icons/typicons_dark/mixed_size-width.svg +0 -6
  128. novelwriter/assets/icons/typicons_dark/nw_deco-h0.svg +0 -4
  129. novelwriter/assets/icons/typicons_dark/nw_deco-h1.svg +0 -4
  130. novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +0 -4
  131. novelwriter/assets/icons/typicons_dark/nw_deco-h2.svg +0 -4
  132. novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +0 -4
  133. novelwriter/assets/icons/typicons_dark/nw_deco-h3.svg +0 -4
  134. novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +0 -4
  135. novelwriter/assets/icons/typicons_dark/nw_deco-h4.svg +0 -4
  136. novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +0 -4
  137. novelwriter/assets/icons/typicons_dark/nw_deco-noveltree-more.svg +0 -4
  138. novelwriter/assets/icons/typicons_dark/nw_font.svg +0 -4
  139. novelwriter/assets/icons/typicons_dark/nw_panel.svg +0 -4
  140. novelwriter/assets/icons/typicons_dark/nw_quote.svg +0 -4
  141. novelwriter/assets/icons/typicons_dark/nw_search-case.svg +0 -4
  142. novelwriter/assets/icons/typicons_dark/nw_search-preserve.svg +0 -4
  143. novelwriter/assets/icons/typicons_dark/nw_search-regex.svg +0 -4
  144. novelwriter/assets/icons/typicons_dark/nw_search-word.svg +0 -4
  145. novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +0 -4
  146. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +0 -6
  147. novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +0 -4
  148. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +0 -6
  149. novelwriter/assets/icons/typicons_dark/nw_tb-mark.svg +0 -7
  150. novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +0 -4
  151. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +0 -6
  152. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +0 -7
  153. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +0 -7
  154. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +0 -7
  155. novelwriter/assets/icons/typicons_dark/nw_toolbar.svg +0 -5
  156. novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg +0 -4
  157. novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg +0 -4
  158. novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg +0 -4
  159. novelwriter/assets/icons/typicons_dark/typ_arrow-minimise.svg +0 -4
  160. novelwriter/assets/icons/typicons_dark/typ_arrow-repeat-grey.svg +0 -4
  161. novelwriter/assets/icons/typicons_dark/typ_book-grey.svg +0 -4
  162. novelwriter/assets/icons/typicons_dark/typ_book.svg +0 -6
  163. novelwriter/assets/icons/typicons_dark/typ_bookmark.svg +0 -4
  164. novelwriter/assets/icons/typicons_dark/typ_calendar.svg +0 -4
  165. novelwriter/assets/icons/typicons_dark/typ_cancel-grey.svg +0 -4
  166. novelwriter/assets/icons/typicons_dark/typ_cancel.svg +0 -4
  167. novelwriter/assets/icons/typicons_dark/typ_chart-bar-grey.svg +0 -4
  168. novelwriter/assets/icons/typicons_dark/typ_chevron-down.svg +0 -4
  169. novelwriter/assets/icons/typicons_dark/typ_chevron-left.svg +0 -4
  170. novelwriter/assets/icons/typicons_dark/typ_chevron-right.svg +0 -4
  171. novelwriter/assets/icons/typicons_dark/typ_chevron-up.svg +0 -4
  172. novelwriter/assets/icons/typicons_dark/typ_cog.svg +0 -4
  173. novelwriter/assets/icons/typicons_dark/typ_delete-full.svg +0 -4
  174. novelwriter/assets/icons/typicons_dark/typ_delete.svg +0 -4
  175. novelwriter/assets/icons/typicons_dark/typ_directions-full.svg +0 -4
  176. novelwriter/assets/icons/typicons_dark/typ_document-add.svg +0 -4
  177. novelwriter/assets/icons/typicons_dark/typ_document-text.svg +0 -8
  178. novelwriter/assets/icons/typicons_dark/typ_document.svg +0 -4
  179. novelwriter/assets/icons/typicons_dark/typ_export-grey.svg +0 -4
  180. novelwriter/assets/icons/typicons_dark/typ_export.svg +0 -4
  181. novelwriter/assets/icons/typicons_dark/typ_eye.svg +0 -4
  182. novelwriter/assets/icons/typicons_dark/typ_flag.svg +0 -4
  183. novelwriter/assets/icons/typicons_dark/typ_folder-open.svg +0 -4
  184. novelwriter/assets/icons/typicons_dark/typ_folder.svg +0 -5
  185. novelwriter/assets/icons/typicons_dark/typ_globe-grey.svg +0 -4
  186. novelwriter/assets/icons/typicons_dark/typ_key.svg +0 -4
  187. novelwriter/assets/icons/typicons_dark/typ_lightbulb-full.svg +0 -4
  188. novelwriter/assets/icons/typicons_dark/typ_location.svg +0 -4
  189. novelwriter/assets/icons/typicons_dark/typ_media-pause-grey.svg +0 -4
  190. novelwriter/assets/icons/typicons_dark/typ_media-record-outline.svg +0 -4
  191. novelwriter/assets/icons/typicons_dark/typ_media-record.svg +0 -4
  192. novelwriter/assets/icons/typicons_dark/typ_minus.svg +0 -4
  193. novelwriter/assets/icons/typicons_dark/typ_pencil.svg +0 -5
  194. novelwriter/assets/icons/typicons_dark/typ_pin-outline.svg +0 -4
  195. novelwriter/assets/icons/typicons_dark/typ_pin.svg +0 -4
  196. novelwriter/assets/icons/typicons_dark/typ_plus.svg +0 -4
  197. novelwriter/assets/icons/typicons_dark/typ_puzzle-outline.svg +0 -4
  198. novelwriter/assets/icons/typicons_dark/typ_puzzle.svg +0 -4
  199. novelwriter/assets/icons/typicons_dark/typ_refresh-flipped.svg +0 -4
  200. novelwriter/assets/icons/typicons_dark/typ_refresh.svg +0 -4
  201. novelwriter/assets/icons/typicons_dark/typ_search-grey.svg +0 -4
  202. novelwriter/assets/icons/typicons_dark/typ_search.svg +0 -4
  203. novelwriter/assets/icons/typicons_dark/typ_star.svg +0 -4
  204. novelwriter/assets/icons/typicons_dark/typ_stopwatch-grey.svg +0 -4
  205. novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +0 -4
  206. novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +0 -4
  207. novelwriter/assets/icons/typicons_dark/typ_th-list-grey.svg +0 -4
  208. novelwriter/assets/icons/typicons_dark/typ_th-list.svg +0 -9
  209. novelwriter/assets/icons/typicons_dark/typ_times.svg +0 -4
  210. novelwriter/assets/icons/typicons_dark/typ_trash.svg +0 -5
  211. novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +0 -4
  212. novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +0 -4
  213. novelwriter/assets/icons/typicons_dark/typ_user.svg +0 -5
  214. novelwriter/assets/icons/typicons_dark/typ_warning-full.svg +0 -4
  215. novelwriter/assets/icons/typicons_light/README.md +0 -29
  216. novelwriter/assets/icons/typicons_light/icons.conf +0 -134
  217. novelwriter/assets/icons/typicons_light/mixed_copy.svg +0 -4
  218. novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg +0 -12
  219. novelwriter/assets/icons/typicons_light/mixed_document-new.svg +0 -6
  220. novelwriter/assets/icons/typicons_light/mixed_document-note.svg +0 -12
  221. novelwriter/assets/icons/typicons_light/mixed_document-scene.svg +0 -12
  222. novelwriter/assets/icons/typicons_light/mixed_document-section.svg +0 -12
  223. novelwriter/assets/icons/typicons_light/mixed_document-title.svg +0 -12
  224. novelwriter/assets/icons/typicons_light/mixed_edit.svg +0 -4
  225. novelwriter/assets/icons/typicons_light/mixed_import.svg +0 -5
  226. novelwriter/assets/icons/typicons_light/mixed_input-checked.svg +0 -5
  227. novelwriter/assets/icons/typicons_light/mixed_input-none.svg +0 -5
  228. novelwriter/assets/icons/typicons_light/mixed_input-unchecked.svg +0 -5
  229. novelwriter/assets/icons/typicons_light/mixed_margin-bottom.svg +0 -6
  230. novelwriter/assets/icons/typicons_light/mixed_margin-left.svg +0 -6
  231. novelwriter/assets/icons/typicons_light/mixed_margin-right.svg +0 -6
  232. novelwriter/assets/icons/typicons_light/mixed_margin-top.svg +0 -6
  233. novelwriter/assets/icons/typicons_light/mixed_search-replace.svg +0 -6
  234. novelwriter/assets/icons/typicons_light/mixed_size-height.svg +0 -6
  235. novelwriter/assets/icons/typicons_light/mixed_size-width.svg +0 -6
  236. novelwriter/assets/icons/typicons_light/nw_deco-h0.svg +0 -4
  237. novelwriter/assets/icons/typicons_light/nw_deco-h1.svg +0 -4
  238. novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +0 -4
  239. novelwriter/assets/icons/typicons_light/nw_deco-h2.svg +0 -4
  240. novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +0 -4
  241. novelwriter/assets/icons/typicons_light/nw_deco-h3.svg +0 -4
  242. novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +0 -4
  243. novelwriter/assets/icons/typicons_light/nw_deco-h4.svg +0 -4
  244. novelwriter/assets/icons/typicons_light/nw_deco-note.svg +0 -4
  245. novelwriter/assets/icons/typicons_light/nw_deco-noveltree-more.svg +0 -4
  246. novelwriter/assets/icons/typicons_light/nw_font.svg +0 -4
  247. novelwriter/assets/icons/typicons_light/nw_panel.svg +0 -4
  248. novelwriter/assets/icons/typicons_light/nw_quote.svg +0 -4
  249. novelwriter/assets/icons/typicons_light/nw_search-case.svg +0 -4
  250. novelwriter/assets/icons/typicons_light/nw_search-preserve.svg +0 -4
  251. novelwriter/assets/icons/typicons_light/nw_search-regex.svg +0 -4
  252. novelwriter/assets/icons/typicons_light/nw_search-word.svg +0 -4
  253. novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +0 -4
  254. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +0 -6
  255. novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +0 -4
  256. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +0 -6
  257. novelwriter/assets/icons/typicons_light/nw_tb-mark.svg +0 -7
  258. novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +0 -4
  259. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +0 -6
  260. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +0 -7
  261. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +0 -7
  262. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +0 -7
  263. novelwriter/assets/icons/typicons_light/nw_toolbar.svg +0 -5
  264. novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg +0 -4
  265. novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg +0 -4
  266. novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg +0 -4
  267. novelwriter/assets/icons/typicons_light/typ_arrow-minimise.svg +0 -4
  268. novelwriter/assets/icons/typicons_light/typ_arrow-repeat-grey.svg +0 -4
  269. novelwriter/assets/icons/typicons_light/typ_book-grey.svg +0 -4
  270. novelwriter/assets/icons/typicons_light/typ_book.svg +0 -6
  271. novelwriter/assets/icons/typicons_light/typ_bookmark.svg +0 -4
  272. novelwriter/assets/icons/typicons_light/typ_calendar.svg +0 -4
  273. novelwriter/assets/icons/typicons_light/typ_cancel-grey.svg +0 -4
  274. novelwriter/assets/icons/typicons_light/typ_cancel.svg +0 -4
  275. novelwriter/assets/icons/typicons_light/typ_chart-bar-grey.svg +0 -4
  276. novelwriter/assets/icons/typicons_light/typ_chevron-down.svg +0 -4
  277. novelwriter/assets/icons/typicons_light/typ_chevron-left.svg +0 -4
  278. novelwriter/assets/icons/typicons_light/typ_chevron-right.svg +0 -4
  279. novelwriter/assets/icons/typicons_light/typ_chevron-up.svg +0 -4
  280. novelwriter/assets/icons/typicons_light/typ_cog.svg +0 -4
  281. novelwriter/assets/icons/typicons_light/typ_delete-full.svg +0 -4
  282. novelwriter/assets/icons/typicons_light/typ_delete.svg +0 -4
  283. novelwriter/assets/icons/typicons_light/typ_directions-full.svg +0 -4
  284. novelwriter/assets/icons/typicons_light/typ_document-add.svg +0 -4
  285. novelwriter/assets/icons/typicons_light/typ_document-text.svg +0 -5
  286. novelwriter/assets/icons/typicons_light/typ_document.svg +0 -4
  287. novelwriter/assets/icons/typicons_light/typ_export-grey.svg +0 -4
  288. novelwriter/assets/icons/typicons_light/typ_export.svg +0 -4
  289. novelwriter/assets/icons/typicons_light/typ_eye.svg +0 -4
  290. novelwriter/assets/icons/typicons_light/typ_flag.svg +0 -4
  291. novelwriter/assets/icons/typicons_light/typ_folder-open.svg +0 -4
  292. novelwriter/assets/icons/typicons_light/typ_folder.svg +0 -5
  293. novelwriter/assets/icons/typicons_light/typ_globe-grey.svg +0 -4
  294. novelwriter/assets/icons/typicons_light/typ_key.svg +0 -4
  295. novelwriter/assets/icons/typicons_light/typ_lightbulb-full.svg +0 -4
  296. novelwriter/assets/icons/typicons_light/typ_location.svg +0 -4
  297. novelwriter/assets/icons/typicons_light/typ_media-pause-grey.svg +0 -4
  298. novelwriter/assets/icons/typicons_light/typ_media-record-outline.svg +0 -4
  299. novelwriter/assets/icons/typicons_light/typ_media-record.svg +0 -4
  300. novelwriter/assets/icons/typicons_light/typ_minus.svg +0 -4
  301. novelwriter/assets/icons/typicons_light/typ_pencil.svg +0 -5
  302. novelwriter/assets/icons/typicons_light/typ_pin-outline.svg +0 -4
  303. novelwriter/assets/icons/typicons_light/typ_pin.svg +0 -4
  304. novelwriter/assets/icons/typicons_light/typ_plus.svg +0 -4
  305. novelwriter/assets/icons/typicons_light/typ_puzzle-outline.svg +0 -4
  306. novelwriter/assets/icons/typicons_light/typ_puzzle.svg +0 -4
  307. novelwriter/assets/icons/typicons_light/typ_refresh-flipped.svg +0 -4
  308. novelwriter/assets/icons/typicons_light/typ_refresh.svg +0 -4
  309. novelwriter/assets/icons/typicons_light/typ_search-grey.svg +0 -4
  310. novelwriter/assets/icons/typicons_light/typ_search.svg +0 -4
  311. novelwriter/assets/icons/typicons_light/typ_star.svg +0 -4
  312. novelwriter/assets/icons/typicons_light/typ_stopwatch-grey.svg +0 -4
  313. novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +0 -4
  314. novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +0 -4
  315. novelwriter/assets/icons/typicons_light/typ_th-list-grey.svg +0 -4
  316. novelwriter/assets/icons/typicons_light/typ_th-list.svg +0 -9
  317. novelwriter/assets/icons/typicons_light/typ_times.svg +0 -4
  318. novelwriter/assets/icons/typicons_light/typ_trash.svg +0 -5
  319. novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +0 -4
  320. novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +0 -4
  321. novelwriter/assets/icons/typicons_light/typ_user.svg +0 -5
  322. novelwriter/assets/icons/typicons_light/typ_warning-full.svg +0 -4
  323. {novelWriter-2.6.3.dist-info → novelwriter-2.7rc1.dist-info}/entry_points.txt +0 -0
  324. {novelWriter-2.6.3.dist-info → novelwriter-2.7rc1.dist-info/licenses}/LICENSE.md +0 -0
  325. {novelWriter-2.6.3.dist-info → novelwriter-2.7rc1.dist-info}/top_level.txt +0 -0
novelwriter/gui/search.py CHANGED
@@ -26,23 +26,26 @@ from __future__ import annotations
26
26
  import logging
27
27
 
28
28
  from time import time
29
+ from typing import TYPE_CHECKING
29
30
 
30
- from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
31
- from PyQt5.QtGui import QCursor, QKeyEvent
32
- from PyQt5.QtWidgets import (
31
+ from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot
32
+ from PyQt6.QtGui import QAction, QCursor, QKeyEvent, QPalette
33
+ from PyQt6.QtWidgets import (
33
34
  QApplication, QFrame, QHBoxLayout, QLabel, QLineEdit, QToolBar,
34
35
  QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
35
36
  )
36
37
 
37
38
  from novelwriter import CONFIG, SHARED
38
- from novelwriter.common import checkInt, cssCol
39
+ from novelwriter.common import checkInt, qtAddAction
39
40
  from novelwriter.core.coretools import DocSearch
40
- from novelwriter.core.item import NWItem
41
41
  from novelwriter.types import (
42
42
  QtAlignMiddle, QtAlignRight, QtHeaderStretch, QtHeaderToContents,
43
- QtUserRole
43
+ QtHexArgb, QtUserRole
44
44
  )
45
45
 
46
+ if TYPE_CHECKING:
47
+ from novelwriter.core.item import NWItem
48
+
46
49
  logger = logging.getLogger(__name__)
47
50
 
48
51
 
@@ -65,18 +68,20 @@ class GuiProjectSearch(QWidget):
65
68
 
66
69
  iPx = SHARED.theme.baseIconHeight
67
70
  iSz = SHARED.theme.baseIconSize
68
- mPx = CONFIG.pxInt(2)
69
- tPx = CONFIG.pxInt(4)
70
71
 
71
72
  self._time = time()
72
73
  self._search = DocSearch()
73
74
  self._blocked = False
74
75
  self._map: dict[str, tuple[int, float]] = {}
75
76
 
77
+ self.setContentsMargins(0, 0, 0, 0)
78
+ self.setBackgroundRole(QPalette.ColorRole.Base)
79
+ self.setAutoFillBackground(True)
80
+
76
81
  # Header
77
82
  self.viewLabel = QLabel(self.tr("Project Search"), self)
78
83
  self.viewLabel.setFont(SHARED.theme.guiFontB)
79
- self.viewLabel.setContentsMargins(mPx, tPx, 0, mPx)
84
+ self.viewLabel.setContentsMargins(4, 4, 0, 2)
80
85
 
81
86
  # Options
82
87
  self.searchOpt = QToolBar(self)
@@ -84,30 +89,30 @@ class GuiProjectSearch(QWidget):
84
89
  self.searchOpt.setIconSize(iSz)
85
90
  self.searchOpt.setContentsMargins(0, 0, 0, 0)
86
91
 
87
- self.toggleCase = self.searchOpt.addAction(self.tr("Case Sensitive"))
92
+ self.toggleCase = qtAddAction(self.searchOpt, self.tr("Case Sensitive"))
88
93
  self.toggleCase.setCheckable(True)
89
94
  self.toggleCase.setChecked(CONFIG.searchProjCase)
90
95
  self.toggleCase.toggled.connect(self._toggleCase)
91
96
 
92
- self.toggleWord = self.searchOpt.addAction(self.tr("Whole Words Only"))
97
+ self.toggleWord = qtAddAction(self.searchOpt, self.tr("Whole Words Only"))
93
98
  self.toggleWord.setCheckable(True)
94
99
  self.toggleWord.setChecked(CONFIG.searchProjWord)
95
100
  self.toggleWord.toggled.connect(self._toggleWord)
96
101
 
97
- self.toggleRegEx = self.searchOpt.addAction(self.tr("RegEx Mode"))
102
+ self.toggleRegEx = qtAddAction(self.searchOpt, self.tr("RegEx Mode"))
98
103
  self.toggleRegEx.setCheckable(True)
99
104
  self.toggleRegEx.setChecked(CONFIG.searchProjRegEx)
100
105
  self.toggleRegEx.toggled.connect(self._toggleRegEx)
101
106
 
102
107
  # Search Box
108
+ self.searchAction = QAction("", self)
109
+ self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
110
+ self.searchAction.triggered.connect(self._processSearch)
111
+
103
112
  self.searchText = QLineEdit(self)
104
113
  self.searchText.setPlaceholderText(self.tr("Search for"))
105
114
  self.searchText.setClearButtonEnabled(True)
106
-
107
- self.searchAction = self.searchText.addAction(
108
- SHARED.theme.getIcon("search"), QLineEdit.ActionPosition.TrailingPosition
109
- )
110
- self.searchAction.triggered.connect(self._processSearch)
115
+ self.searchText.addAction(self.searchAction, QLineEdit.ActionPosition.TrailingPosition)
111
116
 
112
117
  # Search Result
113
118
  self.searchResult = QTreeWidget(self)
@@ -120,11 +125,12 @@ class GuiProjectSearch(QWidget):
120
125
  self.searchResult.setAllColumnsShowFocus(True)
121
126
  self.searchResult.itemDoubleClicked.connect(self._searchResultDoubleClicked)
122
127
  self.searchResult.itemSelectionChanged.connect(self._searchResultSelected)
128
+ self.searchResult.setAccessibleName(self.viewLabel.text())
123
129
 
124
- treeHeader = self.searchResult.header()
125
- treeHeader.setStretchLastSection(False)
126
- treeHeader.setSectionResizeMode(self.C_NAME, QtHeaderStretch)
127
- treeHeader.setSectionResizeMode(self.C_COUNT, QtHeaderToContents)
130
+ if header := self.searchResult.header():
131
+ header.setStretchLastSection(False)
132
+ header.setSectionResizeMode(self.C_NAME, QtHeaderStretch)
133
+ header.setSectionResizeMode(self.C_COUNT, QtHeaderToContents)
128
134
 
129
135
  # Assemble
130
136
  self.headerBox = QHBoxLayout()
@@ -138,7 +144,7 @@ class GuiProjectSearch(QWidget):
138
144
  self.outerBox.addWidget(self.searchText, 0)
139
145
  self.outerBox.addWidget(self.searchResult, 1)
140
146
  self.outerBox.setContentsMargins(0, 0, 0, 0)
141
- self.outerBox.setSpacing(mPx)
147
+ self.outerBox.setSpacing(2)
142
148
 
143
149
  self.setLayout(self.outerBox)
144
150
  self.updateTheme()
@@ -153,20 +159,17 @@ class GuiProjectSearch(QWidget):
153
159
 
154
160
  def updateTheme(self) -> None:
155
161
  """Update theme elements."""
156
- bPx = CONFIG.pxInt(1)
157
- mPx = CONFIG.pxInt(2)
158
-
159
- qPalette = self.palette()
160
- colBase = cssCol(qPalette.base().color())
161
- colFocus = cssCol(qPalette.highlight().color())
162
+ palette = QApplication.palette()
163
+ colBase = palette.base().color().name(QtHexArgb)
164
+ colFocus = palette.highlight().color().name(QtHexArgb)
162
165
 
163
166
  self.setStyleSheet(
164
167
  "QToolBar {padding: 0; background: none;} "
165
- f"QLineEdit {{border: {bPx}px solid {colBase}; padding: {mPx}px;}} "
166
- f"QLineEdit:focus {{border: {bPx}px solid {colFocus};}} "
168
+ f"QLineEdit {{border: 1px solid {colBase}; padding: 2px;}} "
169
+ f"QLineEdit:focus {{border: 1px solid {colFocus};}} "
167
170
  )
168
171
 
169
- self.searchAction.setIcon(SHARED.theme.getIcon("search"))
172
+ self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
170
173
  self.toggleCase.setIcon(SHARED.theme.getIcon("search_case"))
171
174
  self.toggleWord.setIcon(SHARED.theme.getIcon("search_word"))
172
175
  self.toggleRegEx.setIcon(SHARED.theme.getIcon("search_regex"))
@@ -27,18 +27,17 @@ import logging
27
27
 
28
28
  from typing import TYPE_CHECKING
29
29
 
30
- from PyQt5.QtCore import QEvent, QPoint, QSize, pyqtSignal
31
- from PyQt5.QtGui import QPalette
32
- from PyQt5.QtWidgets import QMenu, QVBoxLayout, QWidget
30
+ from PyQt6.QtCore import QEvent, QPoint, QSize, pyqtSignal
31
+ from PyQt6.QtWidgets import QMenu, QVBoxLayout, QWidget
33
32
 
34
- from novelwriter import CONFIG, SHARED
33
+ from novelwriter import SHARED
35
34
  from novelwriter.common import qtLambda
36
35
  from novelwriter.enum import nwView
37
36
  from novelwriter.extensions.eventfilters import StatusTipFilter
38
37
  from novelwriter.extensions.modified import NIconToolButton
39
38
  from novelwriter.gui.theme import STYLES_BIG_TOOLBUTTON
40
39
 
41
- if TYPE_CHECKING: # pragma: no cover
40
+ if TYPE_CHECKING:
42
41
  from novelwriter.guimain import GuiMain
43
42
 
44
43
  logger = logging.getLogger(__name__)
@@ -114,7 +113,7 @@ class GuiSideBar(QWidget):
114
113
  self.outerBox.addWidget(self.tbStats)
115
114
  self.outerBox.addWidget(self.tbSettings)
116
115
  self.outerBox.setContentsMargins(0, 0, 0, 0)
117
- self.outerBox.setSpacing(CONFIG.pxInt(6))
116
+ self.outerBox.setSpacing(6)
118
117
 
119
118
  self.setLayout(self.outerBox)
120
119
  self.updateTheme()
@@ -125,10 +124,6 @@ class GuiSideBar(QWidget):
125
124
 
126
125
  def updateTheme(self) -> None:
127
126
  """Initialise GUI elements that depend on specific settings."""
128
- qPalette = self.palette()
129
- qPalette.setBrush(QPalette.ColorRole.Window, qPalette.base())
130
- self.setPalette(qPalette)
131
-
132
127
  buttonStyle = SHARED.theme.getStyleSheet(STYLES_BIG_TOOLBUTTON)
133
128
 
134
129
  self.tbProject.setStyleSheet(buttonStyle)
@@ -140,13 +135,13 @@ class GuiSideBar(QWidget):
140
135
  self.tbStats.setStyleSheet(buttonStyle)
141
136
  self.tbSettings.setStyleSheet(buttonStyle)
142
137
 
143
- self.tbProject.setThemeIcon("view_editor")
144
- self.tbNovel.setThemeIcon("view_novel")
145
- self.tbSearch.setThemeIcon("view_search")
146
- self.tbOutline.setThemeIcon("view_outline")
147
- self.tbBuild.setThemeIcon("view_build")
148
- self.tbDetails.setThemeIcon("proj_details")
149
- self.tbStats.setThemeIcon("proj_stats")
138
+ self.tbProject.setThemeIcon("sb_project")
139
+ self.tbNovel.setThemeIcon("sb_novel")
140
+ self.tbSearch.setThemeIcon("sb_search")
141
+ self.tbOutline.setThemeIcon("sb_outline")
142
+ self.tbBuild.setThemeIcon("sb_build")
143
+ self.tbDetails.setThemeIcon("sb_details")
144
+ self.tbStats.setThemeIcon("sb_stats")
150
145
  self.tbSettings.setThemeIcon("settings")
151
146
 
152
147
  return
@@ -160,4 +155,4 @@ class _PopRightMenu(QMenu):
160
155
  if isinstance(parent := self.parent(), QWidget):
161
156
  offset = QPoint(parent.width(), parent.height() - self.height())
162
157
  self.move(parent.mapToGlobal(offset))
163
- return super(_PopRightMenu, self).event(event)
158
+ return super().event(event)
@@ -28,12 +28,12 @@ import logging
28
28
  from datetime import datetime
29
29
  from time import time
30
30
 
31
- from PyQt5.QtCore import QLocale, pyqtSlot
32
- from PyQt5.QtWidgets import QApplication, QLabel, QStatusBar, QWidget
31
+ from PyQt6.QtCore import QLocale, pyqtSlot
32
+ from PyQt6.QtWidgets import QApplication, QLabel, QStatusBar, QWidget
33
33
 
34
34
  from novelwriter import CONFIG, SHARED
35
35
  from novelwriter.common import formatTime
36
- from novelwriter.constants import nwConst
36
+ from novelwriter.constants import nwConst, nwLabels, nwStats, trStats
37
37
  from novelwriter.extensions.modified import NClickableLabel
38
38
  from novelwriter.extensions.statusled import StatusLED
39
39
 
@@ -56,13 +56,11 @@ class GuiMainStatus(QStatusBar):
56
56
  # Permanent Widgets
57
57
  # =================
58
58
 
59
- xM = CONFIG.pxInt(8)
60
-
61
59
  # The Spell Checker Language
62
60
  self.langIcon = QLabel("", self)
63
61
  self.langText = QLabel(self.tr("None"), self)
64
62
  self.langIcon.setContentsMargins(0, 0, 0, 0)
65
- self.langText.setContentsMargins(0, 0, xM, 0)
63
+ self.langText.setContentsMargins(0, 0, 8, 0)
66
64
  self.addPermanentWidget(self.langIcon)
67
65
  self.addPermanentWidget(self.langText)
68
66
 
@@ -70,7 +68,7 @@ class GuiMainStatus(QStatusBar):
70
68
  self.docIcon = StatusLED(iPx, iPx, self)
71
69
  self.docText = QLabel(self.tr("Editor"), self)
72
70
  self.docIcon.setContentsMargins(0, 0, 0, 0)
73
- self.docText.setContentsMargins(0, 0, xM, 0)
71
+ self.docText.setContentsMargins(0, 0, 8, 0)
74
72
  self.addPermanentWidget(self.docIcon)
75
73
  self.addPermanentWidget(self.docText)
76
74
 
@@ -78,7 +76,7 @@ class GuiMainStatus(QStatusBar):
78
76
  self.projIcon = StatusLED(iPx, iPx, self)
79
77
  self.projText = QLabel(self.tr("Project"), self)
80
78
  self.projIcon.setContentsMargins(0, 0, 0, 0)
81
- self.projText.setContentsMargins(0, 0, xM, 0)
79
+ self.projText.setContentsMargins(0, 0, 8, 0)
82
80
  self.addPermanentWidget(self.projIcon)
83
81
  self.addPermanentWidget(self.projText)
84
82
 
@@ -86,7 +84,7 @@ class GuiMainStatus(QStatusBar):
86
84
  self.statsIcon = QLabel(self)
87
85
  self.statsText = QLabel("", self)
88
86
  self.statsIcon.setContentsMargins(0, 0, 0, 0)
89
- self.statsText.setContentsMargins(0, 0, xM, 0)
87
+ self.statsText.setContentsMargins(0, 0, 8, 0)
90
88
  self.addPermanentWidget(self.statsIcon)
91
89
  self.addPermanentWidget(self.statsText)
92
90
 
@@ -110,11 +108,22 @@ class GuiMainStatus(QStatusBar):
110
108
 
111
109
  logger.debug("Ready: GuiMainStatus")
112
110
 
111
+ self.initSettings()
113
112
  self.updateTheme()
114
113
  self.clearStatus()
115
114
 
116
115
  return
117
116
 
117
+ def initSettings(self) -> None:
118
+ """Apply user settings."""
119
+ if CONFIG.useCharCount:
120
+ self._trStatsCount = trStats(nwLabels.STATS_DISPLAY[nwStats.CHARS])
121
+ self._trStatsTip = self.tr("Total character count (session change)")
122
+ else:
123
+ self._trStatsCount = trStats(nwLabels.STATS_DISPLAY[nwStats.WORDS])
124
+ self._trStatsTip = self.tr("Total word count (session change)")
125
+ return
126
+
118
127
  def clearStatus(self) -> None:
119
128
  """Reset all widgets on the status bar to default values."""
120
129
  self.setRefTime(-1.0)
@@ -128,15 +137,15 @@ class GuiMainStatus(QStatusBar):
128
137
  def updateTheme(self) -> None:
129
138
  """Update theme elements."""
130
139
  iPx = SHARED.theme.baseIconHeight
131
- self.langIcon.setPixmap(SHARED.theme.getPixmap("status_lang", (iPx, iPx)))
132
- self.statsIcon.setPixmap(SHARED.theme.getPixmap("status_stats", (iPx, iPx)))
133
- self.timePixmap = SHARED.theme.getPixmap("status_time", (iPx, iPx))
134
- self.idlePixmap = SHARED.theme.getPixmap("status_idle", (iPx, iPx))
140
+ self.langIcon.setPixmap(SHARED.theme.getPixmap("language", (iPx, iPx)))
141
+ self.statsIcon.setPixmap(SHARED.theme.getPixmap("stats", (iPx, iPx)))
142
+ self.timePixmap = SHARED.theme.getPixmap("timer", (iPx, iPx))
143
+ self.idlePixmap = SHARED.theme.getPixmap("timer_off", (iPx, iPx))
135
144
  self.timeIcon.setPixmap(self.timePixmap)
136
145
 
137
- colNone = SHARED.theme.statNone
138
- colSaved = SHARED.theme.statSaved
139
- colUnsaved = SHARED.theme.statUnsaved
146
+ colNone = SHARED.theme.getIconColor("default").darker(150)
147
+ colSaved = SHARED.theme.getIconColor("green").darker(150)
148
+ colUnsaved = SHARED.theme.getIconColor("red").darker(150)
140
149
  self.docIcon.setColors(colNone, colSaved, colUnsaved)
141
150
  self.projIcon.setColors(colNone, colSaved, colUnsaved)
142
151
 
@@ -175,11 +184,8 @@ class GuiMainStatus(QStatusBar):
175
184
 
176
185
  def setProjectStats(self, pWC: int, sWC: int) -> None:
177
186
  """Update the current project statistics."""
178
- self.statsText.setText(self.tr("Words: {0} ({1})").format(f"{pWC:n}", f"{sWC:+n}"))
179
- if CONFIG.incNotesWCount:
180
- self.statsText.setToolTip(self.tr("Project word count (session change)"))
181
- else:
182
- self.statsText.setToolTip(self.tr("Novel word count (session change)"))
187
+ self.statsText.setText(self._trStatsCount.format(f"{pWC:n}", f"{sWC:+n}"))
188
+ self.statsText.setToolTip(self._trStatsTip)
183
189
  return
184
190
 
185
191
  def updateTime(self, idleTime: float = 0.0) -> None: