novelWriter 2.6b1__tar.gz → 2.6b2__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 (429) hide show
  1. {novelwriter-2.6b1 → novelwriter-2.6b2}/CHANGELOG.md +85 -0
  2. {novelwriter-2.6b1 → novelwriter-2.6b2}/CREDITS.md +1 -0
  3. {novelwriter-2.6b1 → novelwriter-2.6b2}/PKG-INFO +1 -1
  4. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelWriter.egg-info/PKG-INFO +1 -1
  5. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelWriter.egg-info/SOURCES.txt +16 -0
  6. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/__init__.py +49 -10
  7. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  8. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  9. novelwriter-2.6b2/novelwriter/assets/i18n/nw_ru_RU.qm +0 -0
  10. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_de_DE.json +2 -2
  11. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_ru_RU.json +11 -0
  12. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/icons.conf +7 -0
  13. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/mixed_margin-bottom.svg +6 -0
  14. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/mixed_margin-left.svg +6 -0
  15. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/mixed_margin-right.svg +6 -0
  16. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/mixed_margin-top.svg +6 -0
  17. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/mixed_size-height.svg +6 -0
  18. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/mixed_size-width.svg +6 -0
  19. novelwriter-2.6b2/novelwriter/assets/icons/typicons_dark/nw_toolbar.svg +5 -0
  20. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/icons.conf +7 -0
  21. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/mixed_margin-bottom.svg +6 -0
  22. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/mixed_margin-left.svg +6 -0
  23. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/mixed_margin-right.svg +6 -0
  24. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/mixed_margin-top.svg +6 -0
  25. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/mixed_size-height.svg +6 -0
  26. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/mixed_size-width.svg +6 -0
  27. novelwriter-2.6b2/novelwriter/assets/icons/typicons_light/nw_toolbar.svg +5 -0
  28. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/manual.pdf +0 -0
  29. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/sample.zip +0 -0
  30. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/text/credits_en.htm +1 -0
  31. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/common.py +37 -2
  32. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/config.py +15 -12
  33. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/constants.py +24 -9
  34. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/coretools.py +111 -125
  35. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/docbuild.py +3 -2
  36. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/index.py +9 -19
  37. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/item.py +39 -6
  38. novelwriter-2.6b2/novelwriter/core/itemmodel.py +518 -0
  39. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/project.py +67 -89
  40. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/status.py +7 -5
  41. novelwriter-2.6b2/novelwriter/core/tree.py +503 -0
  42. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/docmerge.py +7 -17
  43. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/preferences.py +3 -3
  44. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/projectsettings.py +2 -2
  45. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/enum.py +7 -0
  46. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/configlayout.py +6 -4
  47. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/todocx.py +34 -38
  48. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/tohtml.py +14 -15
  49. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/tokenizer.py +21 -17
  50. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/toodt.py +53 -124
  51. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/toqdoc.py +92 -44
  52. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/doceditor.py +230 -219
  53. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/docviewer.py +38 -9
  54. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/docviewerpanel.py +14 -22
  55. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/itemdetails.py +17 -24
  56. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/mainmenu.py +13 -8
  57. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/noveltree.py +12 -12
  58. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/outline.py +10 -11
  59. novelwriter-2.6b2/novelwriter/gui/projtree.py +1428 -0
  60. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/search.py +9 -10
  61. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/theme.py +7 -3
  62. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/guimain.py +59 -43
  63. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/shared.py +52 -23
  64. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/text/patterns.py +17 -5
  65. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/manusbuild.py +13 -11
  66. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/manussettings.py +42 -52
  67. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/types.py +7 -1
  68. novelwriter-2.6b1/novelwriter/core/tree.py +0 -522
  69. novelwriter-2.6b1/novelwriter/gui/projtree.py +0 -2082
  70. {novelwriter-2.6b1 → novelwriter-2.6b2}/LICENSE.md +0 -0
  71. {novelwriter-2.6b1 → novelwriter-2.6b2}/MANIFEST.in +0 -0
  72. {novelwriter-2.6b1 → novelwriter-2.6b2}/README.md +0 -0
  73. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelWriter.egg-info/dependency_links.txt +0 -0
  74. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelWriter.egg-info/entry_points.txt +0 -0
  75. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelWriter.egg-info/requires.txt +0 -0
  76. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelWriter.egg-info/top_level.txt +0 -0
  77. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_en_US.qm +0 -0
  78. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_es_419.qm +0 -0
  79. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  80. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  81. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  82. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  83. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  84. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_pl_PL.qm +0 -0
  85. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  86. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_en_GB.json +0 -0
  87. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_en_US.json +0 -0
  88. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_es_419.json +0 -0
  89. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_fr_FR.json +0 -0
  90. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_it_IT.json +0 -0
  91. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_ja_JP.json +0 -0
  92. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_nb_NO.json +0 -0
  93. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_nl_NL.json +0 -0
  94. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_nn_NO.json +0 -0
  95. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_pl_PL.json +0 -0
  96. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_pt_BR.json +0 -0
  97. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/i18n/project_zh_CN.json +0 -0
  98. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/none.svg +0 -0
  99. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/novelwriter.ico +0 -0
  100. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/novelwriter.svg +0 -0
  101. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/README.md +0 -0
  102. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_copy.svg +0 -0
  103. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg +0 -0
  104. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_document-new.svg +0 -0
  105. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_document-note.svg +0 -0
  106. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_document-scene.svg +0 -0
  107. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_document-section.svg +0 -0
  108. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_document-title.svg +0 -0
  109. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_edit.svg +0 -0
  110. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_import.svg +0 -0
  111. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_input-checked.svg +0 -0
  112. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_input-none.svg +0 -0
  113. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_input-unchecked.svg +0 -0
  114. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/mixed_search-replace.svg +0 -0
  115. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h0.svg +0 -0
  116. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h1.svg +0 -0
  117. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +0 -0
  118. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h2.svg +0 -0
  119. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +0 -0
  120. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h3.svg +0 -0
  121. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +0 -0
  122. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-h4.svg +0 -0
  123. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +0 -0
  124. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_deco-noveltree-more.svg +0 -0
  125. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_font.svg +0 -0
  126. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_panel.svg +0 -0
  127. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_quote.svg +0 -0
  128. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_search-case.svg +0 -0
  129. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_search-preserve.svg +0 -0
  130. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_search-regex.svg +0 -0
  131. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_search-word.svg +0 -0
  132. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +0 -0
  133. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +0 -0
  134. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +0 -0
  135. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +0 -0
  136. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-mark.svg +0 -0
  137. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +0 -0
  138. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +0 -0
  139. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +0 -0
  140. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +0 -0
  141. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +0 -0
  142. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg +0 -0
  143. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg +0 -0
  144. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg +0 -0
  145. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_arrow-minimise.svg +0 -0
  146. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_arrow-repeat-grey.svg +0 -0
  147. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_book-grey.svg +0 -0
  148. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_book.svg +0 -0
  149. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_bookmark.svg +0 -0
  150. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_calendar.svg +0 -0
  151. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_cancel-grey.svg +0 -0
  152. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_cancel.svg +0 -0
  153. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_chart-bar-grey.svg +0 -0
  154. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_chevron-down.svg +0 -0
  155. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_chevron-left.svg +0 -0
  156. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_chevron-right.svg +0 -0
  157. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_chevron-up.svg +0 -0
  158. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_cog.svg +0 -0
  159. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_delete-full.svg +0 -0
  160. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_delete.svg +0 -0
  161. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_directions-full.svg +0 -0
  162. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_document-add.svg +0 -0
  163. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_document-text.svg +0 -0
  164. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_document.svg +0 -0
  165. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_export-grey.svg +0 -0
  166. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_export.svg +0 -0
  167. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_eye.svg +0 -0
  168. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_flag.svg +0 -0
  169. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_folder-open.svg +0 -0
  170. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_folder.svg +0 -0
  171. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_globe-grey.svg +0 -0
  172. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_key.svg +0 -0
  173. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_lightbulb-full.svg +0 -0
  174. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_location.svg +0 -0
  175. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_media-pause-grey.svg +0 -0
  176. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_media-record-outline.svg +0 -0
  177. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_media-record.svg +0 -0
  178. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_minus.svg +0 -0
  179. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_pencil.svg +0 -0
  180. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_pin-outline.svg +0 -0
  181. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_pin.svg +0 -0
  182. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_plus.svg +0 -0
  183. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_puzzle-outline.svg +0 -0
  184. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_puzzle.svg +0 -0
  185. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_refresh-flipped.svg +0 -0
  186. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_refresh.svg +0 -0
  187. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_search-grey.svg +0 -0
  188. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_search.svg +0 -0
  189. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_star.svg +0 -0
  190. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_stopwatch-grey.svg +0 -0
  191. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +0 -0
  192. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +0 -0
  193. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_th-list-grey.svg +0 -0
  194. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_th-list.svg +0 -0
  195. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_times.svg +0 -0
  196. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_trash.svg +0 -0
  197. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +0 -0
  198. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +0 -0
  199. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_user.svg +0 -0
  200. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_dark/typ_warning-full.svg +0 -0
  201. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/README.md +0 -0
  202. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_copy.svg +0 -0
  203. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg +0 -0
  204. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_document-new.svg +0 -0
  205. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_document-note.svg +0 -0
  206. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_document-scene.svg +0 -0
  207. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_document-section.svg +0 -0
  208. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_document-title.svg +0 -0
  209. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_edit.svg +0 -0
  210. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_import.svg +0 -0
  211. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_input-checked.svg +0 -0
  212. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_input-none.svg +0 -0
  213. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_input-unchecked.svg +0 -0
  214. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/mixed_search-replace.svg +0 -0
  215. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h0.svg +0 -0
  216. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h1.svg +0 -0
  217. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +0 -0
  218. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h2.svg +0 -0
  219. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +0 -0
  220. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h3.svg +0 -0
  221. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +0 -0
  222. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-h4.svg +0 -0
  223. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-note.svg +0 -0
  224. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_deco-noveltree-more.svg +0 -0
  225. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_font.svg +0 -0
  226. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_panel.svg +0 -0
  227. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_quote.svg +0 -0
  228. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_search-case.svg +0 -0
  229. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_search-preserve.svg +0 -0
  230. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_search-regex.svg +0 -0
  231. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_search-word.svg +0 -0
  232. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +0 -0
  233. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +0 -0
  234. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +0 -0
  235. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +0 -0
  236. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-mark.svg +0 -0
  237. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +0 -0
  238. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +0 -0
  239. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +0 -0
  240. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +0 -0
  241. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +0 -0
  242. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg +0 -0
  243. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg +0 -0
  244. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg +0 -0
  245. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_arrow-minimise.svg +0 -0
  246. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_arrow-repeat-grey.svg +0 -0
  247. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_book-grey.svg +0 -0
  248. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_book.svg +0 -0
  249. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_bookmark.svg +0 -0
  250. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_calendar.svg +0 -0
  251. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_cancel-grey.svg +0 -0
  252. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_cancel.svg +0 -0
  253. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_chart-bar-grey.svg +0 -0
  254. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_chevron-down.svg +0 -0
  255. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_chevron-left.svg +0 -0
  256. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_chevron-right.svg +0 -0
  257. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_chevron-up.svg +0 -0
  258. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_cog.svg +0 -0
  259. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_delete-full.svg +0 -0
  260. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_delete.svg +0 -0
  261. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_directions-full.svg +0 -0
  262. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_document-add.svg +0 -0
  263. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_document-text.svg +0 -0
  264. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_document.svg +0 -0
  265. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_export-grey.svg +0 -0
  266. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_export.svg +0 -0
  267. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_eye.svg +0 -0
  268. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_flag.svg +0 -0
  269. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_folder-open.svg +0 -0
  270. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_folder.svg +0 -0
  271. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_globe-grey.svg +0 -0
  272. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_key.svg +0 -0
  273. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_lightbulb-full.svg +0 -0
  274. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_location.svg +0 -0
  275. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_media-pause-grey.svg +0 -0
  276. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_media-record-outline.svg +0 -0
  277. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_media-record.svg +0 -0
  278. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_minus.svg +0 -0
  279. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_pencil.svg +0 -0
  280. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_pin-outline.svg +0 -0
  281. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_pin.svg +0 -0
  282. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_plus.svg +0 -0
  283. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_puzzle-outline.svg +0 -0
  284. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_puzzle.svg +0 -0
  285. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_refresh-flipped.svg +0 -0
  286. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_refresh.svg +0 -0
  287. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_search-grey.svg +0 -0
  288. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_search.svg +0 -0
  289. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_star.svg +0 -0
  290. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_stopwatch-grey.svg +0 -0
  291. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +0 -0
  292. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +0 -0
  293. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_th-list-grey.svg +0 -0
  294. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_th-list.svg +0 -0
  295. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_times.svg +0 -0
  296. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_trash.svg +0 -0
  297. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +0 -0
  298. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +0 -0
  299. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_user.svg +0 -0
  300. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/typicons_light/typ_warning-full.svg +0 -0
  301. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
  302. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/icons/x-novelwriter-project.svg +0 -0
  303. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/images/novelwriter-text-dark.svg +0 -0
  304. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/images/novelwriter-text-light.svg +0 -0
  305. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/images/welcome-dark.jpg +0 -0
  306. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/images/welcome-light.jpg +0 -0
  307. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/cyberpunk_night.conf +0 -0
  308. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/default_dark.conf +0 -0
  309. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/default_light.conf +0 -0
  310. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/dracula.conf +0 -0
  311. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/grey_dark.conf +0 -0
  312. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/grey_light.conf +0 -0
  313. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/light_owl.conf +0 -0
  314. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/night_owl.conf +0 -0
  315. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/snazzy.conf +0 -0
  316. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/solarized_dark.conf +0 -0
  317. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/solarized_light.conf +0 -0
  318. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/tango.conf +0 -0
  319. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/tomorrow.conf +0 -0
  320. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/tomorrow_night.conf +0 -0
  321. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/tomorrow_night_blue.conf +0 -0
  322. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/tomorrow_night_bright.conf +0 -0
  323. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/syntax/tomorrow_night_eighties.conf +0 -0
  324. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/text/lipsum.txt +0 -0
  325. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/cyberpunk_night.conf +0 -0
  326. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/default.conf +0 -0
  327. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/default_dark.conf +0 -0
  328. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/default_light.conf +0 -0
  329. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/dracula.conf +0 -0
  330. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/solarized_dark.conf +0 -0
  331. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/assets/themes/solarized_light.conf +0 -0
  332. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/buildsettings.py +0 -0
  333. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/document.py +0 -0
  334. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/options.py +0 -0
  335. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/projectdata.py +0 -0
  336. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/projectxml.py +0 -0
  337. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/sessions.py +0 -0
  338. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/spellcheck.py +0 -0
  339. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/core/storage.py +0 -0
  340. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/about.py +0 -0
  341. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/docsplit.py +0 -0
  342. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/editlabel.py +0 -0
  343. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/quotes.py +0 -0
  344. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/dialogs/wordlist.py +0 -0
  345. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/error.py +0 -0
  346. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/eventfilters.py +0 -0
  347. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/modified.py +0 -0
  348. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/novelselector.py +0 -0
  349. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/pagedsidebar.py +0 -0
  350. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/progressbars.py +0 -0
  351. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/statusled.py +0 -0
  352. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/switch.py +0 -0
  353. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/switchbox.py +0 -0
  354. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/extensions/versioninfo.py +0 -0
  355. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/shared.py +0 -0
  356. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/tomarkdown.py +0 -0
  357. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/formats/toraw.py +0 -0
  358. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/dochighlight.py +0 -0
  359. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/editordocument.py +0 -0
  360. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/sidebar.py +0 -0
  361. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/gui/statusbar.py +0 -0
  362. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/text/counting.py +0 -0
  363. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/dictionaries.py +0 -0
  364. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/lipsum.py +0 -0
  365. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/manuscript.py +0 -0
  366. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/noveldetails.py +0 -0
  367. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/welcome.py +0 -0
  368. {novelwriter-2.6b1 → novelwriter-2.6b2}/novelwriter/tools/writingstats.py +0 -0
  369. {novelwriter-2.6b1 → novelwriter-2.6b2}/pkgutils.py +0 -0
  370. {novelwriter-2.6b1 → novelwriter-2.6b2}/pyproject.toml +0 -0
  371. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/appimage_launcher.sh +0 -0
  372. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/128x128/apps/novelwriter.png +0 -0
  373. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/128x128/mimetypes/application-x-novelwriter-project.png +0 -0
  374. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/16x16/apps/novelwriter.png +0 -0
  375. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/16x16/mimetypes/application-x-novelwriter-project.png +0 -0
  376. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/24x24/apps/novelwriter.png +0 -0
  377. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/24x24/mimetypes/application-x-novelwriter-project.png +0 -0
  378. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/256x256/apps/novelwriter.png +0 -0
  379. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/256x256/mimetypes/application-x-novelwriter-project.png +0 -0
  380. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/32x32/apps/novelwriter.png +0 -0
  381. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/32x32/mimetypes/application-x-novelwriter-project.png +0 -0
  382. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/48x48/apps/novelwriter.png +0 -0
  383. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/48x48/mimetypes/application-x-novelwriter-project.png +0 -0
  384. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/512x512/apps/novelwriter.png +0 -0
  385. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/512x512/mimetypes/application-x-novelwriter-project.png +0 -0
  386. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/64x64/apps/novelwriter.png +0 -0
  387. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/64x64/mimetypes/application-x-novelwriter-project.png +0 -0
  388. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/scalable/apps/novelwriter.svg +0 -0
  389. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/hicolor/scalable/mimetypes/application-x-novelwriter-project.svg +0 -0
  390. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/novelwriter.desktop +0 -0
  391. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/novelwriter.png +0 -0
  392. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/data/x-novelwriter-project.xml +0 -0
  393. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/compat +0 -0
  394. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/control +0 -0
  395. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/copyright +0 -0
  396. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/install +0 -0
  397. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/py3dist-overrides +0 -0
  398. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/rules +0 -0
  399. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/debian/source/format +0 -0
  400. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/description_pypi.md +0 -0
  401. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/description_short.txt +0 -0
  402. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/icons/novelwriter.ico +0 -0
  403. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/icons/novelwriter.svg +0 -0
  404. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/icons/x-novelwriter-project.ico +0 -0
  405. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/icons/x-novelwriter-project.svg +0 -0
  406. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/iss_license.txt +0 -0
  407. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/launchpad_setup.cfg +0 -0
  408. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/App.entitlements +0 -0
  409. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/Info.plist.template +0 -0
  410. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/build.sh +0 -0
  411. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_128x128.png +0 -0
  412. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_128x128@2x.png +0 -0
  413. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_16x16.png +0 -0
  414. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_16x16@2x.png +0 -0
  415. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_256x256.png +0 -0
  416. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_256x256@2x.png +0 -0
  417. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_32x32.png +0 -0
  418. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_32x32@2x.png +0 -0
  419. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_512x512.png +0 -0
  420. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/macos/novelwriter.iconset/icon_512x512@2x.png +0 -0
  421. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/make_clean.sh +0 -0
  422. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/make_pip.sh +0 -0
  423. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/make_release.sh +0 -0
  424. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/novelwriter.appdata.xml +0 -0
  425. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/novelwriter_readme.png +0 -0
  426. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/novelwriter_text.png +0 -0
  427. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/signpath_logo.png +0 -0
  428. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup/win_setup_embed.iss +0 -0
  429. {novelwriter-2.6b1 → novelwriter-2.6b2}/setup.cfg +0 -0
@@ -1,5 +1,59 @@
1
1
  # novelWriter Changelog
2
2
 
3
+ ## Version 2.6 Beta 2 [2024-12-23]
4
+
5
+ ### Release Notes
6
+
7
+ This is a beta release of the next release version, and is intended for testing purposes. Please be
8
+ careful when using this version on live writing projects, and make sure you take frequent backups.
9
+
10
+ ### Detailed Changelog
11
+
12
+ **New Features**
13
+
14
+ * The project tree has been completely rewritten under the hood. The main difference in the GUI is
15
+ a lifting of restrictions on drag and drop. You can now select multiple items in multiple places
16
+ in the tree, and drag them to a new location. It is still not allowed to drag root level items,
17
+ or drop items on the root level. PR #2119.
18
+ * You can now drag and drop items from the project tree onto the editor and viewer to load the
19
+ documents there. PR #2119.
20
+
21
+ **Bugfixes**
22
+
23
+ * Make line height in DocX scale correctly. Issue #2099. PR #2102.
24
+ * Make margins scale with font size in ODT and HTML output. PR #2102.
25
+ * Fix DocX page count to work with Office 365. PR #2102.
26
+ * Fix font scaling issues for PDF output. Issue #2100. PR #2104.
27
+ * Fix an issue that cleared the editor when the return key was used on a folder item. PR #2113.
28
+ * Fix an issue where the viewer and preview would not reset text emphasis when selecting a default
29
+ font style with emphasis features. Issue #2121. PR #2122.
30
+ * Change how custom fonts are loaded to ensure that the Qt framework don't take shortcuts by using
31
+ a similar font instead of the chosen font. This is a side effect of the Qt font matching feature.
32
+ Issue #2118. PR #2122.
33
+
34
+ **Improvements**
35
+
36
+ * Move processing of alternative apostrophe and dash to a later point in the tokenization process.
37
+ It needs to happen after dialogue is processed to work as intended. PR #2095.
38
+ * Use icons for text margin settings in Build Settings. Issue #2098. PR #2102.
39
+ * Replace the toolbar icon in the editor. PR #2103.
40
+ * Turn off auto-default button on the Build dialog. Issue #2101. PR #2105.
41
+ * Add ANSI colours to log output for easier debugging. PRs #2114 and #2117.
42
+ * Document header is now aligned to the bottom of the top page margin in the same way for ODT and
43
+ DocX output. Issue #2120. PR #2128.
44
+ * Dialogue detection for quoted dialogue has been improved to better support Chinese, and other
45
+ languages that don't use whitespaces to separate words. Some improvements have also been made to
46
+ how single quoted dialogues are processed when apostrophes are present. Issue #2131. PR #2138.
47
+
48
+ **Code Improvements**
49
+
50
+ * Completely rewrite the project tree into a model/view set with one single definition if the
51
+ project structure. PR #2109.
52
+ * The auto-replace feature in the editor has been refactored. It is now better separated from the
53
+ editor code, and may have some minor performance improvements. Issue #2129. PR #2132.
54
+
55
+ ----
56
+
3
57
  ## Version 2.6 Beta 1 [2024-11-12]
4
58
 
5
59
  ### Release Notes
@@ -72,6 +126,37 @@ careful when using this version on live writing projects, and make sure you take
72
126
 
73
127
  ----
74
128
 
129
+ ## Version 2.5.3 [2024-11-26]
130
+
131
+ ### Release Notes
132
+
133
+ This is a patch release that fixes a few minor bugs in the user interface, and with the HTML
134
+ manuscript format. This patch also adds a Russian translation, and updated the German and
135
+ Portuguese translations.
136
+
137
+ ### Detailed Changelog
138
+
139
+ **Bugfixes**
140
+
141
+ * Fixed the red/green LEDs on the statusbar for the Default Light theme. The colours were swapped.
142
+ Issue #2057. PR #2059.
143
+ * Moved the styles tag into the head tag for HTML manuscript output, which is the correct placement
144
+ for them. Issue #2080. PR #2085.
145
+ * Fixed a bug in the project tree where it was possible to drag content to root level on some Qt
146
+ versions where the disallow flag is not obeyed. The illegal action is now additionally blocked by
147
+ code. Issue #2108. PR #2109.
148
+
149
+ **Documentation**
150
+
151
+ * Updated a dead link to the spell check library with the new one. Issue #2042. PR #2059.
152
+
153
+ **Internationalisation**
154
+
155
+ * Russian translation added by Konstantin Tan (@k1kimosha). PR #2126
156
+ * Updated German and Portuguese translations. PR #2126
157
+
158
+ ----
159
+
75
160
  ## Version 2.5.2 [2024-09-17]
