diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index 9590241d..19009466 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -42,14 +42,14 @@ if TYPE_CHECKING: # pragma: no cover # ============ __package__ = "novelwriter" -__copyright__ = "Copyright 2018–2024, Veronica Berglyd Olsen" +__copyright__ = "Copyright 2018-2025 Veronica Berglyd Olsen" __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "2.7a1" -__hexversion__ = "0x020700a1" -__date__ = "2025-01-15" +__version__ = "2.7a2" +__hexversion__ = "0x020700a2" +__date__ = "2025-01-20" __status__ = "Stable" __domain__ = "novelwriter.io" @@ -65,20 +65,20 @@ CONFIG = Config() SHARED = SharedData() # ANSI Colours -C_RED = "\033[91m" -C_GREEN = "\033[92m" -C_YELLOW = "\033[93m" -C_BLUE = "\033[94m" -C_WHITE = "\033[97m" -C_END = "\033[0m" +RED = "\033[91m" +GREEN = "\033[92m" +YELLOW = "\033[93m" +BLUE = "\033[94m" +WHITE = "\033[97m" +END = "\033[0m" -# Log Formats -L_TIME = "[{asctime:}]" -L_FILE = "{filename:>18}" -L_LINE = "{lineno:<4d}" -L_LVLP = "{levelname:8}" -L_LVLC = "{levelname:17}" -L_TEXT = "{message:}" +# Log Format Components +TIME = "[{asctime:}]" +FILE = "{filename:>18}" +LINE = "{lineno:<4d}" +LVLP = "{levelname:8}" +LVLC = "{levelname:17}" +TEXT = "{message:}" def main(sysArgs: list | None = None) -> GuiMain | None: @@ -104,11 +104,19 @@ def main(sysArgs: list | None = None) -> GuiMain | None: f"novelWriter {__version__} ({__date__})\n" f"{__copyright__}\n" "\n" + "This program is free software: you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation, either version 3 of the License, or\n" + "(at your option) any later version.\n" + "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public Licence for more details.\n" "\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program. If not, see .\n" + "\n" "Usage:\n" " -h, --help Print this message.\n" " -v, --version Print program version and exit.\n" @@ -167,21 +175,21 @@ def main(sysArgs: list | None = None) -> GuiMain | None: if fmtFlags & 0b01: # This will overwrite the default level names, and also ensure that # they can be converted back to integer levels - logging.addLevelName(logging.DEBUG, f"{C_BLUE}DEBUG{C_END}") - logging.addLevelName(logging.INFO, f"{C_GREEN}INFO{C_END}") - logging.addLevelName(logging.WARNING, f"{C_YELLOW}WARNING{C_END}") - logging.addLevelName(logging.ERROR, f"{C_RED}ERROR{C_END}") - logging.addLevelName(logging.CRITICAL, f"{C_RED}CRITICAL{C_END}") + logging.addLevelName(logging.DEBUG, f"{BLUE}DEBUG{END}") + logging.addLevelName(logging.INFO, f"{GREEN}INFO{END}") + logging.addLevelName(logging.WARNING, f"{YELLOW}WARNING{END}") + logging.addLevelName(logging.ERROR, f"{RED}ERROR{END}") + logging.addLevelName(logging.CRITICAL, f"{RED}CRITICAL{END}") # Determine Log Format if fmtFlags == 0b00: - logFmt = f"{L_LVLP} {L_TEXT}" + logFmt = f"{LVLP} {TEXT}" elif fmtFlags == 0b01: - logFmt = f"{L_LVLC} {L_TEXT}" + logFmt = f"{LVLC} {TEXT}" elif fmtFlags == 0b10: - logFmt = f"{L_TIME} {L_FILE}:{L_LINE} {L_LVLP} {L_TEXT}" + logFmt = f"{TIME} {FILE}:{LINE} {LVLP} {TEXT}" elif fmtFlags == 0b11: - logFmt = f"{L_TIME} {C_BLUE}{L_FILE}{C_END}:{C_WHITE}{L_LINE}{C_END} {L_LVLC} {L_TEXT}" + logFmt = f"{TIME} {BLUE}{FILE}{END}:{WHITE}{LINE}{END} {LVLC} {TEXT}" # Setup Logging pkgLogger = logging.getLogger(__package__) @@ -272,7 +280,9 @@ def main(sysArgs: list | None = None) -> GuiMain | None: def _createApp(style: str) -> QApplication: - """Create the app.""" + """Create the app. This is done in a function to make it easier to + block app creation during testing. + """ app = QApplication([CONFIG.appName, (f"-style={style}")]) app.setApplicationName(CONFIG.appName) app.setApplicationVersion(__version__) diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index c7374651..b0a4ed1f 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Sample Project Jane Smith diff --git a/setup/windows/launcher.rc b/setup/windows/launcher.rc index d8ad36e2..f6809018 100644 --- a/setup/windows/launcher.rc +++ b/setup/windows/launcher.rc @@ -1,7 +1,7 @@ -IDI_ICON1 ICON DISCARDABLE "novelwriter.ico" +IDI_ICON1 ICON DISCARDABLE "novelWriter.ico" 1 VERSIONINFO -FILEVERSION 1,0,0,0 -PRODUCTVERSION 1,0,0,0 +FILEVERSION 1,1,0,0 +PRODUCTVERSION 1,1,0,0 FILEOS 0x4 FILETYPE 0x1 { @@ -9,11 +9,11 @@ FILETYPE 0x1 BLOCK "040904b0" { VALUE "CompanyName", "Veronica Berglyd Olsen\0" VALUE "FileDescription", "novelWriter Launcher\0" - VALUE "FileVersion", "1.0.0.0\0" - VALUE "LegalCopyright", "© 2025 Veronica Berglyd Olsen\0" + VALUE "FileVersion", "1.1.0.0\0" + VALUE "LegalCopyright", "(c) 2025 Veronica Berglyd Olsen\0" VALUE "OriginalFilename", "novelWriter.exe\0" VALUE "ProductName", "novelWriter\0" - VALUE "ProductVersion", "1.0.0.0\0" + VALUE "ProductVersion", "1.1.0.0\0" } } BLOCK "VarFileInfo" { diff --git a/setup/windows/main.cpp b/setup/windows/main.cpp index 052f57c6..4f2121b3 100644 --- a/setup/windows/main.cpp +++ b/setup/windows/main.cpp @@ -24,7 +24,7 @@ #include #include -void _tmain( int argc, TCHAR *argv[] ) { +void _tmain(int argc, TCHAR *argv[]) { STARTUPINFO si; PROCESS_INFORMATION pi; @@ -32,19 +32,20 @@ void _tmain( int argc, TCHAR *argv[] ) { si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - TCHAR fileName[MAX_PATH]; - auto pathlen = GetModuleFileName(NULL, fileName, MAX_PATH); - fileName[pathlen - 15] = 0; - SetCurrentDirectory(fileName); - std::cout << "WorkDir: " << fileName << std::endl; + TCHAR path[MAX_PATH]; + auto pathlen = GetModuleFileName(NULL, path, MAX_PATH); + path[pathlen - 15] = 0; + SetCurrentDirectory(path); + std::cout << "WorkDir: " << path << std::endl; - TCHAR cmd[MAX_PATH] = "pythonw.exe novelWriter.pyw"; + TCHAR cmd[MAX_PATH] = TEXT("pythonw.exe novelWriter.pyw"); if (argc > 1) { _tcscat_s(cmd, TEXT(" ")); _tcscat_s(cmd, argv[1]); } std::cout << "Command: " << cmd << std::endl; + std::cout << "Launching novelWriter GUI" << std::endl; CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); return; diff --git a/setup/windows/novelWriter.exe b/setup/windows/novelWriter.exe index 5026cddb..9cce6d42 100644 Binary files a/setup/windows/novelWriter.exe and b/setup/windows/novelWriter.exe differ diff --git a/tests/test_base/test_base_init.py b/tests/test_base/test_base_init.py index 664007eb..39ba566f 100644 --- a/tests/test_base/test_base_init.py +++ b/tests/test_base/test_base_init.py @@ -30,8 +30,8 @@ import pytest from PyQt6.QtWidgets import QApplication from novelwriter import ( - C_BLUE, C_END, C_WHITE, CONFIG, L_FILE, L_LINE, L_LVLC, L_LVLP, L_TEXT, - L_TIME, _createApp, logger, main + BLUE, CONFIG, END, FILE, LINE, LVLC, LVLP, TEXT, TIME, WHITE, _createApp, + logger, main ) from tests.tools import clearLogHandlers @@ -115,16 +115,14 @@ def testBaseInit_Options(monkeypatch, fncPath): main(["--info", "--color", f"--config={fncPath}", f"--data={fncPath}"]) assert ex.value.code == 0 assert logger.getEffectiveLevel() == logging.INFO - assert getFormat() == f"{L_LVLC} {L_TEXT}" + assert getFormat() == f"{LVLC} {TEXT}" clearLogHandlers() with pytest.raises(SystemExit) as ex: main(["--debug", "--color", f"--config={fncPath}", f"--data={fncPath}"]) assert ex.value.code == 0 assert logger.getEffectiveLevel() == logging.DEBUG - assert getFormat() == ( - f"{L_TIME} {C_BLUE}{L_FILE}{C_END}:{C_WHITE}{L_LINE}{C_END} {L_LVLC} {L_TEXT}" - ) + assert getFormat() == f"{TIME} {BLUE}{FILE}{END}:{WHITE}{LINE}{END} {LVLC} {TEXT}" # Log Levels wo/Color clearLogHandlers() @@ -132,14 +130,14 @@ def testBaseInit_Options(monkeypatch, fncPath): main(["--info", f"--config={fncPath}", f"--data={fncPath}"]) assert ex.value.code == 0 assert logger.getEffectiveLevel() == logging.INFO - assert getFormat() == f"{L_LVLP} {L_TEXT}" + assert getFormat() == f"{LVLP} {TEXT}" clearLogHandlers() with pytest.raises(SystemExit) as ex: main(["--debug", f"--config={fncPath}", f"--data={fncPath}"]) assert ex.value.code == 0 assert logger.getEffectiveLevel() == logging.DEBUG - assert getFormat() == f"{L_TIME} {L_FILE}:{L_LINE} {L_LVLP} {L_TEXT}" + assert getFormat() == f"{TIME} {FILE}:{LINE} {LVLP} {TEXT}" # Help and Version with pytest.raises(SystemExit) as ex: