novelWriter 2.7.4__tar.gz → 2.7.5__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 (238) hide show
  1. {novelwriter-2.7.4 → novelwriter-2.7.5}/CHANGELOG.md +23 -0
  2. {novelwriter-2.7.4 → novelwriter-2.7.5}/PKG-INFO +1 -1
  3. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelWriter.egg-info/PKG-INFO +1 -1
  4. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/__init__.py +3 -3
  5. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/manual.pdf +0 -0
  6. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/manual_fr.pdf +0 -0
  7. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/sample.zip +0 -0
  8. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/doceditor.py +49 -22
  9. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/types.py +2 -0
  10. {novelwriter-2.7.4 → novelwriter-2.7.5}/CREDITS.md +0 -0
  11. {novelwriter-2.7.4 → novelwriter-2.7.5}/LICENSE.md +0 -0
  12. {novelwriter-2.7.4 → novelwriter-2.7.5}/MANIFEST.in +0 -0
  13. {novelwriter-2.7.4 → novelwriter-2.7.5}/README.md +0 -0
  14. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelWriter.egg-info/SOURCES.txt +0 -0
  15. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelWriter.egg-info/dependency_links.txt +0 -0
  16. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelWriter.egg-info/entry_points.txt +0 -0
  17. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelWriter.egg-info/requires.txt +0 -0
  18. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelWriter.egg-info/top_level.txt +0 -0
  19. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_cs_CZ.qm +0 -0
  20. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  21. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_en_US.qm +0 -0
  22. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_es_419.qm +0 -0
  23. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  24. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  25. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  26. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  27. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  28. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_pl_PL.qm +0 -0
  29. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  30. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_ru_RU.qm +0 -0
  31. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  32. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_cs_CZ.json +0 -0
  33. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_de_DE.json +0 -0
  34. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_en_GB.json +0 -0
  35. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_en_US.json +0 -0
  36. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_es_419.json +0 -0
  37. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_fr_FR.json +0 -0
  38. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_it_IT.json +0 -0
  39. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_ja_JP.json +0 -0
  40. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_nb_NO.json +0 -0
  41. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_nl_NL.json +0 -0
  42. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_nn_NO.json +0 -0
  43. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_pl_PL.json +0 -0
  44. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_pt_BR.json +0 -0
  45. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_ru_RU.json +0 -0
  46. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/i18n/project_zh_CN.json +0 -0
  47. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/font_awesome.icons +0 -0
  48. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/material_filled_normal.icons +0 -0
  49. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/material_filled_thin.icons +0 -0
  50. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/material_rounded_normal.icons +0 -0
  51. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/material_rounded_thin.icons +0 -0
  52. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/material_sharp_normal.icons +0 -0
  53. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/material_sharp_thin.icons +0 -0
  54. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/none.svg +0 -0
  55. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/novelwriter.ico +0 -0
  56. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/novelwriter.svg +0 -0
  57. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/remix_filled.icons +0 -0
  58. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/remix_outline.icons +0 -0
  59. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
  60. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/icons/x-novelwriter-project.svg +0 -0
  61. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/images/novelwriter-text-dark.svg +0 -0
  62. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/images/novelwriter-text-light.svg +0 -0
  63. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/images/splash.png +0 -0
  64. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/images/welcome-dark.jpg +0 -0
  65. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/images/welcome-light.jpg +0 -0
  66. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/cyberpunk_night.conf +0 -0
  67. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/default_dark.conf +0 -0
  68. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/default_light.conf +0 -0
  69. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/dracula.conf +0 -0
  70. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/grey_dark.conf +0 -0
  71. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/grey_light.conf +0 -0
  72. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/light_owl.conf +0 -0
  73. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/night_owl.conf +0 -0
  74. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/snazzy.conf +0 -0
  75. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/solarized_dark.conf +0 -0
  76. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/solarized_light.conf +0 -0
  77. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/tango.conf +0 -0
  78. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/tomorrow.conf +0 -0
  79. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/tomorrow_night.conf +0 -0
  80. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/tomorrow_night_blue.conf +0 -0
  81. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/tomorrow_night_bright.conf +0 -0
  82. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/syntax/tomorrow_night_eighties.conf +0 -0
  83. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/text/credits_en.htm +0 -0
  84. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/text/lipsum.txt +0 -0
  85. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/cyberpunk_night.conf +0 -0
  86. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/default.conf +0 -0
  87. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/default_dark.conf +0 -0
  88. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/default_light.conf +0 -0
  89. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/dracula.conf +0 -0
  90. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/snazzy.conf +0 -0
  91. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/solarized_dark.conf +0 -0
  92. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/assets/themes/solarized_light.conf +0 -0
  93. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/common.py +0 -0
  94. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/config.py +0 -0
  95. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/constants.py +0 -0
  96. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/buildsettings.py +0 -0
  97. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/coretools.py +0 -0
  98. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/docbuild.py +0 -0
  99. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/document.py +0 -0
  100. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/index.py +0 -0
  101. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/indexdata.py +0 -0
  102. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/item.py +0 -0
  103. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/itemmodel.py +0 -0
  104. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/novelmodel.py +0 -0
  105. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/options.py +0 -0
  106. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/project.py +0 -0
  107. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/projectdata.py +0 -0
  108. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/projectxml.py +0 -0
  109. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/sessions.py +0 -0
  110. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/spellcheck.py +0 -0
  111. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/status.py +0 -0
  112. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/storage.py +0 -0
  113. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/core/tree.py +0 -0
  114. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/about.py +0 -0
  115. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/docmerge.py +0 -0
  116. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/docsplit.py +0 -0
  117. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/editlabel.py +0 -0
  118. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/preferences.py +0 -0
  119. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/projectsettings.py +0 -0
  120. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/quotes.py +0 -0
  121. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/dialogs/wordlist.py +0 -0
  122. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/enum.py +0 -0
  123. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/error.py +0 -0
  124. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/configlayout.py +0 -0
  125. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/eventfilters.py +0 -0
  126. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/modified.py +0 -0
  127. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/novelselector.py +0 -0
  128. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/pagedsidebar.py +0 -0
  129. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/progressbars.py +0 -0
  130. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/statusled.py +0 -0
  131. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/switch.py +0 -0
  132. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/switchbox.py +0 -0
  133. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/extensions/versioninfo.py +0 -0
  134. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/shared.py +0 -0
  135. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/todocx.py +0 -0
  136. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/tohtml.py +0 -0
  137. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/tokenizer.py +0 -0
  138. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/tomarkdown.py +0 -0
  139. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/toodt.py +0 -0
  140. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/toqdoc.py +0 -0
  141. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/formats/toraw.py +0 -0
  142. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/dochighlight.py +0 -0
  143. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/docviewer.py +0 -0
  144. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/docviewerpanel.py +0 -0
  145. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/editordocument.py +0 -0
  146. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/itemdetails.py +0 -0
  147. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/mainmenu.py +0 -0
  148. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/noveltree.py +0 -0
  149. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/outline.py +0 -0
  150. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/projtree.py +0 -0
  151. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/search.py +0 -0
  152. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/sidebar.py +0 -0
  153. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/statusbar.py +0 -0
  154. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/gui/theme.py +0 -0
  155. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/guimain.py +0 -0
  156. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/shared.py +0 -0
  157. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/splash.py +0 -0
  158. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/text/comments.py +0 -0
  159. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/text/counting.py +0 -0
  160. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/text/patterns.py +0 -0
  161. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/dictionaries.py +0 -0
  162. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/lipsum.py +0 -0
  163. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/manusbuild.py +0 -0
  164. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/manuscript.py +0 -0
  165. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/manussettings.py +0 -0
  166. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/noveldetails.py +0 -0
  167. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/welcome.py +0 -0
  168. {novelwriter-2.7.4 → novelwriter-2.7.5}/novelwriter/tools/writingstats.py +0 -0
  169. {novelwriter-2.7.4 → novelwriter-2.7.5}/pkgutils.py +0 -0
  170. {novelwriter-2.7.4 → novelwriter-2.7.5}/pyproject.toml +0 -0
  171. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/LICENSE-Apache-2.0.txt +0 -0
  172. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/appimage_launcher.sh +0 -0
  173. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/128x128/apps/novelwriter.png +0 -0
  174. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/128x128/mimetypes/application-x-novelwriter-project.png +0 -0
  175. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/16x16/apps/novelwriter.png +0 -0
  176. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/16x16/mimetypes/application-x-novelwriter-project.png +0 -0
  177. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/24x24/apps/novelwriter.png +0 -0
  178. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/24x24/mimetypes/application-x-novelwriter-project.png +0 -0
  179. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/256x256/apps/novelwriter.png +0 -0
  180. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/256x256/mimetypes/application-x-novelwriter-project.png +0 -0
  181. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/32x32/apps/novelwriter.png +0 -0
  182. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/32x32/mimetypes/application-x-novelwriter-project.png +0 -0
  183. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/48x48/apps/novelwriter.png +0 -0
  184. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/48x48/mimetypes/application-x-novelwriter-project.png +0 -0
  185. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/512x512/apps/novelwriter.png +0 -0
  186. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/512x512/mimetypes/application-x-novelwriter-project.png +0 -0
  187. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/64x64/apps/novelwriter.png +0 -0
  188. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/64x64/mimetypes/application-x-novelwriter-project.png +0 -0
  189. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/scalable/apps/novelwriter.svg +0 -0
  190. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/hicolor/scalable/mimetypes/application-x-novelwriter-project.svg +0 -0
  191. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/novelwriter.desktop +0 -0
  192. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/novelwriter.png +0 -0
  193. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/data/x-novelwriter-project.xml +0 -0
  194. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/compat +0 -0
  195. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/control +0 -0
  196. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/copyright +0 -0
  197. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/install +0 -0
  198. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/py3dist-overrides +0 -0
  199. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/rules +0 -0
  200. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/debian/source/format +0 -0
  201. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/description_pypi.md +0 -0
  202. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/description_short.txt +0 -0
  203. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/icons/novelwriter.ico +0 -0
  204. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/icons/novelwriter.png +0 -0
  205. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/icons/novelwriter.svg +0 -0
  206. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/icons/x-novelwriter-project.ico +0 -0
  207. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/icons/x-novelwriter-project.png +0 -0
  208. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/icons/x-novelwriter-project.svg +0 -0
  209. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/iss_license.txt +0 -0
  210. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/App.entitlements +0 -0
  211. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/Info.plist.template +0 -0
  212. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/build.sh +0 -0
  213. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_128x128.png +0 -0
  214. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_128x128@2x.png +0 -0
  215. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_16x16.png +0 -0
  216. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_16x16@2x.png +0 -0
  217. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_256x256.png +0 -0
  218. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_256x256@2x.png +0 -0
  219. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_32x32.png +0 -0
  220. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_32x32@2x.png +0 -0
  221. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_512x512.png +0 -0
  222. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/macos/novelwriter.iconset/icon_512x512@2x.png +0 -0
  223. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/make_clean.sh +0 -0
  224. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/make_pip.sh +0 -0
  225. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/make_release.sh +0 -0
  226. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/novelwriter.appdata.xml +0 -0
  227. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/novelwriter_readme.png +0 -0
  228. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/novelwriter_text.png +0 -0
  229. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/screenshot.png +0 -0
  230. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/signpath_logo.png +0 -0
  231. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/win_setup_embed.iss +0 -0
  232. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/windows/CMakeLists.txt +0 -0
  233. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/windows/launcher.rc +0 -0
  234. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/windows/main.cpp +0 -0
  235. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/windows/make.ps1 +0 -0
  236. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/windows/novelWriter.exe +0 -0
  237. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup/windows/novelWriter.ico +0 -0
  238. {novelwriter-2.7.4 → novelwriter-2.7.5}/setup.cfg +0 -0
@@ -1,5 +1,28 @@
1
1
  # novelWriter Changelog
2
2
 
3
+ ## Version 2.7.5 [2025-09-14]
4
+
5
+ ### Release Notes
6
+
7
+ This is a patch release that fixes an issue related to crashes when using the completer menu under
8
+ certain conditions, and improves positioning of the input box for CJK languages.
9
+
10
+ ### Detailed Changelog
11
+
12
+ **Bugfixes**
13
+
14
+ * Fixes an issue where the app would crash of deleting the `@` character with the completer menu
15
+ visible and the text margins of the editor set to "justified". This is likely crashing due to
16
+ some unhandled corner case in the Qt library, but the implementation of the completer menu in
17
+ novelWriter uses a small hack to bypass some intended behaviour of the menu. Extra steps have
18
+ been added to the implementation that seems to avoid the crash. Issue #2510. PR #2511.
19
+ * Fixes an issue where the input box that shows up when typing CJK languages were covering the text
20
+ due to an incorrect offset of the box location. The incorrect offset is caused by the text
21
+ margins not being taken into account. Fix by @Euophrys based on solution by @Jack-name.
22
+ Issues #2267 and #2517. PR #2518.
23
+
24
+ ----
25
+
3
26
  ## Version 2.7.4 [2025-07-15]