76
161
 
77
162
  ### Release Notes
@@ -30,6 +30,7 @@ translators for the languages currently available:
30
30
  * **Norwegian:** Veronica Berglyd Olsen (vkbo)
31
31
  * **Polish:** Anna Maria Polak (Nauthiz)
32
32
  * **Portuguese:** Bruno Meneguello (bkmeneguello)
33
+ * **Russian:** Konstantin Tan (k1kimosha)
33
34
  * **Simplified Chinese:** Qianzhi Long (longqzh)
34
35
 
35
36
  Additional larger translation contributions:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelWriter
3
- Version: 2.6b1
3
+ Version: 2.6b2
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelWriter
3
- Version: 2.6b1
3
+ Version: 2.6b2
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
@@ -32,6 +32,7 @@ novelwriter/assets/i18n/nw_nb_NO.qm
32
32
  novelwriter/assets/i18n/nw_nl_NL.qm
33
33
  novelwriter/assets/i18n/nw_pl_PL.qm
34
34
  novelwriter/assets/i18n/nw_pt_BR.qm
35
+ novelwriter/assets/i18n/nw_ru_RU.qm
35
36
  novelwriter/assets/i18n/nw_zh_CN.qm
36
37
  novelwriter/assets/i18n/project_de_DE.json
37
38
  novelwriter/assets/i18n/project_en_GB.json
@@ -66,7 +67,13 @@ novelwriter/assets/icons/typicons_dark/mixed_import.svg
66
67
  novelwriter/assets/icons/typicons_dark/mixed_input-checked.svg
67
68
  novelwriter/assets/icons/typicons_dark/mixed_input-none.svg
68
69
  novelwriter/assets/icons/typicons_dark/mixed_input-unchecked.svg
70
+ novelwriter/assets/icons/typicons_dark/mixed_margin-bottom.svg
71
+ novelwriter/assets/icons/typicons_dark/mixed_margin-left.svg
72
+ novelwriter/assets/icons/typicons_dark/mixed_margin-right.svg
73
+ novelwriter/assets/icons/typicons_dark/mixed_margin-top.svg
69
74
  novelwriter/assets/icons/typicons_dark/mixed_search-replace.svg
