novelWriter 2.4rc1__tar.gz → 2.4.1__tar.gz

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 (400) hide show
  1. {novelWriter-2.4rc1 → novelwriter-2.4.1}/CHANGELOG.md +86 -0
  2. {novelWriter-2.4rc1 → novelwriter-2.4.1}/PKG-INFO +1 -1
  3. {novelWriter-2.4rc1 → novelwriter-2.4.1}/README.md +4 -0
  4. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelWriter.egg-info/PKG-INFO +1 -1
  5. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelWriter.egg-info/SOURCES.txt +1 -0
  6. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/__init__.py +13 -6
  7. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  8. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_en_US.qm +0 -0
  9. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_es_419.qm +0 -0
  10. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  11. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  12. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  13. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  14. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  15. novelwriter-2.4.1/novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  16. novelwriter-2.4.1/novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  17. novelwriter-2.4.1/novelwriter/assets/manual.pdf +0 -0
  18. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/sample.zip +0 -0
  19. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/common.py +5 -2
  20. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/config.py +4 -0
  21. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/buildsettings.py +7 -7
  22. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/docbuild.py +2 -2
  23. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/projectxml.py +1 -1
  24. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/spellcheck.py +3 -3
  25. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/tokenizer.py +3 -3
  26. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/toodt.py +1 -1
  27. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/preferences.py +1 -1
  28. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/projectsettings.py +2 -2
  29. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/wordlist.py +2 -2
  30. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/error.py +1 -1
  31. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/doceditor.py +27 -25
  32. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/dochighlight.py +22 -5
  33. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/docviewer.py +3 -3
  34. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/mainmenu.py +2 -2
  35. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/noveltree.py +1 -1
  36. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/outline.py +9 -9
  37. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/projtree.py +1 -1
  38. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/search.py +2 -2
  39. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/theme.py +15 -5
  40. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/guimain.py +2 -2
  41. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/shared.py +16 -4
  42. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/text/counting.py +1 -0
  43. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/dictionaries.py +2 -2
  44. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/manusbuild.py +12 -11
  45. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/manuscript.py +48 -43
  46. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/manussettings.py +27 -29
  47. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/welcome.py +4 -5
  48. {novelWriter-2.4rc1 → novelwriter-2.4.1}/pkgutils.py +78 -53
  49. {novelWriter-2.4rc1 → novelwriter-2.4.1}/pyproject.toml +19 -0
  50. novelwriter-2.4.1/setup/launchpad_setup.cfg +48 -0
  51. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/build.sh +22 -9
  52. novelWriter-2.4rc1/novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  53. novelWriter-2.4rc1/novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  54. novelWriter-2.4rc1/novelwriter/assets/manual.pdf +0 -0
  55. {novelWriter-2.4rc1 → novelwriter-2.4.1}/CREDITS.md +0 -0
  56. {novelWriter-2.4rc1 → novelwriter-2.4.1}/LICENSE.md +0 -0
  57. {novelWriter-2.4rc1 → novelwriter-2.4.1}/MANIFEST.in +0 -0
  58. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelWriter.egg-info/dependency_links.txt +0 -0
  59. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelWriter.egg-info/entry_points.txt +0 -0
  60. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelWriter.egg-info/requires.txt +0 -0
  61. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelWriter.egg-info/top_level.txt +0 -0
  62. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_de_DE.json +0 -0
  63. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_en_GB.json +0 -0
  64. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_en_US.json +0 -0
  65. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_es_419.json +0 -0
  66. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_fr_FR.json +0 -0
  67. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_it_IT.json +0 -0
  68. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_ja_JP.json +0 -0
  69. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_nb_NO.json +0 -0
  70. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_nl_NL.json +0 -0
  71. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_nn_NO.json +0 -0
  72. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_pt_BR.json +0 -0
  73. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_ru_RU.json +0 -0
  74. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/i18n/project_zh_CN.json +0 -0
  75. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/none.svg +0 -0
  76. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/novelwriter.ico +0 -0
  77. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/novelwriter.svg +0 -0
  78. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/README.md +0 -0
  79. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/icons.conf +0 -0
  80. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg +0 -0
  81. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_document-new.svg +0 -0
  82. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_document-note.svg +0 -0
  83. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_document-scene.svg +0 -0
  84. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_document-section.svg +0 -0
  85. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_document-title.svg +0 -0
  86. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_edit.svg +0 -0
  87. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_import.svg +0 -0
  88. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_input-checked.svg +0 -0
  89. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_input-none.svg +0 -0
  90. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_input-unchecked.svg +0 -0
  91. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/mixed_search-replace.svg +0 -0
  92. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h0.svg +0 -0
  93. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h1.svg +0 -0
  94. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +0 -0
  95. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h2.svg +0 -0
  96. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +0 -0
  97. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h3.svg +0 -0
  98. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +0 -0
  99. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-h4.svg +0 -0
  100. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +0 -0
  101. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_deco-noveltree-more.svg +0 -0
  102. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_panel.svg +0 -0
  103. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_search-case.svg +0 -0
  104. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_search-preserve.svg +0 -0
  105. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_search-regex.svg +0 -0
  106. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_search-word.svg +0 -0
  107. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +0 -0
  108. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +0 -0
  109. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +0 -0
  110. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +0 -0
  111. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-mark.svg +0 -0
  112. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +0 -0
  113. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +0 -0
  114. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +0 -0
  115. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +0 -0
  116. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +0 -0
  117. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg +0 -0
  118. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg +0 -0
  119. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg +0 -0
  120. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_arrow-minimise.svg +0 -0
  121. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_arrow-repeat-grey.svg +0 -0
  122. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_book-grey.svg +0 -0
  123. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_book.svg +0 -0
  124. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_bookmark.svg +0 -0
  125. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_calendar.svg +0 -0
  126. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_cancel-grey.svg +0 -0
  127. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_cancel.svg +0 -0
  128. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_chart-bar-grey.svg +0 -0
  129. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_chevron-down.svg +0 -0
  130. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_chevron-left.svg +0 -0
  131. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_chevron-right.svg +0 -0
  132. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_chevron-up.svg +0 -0
  133. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_cog.svg +0 -0
  134. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_delete-full.svg +0 -0
  135. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_delete.svg +0 -0
  136. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_directions-full.svg +0 -0
  137. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_document-add.svg +0 -0
  138. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_document-text.svg +0 -0
  139. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_document.svg +0 -0
  140. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_export-grey.svg +0 -0
  141. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_export.svg +0 -0
  142. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_eye.svg +0 -0
  143. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_flag.svg +0 -0
  144. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_folder-open.svg +0 -0
  145. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_folder.svg +0 -0
  146. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_globe-grey.svg +0 -0
  147. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_key.svg +0 -0
  148. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_lightbulb-full.svg +0 -0
  149. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_location.svg +0 -0
  150. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_media-pause-grey.svg +0 -0
  151. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_media-record-outline.svg +0 -0
  152. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_media-record.svg +0 -0
  153. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_minus.svg +0 -0
  154. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_pencil.svg +0 -0
  155. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_pin-outline.svg +0 -0
  156. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_pin.svg +0 -0
  157. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_plus.svg +0 -0
  158. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_puzzle-outline.svg +0 -0
  159. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_puzzle.svg +0 -0
  160. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_refresh-flipped.svg +0 -0
  161. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_refresh.svg +0 -0
  162. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_search-grey.svg +0 -0
  163. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_search.svg +0 -0
  164. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_star.svg +0 -0
  165. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_stopwatch-grey.svg +0 -0
  166. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +0 -0
  167. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +0 -0
  168. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_th-list-grey.svg +0 -0
  169. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_th-list.svg +0 -0
  170. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_times.svg +0 -0
  171. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_trash.svg +0 -0
  172. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +0 -0
  173. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +0 -0
  174. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_user.svg +0 -0
  175. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_dark/typ_warning-full.svg +0 -0
  176. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/README.md +0 -0
  177. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/icons.conf +0 -0
  178. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg +0 -0
  179. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_document-new.svg +0 -0
  180. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_document-note.svg +0 -0
  181. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_document-scene.svg +0 -0
  182. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_document-section.svg +0 -0
  183. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_document-title.svg +0 -0
  184. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_edit.svg +0 -0
  185. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_import.svg +0 -0
  186. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_input-checked.svg +0 -0
  187. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_input-none.svg +0 -0
  188. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_input-unchecked.svg +0 -0
  189. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/mixed_search-replace.svg +0 -0
  190. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h0.svg +0 -0
  191. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h1.svg +0 -0
  192. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +0 -0
  193. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h2.svg +0 -0
  194. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +0 -0
  195. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h3.svg +0 -0
  196. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +0 -0
  197. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-h4.svg +0 -0
  198. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-note.svg +0 -0
  199. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_deco-noveltree-more.svg +0 -0
  200. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_panel.svg +0 -0
  201. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_search-case.svg +0 -0
  202. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_search-preserve.svg +0 -0
  203. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_search-regex.svg +0 -0
  204. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_search-word.svg +0 -0
  205. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +0 -0
  206. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +0 -0
  207. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +0 -0
  208. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +0 -0
  209. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-mark.svg +0 -0
  210. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +0 -0
  211. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +0 -0
  212. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +0 -0
  213. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +0 -0
  214. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +0 -0
  215. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg +0 -0
  216. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg +0 -0
  217. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg +0 -0
  218. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_arrow-minimise.svg +0 -0
  219. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_arrow-repeat-grey.svg +0 -0
  220. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_book-grey.svg +0 -0
  221. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_book.svg +0 -0
  222. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_bookmark.svg +0 -0
  223. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_calendar.svg +0 -0
  224. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_cancel-grey.svg +0 -0
  225. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_cancel.svg +0 -0
  226. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_chart-bar-grey.svg +0 -0
  227. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_chevron-down.svg +0 -0
  228. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_chevron-left.svg +0 -0
  229. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_chevron-right.svg +0 -0
  230. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_chevron-up.svg +0 -0
  231. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_cog.svg +0 -0
  232. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_delete-full.svg +0 -0
  233. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_delete.svg +0 -0
  234. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_directions-full.svg +0 -0
  235. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_document-add.svg +0 -0
  236. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_document-text.svg +0 -0
  237. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_document.svg +0 -0
  238. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_export-grey.svg +0 -0
  239. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_export.svg +0 -0
  240. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_eye.svg +0 -0
  241. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_flag.svg +0 -0
  242. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_folder-open.svg +0 -0
  243. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_folder.svg +0 -0
  244. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_globe-grey.svg +0 -0
  245. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_key.svg +0 -0
  246. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_lightbulb-full.svg +0 -0
  247. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_location.svg +0 -0
  248. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_media-pause-grey.svg +0 -0
  249. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_media-record-outline.svg +0 -0
  250. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_media-record.svg +0 -0
  251. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_minus.svg +0 -0
  252. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_pencil.svg +0 -0
  253. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_pin-outline.svg +0 -0
  254. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_pin.svg +0 -0
  255. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_plus.svg +0 -0
  256. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_puzzle-outline.svg +0 -0
  257. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_puzzle.svg +0 -0
  258. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_refresh-flipped.svg +0 -0
  259. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_refresh.svg +0 -0
  260. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_search-grey.svg +0 -0
  261. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_search.svg +0 -0
  262. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_star.svg +0 -0
  263. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_stopwatch-grey.svg +0 -0
  264. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +0 -0
  265. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +0 -0
  266. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_th-list-grey.svg +0 -0
  267. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_th-list.svg +0 -0
  268. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_times.svg +0 -0
  269. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_trash.svg +0 -0
  270. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +0 -0
  271. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +0 -0
  272. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_user.svg +0 -0
  273. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/typicons_light/typ_warning-full.svg +0 -0
  274. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
  275. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/icons/x-novelwriter-project.svg +0 -0
  276. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/images/novelwriter-text-dark.svg +0 -0
  277. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/images/novelwriter-text-light.svg +0 -0
  278. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/images/welcome-dark.jpg +0 -0
  279. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/images/welcome-light.jpg +0 -0
  280. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/cyberpunk_night.conf +0 -0
  281. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/default_dark.conf +0 -0
  282. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/default_light.conf +0 -0
  283. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/grey_dark.conf +0 -0
  284. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/grey_light.conf +0 -0
  285. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/light_owl.conf +0 -0
  286. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/night_owl.conf +0 -0
  287. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/solarized_dark.conf +0 -0
  288. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/solarized_light.conf +0 -0
  289. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/tango.conf +0 -0
  290. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/tomorrow.conf +0 -0
  291. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/tomorrow_night.conf +0 -0
  292. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/tomorrow_night_blue.conf +0 -0
  293. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/tomorrow_night_bright.conf +0 -0
  294. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/syntax/tomorrow_night_eighties.conf +0 -0
  295. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/text/credits_en.htm +0 -0
  296. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/text/lipsum.txt +0 -0
  297. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/themes/cyberpunk_night.conf +0 -0
  298. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/themes/default.conf +0 -0
  299. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/themes/default_dark.conf +0 -0
  300. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/themes/default_light.conf +0 -0
  301. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/themes/solarized_dark.conf +0 -0
  302. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/assets/themes/solarized_light.conf +0 -0
  303. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/constants.py +0 -0
  304. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/coretools.py +0 -0
  305. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/document.py +0 -0
  306. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/index.py +0 -0
  307. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/item.py +0 -0
  308. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/options.py +0 -0
  309. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/project.py +0 -0
  310. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/projectdata.py +0 -0
  311. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/sessions.py +0 -0
  312. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/status.py +0 -0
  313. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/storage.py +0 -0
  314. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/tohtml.py +0 -0
  315. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/tomd.py +0 -0
  316. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/core/tree.py +0 -0
  317. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/about.py +0 -0
  318. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/docmerge.py +0 -0
  319. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/docsplit.py +0 -0
  320. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/editlabel.py +0 -0
  321. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/dialogs/quotes.py +0 -0
  322. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/enum.py +0 -0
  323. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/circularprogress.py +0 -0
  324. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/configlayout.py +0 -0
  325. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/eventfilters.py +0 -0
  326. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/modified.py +0 -0
  327. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/novelselector.py +0 -0
  328. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/pagedsidebar.py +0 -0
  329. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/simpleprogress.py +0 -0
  330. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/statusled.py +0 -0
  331. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/switch.py +0 -0
  332. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/switchbox.py +0 -0
  333. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/extensions/versioninfo.py +0 -0
  334. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/docviewerpanel.py +0 -0
  335. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/editordocument.py +0 -0
  336. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/itemdetails.py +0 -0
  337. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/sidebar.py +0 -0
  338. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/gui/statusbar.py +0 -0
  339. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/lipsum.py +0 -0
  340. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/noveldetails.py +0 -0
  341. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/tools/writingstats.py +0 -0
  342. {novelWriter-2.4rc1 → novelwriter-2.4.1}/novelwriter/types.py +0 -0
  343. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/appimage_launcher.sh +0 -0
  344. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/128x128/apps/novelwriter.png +0 -0
  345. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/128x128/mimetypes/application-x-novelwriter-project.png +0 -0
  346. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/16x16/apps/novelwriter.png +0 -0
  347. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/16x16/mimetypes/application-x-novelwriter-project.png +0 -0
  348. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/24x24/apps/novelwriter.png +0 -0
  349. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/24x24/mimetypes/application-x-novelwriter-project.png +0 -0
  350. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/256x256/apps/novelwriter.png +0 -0
  351. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/256x256/mimetypes/application-x-novelwriter-project.png +0 -0
  352. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/32x32/apps/novelwriter.png +0 -0
  353. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/32x32/mimetypes/application-x-novelwriter-project.png +0 -0
  354. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/48x48/apps/novelwriter.png +0 -0
  355. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/48x48/mimetypes/application-x-novelwriter-project.png +0 -0
  356. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/512x512/apps/novelwriter.png +0 -0
  357. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/512x512/mimetypes/application-x-novelwriter-project.png +0 -0
  358. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/64x64/apps/novelwriter.png +0 -0
  359. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/64x64/mimetypes/application-x-novelwriter-project.png +0 -0
  360. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/scalable/apps/novelwriter.svg +0 -0
  361. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/hicolor/scalable/mimetypes/application-x-novelwriter-project.svg +0 -0
  362. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/novelwriter.desktop +0 -0
  363. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/novelwriter.png +0 -0
  364. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/data/x-novelwriter-project.xml +0 -0
  365. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/compat +0 -0
  366. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/control +0 -0
  367. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/copyright +0 -0
  368. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/install +0 -0
  369. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/py3dist-overrides +0 -0
  370. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/rules +0 -0
  371. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/debian/source/format +0 -0
  372. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/description_pypi.md +0 -0
  373. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/description_short.txt +0 -0
  374. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/icons/novelwriter.ico +0 -0
  375. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/icons/novelwriter.svg +0 -0
  376. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/icons/x-novelwriter-project.ico +0 -0
  377. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/icons/x-novelwriter-project.svg +0 -0
  378. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/iss_license.txt +0 -0
  379. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/App.entitlements +0 -0
  380. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/Info.plist.template +0 -0
  381. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_128x128.png +0 -0
  382. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_128x128@2x.png +0 -0
  383. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_16x16.png +0 -0
  384. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_16x16@2x.png +0 -0
  385. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_256x256.png +0 -0
  386. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_256x256@2x.png +0 -0
  387. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_32x32.png +0 -0
  388. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_32x32@2x.png +0 -0
  389. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_512x512.png +0 -0
  390. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/macos/novelwriter.iconset/icon_512x512@2x.png +0 -0
  391. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/make_clean.sh +0 -0
  392. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/make_pip.sh +0 -0
  393. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/make_release.sh +0 -0
  394. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/novelwriter.appdata.xml +0 -0
  395. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/novelwriter_readme.png +0 -0
  396. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/novelwriter_text.png +0 -0
  397. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/win_setup_embed.iss +0 -0
  398. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/windows_install.bat +0 -0
  399. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup/windows_uninstall.bat +0 -0
  400. {novelWriter-2.4rc1 → novelwriter-2.4.1}/setup.cfg +0 -0
