diff --git a/.gitignore b/.gitignore index ddf7063c..66c21d61 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ *.egg-info setup.iss novelwriter.desktop -novelWriter.pyw # Documentation /docs/build/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 1db8f462..5a5a0c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,51 @@ be left "hanging", that is, no closing quote in the same paragraph. ---- +## Version 1.0.4 [2021-02-07] + +### Release Notes + +This patch release fixes a couple of minor issues with the Preferences dialog and the behaviour of +one of the keyboard shortcuts. + +Aside from these fixes, the main point of this patch is to add new setup features for novelWriter +on Windows. A Windows installer will no longer be provided for the foreseeable future, and instead +functionality has been added to the main setup script to create desktop and start menu icons. + +### Detailed Changelog + +**Bug Fixes** + +* Fixed an issue with the Preferences dialog where the setting for justified text was mixed with + the setting for fixed text width. This meant that the justified text setting could potentially + get overwritten when the Preferences were changed and saved. Issue #623, PR #625. +* Fixed an issue with the Open Project dialog where the list of recent projects would contain + duplicate entries if the dialog was opened multiple times. PR #627. + +**User Interface** + +* The `Ctrl+Del` keyboard shortcut is now only active when the project tree has focus. Since this + is also a common shortcut in many applications for deleting the next word ahead of the cursor, + the activation of the delete file function when the editor has focus is unexpected to some users. + Issue #629, PR #631. + +**Installation** + +* A new command has been added to the `setup.py` script. The new command, `win-install`, will + create a desktop and start menu icon for novelWriter when run in the source folder. A windows + batch file, `setup_windows.bat`, has also been added. Running this file from the source folder, + either by command line or by double-click, will install dependencies from PyPi and set up the + icons and file association with novelWriter project files. This should make it easier to run + novelWriter from the source folder on Windows. PRs #634, #641 and #642. + +**Documentation** + +* The documentation on how to setup and install novelWriter has been extended and reorganised into + one file per operating system. Some of the other documentation files have also been moved to a + different section. PR #634. + +---- + ## Version 1.0.3 [2021-01-24] ### Release Notes @@ -951,7 +996,7 @@ planned by GitHub. See their [notes](https://github.com/github/renaming) for mor **Other Changes** * The install scripts now try to create folders before copying icons. PR #364. -* The manifest file now lists the root assets folder, so that it is included in the pypi build. PR +* The manifest file now lists the root assets folder, so that it is included in the PyPi build. PR #364. * The .desktop template file has the correct categories set according to the FreeDesktop standard. PR #364. diff --git a/README.md b/README.md index 033035fa..e0e3ad27 100644 --- a/README.md +++ b/README.md @@ -191,9 +191,15 @@ novelWriter ### Setup on Windows -For Windows, you can either install via PyPi, or use the Windows installer available from the -[releases](https://github.com/vkbo/novelWriter/releases) page. This should add the necessary icons -to your desktop and start menu. +For Windows, first ensure that you have Python installed. If not, get it from +[python.org/downloads](https://www.python.org/downloads/). Remember to select "Add Python to PATH" +during the installation, otherwise novelWriter cannot find it. + +Then, download the `novelWriter-x.y.z-minimal.zip` file, where `x.y.z` is the version number, from +the [releases](https://github.com/vkbo/novelWriter/releases) page. You can extract it to wherever +you want to keep novelWriter on your PC, and run the `setup_windows.bat` file in it +(double-clicking it should work). This will install the necessary dependencies from +[pypi,org](https://pypi.org/) and create desktop and start menu icons. ## Debugging @@ -211,7 +217,7 @@ details, or consult the [LICENSE](https://github.com/vkbo/novelWriter/blob/main/ Bundled assets have the following licenses: -* The Typicon-based icon themes by Stephen Hutchings are licensed under +* The Typicons-based icon themes by Stephen Hutchings are licensed under [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/). The icons have been altered in size and colour for use with novelWriter, and some additional icons added. The original icon set is available at diff --git a/docs/source/index.rst b/docs/source/index.rst index 41c485dd..d5e1bc77 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -61,9 +61,9 @@ details. int_introduction int_started - int_linux - int_mac - int_windows + setup_linux + setup_mac + setup_windows .. toctree:: diff --git a/docs/source/int_windows.rst b/docs/source/int_windows.rst deleted file mode 100644 index 4b2e164c..00000000 --- a/docs/source/int_windows.rst +++ /dev/null @@ -1,91 +0,0 @@ -.. _a_setup_win: - -**************** -Setup on Windows -**************** - -.. _GitHub: https://github.com/vkbo/novelWriter/releases -.. _main website: https://novelwriter.io -.. _zipapp: https://docs.python.org/3/library/zipapp.html -.. _Inno Setup: https://jrsoftware.org/isinfo.php -.. _python.org: https://www.python.org/downloads/windows -.. _PyPi: https://pypi.org/project/novelWriter -.. _discussions: https://github.com/vkbo/novelWriter/discussions - -This is a brief guide to how you can get novelWriter running on a Windows computer. - -On Windows, you have two options: You can either run from source, or install novelWriter via a -Windows installer. The latter is the simplest, but since novelWriter is a hobby project, the -installer is not signed and downloading and running the installer often triggers warning because -Windows doesn't know whether it's safe or not. - -The installer contains an executable zip of novelWriter, a copy of the three libraries it depends -on, and a copy of the Python run environment. If you're uncomfortable with running this installer, -you can install the components yourself and just run novelWriter directly from the source code. The -Source code can be downloaded as a zip file directly from GitHub_. - - -.. _a_setup_win_installer: - -Using the Installer -=================== - -You can install novelWriter with the Windows installer for 64-bit Windows available on the -`main website`_ and GitHub_ page. This installer bundles all that is needed for novelWriter to run, -including Python and the XML and Qt libraries. When installing novelWriter this way, you don't need -to install any of the dependencies manually. The installer is made with zipapp_ and `Inno Setup`_. - - -.. _a_setup_win_source: - -Running from Source -=================== - -To run novelWriter from source, download the latest source package from the release page on -GitHub_, or if you have git running on your computer, you can also clone the repository. - -The main requirement is that you have Python installed. The dependencies of novelWriter can then be -installed from the Python Package Index, PyPi_. - -Step 1: Installing Python -------------------------- - -If you already have Python installed, you can skip this step. If you don't have it installed, you -can download it from the python.org_ website. novelWriter should work with Python 3.6 or higher, -but it is recommended that you install the latest version of Python. - -Also, make sure you select the "Add Python to PATH" option during installation, otherwise the -``python`` command will not work in the command line window. - -.. image:: images/python_win_install.png - :width: 600 - -Step 2: Dependencies and Icons ------------------------------- - -**Alternative A: By Script** - -Open the folder where you extracted the novelWriter source, and double-click the file named -``win_install`` or ``win_install.bat``. This should open a command line window and run the setup -script to install dependencies and desktop and start menu icons. - -**Alternative B: Command Prompt** - -The above alternative can also be run manually. - -Open the windows command prompt. It can be launched by pressing the :kbd:`Win` key and typing "cmd". -The "Command Prompt" app should then be in the list of applications. - -With the command prompt open, navigate to the folder where you extracted the novelWriter source, -and run the following commands. - -.. code-block:: console - - python setup.py pip - python setup.py win-install - -The first command will install the dependencies on your system, and the second command will create -a desktop icon and a start menu icon. - -That should be all that you need. If you have any problems, you can always open a question on the -project's discussions_ page. This requires a GitHub account. diff --git a/docs/source/int_linux.rst b/docs/source/setup_linux.rst similarity index 100% rename from docs/source/int_linux.rst rename to docs/source/setup_linux.rst diff --git a/docs/source/int_mac.rst b/docs/source/setup_mac.rst similarity index 100% rename from docs/source/int_mac.rst rename to docs/source/setup_mac.rst diff --git a/docs/source/setup_windows.rst b/docs/source/setup_windows.rst new file mode 100644 index 00000000..4a2f35a9 --- /dev/null +++ b/docs/source/setup_windows.rst @@ -0,0 +1,96 @@ +.. _a_setup_win: + +**************** +Setup on Windows +**************** + +This is a brief guide to how you can get novelWriter running on a Windows computer. + +Unlike other operating systems, Windows does not come prepared with an environment to run Python +applications, so you must first install Python. After that, running novelWriter is straightfoeward. + +If you have any problems, you can always open a question on the project's discussions_ page. This +requires a GitHub account. + +.. _discussions: https://github.com/vkbo/novelWriter/discussions + + +.. _a_setup_win_installer: + +Using the Installer +=================== + +The installer for Windows is no longer provided. You can still create it yourself if you want to. +It can be generated with the provided ``setup.py`` script. use the script's ``help`` command to get +further instructions. + +Please use the "Running from Source" option below instead. + + +.. _a_setup_win_source: + +Running from Source +=================== + +To run novelWriter from source, download the latest source zip file from the release page on +GitHub_ or the `main website`_. The file named ``novelWriter-x.y.z-minimal.zip``, where ``x.y.z`` +is the version number, is ideal for this. You can also download the full source. + +In order to make novelWriter run on your system, you must first have Python installed (Step 1). +Thereafter, a script will do the rest of the job (Step 2). or you can do it yourself manually if +you wish to. + +.. _GitHub: https://github.com/vkbo/novelWriter/releases +.. _main website: https://novelwriter.io + + +Step 1: Installing Python +------------------------- + +If you already have Python installed, you can skip this step. If you don't have it installed, you +can download it from the python.org_ website. novelWriter should work with Python 3.6 or higher, +but it is recommended that you install the latest version of Python. + +Make sure you select the "Add Python to PATH" option during installation, otherwise the ``python`` +command will not work in the command line window. + +.. image:: images/python_win_install.png + :width: 600 + +.. _python.org: https://www.python.org/downloads/windows + + +Step 2: Dependencies and Icons +------------------------------ + +**Alternative A: By Script** + +Open the folder where you extracted the novelWriter source, and double-click the file named +``setup_windows`` or ``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. It will also check that +it can find Python from Step 1. + +.. note:: + If you upgrade Python to a newer version and the path to ``pythonw.exe`` changes, you may need + to run this script again. + +**Alternative B: Manual Installation** + +The above alternative can also be run manually. + +Open the windows command prompt. It can be launched by pressing the :kbd:`Win` key and typing "cmd". +The "Command Prompt" app should then be in the list of applications. + +With the command prompt open, navigate to the folder where you extracted the novelWriter source, +and run the following commands: + +.. code-block:: console + + python setup.py pip + python setup.py win-install + +The first command will install the dependencies on your system from the `Python Package Index`_, +and the second command will create a desktop icon and a start menu icon. That should be all that +you need. + +.. _Python Package Index: https://pypi.org/ diff --git a/novelWriter.py b/novelWriter.py index d6c7deb7..58af6c06 100755 --- a/novelWriter.py +++ b/novelWriter.py @@ -1,5 +1,10 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +novelWriter – Terminal Start Script +=================================== +The main start script for the terminal +""" import sys diff --git a/novelWriter.pyw b/novelWriter.pyw new file mode 100644 index 00000000..6a39bd3c --- /dev/null +++ b/novelWriter.pyw @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +novelWriter – Windows Start Script +================================== +The main start script for Windows GUI +""" + +import os + +os.curdir = os.path.abspath(os.path.dirname(__file__)) + +if __name__ == "__main__": + import nw + nw.main() diff --git a/nw/assets/text/release_notes_1.0.htm b/nw/assets/text/release_notes_1.0.htm index 7052b51c..789ef644 100644 --- a/nw/assets/text/release_notes_1.0.htm +++ b/nw/assets/text/release_notes_1.0.htm @@ -2,6 +2,20 @@ +