75
+ novelwriter/assets/icons/typicons_dark/mixed_size-height.svg
76
+ novelwriter/assets/icons/typicons_dark/mixed_size-width.svg
70
77
  novelwriter/assets/icons/typicons_dark/nw_deco-h0.svg
71
78
  novelwriter/assets/icons/typicons_dark/nw_deco-h1.svg
72
79
  novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg
@@ -94,6 +101,7 @@ novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg
94
101
  novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg
95
102
  novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg
96
103
  novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg
104
+ novelwriter/assets/icons/typicons_dark/nw_toolbar.svg
97
105
  novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg
98
106
  novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg
99
107
  novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg
@@ -167,7 +175,13 @@ novelwriter/assets/icons/typicons_light/mixed_import.svg
167
175
  novelwriter/assets/icons/typicons_light/mixed_input-checked.svg
168
176
  novelwriter/assets/icons/typicons_light/mixed_input-none.svg
169
177
  novelwriter/assets/icons/typicons_light/mixed_input-unchecked.svg
178
+ novelwriter/assets/icons/typicons_light/mixed_margin-bottom.svg
179
+ novelwriter/assets/icons/typicons_light/mixed_margin-left.svg
180
+ novelwriter/assets/icons/typicons_light/mixed_margin-right.svg
181
+ novelwriter/assets/icons/typicons_light/mixed_margin-top.svg
170
182
  novelwriter/assets/icons/typicons_light/mixed_search-replace.svg
183
+ novelwriter/assets/icons/typicons_light/mixed_size-height.svg
184
+ novelwriter/assets/icons/typicons_light/mixed_size-width.svg
171
185
  novelwriter/assets/icons/typicons_light/nw_deco-h0.svg
172
186
  novelwriter/assets/icons/typicons_light/nw_deco-h1.svg
173
187
  novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg
@@ -195,6 +209,7 @@ novelwriter/assets/icons/typicons_light/nw_tb-strike.svg
195
209
  novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg
196
210
  novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg
197
211
  novelwriter/assets/icons/typicons_light/nw_tb-underline.svg
212
+ novelwriter/assets/icons/typicons_light/nw_toolbar.svg
198
213
  novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg
199
214
  novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg
200
215
  novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg
@@ -290,6 +305,7 @@ novelwriter/core/docbuild.py
290
305
  novelwriter/core/document.py
291
306
  novelwriter/core/index.py
292
307
  novelwriter/core/item.py
308
+ novelwriter/core/itemmodel.py
293
309
  novelwriter/core/options.py
294
310
  novelwriter/core/project.py
295
311
  novelwriter/core/projectdata.py
@@ -3,7 +3,7 @@ novelWriter – Init File
3
3
  =======================
4
4
 
5
5
  File History:
6
- Created: 2018-09-22 [0.0.1]
6
+ Created: 2018-09-22 [0.0.1] main
7
7
 
8
8
  This file is a part of novelWriter
9
9
  Copyright 2018–2024, Veronica Berglyd Olsen
@@ -47,9 +47,9 @@ __license__ = "GPLv3"
47
47
  __author__ = "Veronica Berglyd Olsen"
48
48
  __maintainer__ = "Veronica Berglyd Olsen"
49
49
  __email__ = "code@vkbo.net"
50
- __version__ = "2.6b1"
51
- __hexversion__ = "0x020600b1"
52
- __date__ = "2024-11-12"
50
+ __version__ = "2.6b2"
51
+ __hexversion__ = "0x020600b2"
52
+ __date__ = "2024-12-23"
53
53
  __status__ = "Stable"
54
54
  __domain__ = "novelwriter.io"
55
55
 
@@ -60,10 +60,26 @@ logger = logging.getLogger(__name__)
60
60
  # Main Program
61
61
  ##
62
62
 
63
- # Global config and data singletons
63
+ # Globals Singletons
64
64
  CONFIG = Config()
65
65
  SHARED = SharedData()
66
66
 
67
+ # ANSI Colours
68
+ C_RED = "\033[91m"
69
+ C_GREEN = "\033[92m"
70
+ C_YELLOW = "\033[93m"
71
+ C_BLUE = "\033[94m"
72
+ C_WHITE = "\033[97m"
73
+ C_END = "\033[0m"
74
+
75
+ # Log Formats
76
+ L_TIME = "[{asctime:}]"
77
+ L_FILE = "{filename:>18}"
78
+ L_LINE = "{lineno:<4d}"
79
+ L_LVLP = "{levelname:8}"
80
+ L_LVLC = "{levelname:17}"
81
+ L_TEXT = "{message:}"
82
+
67
83
 
68
84
  def main(sysArgs: list | None = None) -> GuiMain | None:
69
85
  """Parse command line, set up logging, and launch main GUI."""
@@ -77,6 +93,7 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
77
93
  "version",
78
94
  "info",
79
95
  "debug",
96
+ "color",
80
97
  "style=",
81
98
  "config=",
82
99
  "data=",
@@ -98,6 +115,7 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
98
115
  " -v, --version Print program version and exit.\n"
99
116
  " --info Print additional runtime information.\n"
100
117
  " --debug Print debug output. Includes --info.\n"
118
+ " --color Add ANSI colors to log output.\n"
101
119
  " --meminfo Show memory usage information in the status bar.\n"
102
120
  " --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n"
103
121
  " --config= Alternative config file.\n"
@@ -106,12 +124,12 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
106
124
 
107
125
  # Defaults
108
126
  logLevel = logging.WARN
109
- logFormat = "{levelname:8} {message:}"
127
+ fmtFlags = 0b00
110
128
  confPath = None
111
129
  dataPath = None
112
130
  testMode = False
113
- qtStyle = "Fusion"
114
- cmdOpen = None
131
+ qtStyle = "Fusion"
132
+ cmdOpen = None
115
133
 
116
134
  # Parse Options
117
135
  try:
@@ -135,8 +153,10 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
135
153
  logLevel = logging.INFO
136
154
  elif inOpt == "--debug":
137
155
  CONFIG.isDebug = True
156
+ fmtFlags = fmtFlags | 0b10
138
157
  logLevel = logging.DEBUG
139
- logFormat = "[{asctime:}] {filename:>18}:{lineno:<4d} {levelname:8} {message:}"
158
+ elif inOpt == "--color":
159
+ fmtFlags = fmtFlags | 0b01
140
160
  elif inOpt == "--style":
141
161
  qtStyle = inArg
142
162
  elif inOpt == "--config":
@@ -148,13 +168,32 @@ def main(sysArgs: list | None = None) -> GuiMain | None:
148
168
  elif inOpt == "--meminfo":
149
169
  CONFIG.memInfo = True
150
170
 
