Merge branch 'release'

This commit is contained in:
Veronica Berglyd Olsen
2024-07-04 16:30:26 +02:00
22 changed files with 7326 additions and 2185 deletions
+32 -30
View File
@@ -2,72 +2,74 @@
## Main Developer ## Main Developer
* Veronica Berglyd Olsen (@vkbo) * Veronica Berglyd Olsen
## Contributors ## Contributors
* Concept: Marian Lückhof (@Number042) * Early Concept: Marian Lückhof
* Internationalisation: Bruno Meneguello (@bkmeneguello) * Internationalisation: Bruno Meneguello
* Setup and Packaging: Rachel Powers (@Ryex) * Setup and Packaging: Rachel Powers
For other contributions, see the project's [Contributors](https://github.com/vkbo/novelWriter/graphs/contributors) page. For other contributions, see the project's [Contributors](https://github.com/vkbo/novelWriter/graphs/contributors) page.
## Artwork ## Artwork
The artwork on the Welcome dialog was created by [Louis Durrant](https://louisdurrant.art). The artwork on the Welcome dialog was created by Louis Durrant.
## Translations ## Translations
The default language is English (UK) with English (US) as an option. These are the original The default language is English (UK) with English (US) as an option. These are the original
translators for the languages currently available: translators for the languages currently available:
* Dutch: Martijn van der Kleijn (@mvdkleijn) * **Dutch:** Martijn van der Kleijn (mvdkleijn)
* French: Jan Lüdke (@jyhelle) * **French:** Jan Lüdke (jyhelle)
* German: Myian (@heymyian) * **German:** Myian (HeyMyian)
* Italian: Riccardo Mangili * **Italian:** Riccardo Mangili
* Japanese: hebekeg (@hebekeg) * **Japanese:** hebekeg
* Latin American Spanish: Tommy Marplatt (@tmarplatt) * **Latin American Spanish:** Tommy Marplatt (tmarplatt)
* Norwegian: Veronica Berglyd Olsen (@vkbo) * **Norwegian:** Veronica Berglyd Olsen (vkbo)
* Portuguese: Bruno Meneguello (@bkmeneguello) * **Polish:** Anna Maria Polak (Nauthiz)
* Simplified Chinese: Qianzhi Long (@longqzh) * **Portuguese:** Bruno Meneguello (bkmeneguello)
* **Simplified Chinese:** Qianzhi Long (longqzh)
Additional larger translation contributions: Additional larger translation contributions:
* French: Albert Aribaud (@aaribaud) * **French:** Albert Aribaud (aaribaud)
* **Portuguese:** Oli Maia (olimaia)
Translations are managed on [Crowdin](https://crowdin.com/project/novelwriter), and more Translations are managed on [Crowdin](https://crowdin.com/project/novelwriter), and more
contributions are listed on the project's [Members](https://crowdin.com/project/novelwriter/members) page. contributions are listed on the project's Members page.
## Libraries ## Libraries
The following libraries are dependencies of novelWriter: The following libraries are dependencies of novelWriter:
* [Qt5](https://www.qt.io) by Qt Company * **Qt5** by Qt Company
* [PyQt5](https://www.riverbankcomputing.com/software/pyqt) by Riverbank Computing * **PyQt5** by Riverbank Computing
* [Enchant](https://abiword.github.io/enchant) by Dom Lachowicz * **Enchant** by Dom Lachowicz
* [PyEnchant](https://pyenchant.github.io/pyenchant) by Dimitri Merejkowsky * **PyEnchant** by Dimitri Merejkowsky
## Assets ## Assets
Some of the assets bundled with novelWriter were adapted from the following sources: Some of the assets bundled with novelWriter were adapted from the following sources:
* [Typicons](https://github.com/stephenhutchings/typicons.font) icons by Stephen Hutchings (CC BY-SA 4.0) * **Typicons** icons by Stephen Hutchings (CC BY-SA 4.0)
* [Tomorrow](https://github.com/chriskempson/base16) syntax themes by Chris Kempson (MIT License) * **Tomorrow** syntax themes by Chris Kempson (MIT License)
* [Owl](https://github.com/sdras/night-owl-vscode-theme) syntax themes by Sarah Drasner (MIT License) * **Owl** syntax themes by Sarah Drasner (MIT License)
* [Solarized](https://github.com/altercation/solarized) themes by Ethan Schoonover (MIT License) * **Solarized** themes by Ethan Schoonover (MIT License)
* [Cyberpunk Night](https://github.com/alemvigh) theme by Anders Lemvigh (CC BY-SA 4.0) * **Cyberpunk Night** theme by Anders Lemvigh (CC BY-SA 4.0)
* [Dracula](https://draculatheme.com) theme by Zeno Rocha (MIT License) * **Dracula** theme by Zeno Rocha (MIT License)
* [Snazzy Light](https://github.com/loilo/vscode-snazzy-light) theme by Florian Reuschel (MIT License) * **Snazzy Light** theme by Florian Reuschel (MIT License)
## Fonts ## Fonts
The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are
used on buttons and icons. used on buttons and icons.
* Pridi by Cadson Demak (Open Font License, Version 1.1) * **Pridi** by Cadson Demak (Open Font License, Version 1.1)
* Source Sans Pro by Paul D. Hunt (SIL Open Font License) * **Source Sans Pro** by Paul D. Hunt (SIL Open Font License)
## Special Mentions ## Special Mentions
Additional thanks to @johnblommers who was an early user and who has provided a lot of very useful Additional thanks to John Blommers who was an early user and who has provided a lot of very useful
feedback over the years. feedback over the years.
+150 -150
View File
@@ -1267,27 +1267,27 @@
<context> <context>
<name>GuiDocViewFooter</name> <name>GuiDocViewFooter</name>
<message> <message>
<location filename="../novelwriter/gui/docviewer.py" line="838" /> <location filename="../novelwriter/gui/docviewer.py" line="840" />
<source>Show/Hide Viewer Panel</source> <source>Show/Hide Viewer Panel</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/docviewer.py" line="842" /> <location filename="../novelwriter/gui/docviewer.py" line="844" />
<source>Comments</source> <source>Comments</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/docviewer.py" line="848" /> <location filename="../novelwriter/gui/docviewer.py" line="850" />
<source>Show Comments</source> <source>Show Comments</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/docviewer.py" line="852" /> <location filename="../novelwriter/gui/docviewer.py" line="854" />
<source>Synopsis</source> <source>Synopsis</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/docviewer.py" line="858" /> <location filename="../novelwriter/gui/docviewer.py" line="860" />
<source>Show Synopsis Comments</source> <source>Show Synopsis Comments</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -1534,12 +1534,12 @@
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/guimain.py" line="1045" /> <location filename="../novelwriter/guimain.py" line="1061" />
<source>Some changes will not be applied until novelWriter has been restarted.</source> <source>Some changes will not be applied until novelWriter has been restarted.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/guimain.py" line="1398" /> <location filename="../novelwriter/guimain.py" line="1414" />
<source>Could not find the reference for tag '{0}'. It either doesn't exist, or the index is out of date. The index can be updated from the Tools menu, or by pressing {1}.</source> <source>Could not find the reference for tag '{0}'. It either doesn't exist, or the index is out of date. The index can be updated from the Tools menu, or by pressing {1}.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2457,64 +2457,64 @@
<context> <context>
<name>GuiOutlineDetails</name> <name>GuiOutlineDetails</name>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="1004" /> <location filename="../novelwriter/gui/outline.py" line="1005" />
<location filename="../novelwriter/gui/outline.py" line="796" /> <location filename="../novelwriter/gui/outline.py" line="797" />
<location filename="../novelwriter/gui/outline.py" line="771" /> <location filename="../novelwriter/gui/outline.py" line="772" />
<source>Title</source> <source>Title</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="772" /> <location filename="../novelwriter/gui/outline.py" line="773" />
<source>Chapter</source> <source>Chapter</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="773" /> <location filename="../novelwriter/gui/outline.py" line="774" />
<source>Scene</source> <source>Scene</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="774" /> <location filename="../novelwriter/gui/outline.py" line="775" />
<source>Section</source> <source>Section</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="797" /> <location filename="../novelwriter/gui/outline.py" line="798" />
<source>Document</source> <source>Document</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="798" /> <location filename="../novelwriter/gui/outline.py" line="799" />
<source>Status</source> <source>Status</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="815" /> <location filename="../novelwriter/gui/outline.py" line="816" />
<source>Characters</source> <source>Characters</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="816" /> <location filename="../novelwriter/gui/outline.py" line="817" />
<source>Words</source> <source>Words</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="817" /> <location filename="../novelwriter/gui/outline.py" line="818" />
<source>Paragraphs</source> <source>Paragraphs</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="834" /> <location filename="../novelwriter/gui/outline.py" line="835" />
<source>Synopsis</source> <source>Synopsis</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="916" /> <location filename="../novelwriter/gui/outline.py" line="917" />
<source>Title Details</source> <source>Title Details</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="941" /> <location filename="../novelwriter/gui/outline.py" line="942" />
<source>Reference Tags</source> <source>Reference Tags</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2522,7 +2522,7 @@
<context> <context>
<name>GuiOutlineHeaderMenu</name> <name>GuiOutlineHeaderMenu</name>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="735" /> <location filename="../novelwriter/gui/outline.py" line="736" />
<source>Select Columns</source> <source>Select Columns</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2548,7 +2548,7 @@
<context> <context>
<name>GuiOutlineTree</name> <name>GuiOutlineTree</name>
<message> <message>
<location filename="../novelwriter/gui/outline.py" line="528" /> <location filename="../novelwriter/gui/outline.py" line="529" />
<source>Save Outline As</source> <source>Save Outline As</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
@@ -2556,589 +2556,589 @@
<context> <context>
<name>GuiPreferences</name> <name>GuiPreferences</name>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="69" /> <location filename="../novelwriter/dialogs/preferences.py" line="66" />
<location filename="../novelwriter/dialogs/preferences.py" line="63" /> <location filename="../novelwriter/dialogs/preferences.py" line="60" />
<source>Preferences</source> <source>Preferences</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="75" /> <location filename="../novelwriter/dialogs/preferences.py" line="72" />
<source>Search</source> <source>Search</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="147" /> <location filename="../novelwriter/dialogs/preferences.py" line="145" />
<source>General</source> <source>General</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="152" /> <location filename="../novelwriter/dialogs/preferences.py" line="150" />
<source>Appearance</source> <source>Appearance</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="165" /> <location filename="../novelwriter/dialogs/preferences.py" line="163" />
<source>Display language</source> <source>Display language</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="191" /> <location filename="../novelwriter/dialogs/preferences.py" line="189" />
<location filename="../novelwriter/dialogs/preferences.py" line="166" /> <location filename="../novelwriter/dialogs/preferences.py" line="164" />
<source>Requires restart to take effect.</source> <source>Requires restart to take effect.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="177" /> <location filename="../novelwriter/dialogs/preferences.py" line="175" />
<source>Colour theme</source> <source>Colour theme</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="178" /> <location filename="../novelwriter/dialogs/preferences.py" line="176" />
<source>General colour theme and icons.</source> <source>General colour theme and icons.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="190" /> <location filename="../novelwriter/dialogs/preferences.py" line="188" />
<source>Application font</source> <source>Application font</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="199" /> <location filename="../novelwriter/dialogs/preferences.py" line="197" />
<source>Hide vertical scroll bars in main windows</source> <source>Hide vertical scroll bars in main windows</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="208" /> <location filename="../novelwriter/dialogs/preferences.py" line="206" />
<location filename="../novelwriter/dialogs/preferences.py" line="200" /> <location filename="../novelwriter/dialogs/preferences.py" line="198" />
<source>Scrolling available with mouse wheel and keys only.</source> <source>Scrolling available with mouse wheel and keys only.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="207" /> <location filename="../novelwriter/dialogs/preferences.py" line="205" />
<source>Hide horizontal scroll bars in main windows</source> <source>Hide horizontal scroll bars in main windows</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="215" /> <location filename="../novelwriter/dialogs/preferences.py" line="213" />
<source>Use the system's font selection dialog</source> <source>Use the system's font selection dialog</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="216" /> <location filename="../novelwriter/dialogs/preferences.py" line="214" />
<source>Turn off to use the Qt font dialog, which may have more options.</source> <source>Turn off to use the Qt font dialog, which may have more options.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="222" /> <location filename="../novelwriter/dialogs/preferences.py" line="220" />
<source>Document Style</source> <source>Document Style</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="235" /> <location filename="../novelwriter/dialogs/preferences.py" line="233" />
<source>Document colour theme</source> <source>Document colour theme</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="236" /> <location filename="../novelwriter/dialogs/preferences.py" line="234" />
<source>Colour theme for the editor and viewer.</source> <source>Colour theme for the editor and viewer.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="248" /> <location filename="../novelwriter/dialogs/preferences.py" line="246" />
<source>Document font</source> <source>Document font</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="429" /> <location filename="../novelwriter/dialogs/preferences.py" line="427" />
<location filename="../novelwriter/dialogs/preferences.py" line="418" /> <location filename="../novelwriter/dialogs/preferences.py" line="416" />
<location filename="../novelwriter/dialogs/preferences.py" line="249" /> <location filename="../novelwriter/dialogs/preferences.py" line="247" />
<source>Applies to both document editor and viewer.</source> <source>Applies to both document editor and viewer.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="257" /> <location filename="../novelwriter/dialogs/preferences.py" line="255" />
<source>Emphasise partition and chapter labels</source> <source>Emphasise partition and chapter labels</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="258" /> <location filename="../novelwriter/dialogs/preferences.py" line="256" />
<source>Makes them stand out in the project tree.</source> <source>Makes them stand out in the project tree.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="265" /> <location filename="../novelwriter/dialogs/preferences.py" line="263" />
<source>Show full path in document header</source> <source>Show full path in document header</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="266" /> <location filename="../novelwriter/dialogs/preferences.py" line="264" />
<source>Add the parent folder names to the header.</source> <source>Add the parent folder names to the header.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="273" /> <location filename="../novelwriter/dialogs/preferences.py" line="271" />
<source>Include project notes in status bar word count</source> <source>Include project notes in status bar word count</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="279" /> <location filename="../novelwriter/dialogs/preferences.py" line="277" />
<source>Auto Save</source> <source>Auto Save</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="291" /> <location filename="../novelwriter/dialogs/preferences.py" line="289" />
<source>Save document interval</source> <source>Save document interval</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="292" /> <location filename="../novelwriter/dialogs/preferences.py" line="290" />
<source>How often the document is automatically saved.</source> <source>How often the document is automatically saved.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="303" /> <location filename="../novelwriter/dialogs/preferences.py" line="301" />
<location filename="../novelwriter/dialogs/preferences.py" line="292" /> <location filename="../novelwriter/dialogs/preferences.py" line="290" />
<source>seconds</source> <source>seconds</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="302" /> <location filename="../novelwriter/dialogs/preferences.py" line="300" />
<source>Save project interval</source> <source>Save project interval</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="303" /> <location filename="../novelwriter/dialogs/preferences.py" line="301" />
<source>How often the project is automatically saved.</source> <source>How often the project is automatically saved.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="309" /> <location filename="../novelwriter/dialogs/preferences.py" line="307" />
<source>Project Backup</source> <source>Project Backup</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="316" /> <location filename="../novelwriter/dialogs/preferences.py" line="314" />
<source>Browse</source> <source>Browse</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="320" /> <location filename="../novelwriter/dialogs/preferences.py" line="318" />
<source>Backup storage location</source> <source>Backup storage location</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="840" /> <location filename="../novelwriter/dialogs/preferences.py" line="825" />
<location filename="../novelwriter/dialogs/preferences.py" line="321" /> <location filename="../novelwriter/dialogs/preferences.py" line="319" />
<source>Path: {0}</source> <source>Path: {0}</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="329" /> <location filename="../novelwriter/dialogs/preferences.py" line="327" />
<source>Run backup when the project is closed</source> <source>Run backup when the project is closed</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="330" /> <location filename="../novelwriter/dialogs/preferences.py" line="328" />
<source>Can be overridden for individual projects in Project Settings.</source> <source>Can be overridden for individual projects in Project Settings.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="339" /> <location filename="../novelwriter/dialogs/preferences.py" line="337" />
<source>Ask before running backup</source> <source>Ask before running backup</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="340" /> <location filename="../novelwriter/dialogs/preferences.py" line="338" />
<source>If off, backups will run in the background.</source> <source>If off, backups will run in the background.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="346" /> <location filename="../novelwriter/dialogs/preferences.py" line="344" />
<source>Session Timer</source> <source>Session Timer</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="355" /> <location filename="../novelwriter/dialogs/preferences.py" line="353" />
<source>Pause the session timer when not writing</source> <source>Pause the session timer when not writing</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="356" /> <location filename="../novelwriter/dialogs/preferences.py" line="354" />
<source>Also pauses when the application window does not have focus.</source> <source>Also pauses when the application window does not have focus.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="367" /> <location filename="../novelwriter/dialogs/preferences.py" line="365" />
<source>Editor inactive time before pausing timer</source> <source>Editor inactive time before pausing timer</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="368" /> <location filename="../novelwriter/dialogs/preferences.py" line="366" />
<source>User activity includes typing and changing the content.</source> <source>User activity includes typing and changing the content.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="369" /> <location filename="../novelwriter/dialogs/preferences.py" line="367" />
<source>minutes</source> <source>minutes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="373" /> <location filename="../novelwriter/dialogs/preferences.py" line="371" />
<source>Writing</source> <source>Writing</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="378" /> <location filename="../novelwriter/dialogs/preferences.py" line="376" />
<source>Text Flow</source> <source>Text Flow</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="390" /> <location filename="../novelwriter/dialogs/preferences.py" line="388" />
<source>Maximum text width in "Normal Mode"</source> <source>Maximum text width in "Normal Mode"</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="391" /> <location filename="../novelwriter/dialogs/preferences.py" line="389" />
<source>Set to 0 to disable this feature.</source> <source>Set to 0 to disable this feature.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="442" /> <location filename="../novelwriter/dialogs/preferences.py" line="440" />
<location filename="../novelwriter/dialogs/preferences.py" line="430" /> <location filename="../novelwriter/dialogs/preferences.py" line="428" />
<location filename="../novelwriter/dialogs/preferences.py" line="402" /> <location filename="../novelwriter/dialogs/preferences.py" line="400" />
<location filename="../novelwriter/dialogs/preferences.py" line="391" /> <location filename="../novelwriter/dialogs/preferences.py" line="389" />
<source>px</source> <source>px</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="401" /> <location filename="../novelwriter/dialogs/preferences.py" line="399" />
<source>Maximum text width in "Focus Mode"</source> <source>Maximum text width in "Focus Mode"</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="402" /> <location filename="../novelwriter/dialogs/preferences.py" line="400" />
<source>The maximum width cannot be disabled.</source> <source>The maximum width cannot be disabled.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="409" /> <location filename="../novelwriter/dialogs/preferences.py" line="407" />
<source>Hide document footer in "Focus Mode"</source> <source>Hide document footer in "Focus Mode"</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="410" /> <location filename="../novelwriter/dialogs/preferences.py" line="408" />
<source>Hide the information bar in the document editor.</source> <source>Hide the information bar in the document editor.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="417" /> <location filename="../novelwriter/dialogs/preferences.py" line="415" />
<source>Justify the text margins</source> <source>Justify the text margins</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="428" /> <location filename="../novelwriter/dialogs/preferences.py" line="426" />
<source>Minimum text margin</source> <source>Minimum text margin</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="440" /> <location filename="../novelwriter/dialogs/preferences.py" line="438" />
<source>Tab width</source> <source>Tab width</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="441" /> <location filename="../novelwriter/dialogs/preferences.py" line="439" />
<source>The width of a tab key press in the editor and viewer.</source> <source>The width of a tab key press in the editor and viewer.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="448" /> <location filename="../novelwriter/dialogs/preferences.py" line="446" />
<source>Text Editing</source> <source>Text Editing</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="468" /> <location filename="../novelwriter/dialogs/preferences.py" line="466" />
<source>Spell check language</source> <source>Spell check language</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="469" /> <location filename="../novelwriter/dialogs/preferences.py" line="467" />
<source>Available languages are determined by your system.</source> <source>Available languages are determined by your system.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="476" /> <location filename="../novelwriter/dialogs/preferences.py" line="474" />
<source>Auto-select word under cursor</source> <source>Auto-select word under cursor</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="477" /> <location filename="../novelwriter/dialogs/preferences.py" line="475" />
<source>Apply formatting to word under cursor if no selection is made.</source> <source>Apply formatting to word under cursor if no selection is made.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="484" /> <location filename="../novelwriter/dialogs/preferences.py" line="482" />
<source>Show tabs and spaces</source> <source>Show tabs and spaces</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="491" /> <location filename="../novelwriter/dialogs/preferences.py" line="489" />
<source>Show line endings</source> <source>Show line endings</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="497" /> <location filename="../novelwriter/dialogs/preferences.py" line="495" />
<source>Editor Scrolling</source> <source>Editor Scrolling</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="506" /> <location filename="../novelwriter/dialogs/preferences.py" line="504" />
<source>Scroll past end of the document</source> <source>Scroll past end of the document</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="507" /> <location filename="../novelwriter/dialogs/preferences.py" line="505" />
<source>Also centres the cursor when scrolling.</source> <source>Also centres the cursor when scrolling.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="514" /> <location filename="../novelwriter/dialogs/preferences.py" line="512" />
<source>Typewriter style scrolling when you type</source> <source>Typewriter style scrolling when you type</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="515" /> <location filename="../novelwriter/dialogs/preferences.py" line="513" />
<source>Keeps the cursor at a fixed vertical position.</source> <source>Keeps the cursor at a fixed vertical position.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="525" /> <location filename="../novelwriter/dialogs/preferences.py" line="523" />
<source>Minimum position for Typewriter scrolling</source> <source>Minimum position for Typewriter scrolling</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="526" /> <location filename="../novelwriter/dialogs/preferences.py" line="524" />
<source>Percentage of the editor height from the top.</source> <source>Percentage of the editor height from the top.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="532" /> <location filename="../novelwriter/dialogs/preferences.py" line="530" />
<source>Text Highlighting</source> <source>Text Highlighting</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="538" /> <location filename="../novelwriter/dialogs/preferences.py" line="536" />
<source>None</source> <source>None</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="539" /> <location filename="../novelwriter/dialogs/preferences.py" line="537" />
<source>Single Quotes</source> <source>Single Quotes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="540" /> <location filename="../novelwriter/dialogs/preferences.py" line="538" />
<source>Double Quotes</source> <source>Double Quotes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="541" /> <location filename="../novelwriter/dialogs/preferences.py" line="539" />
<source>Both</source> <source>Both</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="544" /> <location filename="../novelwriter/dialogs/preferences.py" line="542" />
<source>Highlight dialogue</source> <source>Highlight dialogue</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="545" /> <location filename="../novelwriter/dialogs/preferences.py" line="543" />
<source>Applies to the selected quote styles.</source> <source>Applies to the selected quote styles.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="551" /> <location filename="../novelwriter/dialogs/preferences.py" line="549" />
<source>Allow open-ended dialogue</source> <source>Allow open-ended dialogue</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="552" /> <location filename="../novelwriter/dialogs/preferences.py" line="550" />
<source>Highlight dialogue line with no closing quote.</source> <source>Highlight dialogue line with no closing quote.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="561" /> <location filename="../novelwriter/dialogs/preferences.py" line="559" />
<source>Dialogue narrator break symbol</source> <source>Dialogue narrator break symbol</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="562" /> <location filename="../novelwriter/dialogs/preferences.py" line="560" />
<source>Symbol to indicate injected narrator break.</source> <source>Symbol to indicate injected narrator break.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="571" /> <location filename="../novelwriter/dialogs/preferences.py" line="569" />
<source>Dialogue line symbol</source> <source>Dialogue line symbol</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="572" /> <location filename="../novelwriter/dialogs/preferences.py" line="570" />
<source>Lines starting with this symbol are dialogue.</source> <source>Lines starting with this symbol are dialogue.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="588" /> <location filename="../novelwriter/dialogs/preferences.py" line="586" />
<source>Alternative dialogue symbols</source> <source>Alternative dialogue symbols</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="589" /> <location filename="../novelwriter/dialogs/preferences.py" line="587" />
<source>Custom highlighting of dialogue text.</source> <source>Custom highlighting of dialogue text.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="595" /> <location filename="../novelwriter/dialogs/preferences.py" line="593" />
<source>Add highlight colour to emphasised text</source> <source>Add highlight colour to emphasised text</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="603" /> <location filename="../novelwriter/dialogs/preferences.py" line="601" />
<location filename="../novelwriter/dialogs/preferences.py" line="596" /> <location filename="../novelwriter/dialogs/preferences.py" line="594" />
<source>Applies to the document editor only.</source> <source>Applies to the document editor only.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="602" /> <location filename="../novelwriter/dialogs/preferences.py" line="600" />
<source>Highlight multiple or trailing spaces</source> <source>Highlight multiple or trailing spaces</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="609" /> <location filename="../novelwriter/dialogs/preferences.py" line="607" />
<source>Text Automation</source> <source>Text Automation</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="621" /> <location filename="../novelwriter/dialogs/preferences.py" line="619" />
<source>Auto-replace text as you type</source> <source>Auto-replace text as you type</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="622" /> <location filename="../novelwriter/dialogs/preferences.py" line="620" />
<source>Allow the editor to replace symbols as you type.</source> <source>Allow the editor to replace symbols as you type.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="630" /> <location filename="../novelwriter/dialogs/preferences.py" line="628" />
<source>Auto-replace single quotes</source> <source>Auto-replace single quotes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="640" /> <location filename="../novelwriter/dialogs/preferences.py" line="638" />
<location filename="../novelwriter/dialogs/preferences.py" line="631" /> <location filename="../novelwriter/dialogs/preferences.py" line="629" />
<source>Try to guess which is an opening or a closing quote.</source> <source>Try to guess which is an opening or a closing quote.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="639" /> <location filename="../novelwriter/dialogs/preferences.py" line="637" />
<source>Auto-replace double quotes</source> <source>Auto-replace double quotes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="648" /> <location filename="../novelwriter/dialogs/preferences.py" line="646" />
<source>Auto-replace dashes</source> <source>Auto-replace dashes</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="649" /> <location filename="../novelwriter/dialogs/preferences.py" line="647" />
<source>Double and triple hyphens become short and long dashes.</source> <source>Double and triple hyphens become short and long dashes.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="657" /> <location filename="../novelwriter/dialogs/preferences.py" line="655" />
<source>Auto-replace dots</source> <source>Auto-replace dots</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="658" /> <location filename="../novelwriter/dialogs/preferences.py" line="656" />
<source>Three consecutive dots become ellipsis.</source> <source>Three consecutive dots become ellipsis.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="667" /> <location filename="../novelwriter/dialogs/preferences.py" line="665" />
<source>Insert non-breaking space before</source> <source>Insert non-breaking space before</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="668" /> <location filename="../novelwriter/dialogs/preferences.py" line="666" />
<source>Automatically add space before any of these symbols.</source> <source>Automatically add space before any of these symbols.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="677" /> <location filename="../novelwriter/dialogs/preferences.py" line="675" />
<source>Insert non-breaking space after</source> <source>Insert non-breaking space after</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="678" /> <location filename="../novelwriter/dialogs/preferences.py" line="676" />
<source>Automatically add space after any of these symbols.</source> <source>Automatically add space after any of these symbols.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="686" /> <location filename="../novelwriter/dialogs/preferences.py" line="684" />
<source>Use thin space instead</source> <source>Use thin space instead</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="687" /> <location filename="../novelwriter/dialogs/preferences.py" line="685" />
<source>Inserts a thin space instead of a regular space.</source> <source>Inserts a thin space instead of a regular space.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="693" /> <location filename="../novelwriter/dialogs/preferences.py" line="691" />
<source>Quotation Style</source> <source>Quotation Style</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="708" /> <location filename="../novelwriter/dialogs/preferences.py" line="706" />
<source>Single quote open style</source> <source>Single quote open style</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="709" /> <location filename="../novelwriter/dialogs/preferences.py" line="707" />
<source>The symbol to use for a leading single quote.</source> <source>The symbol to use for a leading single quote.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="722" /> <location filename="../novelwriter/dialogs/preferences.py" line="720" />
<source>Single quote close style</source> <source>Single quote close style</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="723" /> <location filename="../novelwriter/dialogs/preferences.py" line="721" />
<source>The symbol to use for a trailing single quote.</source> <source>The symbol to use for a trailing single quote.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="737" /> <location filename="../novelwriter/dialogs/preferences.py" line="735" />
<source>Double quote open style</source> <source>Double quote open style</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="738" /> <location filename="../novelwriter/dialogs/preferences.py" line="736" />
<source>The symbol to use for a leading double quote.</source> <source>The symbol to use for a leading double quote.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="751" /> <location filename="../novelwriter/dialogs/preferences.py" line="749" />
<source>Double quote close style</source> <source>Double quote close style</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="752" /> <location filename="../novelwriter/dialogs/preferences.py" line="750" />
<source>The symbol to use for a trailing double quote.</source> <source>The symbol to use for a trailing double quote.</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
<message> <message>
<location filename="../novelwriter/dialogs/preferences.py" line="836" /> <location filename="../novelwriter/dialogs/preferences.py" line="821" />
<source>Backup Directory</source> <source>Backup Directory</source>
<translation type="unfinished" /> <translation type="unfinished" />
</message> </message>
+220 -220
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+4988
View File
File diff suppressed because it is too large Load Diff
+213 -213
View File
File diff suppressed because it is too large Load Diff
+210 -210
View File
File diff suppressed because it is too large Load Diff
+116
View File
@@ -0,0 +1,116 @@
{
"Synopsis": "Streszczenie",
"Short Description": "Krótki opis",
"Comment": "Komentarz",
"Notes": "Notatki",
"Tag": "Znacznik",
"Point of View": "Punkt widzenia",
"Focus": "Skupienie",
"Characters": "Postacie",
"Plot": "Fabuła",
"Timeline": "Oś czasu",
"Locations": "Miejsca",
"Objects": "Obiekty",
"Entities": "Podmioty",
"Custom": "Różne",
"0": "zero",
"1": "pierwszy",
"2": "drugi",
"3": "trzeci",
"4": "czwarty",
"5": "piąty",
"6": "szósty",
"7": "siódmy",
"8": "ósmy",
"9": "dziewiąty",
"10": "dziesiąty",
"11": "jedenasty",
"12": "dwunasty",
"13": "trzynasty",
"14": "czternasty",
"15": "piętnasty",
"16": "szesnasty",
"17": "siedemnasty",
"18": "osiemnasty",
"19": "dziewiętnasty",
"20": "dwudziesty",
"21": "dwudziesty pierwszy",
"22": "dwudziesty drugi",
"23": "dwudziesty Trzeci",
"24": "dwudziesty czwarty",
"25": "dwudziesty piąty",
"26": "dwudziesty szósty",
"27": "dwudziesty siódmy",
"28": "dwudziesty ósmy",
"29": "dwudziesty dziewiąty",
"30": "trzydziesty",
"31": "trzydziesty pierwszy",
"32": "trzydziesty drugi",
"33": "trzydziesty trzeci",
"34": "trzydziesty czwarty",
"35": "trzydziesty piąty",
"36": "trzydziesty szósty",
"37": "trzydziesty siódmy",
"38": "trzydziesty ósmy",
"39": "trzydziesty dziewiaty",
"40": "czterdziesty",
"41": "czterdziesty pierwszy",
"42": "czterdziesty drugi",
"43": "czterdziesty Trzeci",
"44": "czterdziesty czwarty",
"45": "czterdziesty piąty",
"46": "czterdziesty szósty",
"47": "czterdziesty siódmy",
"48": "czterdziesty ósmy",
"49": "czterdziesty dziewiąty",
"50": "pięćdziesiąty",
"51": "pięćdziesiąty pierwszy",
"52": "pięćdziesiąty drugi",
"53": "pięćdziesiąty trzeci",
"54": "pięćdziesiąty czwarty",
"55": "pięćdziesiąty piąty",
"56": "pięćdziesiąty szósty",
"57": "pięćdziesiąty siódmy",
"58": "pięćdziesiąty ósmy",
"59": "pięćdziesiąty dziewiąty",
"60": "sześćdziesiąty",
"61": "sześćdziesiąty pierwszy",
"62": "sześćdziesiąty drugi",
"63": "sześćdziesiąty trzeci",
"64": "sześćdziesiąty czwarty",
"65": "sześćdziesiąty piąty",
"66": "sześćdziesiąty szósty",
"67": "sześćdziesiąty siódmy",
"68": "sześćdziesiąty ósmy",
"69": "sześćdziesiąty dziewiąty",
"70": "siedemdziesiąty",
"71": "siedemdziesiąty pierwszy",
"72": "siedemdziesiąty drugi",
"73": "siedemdziesiąty trzeci",
"74": "siedemdziesiąty czwarty",
"75": "siedemdziesiąty piąty",
"76": "siedemdziesiąty szósty",
"77": "siedemdziesiąty siódmy",
"78": "siedemdziesiąty ósmy",
"79": "siedemdziesiąty dziewiąty",
"80": "osiemdziesiąty",
"81": "osiemdziesiąty pierwszy",
"82": "osiemdziesiąty drugi",
"83": "osiemdziesiąty trzeci",
"84": "osiemdziesiąty czwarty",
"85": "osiemdziesiąty piąty",
"86": "osiemdziesiąty szósty",
"87": "osiemdziesiąty siódmy",
"88": "osiemdziesiąty ósmy",
"89": "osiemdziesiąty dziewiąty",
"90": "dziewięćdziesiąty",
"91": "dziewięćdziesiąty pierwszy",
"92": "dziewięćdziesiąty drugi",
"93": "dziewięćdziesiąty trzeci",
"94": "dziewięćdziesiąty czwarty",
"95": "dziewięćdziesiąty piąty",
"96": "dziewięćdziesiąty szósty",
"97": "dziewięćdziesiąty siódmy",
"98": "dziewięćdziesiąty ósmy",
"99": "dziewięćdziesiąty dziewiąty"
}
+52 -44
View File
@@ -1,84 +1,92 @@
<!DOCTYPE html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html> <html>
<body> <body>
<h3>Main Developer</h3> <h3>Main Developer</h3>
<p>Veronica Berglyd Olsen (<a href="https://github.com/vkbo">@vkbo</a>)</p>
<p>Veronica Berglyd Olsen</p>
<h3>Contributors</h3> <h3>Contributors</h3>
<p> <ul>
&nbsp;&bull;&nbsp;<b>Concept:</b> Marian Lückhof (<a href="https://github.com/Number042">@Number042</a>)<br> <li><b>Early Concept:</b> Marian Lückhof</li>
&nbsp;&bull;&nbsp;<b>Internationalisation:</b> Bruno Meneguello (<a href="https://github.com/bkmeneguello">@bkmeneguello</a>)<br> <li><b>Internationalisation:</b> Bruno Meneguello</li>
&nbsp;&bull;&nbsp;<b>Setup and Packaging:</b> Rachel Powers (<a href="https://github.com/Ryex">@Ryex</a>) <li><b>Setup and Packaging:</b> Rachel Powers</li>
</p> </ul>
<p>For other contributions, see the project's <p>For other contributions, see the project's
<a href="https://github.com/vkbo/novelWriter/graphs/contributors">Contributors</a> page.</p> <a href="https://github.com/vkbo/novelWriter/graphs/contributors">Contributors</a> page.</p>
<h3>Artwork</h3> <h3>Artwork</h3>
<p>The artwork on the Welcome dialog was created by <a href="https://louisdurrant.art">Louis Durrant</a>.</p> <p>The artwork on the Welcome dialog was created by Louis Durrant.</p>
<h3>Translations</h3> <h3>Translations</h3>
<p>The default language is English (UK) with English (US) as an option. These are the original <p>The default language is English (UK) with English (US) as an option. These are the original
translators for the languages currently available:</p> translators for the languages currently available:</p>
<p>
&nbsp;&bull;&nbsp;<b>Dutch:</b> Martijn van der Kleijn (<a href="https://github.com/mvdkleijn">@mvdkleijn</a>)<br> <ul>
&nbsp;&bull;&nbsp;<b>French:</b> Jan Lüdke (<a href="https://github.com/jyhelle">@jyhelle</a>)<br> <li><b>Dutch:</b> Martijn van der Kleijn (mvdkleijn)</li>
&nbsp;&bull;&nbsp;<b>German:</b> Myian (<a href="https://github.com/heymyian">@heymyian</a>)<br> <li><b>French:</b> Jan Lüdke (jyhelle)</li>
&nbsp;&bull;&nbsp;<b>Italian:</b> Riccardo Mangili<br> <li><b>German:</b> Myian (HeyMyian)</li>
&nbsp;&bull;&nbsp;<b>Japanese:</b> hebekeg (<a href="https://github.com/hebekeg">@hebekeg</a>)<br> <li><b>Italian:</b> Riccardo Mangili</li>
&nbsp;&bull;&nbsp;<b>Latin American Spanish:</b> Tommy Marplatt (<a href="https://github.com/tmarplatt">@tmarplatt</a>)<br> <li><b>Japanese:</b> hebekeg</li>
&nbsp;&bull;&nbsp;<b>Norwegian:</b> Veronica Berglyd Olsen (<a href="https://github.com/vkbo">@vkbo</a>)<br> <li><b>Latin American Spanish:</b> Tommy Marplatt (tmarplatt)</li>
&nbsp;&bull;&nbsp;<b>Portuguese:</b> Bruno Meneguello (<a href="https://github.com/bkmeneguello">@bkmeneguello</a>)<br> <li><b>Norwegian:</b> Veronica Berglyd Olsen (vkbo)</li>
&nbsp;&bull;&nbsp;<b>Simplified Chinese:</b> Qianzhi Long (<a href="https://github.com/longqzh">@longqzh</a>) <li><b>Polish:</b> Anna Maria Polak (Nauthiz)</li>
</p> <li><b>Portuguese:</b> Bruno Meneguello (bkmeneguello)</li>
<li><b>Simplified Chinese:</b> Qianzhi Long (longqzh)</li>
</ul>
<p>Additional larger translation contributions:</p> <p>Additional larger translation contributions:</p>
<p>
&nbsp;&bull;&nbsp;<b>French:</b> Albert Aribaud (<a href="https://github.com/aaribaud">@aaribaud</a>) <ul>
</p> <li><b>French:</b> Albert Aribaud (aaribaud)</li>
<li><b>Portuguese:</b> Oli Maia (olimaia)</li>
</ul>
<p>Translations are managed on <a href="https://crowdin.com/project/novelwriter">Crowdin</a>, and <p>Translations are managed on <a href="https://crowdin.com/project/novelwriter">Crowdin</a>, and
more contributions are listed on the project's <a href="https://crowdin.com/project/novelwriter/members">Members</a> page.</p> more contributions are listed on the project's Members page.</p>
<h3>Libraries</h3> <h3>Libraries</h3>
<p>The following libraries are dependencies of novelWriter:</p> <p>The following libraries are dependencies of novelWriter:</p>
<p>
&nbsp;&bull;&nbsp;<a href="https://www.qt.io">Qt5</a> by Qt Company<br> <ul>
&nbsp;&bull;&nbsp;<a href="https://www.riverbankcomputing.com/software/pyqt">PyQt5</a> by Riverbank Computing<br> <li><b>Qt5</b> by Qt Company</li>
&nbsp;&bull;&nbsp;<a href="https://abiword.github.io/enchant">Enchant</a> by Dom Lachowicz<br> <li><b>PyQt5</b> by Riverbank Computing</li>
&nbsp;&bull;&nbsp;<a href="https://pyenchant.github.io/pyenchant">PyEnchant</a> by Dimitri Merejkowsky <li><b>Enchant</b> by Dom Lachowicz</li>
</p> <li><b>PyEnchant</b> by Dimitri Merejkowsky</li>
</ul>
<h3>Assets</h3> <h3>Assets</h3>
<p>Some of the assets bundled with novelWriter were adapted from the following sources:</p> <p>Some of the assets bundled with novelWriter were adapted from the following sources:</p>
<p>
&nbsp;&bull;&nbsp;<a href="https://github.com/stephenhutchings/typicons.font">Typicons</a> icons by Stephen Hutchings (CC BY-SA 4.0)<br> <ul>
&nbsp;&bull;&nbsp;<a href="https://github.com/chriskempson/base16">Tomorrow</a> syntax themes by Chris Kempson (MIT License)<br> <li><b>Typicons</b> icons by Stephen Hutchings (CC BY-SA 4.0)</li>
&nbsp;&bull;&nbsp;<a href="https://github.com/sdras/night-owl-vscode-theme">Owl</a> syntax themes by Sarah Drasner (MIT License)<br> <li><b>Tomorrow</b> syntax themes by Chris Kempson (MIT License)</li>
&nbsp;&bull;&nbsp;<a href="https://github.com/altercation/solarized">Solarized</a> themes by Ethan Schoonover (MIT License)<br> <li><b>Owl</b> syntax themes by Sarah Drasner (MIT License)</li>
&nbsp;&bull;&nbsp;<a href="https://github.com/alemvigh">Cyberpunk Night</a> theme by Anders Lemvigh (CC BY-SA 4.0)<br> <li><b>Solarized</b> themes by Ethan Schoonover (MIT License)</li>
&nbsp;&bull;&nbsp;<a href="https://draculatheme.com">Dracula</a> theme by Zeno Rocha (MIT License)<br> <li><b>Cyberpunk Night</b> theme by Anders Lemvigh (CC BY-SA 4.0)</li>
&nbsp;&bull;&nbsp;<a href="https://github.com/loilo/vscode-snazzy-light">Snazzy Light</a> theme by Florian Reuschel (MIT License) <li><b>Dracula</b> theme by Zeno Rocha (MIT License)</li>
</p> <li><b>Snazzy Light</b> theme by Florian Reuschel (MIT License)</li>
</ul>
<h3>Fonts</h3> <h3>Fonts</h3>
<p>The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are <p>The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are
used on buttons and icons.</p> used on buttons and icons.</p>
<p>
&nbsp;&bull;&nbsp;Pridi by Cadson Demak (Open Font License, Version 1.1)<br> <ul>
&nbsp;&bull;&nbsp;Source Sans Pro by Paul D. Hunt (SIL Open Font License) <li><b>Pridi</b> by Cadson Demak (Open Font License, Version 1.1)</li>
</p> <li><b>Source Sans Pro</b> by Paul D. Hunt (SIL Open Font License)</li>
</ul>
<h3>Special Mentions</h3> <h3>Special Mentions</h3>
<p>Additional thanks to <a href="https://github.com/johnblommers">@johnblommers</a> who was an early user and who has provided a lot <p>Additional thanks to John Blommers who was an early user and who has provided a lot of very
of very useful feedback over the years.</p> useful feedback over the years.</p>
</body> </body>
</html> </html>
+14 -4
View File
@@ -254,13 +254,23 @@ class NWProject:
status = self._storage.initProjectStorage(projPath, clearLock) status = self._storage.initProjectStorage(projPath, clearLock)
if status != NWStorageOpen.READY: if status != NWStorageOpen.READY:
if status == NWStorageOpen.UNKOWN: if status == NWStorageOpen.UNKOWN:
SHARED.error(self.tr("Not a known project file format.")) SHARED.error(
self.tr("Not a known project file format."),
info=self.tr("Path: {0}").format(str(projPath))
)
elif status == NWStorageOpen.NOT_FOUND: elif status == NWStorageOpen.NOT_FOUND:
SHARED.error(self.tr("Project file not found.")) SHARED.error(
self.tr("Project file not found."),
info=self.tr("Path: {0}").format(str(projPath))
)
elif status == NWStorageOpen.FAILED:
SHARED.error(
self.tr("Failed to open project."),
info=self.tr("Path: {0}").format(str(projPath)),
exc=self._storage.exc
)
elif status == NWStorageOpen.LOCKED: elif status == NWStorageOpen.LOCKED:
self._state = NWProjectState.LOCKED self._state = NWProjectState.LOCKED
elif status == NWStorageOpen.FAILED:
SHARED.error(self.tr("Failed to open project."), exc=self._storage.exc)
return False return False
# Read Project XML # Read Project XML
+9 -22
View File
@@ -29,8 +29,8 @@ import logging
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QCloseEvent, QKeyEvent, QKeySequence from PyQt5.QtGui import QCloseEvent, QKeyEvent, QKeySequence
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAbstractButton, QCompleter, QDialogButtonBox, QFileDialog, QHBoxLayout, QCompleter, QDialogButtonBox, QFileDialog, QHBoxLayout, QLineEdit,
QLineEdit, QPushButton, QVBoxLayout, QWidget QPushButton, QVBoxLayout, QWidget
) )
from novelwriter import CONFIG, SHARED from novelwriter import CONFIG, SHARED
@@ -43,10 +43,7 @@ from novelwriter.extensions.modified import (
) )
from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.pagedsidebar import NPagedSideBar
from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.switch import NSwitch
from novelwriter.types import ( from novelwriter.types import QtAlignCenter, QtDialogCancel, QtDialogSave
QtAlignCenter, QtDialogApply, QtDialogClose, QtDialogSave, QtRoleAccept,
QtRoleApply, QtRoleReject
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -89,8 +86,9 @@ class GuiPreferences(NDialog):
self.mainForm.setHelpTextStyle(SHARED.theme.helpText) self.mainForm.setHelpTextStyle(SHARED.theme.helpText)
# Buttons # Buttons
self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose, self) self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel, self)
self.buttonBox.clicked.connect(self._dialogButtonClicked) self.buttonBox.accepted.connect(self._doSave)
self.buttonBox.rejected.connect(self.reject)
# Assemble # Assemble
self.searchBox = QHBoxLayout() self.searchBox = QHBoxLayout()
@@ -784,19 +782,6 @@ class GuiPreferences(NDialog):
# Private Slots # Private Slots
## ##
@pyqtSlot("QAbstractButton*")
def _dialogButtonClicked(self, button: QAbstractButton) -> None:
"""Handle button clicks from the dialog button box."""
role = self.buttonBox.buttonRole(button)
if role == QtRoleApply:
self._saveValues()
elif role == QtRoleAccept:
self._saveValues()
self.close()
elif role == QtRoleReject:
self.close()
return
@pyqtSlot(int) @pyqtSlot(int)
def _sidebarClicked(self, section: int) -> None: def _sidebarClicked(self, section: int) -> None:
"""Process a user request to switch page.""" """Process a user request to switch page."""
@@ -897,7 +882,7 @@ class GuiPreferences(NDialog):
CONFIG.setPreferencesWinSize(self.width(), self.height()) CONFIG.setPreferencesWinSize(self.width(), self.height())
return return
def _saveValues(self) -> None: def _doSave(self) -> None:
"""Save the values set in the form.""" """Save the values set in the form."""
updateTheme = False updateTheme = False
needsRestart = False needsRestart = False
@@ -1012,4 +997,6 @@ class GuiPreferences(NDialog):
CONFIG.saveConfig() CONFIG.saveConfig()
self.newPreferencesReady.emit(needsRestart, refreshTree, updateTheme, updateSyntax) self.newPreferencesReady.emit(needsRestart, refreshTree, updateTheme, updateSyntax)
self.close()
return return
+18 -3
View File
@@ -281,13 +281,28 @@ class NColourLabel(QLabel):
return return
def setTextColors(self, *, color: QColor | None = None, faded: QColor | None = None) -> None:
"""Set or update the text colours."""
self._color = color or self._color
self._faded = faded or self._faded
self._refeshTextColor()
return
def setColorState(self, state: bool) -> None: def setColorState(self, state: bool) -> None:
"""Change the colour state.""" """Change the colour state."""
if self._state is not state: if self._state is not state:
self._state = state self._state = state
colour = self.palette() self._refeshTextColor()
colour.setColor(QPalette.ColorRole.WindowText, self._color if state else self._faded) return
self.setPalette(colour)
def _refeshTextColor(self) -> None:
"""Refresh the colour of the text on the label."""
palette = self.palette()
palette.setColor(
QPalette.ColorRole.WindowText,
self._color if self._state else self._faded,
)
self.setPalette(palette)
return return
+3 -3
View File
@@ -2919,10 +2919,10 @@ class GuiDocEditHeader(QWidget):
palette.setColor(QPalette.ColorRole.Window, SHARED.theme.colBack) palette.setColor(QPalette.ColorRole.Window, SHARED.theme.colBack)
palette.setColor(QPalette.ColorRole.WindowText, SHARED.theme.colText) palette.setColor(QPalette.ColorRole.WindowText, SHARED.theme.colText)
palette.setColor(QPalette.ColorRole.Text, SHARED.theme.colText) palette.setColor(QPalette.ColorRole.Text, SHARED.theme.colText)
self.setPalette(palette) self.setPalette(palette)
self.itemTitle.setPalette(palette) self.itemTitle.setTextColors(
color=palette.windowText().color(), faded=SHARED.theme.fadedText
)
return return
def changeFocusState(self, state: bool) -> None: def changeFocusState(self, state: bool) -> None:
+3 -1
View File
@@ -741,7 +741,9 @@ class GuiDocViewHeader(QWidget):
palette.setColor(QPalette.ColorRole.WindowText, SHARED.theme.colText) palette.setColor(QPalette.ColorRole.WindowText, SHARED.theme.colText)
palette.setColor(QPalette.ColorRole.Text, SHARED.theme.colText) palette.setColor(QPalette.ColorRole.Text, SHARED.theme.colText)
self.setPalette(palette) self.setPalette(palette)
self.itemTitle.setPalette(palette) self.itemTitle.setTextColors(
color=palette.windowText().color(), faded=SHARED.theme.fadedText
)
return return
def changeFocusState(self, state: bool) -> None: def changeFocusState(self, state: bool) -> None:
+1
View File
@@ -268,6 +268,7 @@ class GuiOutlineToolBar(QToolBar):
self.aExport.setIcon(SHARED.theme.getIcon("export")) self.aExport.setIcon(SHARED.theme.getIcon("export"))
self.tbColumns.setIcon(SHARED.theme.getIcon("menu")) self.tbColumns.setIcon(SHARED.theme.getIcon("menu"))
self.tbColumns.setStyleSheet("QToolButton::menu-indicator {image: none;}") self.tbColumns.setStyleSheet("QToolButton::menu-indicator {image: none;}")
self.novelLabel.setTextColors(color=self.palette().windowText().color())
return return
def populateNovelList(self) -> None: def populateNovelList(self) -> None:
+30 -14
View File
@@ -1006,32 +1006,48 @@ class GuiMain(QMainWindow):
def _switchFocus(self, paneNo: nwFocus) -> None: def _switchFocus(self, paneNo: nwFocus) -> None:
"""Switch focus between main GUI views.""" """Switch focus between main GUI views."""
if paneNo == nwFocus.TREE: if paneNo == nwFocus.TREE:
if self.projStack.currentWidget() is self.projView: # Decision Matrix
if self.projView.treeHasFocus(): # vM | vP | fP | vN | fN | Focus
self._changeView(nwView.NOVEL) # ----|----|----|----|----|---------
self.novelView.setTreeFocus() # T | T | T | F | F | Novel
else: # T | T | F | F | F | Project
self.projView.setTreeFocus() # T | F | F | T | T | Project
elif self.projStack.currentWidget() is self.novelView: # T | F | F | T | F | Novel
if self.novelView.treeHasFocus(): # T | F | F | F | F | Project
self._changeView(nwView.PROJECT) # F | T | T | F | F | Project
self.projView.setTreeFocus() # F | T | F | F | F | Project
else: # F | F | F | T | T | Novel
self.novelView.setTreeFocus() # F | F | F | T | F | Novel
# F | F | F | F | F | Project
vM = self.mainStack.currentWidget() is self.splitMain
vP = self.projStack.currentWidget() is self.projView
vN = self.projStack.currentWidget() is self.novelView
fP = self.projView.treeHasFocus()
fN = self.novelView.treeHasFocus()
self._changeView(nwView.EDITOR)
if (vM and (vP and fP or vN and not fN)) or (not vM and vN):
self._changeView(nwView.NOVEL)
self.novelView.setTreeFocus()
else: else:
self._changeView(nwView.PROJECT) self._changeView(nwView.PROJECT)
self.projView.setTreeFocus() self.projView.setTreeFocus()
elif paneNo == nwFocus.DOCUMENT: elif paneNo == nwFocus.DOCUMENT:
self._changeView(nwView.EDITOR) self._changeView(nwView.EDITOR)
if self.docEditor.anyFocus(): hasViewer = self.splitView.isVisible()
if hasViewer and self.docEditor.anyFocus():
self.docViewer.setFocus() self.docViewer.setFocus()
elif self.docViewer.anyFocus(): elif hasViewer and self.docViewer.anyFocus():
self.docEditor.setFocus() self.docEditor.setFocus()
else: else:
self.docEditor.setFocus() self.docEditor.setFocus()
elif paneNo == nwFocus.OUTLINE: elif paneNo == nwFocus.OUTLINE:
self._changeView(nwView.OUTLINE) self._changeView(nwView.OUTLINE)
self.outlineView.setTreeFocus() self.outlineView.setTreeFocus()
return return
@pyqtSlot(bool, bool, bool, bool) @pyqtSlot(bool, bool, bool, bool)
+7 -11
View File
@@ -30,7 +30,7 @@ from novelwriter import CONFIG, SHARED
from novelwriter.constants import nwUnicode from novelwriter.constants import nwUnicode
from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.preferences import GuiPreferences
from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.dialogs.quotes import GuiQuoteSelect
from novelwriter.types import QtDialogApply, QtDialogClose, QtDialogSave, QtModNone from novelwriter.types import QtDialogCancel, QtDialogSave, QtModNone
KEY_DELAY = 1 KEY_DELAY = 1
@@ -92,7 +92,8 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI):
"""Test the preferences dialog actions.""" """Test the preferences dialog actions."""
monkeypatch.setattr(SHARED._spelling, "listDictionaries", lambda: [("en", "English [en]")]) monkeypatch.setattr(SHARED._spelling, "listDictionaries", lambda: [("en", "English [en]")])
prefs = GuiPreferences(nwGUI) prefs = GuiPreferences(nwGUI)
prefs.show() with qtbot.waitExposed(prefs):
prefs.show()
# Check Navigation # Check Navigation
vBar = prefs.mainForm.verticalScrollBar() vBar = prefs.mainForm.verticalScrollBar()
@@ -116,12 +117,6 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI):
prefs._gotoSearch() prefs._gotoSearch()
assert value.args[0] < old assert value.args[0] < old
# Check Apply Button
prefs.show()
with qtbot.waitSignal(prefs.newPreferencesReady) as signal:
prefs.buttonBox.button(QtDialogApply).click()
assert signal.args == [False, False, False, False]
# Check Save Button # Check Save Button
prefs.show() prefs.show()
with qtbot.waitSignal(prefs.newPreferencesReady) as signal: with qtbot.waitSignal(prefs.newPreferencesReady) as signal:
@@ -130,7 +125,7 @@ def testDlgPreferences_Actions(qtbot, monkeypatch, nwGUI):
# Check Close Button # Check Close Button
prefs.show() prefs.show()
prefs.buttonBox.button(QtDialogClose).click() prefs.buttonBox.button(QtDialogCancel).click()
assert prefs.isHidden() is True assert prefs.isHidden() is True
# Close Using Escape Key # Close Using Escape Key
@@ -152,7 +147,8 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, tstPaths):
monkeypatch.setattr(CONFIG, "listLanguages", lambda *a: languages) monkeypatch.setattr(CONFIG, "listLanguages", lambda *a: languages)
prefs = GuiPreferences(nwGUI) prefs = GuiPreferences(nwGUI)
prefs.show() with qtbot.waitExposed(prefs):
prefs.show()
# Appearance # Appearance
prefs.guiLocale.setCurrentIndex(prefs.guiLocale.findData("en_US")) prefs.guiLocale.setCurrentIndex(prefs.guiLocale.findData("en_US"))
@@ -315,7 +311,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, tstPaths):
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(QFontDatabase, "families", lambda *a: ["TestFont"]) mp.setattr(QFontDatabase, "families", lambda *a: ["TestFont"])
with qtbot.waitSignal(prefs.newPreferencesReady) as signal: with qtbot.waitSignal(prefs.newPreferencesReady) as signal:
prefs.buttonBox.button(QtDialogApply).click() prefs.buttonBox.button(QtDialogSave).click()
assert signal.args == [True, True, True, True] assert signal.args == [True, True, True, True]
# Check Settings # Check Settings