4
27
 
5
28
  ### Release Notes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: novelWriter
3
- Version: 2.7.4
3
+ Version: 2.7.5
4
4
  Summary: A plain text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
6
  License-Expression: GPL-3.0-or-later AND Apache-2.0 AND CC-BY-4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: novelWriter
3
- Version: 2.7.4
3
+ Version: 2.7.5
4
4
  Summary: A plain text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
6
  License-Expression: GPL-3.0-or-later AND Apache-2.0 AND CC-BY-4.0
@@ -49,9 +49,9 @@ __license__ = "GPLv3"
49
49
  __author__ = "Veronica Berglyd Olsen"
50
50
  __maintainer__ = "Veronica Berglyd Olsen"
51
51
  __email__ = "code@vkbo.net"
52
- __version__ = "2.7.4"
53
- __hexversion__ = "0x020704f0"
54
- __date__ = "2025-07-15"
52
+ __version__ = "2.7.5"
53
+ __hexversion__ = "0x020705f0"
54
+ __date__ = "2025-09-14"
55
55
  __status__ = "Stable"
56
56
  __domain__ = "novelwriter.io"
57
57
 
@@ -39,13 +39,14 @@ from enum import Enum, IntFlag
39
39
  from time import time
40
40
 
41
41
  from PyQt6.QtCore import (
42
- QObject, QPoint, QRegularExpression, QRunnable, Qt, QTimer, pyqtSignal,
43
- pyqtSlot
42
+ QObject, QPoint, QRect, QRegularExpression, QRunnable, Qt, QTimer,
43
+ QVariant, pyqtSignal, pyqtSlot
44
44
  )