171
+ if fmtFlags & 0b01:
172
+ # This will overwrite the default level names, and also ensure that
173
+ # they can be converted back to integer levels
174
+ logging.addLevelName(logging.DEBUG, f"{C_BLUE}DEBUG{C_END}")
175
+ logging.addLevelName(logging.INFO, f"{C_GREEN}INFO{C_END}")
176
+ logging.addLevelName(logging.WARNING, f"{C_YELLOW}WARNING{C_END}")
177
+ logging.addLevelName(logging.ERROR, f"{C_RED}ERROR{C_END}")
178
+ logging.addLevelName(logging.CRITICAL, f"{C_RED}CRITICAL{C_END}")
179
+
180
+ # Determine Log Format
181
+ if fmtFlags == 0b00:
182
+ logFmt = f"{L_LVLP} {L_TEXT}"
183
+ elif fmtFlags == 0b01:
184
+ logFmt = f"{L_LVLC} {L_TEXT}"
185
+ elif fmtFlags == 0b10:
186
+ logFmt = f"{L_TIME} {L_FILE}:{L_LINE} {L_LVLP} {L_TEXT}"
187
+ elif fmtFlags == 0b11:
188
+ logFmt = f"{L_TIME} {C_BLUE}{L_FILE}{C_END}:{C_WHITE}{L_LINE}{C_END} {L_LVLC} {L_TEXT}"
189
+
151
190
  # Setup Logging
152
191
  pkgLogger = logging.getLogger(__package__)
153
192
  pkgLogger.setLevel(logLevel)
154
193
  if len(pkgLogger.handlers) == 0:
155
194
  # Make sure we only create one logger (mostly an issue with tests)
156
195
  cHandle = logging.StreamHandler()
157
- cHandle.setFormatter(logging.Formatter(fmt=logFormat, style="{"))
196
+ cHandle.setFormatter(logging.Formatter(fmt=logFmt, style="{"))
158
197
  pkgLogger.addHandler(cHandle)
159
198
 
160
199
  logger.info("Starting novelWriter %s (%s) %s", __version__, __hexversion__, __date__)
@@ -5,9 +5,9 @@
5
5
  "Notes": "Notizen",
6
6
  "Tag": "Schlagwort",
7
7
  "Point of View": "Perspektive",
8
- "Focus": "Mittelpunkt",
8
+ "Focus": "Fokus",
9
9
  "Characters": "Charaktere",
10
- "Plot": "Handlungen",
10
+ "Plot": "Handlung",
11
11
  "Timeline": "Zeitleiste",
12
12
  "Locations": "Schauplätze",
13
13
  "Objects": "Objekte",
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "Synopsis": "Сводка",
3
+ "Short Description": "Краткое описание",
3
4
  "Comment": "Комментарий",
4
5
  "Notes": "Заметки",
6
+ "Tag": "Тэг",
7
+ "Point of View": "Точка зрения",
8
+ "Focus": "Фокус",
9
+ "Characters": "Персонажей",
10
+ "Plot": "Сюжет",
11
+ "Timeline": "Хронология",
12
+ "Locations": "Локации",
13
+ "Objects": "Объекты",
14
+ "Entities": "Сущности",
15
+ "Custom": "Другое",
5
16
  "0": "Ноль",
6
17
  "1": "Один",
7
18
  "2": "Два",
@@ -64,6 +64,10 @@ font = nw_font.svg
64
64
  forward = typ_chevron-right.svg
65
65
  import = mixed_import.svg
66
66
  list = typ_th-list.svg
67
+ margin_bottom = mixed_margin-bottom.svg
68
+ margin_left = mixed_margin-left.svg
69
+ margin_right = mixed_margin-right.svg
70
+ margin_top = mixed_margin-top.svg
67
71
  maximise = typ_arrow-maximise.svg
68
72
  menu = typ_th-dot-menu.svg
69
73
  minimise = typ_arrow-minimise.svg
@@ -94,6 +98,8 @@ search_regex = nw_search-regex.svg
94
98
  search_replace = mixed_search-replace.svg
95
99
  search_word = nw_search-word.svg
96
100
  settings = typ_cog.svg
101
+ size_height = mixed_size-height.svg
102
+ size_width = mixed_size-width.svg
97
103
  star = typ_star.svg
98
104
  status_idle = typ_media-pause-grey.svg
99
105
  status_lang = typ_globe-grey.svg
@@ -102,6 +108,7 @@ status_stats = typ_chart-bar-grey.svg
102
108
  status_time = typ_stopwatch-grey.svg
103
109
  sticky-off = typ_pin-outline.svg
104
110
  sticky-on = typ_pin.svg
111
+ toolbar = nw_toolbar.svg
105
112
  unchecked = mixed_input-unchecked.svg
106
113
  unfold-hide = typ_unfold-hidden.svg
