From 41bbd7b2591927b43e0bdbb240de03132977dcc3 Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Mon, 23 Nov 2020 12:48:08 +0100
Subject: [PATCH 01/52] Added releases URL
---
nw/__init__.py | 1 +
nw/gui/mainmenu.py | 12 +++++++++---
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/nw/__init__.py b/nw/__init__.py
index 670351b9..a5960f30 100644
--- a/nw/__init__.py
+++ b/nw/__init__.py
@@ -70,6 +70,7 @@ __status__ = "Beta"
__url__ = "https://novelwriter.io"
__sourceurl__ = "https://github.com/vkbo/novelWriter"
__issuesurl__ = "https://github.com/vkbo/novelWriter/issues"
+__releaseurl__ = "https://github.com/vkbo/novelWriter/releases/latest"
__domain__ = "novelwriter.io"
__docurl__ = "https://novelwriter.readthedocs.io"
__credits__ = [
diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py
index c64debe6..d6a1e411 100644
--- a/nw/gui/mainmenu.py
+++ b/nw/gui/mainmenu.py
@@ -918,16 +918,22 @@ class GuiMainMenu(QMenuBar):
# Document > Go to Website
self.aWebsite = QAction("Open the novelWriter Website", self)
- self.aWebsite.setStatusTip("View the main website")
+ self.aWebsite.setStatusTip("Open the main website at %s" % nw.__url__)
self.aWebsite.triggered.connect(lambda: self._openWebsite(nw.__url__))
self.helpMenu.addAction(self.aWebsite)
# Document > Report Issue
- self.aIssue = QAction("Report an Issue", self)
- self.aIssue.setStatusTip("Report a bug or issue on GitHub")
+ self.aIssue = QAction("Report an Issue (GitHub)", self)
+ self.aIssue.setStatusTip("Report a bug or issue on GitHub at %s" % nw.__issuesurl__)
self.aIssue.triggered.connect(lambda: self._openWebsite(nw.__issuesurl__))
self.helpMenu.addAction(self.aIssue)
+ # Document > Latest Release
+ self.aIssue = QAction("Latest Release (GitHub)", self)
+ self.aIssue.setStatusTip("Open the Releases page on GitHub at %s" % nw.__releaseurl__)
+ self.aIssue.triggered.connect(lambda: self._openWebsite(nw.__releaseurl__))
+ self.helpMenu.addAction(self.aIssue)
+
return
# END Class GuiMainMenu
From 12c2d93968d8f8d2881e2bc50c26aa5a6836557e Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Mon, 23 Nov 2020 13:05:53 +0100
Subject: [PATCH 02/52] Added release notes from website
---
CHANGELOG.md | 2 +-
nw/assets/text/release_notes_en.htm | 34 +++++++++++++++++++++++++++++
nw/gui/about.py | 20 +++++++++++++++++
nw/gui/mainmenu.py | 4 ++--
4 files changed, 57 insertions(+), 3 deletions(-)
create mode 100644 nw/assets/text/release_notes_en.htm
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5d8b991a..6687543d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-# novelWriter ChangeLog
+# novelWriter Change Log
## Version 1.0 Release Candidate 1 [2020-11-16]
diff --git a/nw/assets/text/release_notes_en.htm b/nw/assets/text/release_notes_en.htm
new file mode 100644
index 00000000..ac186481
--- /dev/null
+++ b/nw/assets/text/release_notes_en.htm
@@ -0,0 +1,34 @@
+
+
+
+
Release 1.0 RC1
+
This is the first release candidate for the upcoming release of novelWriter 1.0.
+
Since the fifth beta release about four weeks ago, not much has been changed in novelWriter. A
+few minor tweaks have been made to the GUI. A number of features and tools are now automatically
+switched off when there is no project or document open for those features to act upon. No serious
+bugs have been reported or encountered, and I feel it’s time to move on to the release candidates.
+Most of the minor changes should not be noticeable to most users. However, there are a couple of
+noticeable changes.
+
Typewriter Mode
+
"Typewriter Mode" of the editor has been improved. Essentially, this feature is a sort of smart
+scroll. It tries to keep the cursor stationary in the vertical direction, and will try to scroll
+the document up when the cursor skips to a new line while typing (or down in case of backspace).
+This is similar to the way a typewriter scrolls the paper when hitting the return key. It improves
+the writing experience as the current active line will stay at the same eye height level on the
+screen.
+
Previously, the feature would lock the cursor to a given vertical position defined by the user.
+Now, instead, the cursor will remain stationary in the vertical direction at any position the user
+sets it to by mouse click or keyboard navigation. The user can define a minimum distance from the
+top where this feature is activated. It makes it more flexible. The feature can be controlled from
+the main Preferences.
+
Switching Syntax Theme
+
It is now possible to switch syntax highlighting theme without restarting novelWriter.
+Previously, changing the theme would only half-way update the document, header and footer
+background and text colour. The new settings would not be applied until the application was shut
+down and started again. This makes it a bit tedious to look through themes to find the one you
+want. This issue has now been resolved.
+
Switching main GUI theme still requires a restart.
+
+
diff --git a/nw/gui/about.py b/nw/gui/about.py
index 7f00cf11..d2c436cf 100644
--- a/nw/gui/about.py
+++ b/nw/gui/about.py
@@ -84,10 +84,15 @@ class GuiAbout(QDialog):
self.pageLicense.setOpenExternalLinks(True)
self.pageLicense.document().setDocumentMargin(self.mainConf.pxInt(16))
+ self.pageNotes = QTextBrowser()
+ self.pageNotes.setOpenExternalLinks(True)
+ self.pageNotes.document().setDocumentMargin(self.mainConf.pxInt(16))
+
# Main Tab Area
self.tabBox = QTabWidget()
self.tabBox.addTab(self.pageAbout, "About")
self.tabBox.addTab(self.pageLicense, "License")
+ self.tabBox.addTab(self.pageNotes, "Release Notes")
self.innerBox.addWidget(self.tabBox)
# OK Button
@@ -101,6 +106,7 @@ class GuiAbout(QDialog):
self._setStyleSheet()
self._fillAboutPage()
self._fillLicensePage()
+ self._fillNotesPage()
logger.debug("GuiAbout initialisation complete")
@@ -205,6 +211,19 @@ class GuiAbout(QDialog):
self.pageLicense.setHtml("Error loading license text ...")
return
+ def _fillNotesPage(self):
+ """Load the content for the Release Notes page.
+ """
+ docName = "release_notes_%s.htm" % self.mainConf.guiLang
+ docPath = os.path.join(self.mainConf.assetPath, "text", docName)
+ if os.path.isfile(docPath):
+ with open(docPath, mode="r", encoding="utf8") as inFile:
+ helpText = inFile.read()
+ self.pageNotes.setHtml(helpText)
+ else:
+ self.pageNotes.setHtml("Error release notes text ...")
+ return
+
def _setStyleSheet(self):
"""Set stylesheet for all browser tabs
"""
@@ -222,6 +241,7 @@ class GuiAbout(QDialog):
)
self.pageAbout.document().setDefaultStyleSheet(styleSheet)
self.pageLicense.document().setDefaultStyleSheet(styleSheet)
+ self.pageNotes.document().setDefaultStyleSheet(styleSheet)
return
diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py
index d6a1e411..9bf4cae1 100644
--- a/nw/gui/mainmenu.py
+++ b/nw/gui/mainmenu.py
@@ -598,8 +598,8 @@ class GuiMainMenu(QMenuBar):
# Insert > Separator
self.insertMenu.addSeparator()
- # Insert > Keywords and Tags
- self.mInsKeywords = self.insertMenu.addMenu("Keywords and Tags")
+ # Insert > Tags and References
+ self.mInsKeywords = self.insertMenu.addMenu("Tags and References")
self.mInsKWItems = {}
self.mInsKWItems[nwKeyWords.TAG_KEY] = (QAction(self.mInsKeywords), "Ctrl+K, G")
self.mInsKWItems[nwKeyWords.POV_KEY] = (QAction(self.mInsKeywords), "Ctrl+K, V")
From 00f6277eb7c0b3cde121a54bc898209d20517bbd Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Tue, 24 Nov 2020 18:36:08 +0100
Subject: [PATCH 03/52] Add config option and set up menu action
---
...release_notes_en.htm => release_notes.htm} | 14 ++--
nw/config.py | 5 ++
nw/gui/about.py | 65 +++++++++++--------
nw/guimain.py | 17 ++++-
4 files changed, 65 insertions(+), 36 deletions(-)
rename nw/assets/text/{release_notes_en.htm => release_notes.htm} (76%)
diff --git a/nw/assets/text/release_notes_en.htm b/nw/assets/text/release_notes.htm
similarity index 76%
rename from nw/assets/text/release_notes_en.htm
rename to nw/assets/text/release_notes.htm
index ac186481..fe2a9a62 100644
--- a/nw/assets/text/release_notes_en.htm
+++ b/nw/assets/text/release_notes.htm
@@ -1,7 +1,7 @@
-
Release 1.0 RC1
+
Release Notes for 1.0 RC1
This is the first release candidate for the upcoming release of novelWriter 1.0.
Since the fifth beta release about four weeks ago, not much has been changed in novelWriter. A
few minor tweaks have been made to the GUI. A number of features and tools are now automatically
@@ -10,12 +10,12 @@ bugs have been reported or encountered, and I feel it’s time to move on to the
Most of the minor changes should not be noticeable to most users. However, there are a couple of
noticeable changes.
Typewriter Mode
-
"Typewriter Mode" of the editor has been improved. Essentially, this feature is a sort of smart
-scroll. It tries to keep the cursor stationary in the vertical direction, and will try to scroll
-the document up when the cursor skips to a new line while typing (or down in case of backspace).
-This is similar to the way a typewriter scrolls the paper when hitting the return key. It improves
-the writing experience as the current active line will stay at the same eye height level on the
-screen.
+
The "Typewriter Mode" of the editor has been improved. Essentially, this feature is a sort of
+smart scroll. It tries to keep the cursor stationary in the vertical direction, and will try to
+scroll the document up when the cursor skips to a new line while typing (or down in case of
+backspace). This is similar to the way a typewriter scrolls the paper when hitting the return key.
+It improves the writing experience as the current active line will stay at the same eye height
+level on the screen.
Previously, the feature would lock the cursor to a given vertical position defined by the user.
Now, instead, the cursor will remain stationary in the vertical direction at any position the user
sets it to by mouse click or keyboard navigation. The user can define a minimum distance from the
diff --git a/nw/config.py b/nw/config.py
index 05345b45..04c1a4db 100644
--- a/nw/config.py
+++ b/nw/config.py
@@ -91,6 +91,7 @@ class Config:
self.guiFont = "" # Defaults to system default font
self.guiFontSize = 11
self.guiScale = 1.0 # Set automatically by Theme class
+ self.lastNotes = "" # The latest release notes that have been shown
## Sizes
self.winGeometry = [1200, 650]
@@ -380,6 +381,9 @@ class Config:
self.guiFontSize = self._parseLine(
cnfParse, cnfSec, "guifontsize", self.CNF_INT, self.guiFontSize
)
+ self.lastNotes = self._parseLine(
+ cnfParse, cnfSec, "lastnotes", self.CNF_STR, self.lastNotes
+ )
## Sizes
cnfSec = "Sizes"
@@ -584,6 +588,7 @@ class Config:
cnfParse.set(cnfSec, "guidark", str(self.guiDark))
cnfParse.set(cnfSec, "guifont", str(self.guiFont))
cnfParse.set(cnfSec, "guifontsize", str(self.guiFontSize))
+ cnfParse.set(cnfSec, "lastnotes", str(self.lastNotes))
## Sizes
cnfSec = "Sizes"
diff --git a/nw/gui/about.py b/nw/gui/about.py
index d2c436cf..99a4d296 100644
--- a/nw/gui/about.py
+++ b/nw/gui/about.py
@@ -32,8 +32,9 @@ import os
from datetime import datetime
from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import (
- QDialog, QHBoxLayout, QVBoxLayout, QDialogButtonBox, QTabWidget,
+ qApp, QDialog, QHBoxLayout, QVBoxLayout, QDialogButtonBox, QTabWidget,
QTextBrowser, QLabel
)
@@ -80,19 +81,19 @@ class GuiAbout(QDialog):
self.pageAbout.setOpenExternalLinks(True)
self.pageAbout.document().setDocumentMargin(self.mainConf.pxInt(16))
- self.pageLicense = QTextBrowser()
- self.pageLicense.setOpenExternalLinks(True)
- self.pageLicense.document().setDocumentMargin(self.mainConf.pxInt(16))
-
self.pageNotes = QTextBrowser()
self.pageNotes.setOpenExternalLinks(True)
self.pageNotes.document().setDocumentMargin(self.mainConf.pxInt(16))
+ self.pageLicense = QTextBrowser()
+ self.pageLicense.setOpenExternalLinks(True)
+ self.pageLicense.document().setDocumentMargin(self.mainConf.pxInt(16))
+
# Main Tab Area
self.tabBox = QTabWidget()
self.tabBox.addTab(self.pageAbout, "About")
+ self.tabBox.addTab(self.pageNotes, "Release")
self.tabBox.addTab(self.pageLicense, "License")
- self.tabBox.addTab(self.pageNotes, "Release Notes")
self.innerBox.addWidget(self.tabBox)
# OK Button
@@ -103,15 +104,27 @@ class GuiAbout(QDialog):
self.outerBox.addWidget(self.buttonBox)
self.setLayout(self.outerBox)
- self._setStyleSheet()
- self._fillAboutPage()
- self._fillLicensePage()
- self._fillNotesPage()
-
logger.debug("GuiAbout initialisation complete")
return
+ def populateGUI(self):
+ """Populate tabs with text.
+ """
+ qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
+ self._setStyleSheet()
+ self._fillAboutPage()
+ self._fillNotesPage()
+ self._fillLicensePage()
+ qApp.restoreOverrideCursor()
+ return
+
+ def showReleaseNotes(self):
+ """Show the release notes.
+ """
+ self.tabBox.setCurrentWidget(self.pageNotes)
+ return
+
##
# Internal Functions
##
@@ -198,11 +211,22 @@ class GuiAbout(QDialog):
return
+ def _fillNotesPage(self):
+ """Load the content for the Release Notes page.
+ """
+ docPath = os.path.join(self.mainConf.assetPath, "text", "release_notes.htm")
+ if os.path.isfile(docPath):
+ with open(docPath, mode="r", encoding="utf8") as inFile:
+ helpText = inFile.read()
+ self.pageNotes.setHtml(helpText)
+ else:
+ self.pageNotes.setHtml("Error loading release notes text ...")
+ return
+
def _fillLicensePage(self):
"""Load the content for the License page.
"""
- docName = "gplv3_%s.htm" % self.mainConf.guiLang
- docPath = os.path.join(self.mainConf.assetPath, "text", docName)
+ docPath = os.path.join(self.mainConf.assetPath, "text", "gplv3_en.htm")
if os.path.isfile(docPath):
with open(docPath, mode="r", encoding="utf8") as inFile:
helpText = inFile.read()
@@ -211,19 +235,6 @@ class GuiAbout(QDialog):
self.pageLicense.setHtml("Error loading license text ...")
return
- def _fillNotesPage(self):
- """Load the content for the Release Notes page.
- """
- docName = "release_notes_%s.htm" % self.mainConf.guiLang
- docPath = os.path.join(self.mainConf.assetPath, "text", docName)
- if os.path.isfile(docPath):
- with open(docPath, mode="r", encoding="utf8") as inFile:
- helpText = inFile.read()
- self.pageNotes.setHtml(helpText)
- else:
- self.pageNotes.setHtml("Error release notes text ...")
- return
-
def _setStyleSheet(self):
"""Set stylesheet for all browser tabs
"""
@@ -240,8 +251,8 @@ class GuiAbout(QDialog):
hColB = self.theParent.theTheme.colHead[2],
)
self.pageAbout.document().setDefaultStyleSheet(styleSheet)
- self.pageLicense.document().setDefaultStyleSheet(styleSheet)
self.pageNotes.document().setDefaultStyleSheet(styleSheet)
+ self.pageLicense.document().setDefaultStyleSheet(styleSheet)
return
diff --git a/nw/guimain.py b/nw/guimain.py
index b4ff651a..801de5af 100644
--- a/nw/guimain.py
+++ b/nw/guimain.py
@@ -238,6 +238,12 @@ class GuiMain(QMainWindow):
if self.mainConf.showGUI:
self.showProjectLoadDialog()
+ # Show the latest release notes, if they haven't been shown before
+ if self.mainConf.lastNotes != nw.__version__:
+ if self.mainConf.showGUI:
+ self.showAboutNWDialog(showNotes=True)
+ self.mainConf.lastNotes = nw.__version__
+
logger.debug("novelWriter is ready ...")
self.setStatus("novelWriter is ready ...")
@@ -915,11 +921,18 @@ class GuiMain(QMainWindow):
return
- def showAboutNWDialog(self):
+ def showAboutNWDialog(self, showNotes=False):
"""Show the about dialog for novelWriter.
"""
dlgAbout = GuiAbout(self)
- dlgAbout.exec_()
+ dlgAbout.setModal(True)
+ dlgAbout.show()
+ qApp.processEvents()
+ dlgAbout.populateGUI()
+
+ if showNotes:
+ dlgAbout.showReleaseNotes()
+
return
def showAboutQtDialog(self):
From 1510a5af748103ca200ac818d24e7a83a1f55421 Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Tue, 24 Nov 2020 18:36:30 +0100
Subject: [PATCH 04/52] Fix and update tests
---
tests/reference/novelwriter.conf | 1 +
tests/reference/novelwriter_prefs.conf | 1 +
tests/test_config.py | 10 +++++-----
tests/test_dialogs.py | 13 +++++++++++--
4 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/tests/reference/novelwriter.conf b/tests/reference/novelwriter.conf
index 99b01f75..5ff6f852 100644
--- a/tests/reference/novelwriter.conf
+++ b/tests/reference/novelwriter.conf
@@ -6,6 +6,7 @@ icons = typicons_colour_light
guidark = False
guifont =
guifontsize = 11
+lastnotes = 1.0
[Sizes]
geometry = 1200, 650
diff --git a/tests/reference/novelwriter_prefs.conf b/tests/reference/novelwriter_prefs.conf
index 831bbf08..901a6937 100644
--- a/tests/reference/novelwriter_prefs.conf
+++ b/tests/reference/novelwriter_prefs.conf
@@ -6,6 +6,7 @@ icons = typicons_colour_light
guidark = True
guifont = Cantarell
guifontsize = 12
+lastnotes = 1.0
[Sizes]
geometry = 1100, 650
diff --git a/tests/test_config.py b/tests/test_config.py
index f9ce767b..5d72cdfd 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -14,7 +14,7 @@ def testConfigCore(tmpConf, nwTemp, nwRef):
assert tmpConf.confPath == nwTemp
assert tmpConf.saveConfig()
- assert cmpFiles(testConf, refConf, [2])
+ assert cmpFiles(testConf, refConf, [2, 9])
assert not tmpConf.confChanged
assert tmpConf.loadConfig()
@@ -51,7 +51,7 @@ def testConfigSetWinSize(tmpConf, nwTemp, nwRef):
assert tmpConf.setWinSize(1200, 650)
assert tmpConf.saveConfig()
- assert cmpFiles(testConf, refConf, [2])
+ assert cmpFiles(testConf, refConf, [2, 9])
assert not tmpConf.confChanged
@pytest.mark.core
@@ -73,7 +73,7 @@ def testConfigSetTreeColWidths(tmpConf, nwTemp, nwRef):
assert tmpConf.confChanged
assert tmpConf.saveConfig()
- assert cmpFiles(testConf, refConf, [2])
+ assert cmpFiles(testConf, refConf, [2, 9])
assert not tmpConf.confChanged
@pytest.mark.core
@@ -109,7 +109,7 @@ def testConfigSetPanePos(tmpConf, nwTemp, nwRef):
assert tmpConf.confChanged
assert tmpConf.saveConfig()
- assert cmpFiles(testConf, refConf, [2])
+ assert cmpFiles(testConf, refConf, [2, 9])
assert not tmpConf.confChanged
@pytest.mark.core
@@ -133,7 +133,7 @@ def testConfigFlags(tmpConf, nwTemp, nwRef):
assert tmpConf.confChanged
assert tmpConf.saveConfig()
- assert cmpFiles(testConf, refConf, [2])
+ assert cmpFiles(testConf, refConf, [2, 9])
assert not tmpConf.confChanged
@pytest.mark.core
diff --git a/tests/test_dialogs.py b/tests/test_dialogs.py
index 81c1fc89..36921eb4 100644
--- a/tests/test_dialogs.py
+++ b/tests/test_dialogs.py
@@ -374,12 +374,20 @@ def testAboutBox(qtbot, monkeypatch, nwFuncTemp, nwTemp):
msgAbout.show()
assert msgAbout.pageAbout.document().characterCount() > 100
+ assert msgAbout.pageNotes.document().characterCount() > 100
assert msgAbout.pageLicense.document().characterCount() > 100
msgAbout.mainConf.guiLang = "whatever"
+
+ msgAbout._fillNotesPage()
+ assert msgAbout.pageNotes.toPlainText() == "Error loading release notes text ..."
+
msgAbout._fillLicensePage()
assert msgAbout.pageLicense.toPlainText() == "Error loading license text ..."
+ msgAbout.showReleaseNotes()
+ assert msgAbout.tabBox.currentWidget() == msgAbout.pageNotes
+
# Qt About
monkeypatch.setattr(QMessageBox, "aboutQt", lambda *args, **kwargs: None)
nwGUI.mainMenu.aAboutQt.activate(QAction.Trigger)
@@ -1201,8 +1209,9 @@ def testPreferences(qtbot, monkeypatch, yesToAll, nwMinimal, nwTemp, nwRef, tmpC
copyfile(projConf, testConf)
ignoreLines = [
2, # Timestamp
- 11, 12, 13, 14, 15, 16, 17, # Window sizes
- 7, 27, # Fonts (depends on system default)
+ 9, # Release Notes
+ 12, 13, 14, 15, 16, 17, 18, # Window sizes
+ 7, 28, # Fonts (depends on system default)
]
assert cmpFiles(testConf, refConf, ignoreLines)
From 434a0c60560b330b3b0d401c4d967e26ceead2ae Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Tue, 24 Nov 2020 18:48:32 +0100
Subject: [PATCH 05/52] Updated release notes
---
nw/assets/text/release_notes.htm | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/nw/assets/text/release_notes.htm b/nw/assets/text/release_notes.htm
index fe2a9a62..d9818aa9 100644
--- a/nw/assets/text/release_notes.htm
+++ b/nw/assets/text/release_notes.htm
@@ -4,29 +4,30 @@
Release Notes for 1.0 RC1
This is the first release candidate for the upcoming release of novelWriter 1.0.
Since the fifth beta release about four weeks ago, not much has been changed in novelWriter. A
-few minor tweaks have been made to the GUI. A number of features and tools are now automatically
-switched off when there is no project or document open for those features to act upon. No serious
-bugs have been reported or encountered, and I feel it’s time to move on to the release candidates.
-Most of the minor changes should not be noticeable to most users. However, there are a couple of
-noticeable changes.
+few minor tweaks have been made to the GUI.
+
A number of features and tools are now automatically switched off when there is no project or
+document open for those features to act upon. Previously, this was a bit inconsistent, although no
+serious bugs have been reported or encountered.
+
Most of the minor changes in this release should not be noticeable to most users. However, there
+are a couple of noticeable changes.
Typewriter Mode
The "Typewriter Mode" of the editor has been improved. Essentially, this feature is a sort of
smart scroll. It tries to keep the cursor stationary in the vertical direction, and will try to
scroll the document up when the cursor skips to a new line while typing (or down in case of
-backspace). This is similar to the way a typewriter scrolls the paper when hitting the return key.
+backspaces). This is similar to the way a typewriter scrolls the paper when hitting the return key.
It improves the writing experience as the current active line will stay at the same eye height
level on the screen.
Previously, the feature would lock the cursor to a given vertical position defined by the user.
Now, instead, the cursor will remain stationary in the vertical direction at any position the user
sets it to by mouse click or keyboard navigation. The user can define a minimum distance from the
-top where this feature is activated. It makes it more flexible. The feature can be controlled from
-the main Preferences.
+top where this feature is activated. These changes makes it more flexible in terms of where the
+focus is in the editor. The feature can be controlled from the main Preferences.
Switching Syntax Theme
It is now possible to switch syntax highlighting theme without restarting novelWriter.
Previously, changing the theme would only half-way update the document, header and footer
-background and text colour. The new settings would not be applied until the application was shut
-down and started again. This makes it a bit tedious to look through themes to find the one you
-want. This issue has now been resolved.
+background and text colours. The new settings would not be fully applied until the application was
+shut down and started again, thus making it a bit tedious to look through syntax themes to find the
+one you want.
Switching main GUI theme still requires a restart.