From 19b21a3e8a5d812b429e11bf16a81549d0baed21 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 16:13:13 +0200 Subject: [PATCH 1/8] Add win-uninstall command to the setup script --- setup.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 022a1247..a72f18f4 100755 --- a/setup.py +++ b/setup.py @@ -704,7 +704,7 @@ def xdgUninstall(): return ## -# WIN Installation (win-install, launcher) +# WIN Installation (win-install) ## def winInstall(): @@ -827,6 +827,92 @@ def winInstall(): return +## +# WIN Uninstallation (win-uninstall) +## + +def winUninstall(): + """Will attempt to uninstall icons previously installed. + """ + import winreg + from nw import __version__, __hexversion__ + try: + import win32com.client + except ImportError: + print( + "ERROR: Package 'pywin32' is missing on this system.\n" + " Please run 'pip install --user pywin32' to install it." + ) + sys.exit(1) + + print("") + print("Windows Uninstall") + print("=================") + print("") + + nwTesting = not __hexversion__[-2] == "f" + wShell = win32com.client.Dispatch("WScript.Shell") + + if nwTesting: + linkName = "novelWriter Testing %s.lnk" % __version__ + else: + linkName = "novelWriter %s.lnk" % __version__ + + desktopDir = wShell.SpecialFolders("Desktop") + desktopIcon = os.path.join(desktopDir, linkName) + + startMenuDir = wShell.SpecialFolders("StartMenu") + startMenuProg = os.path.join(startMenuDir, "Programs", "novelWriter") + startMenuIcon = os.path.join(startMenuProg, linkName) + + print("Deleting Links ...") + if os.path.isfile(desktopIcon): + os.unlink(desktopIcon) + print("Deleted: %s" % desktopIcon) + else: + print("Not Found: %s" % desktopIcon) + + if os.path.isfile(startMenuIcon): + os.unlink(startMenuIcon) + print("Deleted: %s" % startMenuIcon) + else: + print("Not Found: %s" % startMenuIcon) + + if os.path.isdir(startMenuProg): + if not os.listdir(startMenuProg): + os.rmdir(startMenuProg) + print("Deleted: %s" % startMenuProg) + else: + print("Not Empty: %s" % startMenuProg) + + print("") + print("Removing registry keys ...") + + theKeys = [ + r"Software\Classes\novelWriterProject.nwx\shell\open\command", + r"Software\Classes\novelWriterProject.nwx\shell\open", + r"Software\Classes\novelWriterProject.nwx\shell", + r"Software\Classes\novelWriterProject.nwx\DefaultIcon", + r"Software\Classes\novelWriterProject.nwx", + r"Software\Classes\.nwx\OpenWithProgids", + r"Software\Classes\.nwx", + r"Software\Classes\Applications\novelWriter.pyw\SupportedTypes", + r"Software\Classes\Applications\novelWriter.pyw", + ] + + for aKey in theKeys: + try: + winreg.DeleteKey(winreg.HKEY_CURRENT_USER, aKey) + print("Deleted: HKEY_CURRENT_USER\\%s" % aKey) + except WindowsError: + print("Not Found: HKEY_CURRENT_USER\\%s" % aKey) + + print("") + print("Done!") + print("") + + return + # =============================================================================================== # # Windows Installers # =============================================================================================== # @@ -937,6 +1023,7 @@ if __name__ == "__main__": " with sudo for system-wide install, or as user for single user install.\n" " Running 'xdg-uninstall' will remove the icons.\n" " win-install Install desktop and start menu icons for Windows systems.\n" + " Running 'win-uninstall' will remove the icons.\n" ) # Flags and Variables @@ -1011,6 +1098,14 @@ if __name__ == "__main__": print("ERROR: Command 'win-install' can only be used on Windows") sys.exit(1) + if "win-uninstall" in sys.argv: + sys.argv.remove("win-uninstall") + if hostOS == OS_WIN: + winUninstall() + else: + print("ERROR: Command 'win-uninstall' can only be used on Windows") + sys.exit(1) + # Windows Setup Installer # ======================= From 421f2dd688340ac2aaa7d873779c0ccd4af8af3a Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 16:35:13 +0200 Subject: [PATCH 2/8] Add uninstall script for windows --- setup.py | 7 +++- setup/README.md | 1 + setup_windows.bat => setup/setup_windows.bat | 14 +++++++ setup/uninstall_windows.bat | 42 ++++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) rename setup_windows.bat => setup/setup_windows.bat (67%) create mode 100644 setup/uninstall_windows.bat diff --git a/setup.py b/setup.py index a72f18f4..8525dfa9 100755 --- a/setup.py +++ b/setup.py @@ -251,19 +251,22 @@ def makeMinimalPackage(targetOS): print("") print("Building Minimal ZIP File") print("=========================") - print("") if not os.path.isdir("dist"): os.mkdir("dist") if targetOS == OS_LINUX: targName = "-linux" + print("Target OS: Linux") elif targetOS == OS_DARWIN: targName = "-darwin" + print("Target OS: Darwin") elif targetOS == OS_WIN: targName = "-win" + print("Target OS: Windows") else: targName = "" + print("") zipFile = f"novelWriter-{__version__}-minimal{targName}.zip" outFile = os.path.join("dist", zipFile) @@ -295,7 +298,7 @@ def makeMinimalPackage(targetOS): if targetOS == OS_WIN: zipObj.write("novelWriter.py", "novelWriter.pyw") print("Adding File: novelWriter.pyw") - zipObj.write("setup_windows.bat") + zipObj.write(os.path.join("setup", "setup_windows.bat"), "setup_windows.bat") print("Adding File: setup_windows.bat") else: zipObj.write("novelWriter.py") diff --git a/setup/README.md b/setup/README.md index a2c3f163..4d819e5c 100644 --- a/setup/README.md +++ b/setup/README.md @@ -49,3 +49,4 @@ or with sudo for system-wide install, or as user for single user install. Running `xdg-uninstall` will remove the icons. `win-install` – Install desktop and start menu icons for Windows systems. +Running `win-uninstall` will remove the icons. diff --git a/setup_windows.bat b/setup/setup_windows.bat similarity index 67% rename from setup_windows.bat rename to setup/setup_windows.bat index 12a8cc3f..eeb88fcf 100644 --- a/setup_windows.bat +++ b/setup/setup_windows.bat @@ -8,6 +8,12 @@ if errorlevel 1 goto errorNoPython echo Python found. OK. echo. +if exist setup.py ( + echo setup.py found. OK. +) else ( + goto errorNoSetup +) + :: Install the PyQt5, lxml and pyenchant dependencies python setup.py pip @@ -24,5 +30,13 @@ echo. echo Please download and install it from https://www.python.org/downloads/ echo Also make sure the "Add Python to PATH" option is selected during installation. echo. +goto:eof + +:errorNoSetup +echo. +echo ERROR^: Could not find the setup.py script. +echo. +echo Make sure you run setup.py from the novelWriter root folder. +echo. pause diff --git a/setup/uninstall_windows.bat b/setup/uninstall_windows.bat new file mode 100644 index 00000000..70ec59b0 --- /dev/null +++ b/setup/uninstall_windows.bat @@ -0,0 +1,42 @@ +@echo off + +:: Check for Python Installation +echo. +echo Looking for Python +python --version 2>NUL +if errorlevel 1 goto errorNoPython +echo Python found. OK. + +if exist setup.py ( + echo setup.py found. OK. +) else ( + goto errorNoSetup +) +echo. + +:: Remove the PyQt5, lxml and pyenchant dependencies +pip uninstall -r requirements.txt + +:: Remove the desktop and start menu icons +python setup.py win-uninstall + +pause +goto:eof + +:errorNoPython +echo. +echo ERROR^: Python is not installed on your system, or cannot be found. +echo. +echo Please download and install it from https://www.python.org/downloads/ +echo Also make sure the "Add Python to PATH" option is selected during installation. +echo. +goto:eof + +:errorNoSetup +echo. +echo ERROR^: Could not find the setup.py script. +echo. +echo Make sure you run setup.py from the novelWriter root folder. +echo. + +pause From 6763ebdd66d82dc398cba5eb9f6cba7d2b7b5e26 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 17:18:47 +0200 Subject: [PATCH 3/8] Don't use import to read version number during setup --- setup.py | 59 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/setup.py b/setup.py index 8525dfa9..ebf79dcf 100755 --- a/setup.py +++ b/setup.py @@ -35,6 +35,30 @@ OS_LINUX = 1 OS_WIN = 2 OS_DARWIN = 3 +# =============================================================================================== # +# Utilities +# =============================================================================================== # + +def extractVersion(): + """Extract the novelWriter version number without having to import + anything else from the main package. + """ + def getValue(theString): + theBits = theString.partition("=") + return theBits[2].strip().strip('"') + + numVers = "Unknown" + hexVers = "Unknown" + initFile = os.path.join("nw", "__init__.py") + with open(initFile, mode="r") as inFile: + for aLine in inFile: + if aLine.startswith("__version__"): + numVers = getValue((aLine)) + if aLine.startswith("__hexversion__"): + hexVers = getValue((aLine)) + + return numVers, hexVers + # =============================================================================================== # # General # =============================================================================================== # @@ -237,9 +261,11 @@ def buildSampleZip(): def makeMinimalPackage(targetOS): """Pack the core source file in a single zip file. """ - from nw import __version__ from zipfile import ZipFile, ZIP_DEFLATED + # Get the version + numVers, _ = extractVersion() + # Make sample.zip first try: buildSampleZip() @@ -268,7 +294,7 @@ def makeMinimalPackage(targetOS): targName = "" print("") - zipFile = f"novelWriter-{__version__}-minimal{targName}.zip" + zipFile = f"novelWriter-{numVers}-minimal{targName}.zip" outFile = os.path.join("dist", zipFile) if os.path.isfile(outFile): os.unlink(outFile) @@ -300,6 +326,8 @@ def makeMinimalPackage(targetOS): print("Adding File: novelWriter.pyw") zipObj.write(os.path.join("setup", "setup_windows.bat"), "setup_windows.bat") print("Adding File: setup_windows.bat") + zipObj.write(os.path.join("setup", "uninstall_windows.bat"), "uninstall_windows.bat") + print("Adding File: setup_windows.bat") else: zipObj.write("novelWriter.py") print("Adding File: novelWriter.py") @@ -714,7 +742,6 @@ def winInstall(): """Will attempt to install icons and make a launcher for Windows. """ import winreg - from nw import __version__, __hexversion__ try: import win32com.client except ImportError: @@ -730,13 +757,14 @@ def winInstall(): print("===============") print("") - nwTesting = not __hexversion__[-2] == "f" + numVers, hexVers = extractVersion() + nwTesting = not hexVers[-2] == "f" wShell = win32com.client.Dispatch("WScript.Shell") if nwTesting: - linkName = "novelWriter Testing %s.lnk" % __version__ + linkName = "novelWriter Testing %s.lnk" % numVers else: - linkName = "novelWriter %s.lnk" % __version__ + linkName = "novelWriter %s.lnk" % numVers desktopDir = wShell.SpecialFolders("Desktop") desktopIcon = os.path.join(desktopDir, linkName) @@ -838,7 +866,6 @@ def winUninstall(): """Will attempt to uninstall icons previously installed. """ import winreg - from nw import __version__, __hexversion__ try: import win32com.client except ImportError: @@ -853,13 +880,14 @@ def winUninstall(): print("=================") print("") - nwTesting = not __hexversion__[-2] == "f" + numVers, hexVers = extractVersion() + nwTesting = not hexVers[-2] == "f" wShell = win32com.client.Dispatch("WScript.Shell") if nwTesting: - linkName = "novelWriter Testing %s.lnk" % __version__ + linkName = "novelWriter Testing %s.lnk" % numVers else: - linkName = "novelWriter %s.lnk" % __version__ + linkName = "novelWriter %s.lnk" % numVers desktopDir = wShell.SpecialFolders("Desktop") desktopIcon = os.path.join(desktopDir, linkName) @@ -937,8 +965,8 @@ def innoSetup(): with open(os.path.join("setup", "win_setup_pyz.iss"), mode="r") as inFile: issData = inFile.read() - import nw # noqa: E402 - issData = issData.replace(r"%%version%%", nw.__version__) + numVers, _ = extractVersion() + issData = issData.replace(r"%%version%%", numVers) issData = issData.replace(r"%%dir%%", os.getcwd()) with open("setup.iss", mode="w+") as outFile: @@ -1042,6 +1070,13 @@ if __name__ == "__main__": print(helpMsg) sys.exit(0) + if "version" in sys.argv: + sys.argv.remove("version") + numVers, hexVers = extractVersion() + print("Semantic Version: %s" % numVers) + print("Hexadecimal Version: %s" % hexVers) + sys.exit(0) + if "pip" in sys.argv: sys.argv.remove("pip") installPackages(hostOS) From a14b319adafcb46af79e5ac627c593029c723b34 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 17:37:22 +0200 Subject: [PATCH 4/8] Update the docs --- docs/source/setup_windows.rst | 33 +++++++++++++++++++++++++++++++++ setup/setup_windows.bat | 9 +++++++-- setup/uninstall_windows.bat | 13 +++++++++---- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/docs/source/setup_windows.rst b/docs/source/setup_windows.rst index a6130854..9fa7a0cf 100644 --- a/docs/source/setup_windows.rst +++ b/docs/source/setup_windows.rst @@ -79,6 +79,9 @@ Open the folder where you extracted the novelWriter source, and double-click the ``setup_windows.bat``. This should open a command line window and run the setup script to install dependencies, and add desktop and start menu icons. +.. note:: + If you downloaded the full source package, the file may be in the ``setup`` subfolder. + The script will also check that it can find Python on your system and alert you if it cannot run it. If you are sure you have installed it, but the script cannot find it, you probably didn't install it with the "Add Python to PATH" option mentioned in Step 1. @@ -108,3 +111,33 @@ and the second command will create a desktop icon and a start menu icon. That sh you need. .. _Python Package Index: https://pypi.org/ + + +Uninstalling +============ + +**Alternative A: By Script** + +Open the folder where you keep the novelWriter files, and double-click the file named +``uninstall_windows.bat``. This should open a command line window and run the setup script to +remove the main dependency packages and remove desktop and start menu icons. + +.. note:: + If you downloaded the full source package, the file may be in the ``setup`` subfolder. + +If you plan to also remove Python from your system, you must run this command first, as it needs +Python in order to run the commands. + +.. note:: + Due to limitations with the ``pip`` installer, dependencies of the dependencies will not be + removed, only the ones the setup script directly installed. + +**Alternative B: Manual Uninstallation** + +Like for the install process, the script just runs two commands. You can of course run them +yourself if you wish. They are: + +.. code-block:: console + + python setup.py win-uninstall + pip uninstall -r requirements.txt diff --git a/setup/setup_windows.bat b/setup/setup_windows.bat index eeb88fcf..3d0b16e0 100644 --- a/setup/setup_windows.bat +++ b/setup/setup_windows.bat @@ -6,13 +6,18 @@ echo Looking for Python python --version 2>NUL if errorlevel 1 goto errorNoPython echo Python found. OK. -echo. if exist setup.py ( echo setup.py found. OK. ) else ( - goto errorNoSetup + cd .. + if exist setup.py ( + echo setup.py found. OK. + ) else ( + goto errorNoSetup + ) ) +echo. :: Install the PyQt5, lxml and pyenchant dependencies python setup.py pip diff --git a/setup/uninstall_windows.bat b/setup/uninstall_windows.bat index 70ec59b0..a02f96d7 100644 --- a/setup/uninstall_windows.bat +++ b/setup/uninstall_windows.bat @@ -10,16 +10,21 @@ echo Python found. OK. if exist setup.py ( echo setup.py found. OK. ) else ( - goto errorNoSetup + cd .. + if exist setup.py ( + echo setup.py found. OK. + ) else ( + goto errorNoSetup + ) ) echo. -:: Remove the PyQt5, lxml and pyenchant dependencies -pip uninstall -r requirements.txt - :: Remove the desktop and start menu icons python setup.py win-uninstall +:: Remove the PyQt5, lxml and pyenchant dependencies +pip uninstall -r requirements.txt + pause goto:eof From fcac28c69f52047a0e80f5a974656f028ef15b2b Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 17:45:28 +0200 Subject: [PATCH 5/8] Improve the windows uninstall script a little --- setup/uninstall_windows.bat | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/setup/uninstall_windows.bat b/setup/uninstall_windows.bat index a02f96d7..cc3a4d85 100644 --- a/setup/uninstall_windows.bat +++ b/setup/uninstall_windows.bat @@ -19,12 +19,22 @@ if exist setup.py ( ) echo. +echo Ready to remove the novelWriter icons, registry keys, and package dependencies. +set /P c=Are you sure you want to continue [y/n]? +if /I "%c%" EQU "y" goto doUninst +goto afterUninst + +:doUninst + :: Remove the desktop and start menu icons python setup.py win-uninstall :: Remove the PyQt5, lxml and pyenchant dependencies -pip uninstall -r requirements.txt +pip uninstall --yes -r requirements.txt +:afterUninst + +echo. pause goto:eof From 2e8425d4b129af06a08b63006df7b612859458d8 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 17:57:13 +0200 Subject: [PATCH 6/8] Improve the setup/uninstall text a bit for windows --- docs/source/setup_windows.rst | 16 +++++++++++----- setup/setup_windows.bat | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/source/setup_windows.rst b/docs/source/setup_windows.rst index 9fa7a0cf..b59b9670 100644 --- a/docs/source/setup_windows.rst +++ b/docs/source/setup_windows.rst @@ -75,7 +75,7 @@ Step 2: Dependencies and Icons **Alternative A: By Script** -Open the folder where you extracted the novelWriter source, and double-click the file named +Open the folder where you extracted novelWriter, and double-click the file named ``setup_windows.bat``. This should open a command line window and run the setup script to install dependencies, and add desktop and start menu icons. @@ -103,7 +103,7 @@ and run the following commands: .. code-block:: console - python setup.py pip + pip install --user pywin32 -r requirements.txt python setup.py win-install The first command will install the dependencies on your system from the `Python Package Index`_, @@ -125,11 +125,11 @@ remove the main dependency packages and remove desktop and start menu icons. .. note:: If you downloaded the full source package, the file may be in the ``setup`` subfolder. -If you plan to also remove Python from your system, you must run this command first, as it needs -Python in order to run the commands. +If you plan to also remove Python from your system, you must run the above script first as it needs +Python in order to run. .. note:: - Due to limitations with the ``pip`` installer, dependencies of the dependencies will not be + Due to limitations of the ``pip`` installer, dependencies of the dependencies will not be removed, only the ones the setup script directly installed. **Alternative B: Manual Uninstallation** @@ -141,3 +141,9 @@ yourself if you wish. They are: python setup.py win-uninstall pip uninstall -r requirements.txt + +There may be other packages on your system installed by ``pip``. To list all packages, run: + +.. code-block:: console + + pip freeze --user diff --git a/setup/setup_windows.bat b/setup/setup_windows.bat index 3d0b16e0..f6b6d5ab 100644 --- a/setup/setup_windows.bat +++ b/setup/setup_windows.bat @@ -20,7 +20,7 @@ if exist setup.py ( echo. :: Install the PyQt5, lxml and pyenchant dependencies -python setup.py pip +pip install --user pywin32 -r requirements.txt :: Create the desktop and start menu icons python setup.py win-install From 41043e4dc15011be96ad6ac39fd3b898f3842ffd Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 17:59:35 +0200 Subject: [PATCH 7/8] Fix wrong progress message in setup script --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ebf79dcf..194a8e23 100755 --- a/setup.py +++ b/setup.py @@ -327,7 +327,7 @@ def makeMinimalPackage(targetOS): zipObj.write(os.path.join("setup", "setup_windows.bat"), "setup_windows.bat") print("Adding File: setup_windows.bat") zipObj.write(os.path.join("setup", "uninstall_windows.bat"), "uninstall_windows.bat") - print("Adding File: setup_windows.bat") + print("Adding File: uninstall_windows.bat") else: zipObj.write("novelWriter.py") print("Adding File: novelWriter.py") From ac22838ded17e1571783aa4ab7e4a1884e6cc49f Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sat, 17 Apr 2021 23:44:49 +0200 Subject: [PATCH 8/8] Bump version to 1.2.3 and update changelog and release notes --- CHANGELOG.md | 35 ++++++++++++++++++++++++++++++++ docs/source/conf.py | 4 ++-- nw/__init__.py | 6 +++--- nw/assets/text/release_notes.htm | 14 +++++++++++-- sample/nwProject.nwx | 6 +++--- 5 files changed, 55 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f3a0e73..c49eb838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,40 @@ # novelWriter Changelog +## Version 1.2.3 [2021-04-18] + +### Release Notes + +This patch fixes a bug where the user's word list (personal dictionary) was not saved properly for +new projects. The added words were thus "forgotten" the next time the project was opened. + +In addition, uninstall commands have been added to the main setup script to make it easier to clean +up icons (Linux and Windows) and registry keys (Windows) if the user wishes to uninstall +novelWriter. + +### Detailed Changelog + +**Bugfixes** + +* Fixed an issue where the initial file for the user dictionary for a new project would not be + created the first time a word was added to it. This caused the words the user added to the + dictionary to not be loaded the next time the project was opened. Issue #733. PR #734. +* Some of the `setup.py` commands could not run if the PyQt5 packages were missing due to an import + command extracting the version number from the main `nw` package. This was not technically a bug + as the choice to do it this way was made deliberately, but a function has been added to the + `setup.py` script to allow reading the version number without having to import the `nw` package. + PR #749. + +**Installation** + +* An `xdg-uninstall` option has been added to `setup.py` to uninstall the icons installed into the + system by the `xdg-install` command. PR #736. +* Likewise, a `win-uninstall` option has been added to `setup.py` to uninstall the icons installed + into the system by the `win-install` command. Issue #743 and discussion #739. PR #749. +* Improvements have also been made to the `setup_windows.bat` script, and a complementary + `uninstall_windows.bat` has been added as well. PR #749. + +---- + ## Version 1.2.2 [2021-03-28] ### Release Notes diff --git a/docs/source/conf.py b/docs/source/conf.py index 33e77da1..21ef9394 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -25,9 +25,9 @@ copyright = "2018–2021, Veronica Berglyd Olsen" author = "Veronica Berglyd Olsen" # The short X.Y version -version = "1.2.2" +version = "1.2.3" # The full version, including alpha/beta/rc tags -release = "1.2.2" +release = "1.2.3" # -- General configuration --------------------------------------------------- diff --git a/nw/__init__.py b/nw/__init__.py index 4b7a05e3..77f65534 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -62,9 +62,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "1.2.2" -__hexversion__ = "0x010202f0" -__date__ = "2021-03-28" +__version__ = "1.2.3" +__hexversion__ = "0x010203f0" +__date__ = "2021-04-18" __status__ = "Stable" __domain__ = "novelwriter.io" __url__ = "https://novelwriter.io" diff --git a/nw/assets/text/release_notes.htm b/nw/assets/text/release_notes.htm index 864521b1..a8e5ca28 100644 --- a/nw/assets/text/release_notes.htm +++ b/nw/assets/text/release_notes.htm @@ -3,6 +3,18 @@ +

Release Notes for 1.2.3

+

Released on 18 April 2021

+

This patch fixes a bug where the user's word list (personal dictionary) was not saved properly +for new projects. The added words were thus "forgotten" the next time the project was opened.

+

In addition, uninstall commands have been added to the main setup script to make it easier to +clean up icons (Linux and Windows) and registry keys (Windows) if the user wishes to uninstall +novelWriter.

+ +

See also the Releases page.

+ +
+

Release Notes for 1.2.2

Released on 28 March 2021

This patch release is a bug fix release addressing some inconsistencies and issues with the @@ -10,8 +22,6 @@ document header buttons when Focus Mode is active. The keyboard shortcuts for se should now also work in Focus Mode. In addition, the setup script for novelWriter has been improved when installing on Windows.

-

See also the Releases page.

-

Release Notes for 1.2.1

diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index b673da8e..3d2ccbf8 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,13 +1,13 @@ - + Sample Project Sample Project Jane Smith Jay Doh - 943 + 946 161 - 47016 + 47084 False