45
45
  from PyQt6.QtGui import (
46
- QAction, QCursor, QDragEnterEvent, QDragMoveEvent, QDropEvent, QKeyEvent,
47
- QKeySequence, QMouseEvent, QPalette, QPixmap, QResizeEvent, QShortcut,
48
- QTextBlock, QTextCursor, QTextDocument, QTextOption
46
+ QAction, QCursor, QDragEnterEvent, QDragMoveEvent, QDropEvent,
47
+ QInputMethodEvent, QKeyEvent, QKeySequence, QMouseEvent, QPalette, QPixmap,
48
+ QResizeEvent, QShortcut, QTextBlock, QTextCursor, QTextDocument,
49
+ QTextOption
49
50
  )
50
51
  from PyQt6.QtWidgets import (
51
52
  QApplication, QFrame, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMenu,
@@ -74,8 +75,9 @@ from novelwriter.text.counting import standardCounter
74
75
  from novelwriter.tools.lipsum import GuiLipsum
75
76
  from novelwriter.types import (
76
77
  QtAlignCenterTop, QtAlignJustify, QtAlignLeft, QtAlignLeftTop,
77
- QtAlignRight, QtKeepAnchor, QtModCtrl, QtModNone, QtModShift, QtMouseLeft,
78
- QtMoveAnchor, QtMoveLeft, QtMoveRight, QtScrollAlwaysOff, QtScrollAsNeeded
78
+ QtAlignRight, QtImCursorRectangle, QtKeepAnchor, QtModCtrl, QtModNone,
79
+ QtModShift, QtMouseLeft, QtMoveAnchor, QtMoveLeft, QtMoveRight,
80
+ QtScrollAlwaysOff, QtScrollAsNeeded
79
81
  )
80
82
 
81
83
  logger = logging.getLogger(__name__)
@@ -151,7 +153,7 @@ class GuiDocEditor(QPlainTextEdit):
151
153
 
152
154
  # Completer
153
155
  self._completer = CommandCompleter(self)
154
- self._completer.complete.connect(self._insertCompletion)
156
+ self._completer.insertText.connect(self._insertCompletion)
155
157
 
156
158
  # Create Custom Document
157
159
  self._qDocument = GuiTextDocument(self)
@@ -914,7 +916,7 @@ class GuiDocEditor(QPlainTextEdit):
914
916
  return True
915
917
 
916
918
  ##
917
- # Document Events and Maintenance
919
+ # Events and Overloads
918
920
  ##
919
921
 
920
922
  def keyPressEvent(self, event: QKeyEvent) -> None:
@@ -1017,6 +1019,26 @@ class GuiDocEditor(QPlainTextEdit):
1017
1019
  super().resizeEvent(event)
1018
1020
  return
1019
1021
 
1022
+ def inputMethodEvent(self, event: QInputMethodEvent) -> None:
1023
+ """Handle text being input from CJK input methods."""
1024
+ super().inputMethodEvent(event)
1025
+ if event.commitString():
1026
+ # See issues #2267 and #2517
1027
+ self.ensureCursorVisible()
1028
+ self._completerToCursor()
1029
+
1030
+ def inputMethodQuery(self, query: Qt.InputMethodQuery) -> QRect | QVariant:
1031
+ """Adjust completion windows for CJK input methods to consider
1032
+ the viewport margins.
1033
+ """
1034
+ if query == QtImCursorRectangle:
1035
+ # See issues #2267 and #2517
1036
+ vM = self.viewportMargins()
1037
+ rect = self.cursorRect()
1038
+ rect.translate(vM.left(), vM.top())
1039
+ return rect
1040
+ return super().inputMethodQuery(query)
1041
+
1020
1042
  ##
1021
1043
  # Public Slots
1022
1044
  ##
@@ -1080,24 +1102,20 @@ class GuiDocEditor(QPlainTextEdit):
1080
1102
 
1081
1103
  if (block := self._qDocument.findBlock(pos)).isValid():
1082
1104
  text = block.text()
1105
+
1083
1106
  if text and text[0] in "@%" and added + removed == 1:
1084
1107
  # Only run on single character changes, or it will trigger
1085
1108
  # at unwanted times when other changes are made to the document
1086
1109
  cursor = self.textCursor()
1087
1110
  bPos = cursor.positionInBlock()
1088
- if bPos > 0 and (viewport := self.viewport()):
1111
+ if bPos > 0:
1089
1112
  if text[0] == "@":
1090
1113
  show = self._completer.updateMetaText(text, bPos)
1091
1114
  else:
1092
1115
  show = self._completer.updateCommentText(text, bPos)
1093
1116
  if show:
1094
- point = self.cursorRect().bottomRight()
1095
- self._completer.move(viewport.mapToGlobal(point))
1096
1117
  self._completer.show()
1097
- else:
1098
- self._completer.close()
1099
- else:
1100
- self._completer.close()
1118
+ self._completerToCursor()
1101
1119
 
1102
1120
  if self._doReplace and added == 1:
1103
1121
  cursor = self.textCursor()
@@ -1121,7 +1139,7 @@ class GuiDocEditor(QPlainTextEdit):
1121
1139
  cursor.setPosition(check, QtMoveAnchor)
1122
1140
  cursor.setPosition(check + length, QtKeepAnchor)
1123
1141
  cursor.insertText(text)
1124
- self._completer.hide()
1142
+ self._completer.close()
1125
1143
  return
1126
1144
 
1127
1145
  @pyqtSlot()
@@ -1898,6 +1916,12 @@ class GuiDocEditor(QPlainTextEdit):
1898
1916
  # Internal Functions
1899
1917
  ##
1900
1918
 
1919
+ def _completerToCursor(self) -> None:
1920
+ """Make sure the completer menu is positioned by the cursor."""
1921
+ if self._completer.isVisible() and (viewport := self.viewport()):
1922
+ point = self.cursorRect().bottomLeft()
1923
+ self._completer.move(viewport.mapToGlobal(point))
1924
+
1901
1925
  def _correctWord(self, cursor: QTextCursor, word: str) -> None:
1902
1926
  """Slot for the spell check context menu triggering the
1903
1927
  replacement of a word with the word from the dictionary.
@@ -2089,10 +2113,13 @@ class CommandCompleter(QMenu):
2089
2113
  called on every keystroke on a line starting with @ or %.
2090
2114
  """
2091
2115
 
2092
- complete = pyqtSignal(int, int, str)
2116
+ __slots__ = ("_parent",)
2117
+
2118
+ insertText = pyqtSignal(int, int, str)
2093
2119
 
2094
2120
  def __init__(self, parent: QWidget) -> None:
2095
2121
  super().__init__(parent=parent)
2122
+ self._parent = parent
2096
2123
  return
2097
2124
 
2098
2125
  def updateMetaText(self, text: str, pos: int) -> bool:
@@ -2179,14 +2206,14 @@ class CommandCompleter(QMenu):
2179
2206
 
2180
2207
  def keyPressEvent(self, event: QKeyEvent) -> None:
2181
2208
  """Capture keypresses and forward most of them to the editor."""
2182
- parent = self.parent()
2183
2209
  if event.key() in (
2184
2210
  Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Return,
2185
2211
  Qt.Key.Key_Enter, Qt.Key.Key_Escape
2186
2212
  ):
2187
2213
  super().keyPressEvent(event)
2188
- elif isinstance(parent, GuiDocEditor):
2189
- parent.keyPressEvent(event)
2214
+ else:
2215
+ self.close() # Close to release the event lock before forwarding the key press (#2510)
2216
+ self._parent.keyPressEvent(event)
2190
2217
  return
2191
2218
 
2192
2219
  ##
@@ -2195,7 +2222,7 @@ class CommandCompleter(QMenu):
2195
2222
 
2196
2223
  def _emitComplete(self, pos: int, length: int, value: str) -> None:
2197
2224
  """Emit the signal to indicate a selection has been made."""
2198
- self.complete.emit(pos, length, value)
2225
+ self.insertText.emit(pos, length, value)
2199
2226
  return
2200
2227
 
2201
2228
 
@@ -110,6 +110,8 @@ QtMoveAnchor = QTextCursor.MoveMode.MoveAnchor
110
110
  QtMoveLeft = QTextCursor.MoveOperation.Left
111
111
  QtMoveRight = QTextCursor.MoveOperation.Right
112
112
 
113
+ QtImCursorRectangle = Qt.InputMethodQuery.ImCursorRectangle
114
+
113
115
  # Size Policy
114
116
 
115
117
  QtSizeExpanding = QSizePolicy.Policy.Expanding
File without changes
File without changes
File without changes
File without changes