107
114
  unfold-show = typ_unfold-visible.svg
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#e6e6e6" fill-opacity=".14902" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="2" y="18" width="20" height="4" rx="1" ry="1" fill="#848484" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m18.414 8.5959c0.78104 0.79361 0.78104 2.0837 0 2.8773l-6.4141 6.5268-6.4141-6.5268c-0.391-0.3968-0.58601-0.91769-0.58601-1.4386 0-0.52092 0.195-1.0418 0.58601-1.4386 0.78104-0.79464 2.047-0.79464 2.8281 0l3.5861 3.6475 3.5861-3.6475c0.78104-0.79464 2.047-0.79464 2.8281 0z" fill="#69c" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#e6e6e6" fill-opacity=".14902" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="2" y="2" width="4" height="20" rx="1" ry="1" fill="#848484" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m15.404 18.5c-0.79361 0.78104-2.0837 0.78104-2.8773 0l-6.5268-6.4141 6.5268-6.4141c0.3968-0.391 0.91769-0.58601 1.4386-0.58601 0.52092 0 1.0418 0.195 1.4386 0.58601 0.79464 0.78104 0.79464 2.047 0 2.8281l-3.6475 3.5861 3.6475 3.5861c0.79464 0.78104 0.79464 2.047 0 2.8281z" fill="#69c" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#e6e6e6" fill-opacity=".14902" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="18" y="2" width="4" height="20" rx="1" ry="1" fill="#848484" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m8.5959 18.5c0.79361 0.78104 2.0837 0.78104 2.8773 0l6.5268-6.4141-6.5268-6.4141c-0.3968-0.391-0.91769-0.58601-1.4386-0.58601-0.52092 0-1.0418 0.195-1.4386 0.58601-0.79464 0.78104-0.79464 2.047 0 2.8281l3.6475 3.5861-3.6475 3.5861c-0.79464 0.78104-0.79464 2.047 0 2.8281z" fill="#69c" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#e6e6e6" fill-opacity=".14902" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="2" y="2" width="20" height="4" rx="1" ry="1" fill="#848484" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m18.414 15.404c0.78104-0.79361 0.78104-2.0837 0-2.8773l-6.4141-6.5268-6.4141 6.5268c-0.391 0.3968-0.58601 0.91769-0.58601 1.4386 0 0.52092 0.195 1.0418 0.58601 1.4386 0.78104 0.79464 2.047 0.79464 2.8281 0l3.5861-3.6475 3.5861 3.6475c0.78104 0.79464 2.047 0.79464 2.8281 0z" fill="#69c" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#e6e6e6" fill-opacity=".14902" stroke-linecap="round" stroke-width="2"/>
4
+ <path d="m18.414 10.404c0.78104-0.79361 0.78104-2.0837 0-2.8773l-6.4141-6.5268-6.4141 6.5268c-0.391 0.3968-0.58601 0.91769-0.58601 1.4386 0 0.52092 0.195 1.0418 0.58601 1.4386 0.78104 0.79464 2.047 0.79464 2.8281 0l3.5861-3.6475 3.5861 3.6475c0.78104 0.79464 2.047 0.79464 2.8281 0z" fill="#69c" stroke-width="1.0087"/>
5
+ <path d="m18.414 13.596c0.78104 0.79361 0.78104 2.0837 0 2.8773l-6.4141 6.5268-6.4141-6.5268c-0.391-0.3968-0.58601-0.91769-0.58601-1.4386 0-0.52092 0.195-1.0418 0.58601-1.4386 0.78104-0.79464 2.047-0.79464 2.8281 0l3.5861 3.6475 3.5861-3.6475c0.78104-0.79464 2.047-0.79464 2.8281 0z" fill="#69c" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#e6e6e6" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <path d="m13.596 18.414c0.79361 0.78104 2.0837 0.78104 2.8773 0l6.5268-6.4141-6.5268-6.4141c-0.3968-0.391-0.91769-0.58601-1.4386-0.58601-0.52092 0-1.0418 0.195-1.4386 0.58601-0.79464 0.78104-0.79464 2.047 0 2.8281l3.6475 3.5861-3.6475 3.5861c-0.79464 0.78104-0.79464 2.047 0 2.8281z" fill="#69c" stroke-width="1.0087"/>
5
+ <path d="m10.404 18.414c-0.79361 0.78104-2.0837 0.78104-2.8773 0l-6.5268-6.4141 6.5268-6.4141c0.3968-0.391 0.91769-0.58601 1.4386-0.58601 0.52092 0 1.0418 0.195 1.4386 0.58601 0.79464 0.78104 0.79464 2.047 0 2.8281l-3.6475 3.5861 3.6475 3.5861c0.79464 0.78104 0.79464 2.047 0 2.8281z" fill="#69c" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="8" y="2" width="8" height="8" rx="1" ry="1" fill="none" stroke="#69c" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="8" y="14" width="8" height="8" rx="1" ry="1" fill="none" stroke="#69c" stroke-linecap="round" stroke-width="2"/>
5
+ </svg>
@@ -64,6 +64,10 @@ font = nw_font.svg
64
64
  forward = typ_chevron-right.svg
65
65
  import = mixed_import.svg
66
66
  list = typ_th-list.svg
67
+ margin_bottom = mixed_margin-bottom.svg
68
+ margin_left = mixed_margin-left.svg
69
+ margin_right = mixed_margin-right.svg
70
+ margin_top = mixed_margin-top.svg
67
71
  maximise = typ_arrow-maximise.svg
68
72
  menu = typ_th-dot-menu.svg
69
73
  minimise = typ_arrow-minimise.svg
@@ -94,6 +98,8 @@ search_regex = nw_search-regex.svg
94
98
  search_replace = mixed_search-replace.svg
95
99
  search_word = nw_search-word.svg
96
100
  settings = typ_cog.svg
101
+ size_height = mixed_size-height.svg
102
+ size_width = mixed_size-width.svg
97
103
  star = typ_star.svg
98
104
  status_idle = typ_media-pause-grey.svg
99
105
  status_lang = typ_globe-grey.svg
@@ -102,6 +108,7 @@ status_stats = typ_chart-bar-grey.svg
102
108
  status_time = typ_stopwatch-grey.svg
103
109
  sticky-off = typ_pin-outline.svg
104
110
  sticky-on = typ_pin.svg
111
+ toolbar = nw_toolbar.svg
105
112
  unchecked = mixed_input-unchecked.svg
106
113
  unfold-hide = typ_unfold-hidden.svg