@@ -1,5 +1,91 @@
1
1
  # novelWriter Changelog
2
2
 
3
+ ## Version 2.4.1 [2024-05-06]
4
+
5
+ ### Release Notes
6
+
7
+ This is a patch release that fixes a number of minor issues with the Manuscript Build tool. The
8
+ only critical fix is related to a potential crash when deleting a build entry when its settings
9
+ dialog is still open.
10
+
11
+ ### Detailed Changelog
12
+
13
+ **Bugfixes**
14
+
15
+ * Fixed an issue that could crash novelWriter if a build settings entry was deleted from the
16
+ Manuscript tool while its settings window was open. PR #1845.
17
+
18
+ **Improvements**
19
+
20
+ * Changed the font used for the document editor and viewer header and footer from the one used for
21
+ the document text to the one used for the user interface. Issue #1842. PR #1843.
22
+ * Added a save document step in the editor before running a manuscript build or a preview job. This
23
+ ensures that the text in the editor is included in the manuscript. Issue #1835. PR #1846.
24
+ * Restore preview panel scroll bar position after updating the preview on the Manuscript tool.
25
+ Issue #1837. PR #1846.
26
+ * Close all non-modal dialogs when a project is closed. PR #1848.
27
+
28
+ **Code Improvements**
29
+
30
+ * Fixed an issue with the Build Settings dialog that blocks the garbage collector from deleting the
31
+ dialog after it's been closed. PR #1843.
32
+ * Remove some deprecated translation entries from the translation files. PR #1850.
33
+
34
+ ----
35
+
36
+ ## Version 2.4 [2024-04-20]
37
+
38
+ ### Release Notes
39
+
40
+ This release adds a new global search feature. The tool is still relatively basic, and will likely
41
+ be extended in later releases.
42
+
43
+ Among new text editing features is the ability to highlight text using `[m]text[/m]` shortcodes.
44
+ The code `[m]` is for "mark", which is the equivalent code in HTML.
45
+
46
+ A second feature added for text editing is the ability to add an alternatively formatted scene
47
+ heading by adding a `!` to the markup, like for chapters and main titles. This allows to
48
+ distinguish between two scene formatting styles, `### Title` and `###! Title`, which can for
49
+ instance be used for soft and hard scene breaks.
50
+
51
+ The **Manuscript Build** tool has also been extended with multiple new formatting options.
52
+
53
+ See the website for complete [Release Notes](https://novelwriter.io/releases/release_2_4.html).
54
+
55
+ ### Detailed Changelog
56
+
57
+ **Bugfixes**
58
+
59
+ * Fixed background colour on some widgets on the new Project Search tool. PR #1800.
60
+ * Fixed a bug when using bold/italic/strike through toggle on an existing text selection in the
61
+ editor. Issue #1807. PR #1808.
62
+ * An index out of bounds error in the word counter has been fixed. It could only be triggered by a
63
+ single line only containing a ">" character. Issues #1816 and #1825. PR #1817.
64
+ * Fixed an issue where not all theme colours were completely reset before changing theme. PR #1820.
65
+ * Shortcodes are no longer passed to the spell checker. PR #1823.
66
+
67
+ **Improvements**
68
+
69
+ * Made placeholder text for search read as "Search for" and "Replace with". PR #1799.
70
+ * The initial count for adding chapter and scenes to new project in the Welcome dialog has been
71
+ changed to 0. The user must now select to add chapters and scenes. Issue #1811. PR #1815.
72
+
73
+ **Documentation**
74
+
75
+ * Updated the documentation for 2.4 features. PR #1818.
76
+
77
+ **Internationalisation**
78
+
79
+ * Norwegian and US English translations updated by Veronica Berglyd Olsen (@vkbo).
80
+ PRs #1799 and #1814.
81
+ * Latin American Spanish translation updated by Tommy Marplatt (@tmarplatt). PR #1814.
82
+ * Italian translation updated by Lou Cyper (loucyper1). PR #1814.
83
+ * Japanese translation updated by @hebekeg. PR #1814.
84
+ * French translation updated by Albert Aribaud (@aaribaud). PR #1821.
85
+ * German translation updated by Myian (@HeyMyian). PR #1821.
86
+
87
+ ----
88
+
3
89
  ## Version 2.4 RC 1 [2024-04-06]
4
90
 
5
91
  ### Release Notes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelWriter
3
- Version: 2.4rc1
3
+ Version: 2.4.1
4
4
  Summary: A markdown-like text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
6
  License: GNU General Public License v3
@@ -49,6 +49,10 @@ code, please also read the full
49
49
 
50
50
  Project credits are available in [CREDITS.md](https://github.com/vkbo/novelWriter/blob/main/CREDITS.md).
51
51
 
52
+ **Note:** As of April 2024 only pre-releases are made from the `main` branch. Full releases are
53
+ made from the `release` branch. So if you're submitting a fix to a current release, **including
54
+ changes to documentation**, they must be made to the `release` branch.
55
+
52
56
  ### Translations
53
57
 
54
58
  New translations are always welcome. This project uses Crowdin to maintain translations, and you
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelWriter
3
- Version: 2.4rc1
3
+ Version: 2.4.1
4
4
  Summary: A markdown-like text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
6
  License: GNU General Public License v3
@@ -338,6 +338,7 @@ setup/appimage_launcher.sh
338
338
  setup/description_pypi.md
339
339
  setup/description_short.txt
340
340
  setup/iss_license.txt
341
+ setup/launchpad_setup.cfg
341
342
  setup/make_clean.sh
342
343
  setup/make_pip.sh
343
344
  setup/make_release.sh
@@ -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.4rc1"
46
- __hexversion__ = "0x020400c1"
47
- __date__ = "2024-04-06"
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:]
@@ -239,4 +244,6 @@ def main(sysArgs: list | None = None):
239
244
 
240
245
  sys.exit(nwApp.exec())
241
246
 
247
+ return None
248
+
242
249
  # END Function main
@@ -449,7 +449,7 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
449
449
 
450
450
  indentations = ["\n"]
451
451
 
452
- def indentChildren(elem, level):
452
+ def indentChildren(elem: ET.Element, level: int) -> None:
453
453
  chLevel = level + 1
454
454
  try:
455
455
  chIndent = indentations[chLevel]
@@ -472,6 +472,8 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
472
472
  if last is not None:
473
473
  last.tail = indentations[level]
474
474
 
475
+ return
476
+
475
477
  if len(tree):
476
478
  indentChildren(tree, 0)
477
479
  tree.tail = "\n"
@@ -534,8 +536,9 @@ class NWConfigParser(ConfigParser):
534
536
  helper functions, and support for lists.
535
537
  """
536
538
 
537
- def __init__(self):
539
+ def __init__(self) -> None:
538
540
  super().__init__()
541
+ return
539
542
 
540
543
  def rdStr(self, section: str, option: str, default: str) -> str:
541
544
  """Read string value."""
@@ -390,6 +390,10 @@ class Config:
390
390
  """Un-scale fixed gui sizes by the screen scale factor."""
391
391
  return int(value/self.guiScale)
392
392
 
393
+ def homePath(self) -> Path:
394
+ """The user's home folder."""
395
+ return self._homePath
396
+
393
397
  def dataPath(self, target: str | None = None) -> Path:
394
398
  """Return a path in the data folder."""
395
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)
@@ -306,8 +306,8 @@ class NWBuildDocument:
306
306
  self._build.getBool("headings.hideScene")