Release Notes for 1.0.4

+

Released on 3 February 2021

+

This patch release fixes a couple of minor issues with the Preferences dialog and the behaviour +of one of the keyboard shortcuts.

+

Aside from these fixes, the main point of this patch is to add new setup features for +novelWriter on Windows. A Windows installer will no longer be provided for the foreseeable future, +and instead functionality has been added to the main setup script to create desktop and start menu +icons.

+ +

The full changelog is available +here.

+ +
+

Release Notes for 1.0.3

Released on 24 January 2021

This patch release fixes a minor bug sometimes encountered when running novelWriter from command @@ -14,9 +28,6 @@ file .pyz. The executable would often be mistakenly flagged by virus cont the packaging tools. This is a known problem with pyinstaller and similar tools, but such warnings are always concerning even if they are false positives.

-

The full changelog is available -here.

-

Release Notes for 1.0.2

diff --git a/setup.py b/setup.py index 0a12a57e..99066647 100755 --- a/setup.py +++ b/setup.py @@ -1,12 +1,28 @@ #!/usr/bin/env python3 +# -*- coding: utf-8 -*- """ -The main setup script for novelWriter. +novelWriter – Main Setup Script +=============================== +The main setup and install script for all operating systems -It runs the standard setuptool.setup() with all options taken from the -setup.cfg file. +File History: +Created: 2019-05-16 [0.5.1] -In addition, a few specialised commands are available. These are -described in the help text in the main section. +This file is a part of novelWriter +Copyright 2018–2021, Veronica Berglyd Olsen + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . """ import os @@ -33,7 +49,7 @@ def installPackages(hostOS): """ print("") print("Installing Dependencies") - print("#######################") + print("=======================") print("") installQueue = ["pip", "-r requirements.txt"] @@ -215,7 +231,71 @@ def buildSampleZip(): # =============================================================================================== # ## -# Make Simple Package (winpack) +# Make Minimal Package (minimal-zip) +## + +def makeMinimalPackage(): + """Pack the core source file in a single zip file. + """ + from nw import __version__ + from zipfile import ZipFile + + # Make sample.zip first + try: + buildSampleZip() + except Exception as e: + print("Failed with error:") + print(str(e)) + sys.exit(1) + + print("") + print("Building Minimal ZIP File") + print("=========================") + print("") + + if not os.path.isdir("dist"): + os.mkdir("dist") + + outFile = os.path.join("dist", "novelWriter-%s-minimal.zip" % __version__) + if os.path.isfile(outFile): + os.unlink(outFile) + + rootFiles = [ + "LICENSE.md", + "README.md", + "CHANGELOG.md", + "novelWriter.pyw", + "requirements.txt", + "setup.py", + "setup_windows.bat", + ] + + with ZipFile(outFile, "w") as zipObj: + for nRoot, _, nFiles in os.walk("nw"): + if nRoot.endswith("__pycache__"): + print("Skipping: %s" % nRoot) + continue + + print("Compressing: %s [%d files]" % (nRoot, len(nFiles))) + for aFile in nFiles: + if aFile.endswith(".pyc"): + print("Skipping: %s" % aFile) + continue + zipObj.write(os.path.join(nRoot, aFile)) + + for aFile in rootFiles: + assert os.path.isfile(aFile) + print("Compressing: %s" % aFile) + zipObj.write(aFile) + + print("") + print("Built file: %s" % outFile) + print("") + + return + +## +# Make Simple Package (pack-pyz) ## def makeSimplePackage(embedPython): @@ -411,7 +491,7 @@ def freezePackage(buildWindowed, oneFile, makeSetup, hostOS): print("") print("Running PyInstaller") - print("###################") + print("===================") print("") if hostOS == OS_WIN: @@ -669,7 +749,8 @@ def xdgInstall(): def winInstall(): """Will attempt to install icons and make a launcher for Windows. """ - from nw import __version__, __hexversion__ + import winreg + from nw import __version__, __status__ try: import win32com.client except ImportError: @@ -685,7 +766,7 @@ def winInstall(): print("===============") print("") - nwTesting = not __hexversion__.endswith("f0") + nwTesting = not __status__.lower().startswith("stable") wShell = win32com.client.Dispatch("WScript.Shell") if nwTesting: @@ -705,19 +786,7 @@ def winInstall(): targetDir = os.path.abspath(os.path.dirname(__file__)) targetPy = os.path.join(targetDir, "novelWriter.pyw") - targetIcon = os.path.join(targetDir, "setup", "icons", "novelwriter.ico") - - os.curdir = os.path.dirname(__file__) - with open(targetPy, mode="w") as outFile: - outFile.write( - "#!/usr/bin/env python3\n" - "# -*- coding: utf-8 -*-\n\n" - "import os\n\n" - "os.curdir = os.path.abspath(os.path.dirname(__file__))\n\n" - "if __name__ == \"__main__\":\n" - " import nw\n" - " nw.main()\n" - ) + targetIcon = os.path.join(targetDir, "nw", "assets", "icons", "novelwriter.ico") print("Collecting Info ...") print("Desktop Folder: %s" % desktopDir) @@ -766,6 +835,28 @@ def winInstall(): wShortcut.save() print("Created: %s" % startMenuIcon) + print("") + print("Creating registry keys ...") + + def setKey(kPath, kName, kVal): + winreg.CreateKey(winreg.HKEY_CURRENT_USER, kPath) + regKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, kPath, 0, winreg.KEY_WRITE) + winreg.SetValueEx(regKey, kName, 0, winreg.REG_SZ, kVal) + winreg.CloseKey(regKey) + + mimeIcon = os.path.join(targetDir, "nw", "assets", "icons", "x-novelwriter-project.ico") + mimeExec = '"%s" "%s" "%%1"' % (pythonExe, targetPy) + + try: + setKey(r"Software\Classes\.nwx\OpenWithProgids", "novelWriterProject.nwx", "") + setKey(r"Software\Classes\novelWriterProject.nwx", "", "novelWriter Project File") + setKey(r"Software\Classes\novelWriterProject.nwx\DefaultIcon", "", mimeIcon) + setKey(r"Software\Classes\novelWriterProject.nwx\shell\open\command", "", mimeExec) + setKey(r"Software\Classes\Applications\novelWriter.pyw\SupportedTypes", ".nwx", "") + except WindowsError: + print("ERROR: Failed to set registry keys.") + print("") + print("") print("Done!") print("") @@ -853,6 +944,8 @@ if __name__ == "__main__": "\n" "Python Packaging:\n" "\n" + " minimal-zip Creates a minimal zip file of the core application without all the\n" + " other source files.\n" " pack-pyz Creates a pyz package in a folder with all dependencies using the\n" " zipapp tool. On Windows, python embeddable is added to the folder.\n" " freeze Freeze the package and produces a folder with all dependencies using\n" @@ -915,6 +1008,10 @@ if __name__ == "__main__": # Python Packaging # ================ + if "minimal-zip" in sys.argv: + sys.argv.remove("minimal-zip") + makeMinimalPackage() + if "pack-pyz" in sys.argv: sys.argv.remove("pack-pyz") simplePack = True diff --git a/setup_windows.bat b/setup_windows.bat new file mode 100644 index 00000000..12a8cc3f --- /dev/null +++ b/setup_windows.bat @@ -0,0 +1,28 @@ +@echo off + +:: Check for Python Installation +echo. +echo Looking for Python +python --version 2>NUL +if errorlevel 1 goto errorNoPython +echo Python found. OK. +echo. + +:: Install the PyQt5, lxml and pyenchant dependencies +python setup.py pip + +:: Create the desktop and start menu icons +python setup.py win-install + +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. + +pause diff --git a/win_install.bat b/win_install.bat deleted file mode 100644 index b36dab22..00000000 --- a/win_install.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -python setup.py pip -python setup.py win-install -pause