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