307
307
  )
308
308
  bldObj.setHardSceneFormat(
309
- self._build.getStr("headings.fmtHardScene"),
310
- self._build.getBool("headings.hideHardScene")
309
+ self._build.getStr("headings.fmtAltScene"),
310
+ self._build.getBool("headings.hideAltScene")
311
311
  )
312
312
  bldObj.setSectionFormat(
313
313
  self._build.getStr("headings.fmtSection"),
@@ -449,7 +449,7 @@ class ProjectXMLReader:
449
449
  result[xEntry.attrib["key"]] = checkString(xEntry.text, "")
450
450
  return result
451
451
 
452
- def _parseDictTagText(self, xItem) -> dict:
452
+ def _parseDictTagText(self, xItem: ET.Element) -> dict:
453
453
  """Parse a dictionary stored with key as the tag and the value
454
454
  as the text property.
455
455
  """
@@ -74,7 +74,7 @@ class NWSpellEnchant:
74
74
  # Setters
75
75
  ##
76
76
 
77
- def setLanguage(self, language: str | None):
77
+ def setLanguage(self, language: str | None) -> None:
78
78
  """Load a dictionary for the language specified in the config.
79
79
  If that fails, we load a mock dictionary so that lookups don't
80
80
  crash. Note that enchant will allow loading an empty string as
@@ -182,10 +182,10 @@ class FakeEnchant:
182
182
  def check(self, word: str) -> bool:
183
183
  return True
184
184
 
185
- def suggest(self, word) -> list[str]:
185
+ def suggest(self, word: str) -> list[str]:
186
186
  return []
187
187
 
188
- def add_to_session(self, word: str):
188
+ def add_to_session(self, word: str) -> None:
189
189
  return
190
190
 
191
191
  # END Class FakeEnchant
@@ -49,7 +49,7 @@ ESCAPES = {r"\*": "*", r"\~": "~", r"\_": "_", r"\[": "[", r"\]": "]", r"\ ": ""
49
49
  RX_ESC = re.compile("|".join([re.escape(k) for k in ESCAPES.keys()]), flags=re.DOTALL)
50
50
 
51
51
 
52
- def stripEscape(text) -> str:
52
+ def stripEscape(text: str) -> str:
53
53
  """Strip escaped Markdown characters from paragraph text."""
54
54
  if "\\" in text:
55
55
  return RX_ESC.sub(lambda x: ESCAPES[x.group(0)], text)
@@ -639,8 +639,8 @@ class Tokenizer(ABC):
639
639
  tmpMarkdown.append(f"{aLine}\n")
640
640
 
641
641
  elif aLine.startswith(("### ", "###! ")):
642
- # (Hard) Scene Headings
643
- # =====================
642
+ # (Alternative) Scene Headings
643
+ # ============================
644
644
  # Scene headings in novel documents are treated as centred
645
645
  # separators if the formatting does not change the text. If the
646
646
  # format is empty, the scene can be hidden or a blank paragraph
@@ -548,7 +548,7 @@ class ToOdt(Tokenizer):
548
548
  oVers = _mkTag("office", "version")
549
549
  xSett = ET.Element(oRoot, attrib={oVers: X_VERS})
550
550
 
551
- def putInZip(name, xObj, zipObj):
551
+ def putInZip(name: str, xObj: ET.Element, zipObj: ZipFile) -> None:
552
552
  with zipObj.open(name, mode="w") as fObj:
553
553
  xml = ET.ElementTree(xObj)
554
554
  xml.write(fObj, encoding="utf-8", xml_declaration=True)
@@ -795,7 +795,7 @@ class GuiPreferences(QDialog):
795
795
  return
796
796
 
797
797
  @pyqtSlot()
798
- def _selectTextFont(self):
798
+ def _selectTextFont(self) -> None:
799
799
  """Open the QFontDialog and set a font for the font style."""
800
800
  current = QFont()
801
801
  current.setFamily(CONFIG.textFont)
@@ -257,17 +257,17 @@ class _SettingsPage(NScrollableForm):
257
257
  )
258
258
 
259
259
  # Project Language
260
+ projLang = data.language or CONFIG.guiLocale
260
261
  self.projLang = NComboBox(self)
261
262
  self.projLang.setMinimumWidth(xW)
262
263
  for tag, language in CONFIG.listLanguages(CONFIG.LANG_PROJ):
263
264
  self.projLang.addItem(language, tag)
265
+ self.projLang.setCurrentData(projLang, projLang)
264
266
  self.addRow(
265
267
  self.tr("Project language"), self.projLang,
266
268
  self.tr("Only used when building the manuscript."),
267
269
  stretch=(3, 2)
268
270
  )
269
- if (idx := self.projLang.findData(data.language)) != -1:
270
- self.projLang.setCurrentIndex(idx)
271
271
 
272
272
  # Spell Check Language
273
273
  self.spellLang = NComboBox(self)
@@ -190,7 +190,7 @@ class GuiWordList(QDialog):
190
190
  ))
191
191
  ffilter = formatFileFilter(["*.txt", "*"])
192
192
  path, _ = QFileDialog.getOpenFileName(
193
- self, self.tr("Import File"), str(Path.home()), filter=ffilter
193
+ self, self.tr("Import File"), str(CONFIG.homePath()), filter=ffilter
194
194
  )
195
195
  if path:
196
196
  try:
@@ -207,7 +207,7 @@ class GuiWordList(QDialog):
207
207
  def _exportWords(self) -> None:
208
208
  """Export words to file."""
209
209
  path, _ = QFileDialog.getSaveFileName(
210
- self, self.tr("Export File"), str(Path.home())
210
+ self, self.tr("Export File"), str(CONFIG.homePath())
211
211
  )
212
212
  if path:
213
213
  try:
@@ -54,7 +54,7 @@ def logException() -> None:
54
54
  return
55
55
 
56
56
 
57
- def formatException(exc) -> str:
57
+ def formatException(exc: BaseException) -> str:
58
58
  """Format an exception as a string the same way the default
59
59
  exception handler does.
60
60
  """
@@ -39,8 +39,8 @@ from time import time
39
39
  from typing import TYPE_CHECKING
40
40
 
41
41
  from PyQt5.QtCore import (
42
- pyqtSignal, pyqtSlot, QObject, QPoint, QRegExp, QRegularExpression,
43
- QRunnable, Qt, QTimer
42
+ QObject, QPoint, QRegExp, QRegularExpression, QRunnable, Qt, QTimer,
43
+ pyqtSignal, pyqtSlot
44
44
  )
45
45
  from PyQt5.QtGui import (
46
46
  QColor, QCursor, QFont, QKeyEvent, QKeySequence, QMouseEvent, QPalette,
@@ -65,7 +65,7 @@ from novelwriter.text.counting import standardCounter
65
65
  from novelwriter.tools.lipsum import GuiLipsum
66
66
  from novelwriter.types import (
67
67
  QtAlignCenterTop, QtAlignJustify, QtAlignLeft, QtAlignLeftTop,
68
- QtAlignRight, QtKeepAnchor, QtModCtrl, QtMouseLeft, QtModeNone, QtModShift,
68
+ QtAlignRight, QtKeepAnchor, QtModCtrl, QtModeNone, QtModShift, QtMouseLeft,
69
69
  QtMoveAnchor, QtMoveLeft, QtMoveRight
70
70
  )
71
71
 
@@ -334,7 +334,7 @@ class GuiDocEditor(QPlainTextEdit):
334
334
  font = QFont()
335
335
  font.setFamily(CONFIG.textFont)
336
336
  font.setPointSize(CONFIG.textSize)
337
- self.setFont(font)
337
+ self._qDocument.setDefaultFont(font)
338
338
 
339
339
  # Set default text margins
340
340
  # Due to cursor visibility, a part of the margin must be
@@ -381,7 +381,7 @@ class GuiDocEditor(QPlainTextEdit):
381
381
 
382
382
  return
383
383
 
384
- def loadText(self, tHandle: str, tLine=None) -> bool:
384
+ def loadText(self, tHandle: str, tLine: int | None = None) -> bool:
385
385
  """Load text from a document into the editor. If we have an I/O
386
386
  error, we must handle this and clear the editor so that we don't
387
387
  risk overwriting the file if it exists. This can for instance
@@ -497,6 +497,7 @@ class GuiDocEditor(QPlainTextEdit):
497
497
  return False
498
498
 
499
499
  self.setDocumentChanged(False)
500
+ self.docTextChanged.emit(self._docHandle, self._lastEdit)
500
501
 
501
502
  oldHeader = self._nwItem.mainHeading
502
503
  oldCount = SHARED.project.index.getHandleHeaderCount(tHandle)
@@ -1080,7 +1081,7 @@ class GuiDocEditor(QPlainTextEdit):
1080
1081
  return
1081
1082
 
1082
1083
  @pyqtSlot()
1083
- def _cursorMoved(self):
1084
+ def _cursorMoved(self) -> None:
1084
1085
  """Triggered when the cursor moved in the editor."""
1085
1086
  self.docFooter.updateLineCount(self.textCursor())
1086
1087
  return
@@ -1470,7 +1471,7 @@ class GuiDocEditor(QPlainTextEdit):
1470
1471
  # Internal Functions : Text Manipulation
1471
1472
  ##
1472
1473
 
1473
- def _toggleFormat(self, fLen: int, fChar: str) -> bool:
1474
+ def _toggleFormat(self, fLen: int, fChar: str) -> None:
1474
1475
  """Toggle the formatting of a specific type for a piece of text.
1475
1476
  If more than one block is selected, the formatting is applied to
1476
1477
  the first block.
@@ -1488,12 +1489,12 @@ class GuiDocEditor(QPlainTextEdit):
1488
1489
 
1489
1490
  posS = cursor.selectionStart()
1490
1491
  posE = cursor.selectionEnd()
1491
- if self._qDocument.characterAt(posO - 1) == fChar:
1492
+ if posS == posE and self._qDocument.characterAt(posO - 1) == fChar:
1492
1493
  logger.warning("Format repetition, cancelling action")
1493
1494
  cursor.clearSelection()
1494
1495
  cursor.setPosition(posO)
1495
1496
  self.setTextCursor(cursor)
1496
- return False
1497
+ return
1497
1498
 
1498
1499
  blockS = self._qDocument.findBlock(posS)
1499
1500
  blockE = self._qDocument.findBlock(posE)
@@ -1519,7 +1520,6 @@ class GuiDocEditor(QPlainTextEdit):
1519
1520
  break
1520
1521
 
1521
1522
  if fLen == min(numA, numB):
1522
- cursor.clearSelection()
1523
1523
  cursor.beginEditBlock()
1524
1524
  cursor.setPosition(posS)
1525
1525
  for i in range(fLen):
@@ -1528,17 +1528,19 @@ class GuiDocEditor(QPlainTextEdit):
1528
1528
  for i in range(fLen):
1529
1529
  cursor.deletePreviousChar()
1530
1530
  cursor.endEditBlock()
1531
- cursor.clearSelection()
1532
- cursor.setPosition(posO - fLen)
1533
- self.setTextCursor(cursor)
1531
+
1532
+ if select != _SelectAction.KEEP_SELECTION:
1533
+ cursor.clearSelection()
1534
+ cursor.setPosition(posO - fLen)
1535
+ self.setTextCursor(cursor)
1534
1536
 
1535
1537
  else:
1536
1538
  self._wrapSelection(fChar*fLen, pos=posO, select=select)
1537
1539
 
1538
- return True
1540
+ return
1539
1541
 
1540
1542
  def _wrapSelection(self, before: str, after: str | None = None, pos: int | None = None,
1541
- select: _SelectAction = _SelectAction.NO_DECISION) -> bool:
1543
+ select: _SelectAction = _SelectAction.NO_DECISION) -> None:
1542
1544
  """Wrap the selected text in whatever is in tBefore and tAfter.
1543
1545
  If there is no selection, the autoSelect setting decides the
1544
1546
  action. AutoSelect will select the word under the cursor before
@@ -1578,21 +1580,21 @@ class GuiDocEditor(QPlainTextEdit):
1578
1580
  if select == _SelectAction.MOVE_AFTER:
1579
1581
  cursor.setPosition(posE + len(before + after))
1580
1582
  elif select == _SelectAction.KEEP_SELECTION:
1581
- cursor.setPosition(posE + len(before), QtMoveAnchor)
1582
- cursor.setPosition(posS + len(before), QtKeepAnchor)
1583
+ cursor.setPosition(posS + len(before), QtMoveAnchor)
1584
+ cursor.setPosition(posE + len(before), QtKeepAnchor)
1583
1585
  elif select == _SelectAction.KEEP_POSITION:
1584
1586
  cursor.setPosition(posO + len(before))
1585
1587
 
1586
1588
  self.setTextCursor(cursor)
1587
1589
 
1588
- return True
1590
+ return
1589
1591
 
1590
- def _replaceQuotes(self, sQuote: str, oQuote: str, cQuote: str) -> bool:
1592
+ def _replaceQuotes(self, sQuote: str, oQuote: str, cQuote: str) -> None:
1591
1593
  """Replace all straight quotes in the selected text."""
1592
1594
  cursor = self.textCursor()
1593
1595
  if not cursor.hasSelection():
1594
1596
  SHARED.error(self.tr("Please select some text before calling replace quotes."))
1595
- return False
1597
+ return
1596
1598
 
1597
1599
  posS = cursor.selectionStart()
1598
1600
  posE = cursor.selectionEnd()
@@ -1632,7 +1634,7 @@ class GuiDocEditor(QPlainTextEdit):
1632
1634
 
1633
1635
  self._allowAutoReplace(True)
1634
1636
 
1635
- return True
1637
+ return
1636
1638
 
1637
1639
  def _processBlockFormat(
1638
1640
  self, action: nwDocAction, text: str, toggle: bool = True
@@ -2185,7 +2187,7 @@ class MetaCompleter(QMenu):
2185
2187
  # Internal Functions
2186
2188
  ##
2187
2189
 
2188
- def _emitComplete(self, pos: int, length: int, value: str):
2190
+ def _emitComplete(self, pos: int, length: int, value: str) -> None:
2189
2191
  """Emit the signal to indicate a selection has been made."""
2190
2192
  self.complete.emit(pos, length, value)
2191
2193
  return
@@ -2408,12 +2410,12 @@ class GuiDocEditSearch(QFrame):
2408
2410
 
2409
2411
  self.searchBox = QLineEdit(self)
2410
2412
  self.searchBox.setFont(self.boxFont)
2411
- self.searchBox.setPlaceholderText(self.tr("Search"))
2413
+ self.searchBox.setPlaceholderText(self.tr("Search for"))
2412
2414
  self.searchBox.returnPressed.connect(self._doSearch)
2413
2415
 
2414
2416
  self.replaceBox = QLineEdit(self)
2415
2417
  self.replaceBox.setFont(self.boxFont)
2416
- self.replaceBox.setPlaceholderText(self.tr("Replace"))
2418
+ self.replaceBox.setPlaceholderText(self.tr("Replace with"))
2417
2419
  self.replaceBox.returnPressed.connect(self._doReplace)
2418
2420
 
2419
2421
  self.searchOpt = QToolBar(self)
@@ -2966,7 +2968,7 @@ class GuiDocEditHeader(QWidget):
2966
2968
  # Events
2967
2969
  ##
2968
2970
 
2969
- def mousePressEvent(self, event: QMouseEvent):
2971
+ def mousePressEvent(self, event: QMouseEvent) -> None:
2970
2972
  """Capture a click on the title and ensure that the item is
2971
2973
  selected in the project tree.
2972
2974
  """