107
114
  unfold-show = typ_unfold-visible.svg
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#333" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="2" y="18" width="20" height="4" rx="1" ry="1" fill="#333" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m18.414 8.5959c0.78104 0.79361 0.78104 2.0837 0 2.8773l-6.4141 6.5268-6.4141-6.5268c-0.391-0.3968-0.58601-0.91769-0.58601-1.4386 0-0.52092 0.195-1.0418 0.58601-1.4386 0.78104-0.79464 2.047-0.79464 2.8281 0l3.5861 3.6475 3.5861-3.6475c0.78104-0.79464 2.047-0.79464 2.8281 0z" fill="#4271ae" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#333" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="2" y="2" width="4" height="20" rx="1" ry="1" fill="#333" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m15.404 18.5c-0.79361 0.78104-2.0837 0.78104-2.8773 0l-6.5268-6.4141 6.5268-6.4141c0.3968-0.391 0.91769-0.58601 1.4386-0.58601 0.52092 0 1.0418 0.195 1.4386 0.58601 0.79464 0.78104 0.79464 2.047 0 2.8281l-3.6475 3.5861 3.6475 3.5861c0.79464 0.78104 0.79464 2.047 0 2.8281z" fill="#4271ae" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#333" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="18" y="2" width="4" height="20" rx="1" ry="1" fill="#333" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m8.5959 18.5c0.79361 0.78104 2.0837 0.78104 2.8773 0l6.5268-6.4141-6.5268-6.4141c-0.3968-0.391-0.91769-0.58601-1.4386-0.58601-0.52092 0-1.0418 0.195-1.4386 0.58601-0.79464 0.78104-0.79464 2.047 0 2.8281l3.6475 3.5861-3.6475 3.5861c-0.79464 0.78104-0.79464 2.047 0 2.8281z" fill="#4271ae" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#333" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="2" y="2" width="20" height="4" rx="1" ry="1" fill="#333" stroke-linecap="round" stroke-width="2"/>
5
+ <path d="m18.414 15.404c0.78104-0.79361 0.78104-2.0837 0-2.8773l-6.4141-6.5268-6.4141 6.5268c-0.391 0.3968-0.58601 0.91769-0.58601 1.4386 0 0.52092 0.195 1.0418 0.58601 1.4386 0.78104 0.79464 2.047 0.79464 2.8281 0l3.5861-3.6475 3.5861 3.6475c0.78104 0.79464 2.047 0.79464 2.8281 0z" fill="#4271ae" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#333" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <path d="m18.414 10.404c0.78104-0.79361 0.78104-2.0837 0-2.8773l-6.4141-6.5268-6.4141 6.5268c-0.391 0.3968-0.58601 0.91769-0.58601 1.4386 0 0.52092 0.195 1.0418 0.58601 1.4386 0.78104 0.79464 2.047 0.79464 2.8281 0l3.5861-3.6475 3.5861 3.6475c0.78104 0.79464 2.047 0.79464 2.8281 0z" fill="#4271ae" stroke-width="1.0087"/>
5
+ <path d="m18.414 13.596c0.78104 0.79361 0.78104 2.0837 0 2.8773l-6.4141 6.5268-6.4141-6.5268c-0.391-0.3968-0.58601-0.91769-0.58601-1.4386 0-0.52092 0.195-1.0418 0.58601-1.4386 0.78104-0.79464 2.047-0.79464 2.8281 0l3.5861 3.6475 3.5861-3.6475c0.78104-0.79464 2.047-0.79464 2.8281 0z" fill="#4271ae" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="2" width="20" height="20" rx="1" ry="1" fill="#333" fill-opacity=".15" stroke-linecap="round" stroke-width="2"/>
4
+ <path d="m13.596 18.414c0.79361 0.78104 2.0837 0.78104 2.8773 0l6.5268-6.4141-6.5268-6.4141c-0.3968-0.391-0.91769-0.58601-1.4386-0.58601-0.52092 0-1.0418 0.195-1.4386 0.58601-0.79464 0.78104-0.79464 2.047 0 2.8281l3.6475 3.5861-3.6475 3.5861c-0.79464 0.78104-0.79464 2.047 0 2.8281z" fill="#4271ae" stroke-width="1.0087"/>
5
+ <path d="m10.404 18.414c-0.79361 0.78104-2.0837 0.78104-2.8773 0l-6.5268-6.4141 6.5268-6.4141c0.3968-0.391 0.91769-0.58601 1.4386-0.58601 0.52092 0 1.0418 0.195 1.4386 0.58601 0.79464 0.78104 0.79464 2.047 0 2.8281l-3.6475 3.5861 3.6475 3.5861c0.79464 0.78104 0.79464 2.047 0 2.8281z" fill="#4271ae" stroke-width="1.0087"/>
6
+ </svg>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="8" y="2" width="8" height="8" rx="1" ry="1" fill="none" stroke="#4271ae" stroke-linecap="round" stroke-width="2"/>
4
+ <rect x="8" y="14" width="8" height="8" rx="1" ry="1" fill="none" stroke="#4271ae" stroke-linecap="round" stroke-width="2"/>
5
+ </svg>
@@ -35,6 +35,7 @@ translators for the languages currently available:</p>
35
35
  <li><b>Norwegian:</b> Veronica Berglyd Olsen (vkbo)</li>
36
36
  <li><b>Polish:</b> Anna Maria Polak (Nauthiz)</li>
37
37
  <li><b>Portuguese:</b> Bruno Meneguello (bkmeneguello)</li>
38
+ <li><b>Russian:</b> Konstantin Tan (k1kimosha)</li>
38
39
  <li><b>Simplified Chinese:</b> Qianzhi Long (longqzh)</li>
39
40
  </ul>
40
41
 
@@ -37,8 +37,8 @@ from typing import TYPE_CHECKING, Any, Literal, TypeVar
37
37
  from urllib.parse import urljoin
38
38
  from urllib.request import pathname2url
39
39
 
40
- from PyQt5.QtCore import QCoreApplication, QUrl
41
- from PyQt5.QtGui import QColor, QDesktopServices, QFont, QFontInfo
40
+ from PyQt5.QtCore import QCoreApplication, QMimeData, QUrl
41
+ from PyQt5.QtGui import QColor, QDesktopServices, QFont, QFontDatabase, QFontInfo
42
42
 
43
43
  from novelwriter.constants import nwConst, nwLabels, nwUnicode, trConst
44
44
  from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
@@ -434,6 +434,30 @@ def describeFont(font: QFont) -> str:
434
434
  return "Error"
435
435
 
436
436
 
437
+ def fontMatcher(font: QFont) -> QFont:
438
+ """Make sure the font is the correct family, if possible. This
439
+ ensures that Qt doesn't re-use another font under the hood. The
440
+ default Qt5 font matching algorithm doesn't handle well changing
441
+ application fonts at runtime.
442
+ """
443
+ info = QFontInfo(font)
444
+ if (famRequest := font.family()) != (famActual := info.family()):
445
+ logger.warning("Font mismatch: Requested '%s', but got '%s'", famRequest, famActual)
446
+ db = QFontDatabase()
447
+ if famRequest in db.families():
448
+ styleRequest, sizeRequest = font.styleName(), font.pointSize()
449
+ logger.info("Lookup: %s, %s, %d pt", famRequest, styleRequest, sizeRequest)
450
+ temp = db.font(famRequest, styleRequest, sizeRequest)
451
+ temp.setPointSize(sizeRequest) # Make sure it isn't changed
452
+ famFound, styleFound, sizeFound = temp.family(), temp.styleName(), temp.pointSize()
453
+ if famFound == famRequest:
454
+ logger.info("Found: %s, %s, %d pt", famFound, styleFound, sizeFound)
455
+ return temp
456
+ logger.warning("Could not find a font match in the font database")
457
+ logger.warning("If you just changed font, you may need to restart the application")
458
+ return font
459
+
460
+
437
461
  def qtLambda(func: Callable, *args: Any, **kwargs: Any) -> Callable:
438
462
  """A replacement for Python lambdas that works for Qt slots."""
439
463
  def wrapper(*a_: Any) -> None:
@@ -441,6 +465,17 @@ def qtLambda(func: Callable, *args: Any, **kwargs: Any) -> Callable:
441
465
  return wrapper
442
466
 
443
467
 
468
+ def encodeMimeHandles(mimeData: QMimeData, handles: list[str]) -> None:
469
+ """Encode handles into a mime data object."""
470
+ mimeData.setData(nwConst.MIME_HANDLE, b"|".join(h.encode() for h in handles))
471
+ return
472
+
473
+
474
+ def decodeMimeHandles(mimeData: QMimeData) -> list[str]:
475
+ """Decode and split a mime data object with handles."""
476
+ return mimeData.data(nwConst.MIME_HANDLE).data().decode().split("|")
477
+
478
+
444
479
  ##
445
480
  # Encoder Functions
446
481
  ##