From 02f85bd5d703b6a31ca110361c328af13b608409 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Fri, 31 Jul 2020 14:48:37 +0200 Subject: [PATCH 1/4] Set __package__ to nw and added variable __appname__ --- nw/__init__.py | 15 ++++++++------- nw/config.py | 4 ++-- nw/core/project.py | 6 +++--- nw/gui/about.py | 6 +++--- nw/gui/mainmenu.py | 6 +++--- nw/gui/preferences.py | 10 +++++----- nw/guimain.py | 12 ++++++------ 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/nw/__init__.py b/nw/__init__.py index a66a888b..b67a6f4f 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -36,7 +36,8 @@ from PyQt5.QtWidgets import QApplication, QErrorMessage from nw.config import Config -__package__ = "novelWriter" +__package__ = "nw" +__appname__ = "novelWriter" __author__ = "Veronica Berglyd Olsen" __copyright__ = "Copyright 2018–2020, Veronica Berglyd Olsen" __license__ = "GPLv3" @@ -132,7 +133,7 @@ def main(sysArgs=None): " --data= Alternative user data path.\n" " --testmode Do not display GUI. Used by the test suite.\n" ).format( - appname = __package__, + appname = __appname__, version = __version__, status = __status__, copyright = __copyright__, @@ -167,7 +168,7 @@ def main(sysArgs=None): print(helpMsg) sys.exit() elif inOpt in ("-v", "--version"): - print("%s %s Version %s [%s]" % (__package__,__status__,__version__,__date__)) + print("%s %s Version %s [%s]" % (__appname__,__status__,__version__,__date__)) sys.exit() elif inOpt == "--info": debugLevel = logging.INFO @@ -218,7 +219,7 @@ def main(sysArgs=None): logger.setLevel(debugLevel) logger.info("Starting %s %s (%s) %s" % ( - __package__, __version__, __hexversion__, __date__ + __appname__, __version__, __hexversion__, __date__ )) # Check Packages and Versions @@ -255,7 +256,7 @@ def main(sysArgs=None): "ERROR: %s cannot start due to the following issues:

" " - %s

Exiting." ) % ( - __package__, "
 - ".join(errorData) + __appname__, "
 - ".join(errorData) )) errApp.exec_() sys.exit(1) @@ -269,8 +270,8 @@ def main(sysArgs=None): nwGUI = GuiMain() return nwGUI else: - nwApp = QApplication([__package__,("-style=%s" % qtStyle)]) - nwApp.setApplicationName(__package__) + nwApp = QApplication([__appname__,("-style=%s" % qtStyle)]) + nwApp.setApplicationName(__appname__) nwApp.setApplicationVersion(__version__) nwApp.setWindowIcon(QIcon(CONFIG.appIcon)) nwApp.setOrganizationDomain("novelwriter.io") diff --git a/nw/config.py b/nw/config.py index cbd79d17..fb60fe11 100644 --- a/nw/config.py +++ b/nw/config.py @@ -52,8 +52,8 @@ class Config: def __init__(self): # Set Application Variables - self.appName = nw.__package__ - self.appHandle = nw.__package__.lower() + self.appName = nw.__appname__ + self.appHandle = nw.__appname__.lower() self.showGUI = True self.debugInfo = False self.cmdOpen = None diff --git a/nw/core/project.py b/nw/core/project.py index 496e8bc4..80ae358c 100644 --- a/nw/core/project.py +++ b/nw/core/project.py @@ -373,7 +373,7 @@ class NWProject(): "Note that after the upgrade, you cannot open the project with an older " "version of %s any more, so make sure you have a recent backup." ) % ( - nw.__package__, nw.__package__ + nw.__appname__, nw.__appname__ )) if msgRes != QMessageBox.Yes: return False @@ -384,7 +384,7 @@ class NWProject(): "The project cannot be opened by this version of {nw:s}. " "The file was saved with {nw:s} version {vers:s}." ).format( - nw = nw.__package__, + nw = nw.__appname__, vers = appVersion, ), nwAlert.ERROR) return False @@ -399,7 +399,7 @@ class NWProject(): "If you continue to open the project, some attributes and settings may not be " "preserved. Continue opening the project?" ) % ( - nw.__package__, appVersion, nw.__version__ + nw.__appname__, appVersion, nw.__version__ )) if msgRes != QMessageBox.Yes: return False diff --git a/nw/gui/about.py b/nw/gui/about.py index d432a4d9..749daeeb 100644 --- a/nw/gui/about.py +++ b/nw/gui/about.py @@ -54,13 +54,13 @@ class GuiAbout(QDialog): self.innerBox = QHBoxLayout() self.innerBox.setSpacing(self.mainConf.pxInt(16)) - self.setWindowTitle("About %s" % nw.__package__) + self.setWindowTitle("About %s" % nw.__appname__) self.setMinimumWidth(self.mainConf.pxInt(650)) self.setMinimumHeight(self.mainConf.pxInt(600)) iPx = self.mainConf.pxInt(96) self.guiDeco = self.theParent.theTheme.loadDecoration("nwicon", (iPx, iPx)) - self.lblName = QLabel("%s" % nw.__package__) + self.lblName = QLabel("%s" % nw.__appname__) self.lblVers = QLabel("v%s" % nw.__version__) self.lblDate = QLabel(datetime.strptime(nw.__date__, "%Y-%m-%d").strftime("%x")) @@ -132,7 +132,7 @@ class GuiAbout(QDialog): "

Credits

" "

{credits:s}

" ).format( - name = nw.__package__, + name = nw.__appname__, copyright = nw.__copyright__, website = nw.__url__, domain = nw.__domain__, diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index 84a336eb..7e17b782 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -258,7 +258,7 @@ class GuiMainMenu(QMenuBar): # Project > Exit self.aExitNW = QAction("Exit", self) - self.aExitNW.setStatusTip("Exit %s" % nw.__package__) + self.aExitNW.setStatusTip("Exit %s" % nw.__appname__) self.aExitNW.setShortcut("Ctrl+Q") self.aExitNW.triggered.connect(self._menuExit) self.projMenu.addAction(self.aExitNW) @@ -804,8 +804,8 @@ class GuiMainMenu(QMenuBar): self.helpMenu = self.addMenu("&Help") # Help > About - self.aAboutNW = QAction("About %s" % nw.__package__, self) - self.aAboutNW.setStatusTip("About %s" % nw.__package__) + self.aAboutNW = QAction("About %s" % nw.__appname__, self) + self.aAboutNW.setStatusTip("About %s" % nw.__appname__) self.aAboutNW.triggered.connect(self._showAbout) self.helpMenu.addAction(self.aAboutNW) diff --git a/nw/gui/preferences.py b/nw/gui/preferences.py index 0882b089..187c664f 100644 --- a/nw/gui/preferences.py +++ b/nw/gui/preferences.py @@ -108,7 +108,7 @@ class GuiPreferences(PagedDialog): msgBox = QMessageBox() msgBox.information( self, "Preferences", - "Some changes will not be applied until %s has been restarted." % nw.__package__ + "Some changes will not be applied until %s has been restarted." % nw.__appname__ ) if validEntries: @@ -154,7 +154,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Main GUI theme", self.selectTheme, - "Changing this requires restarting %s." % nw.__package__ + "Changing this requires restarting %s." % nw.__appname__ ) ## Select Icon Theme @@ -170,7 +170,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Main icon theme", self.selectIcons, - "Changing this requires restarting %s." % nw.__package__ + "Changing this requires restarting %s." % nw.__appname__ ) ## Dark Icons @@ -193,7 +193,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Font family", self.guiFont, - "Changing this requires restarting %s." % nw.__package__, + "Changing this requires restarting %s." % nw.__appname__, theButton = self.fontButton ) @@ -206,7 +206,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Font size", self.guiFontSize, - "Changing this requires restarting %s." % nw.__package__, + "Changing this requires restarting %s." % nw.__appname__, theUnit = "pt" ) diff --git a/nw/guimain.py b/nw/guimain.py index f2a4cb3f..ec8064a1 100644 --- a/nw/guimain.py +++ b/nw/guimain.py @@ -45,8 +45,8 @@ from nw.gui import ( GuiOutline, GuiOutlineDetails, GuiPreferences, GuiProjectLoad, GuiTheme, GuiProjectSettings, GuiProjectTree, GuiWritingStats ) -from nw.core import NWProject, NWDoc, NWIndex -from nw.constants import nwFiles, nwItemType, nwAlert +from .core import NWProject, NWDoc, NWIndex +from .constants import nwFiles, nwItemType, nwAlert logger = logging.getLogger(__name__) @@ -220,7 +220,7 @@ class GuiMain(QMainWindow): else: self.manageProjects() - logger.debug("%s is ready ..." % nw.__package__) + logger.debug("%s is ready ..." % nw.__appname__) return @@ -390,7 +390,7 @@ class GuiMain(QMainWindow): "can safely be overridden. If, however, another instance of %s has " "the project open, overriding the lock may corrupt the project, and " "is not recommended.%s" - ) % (nw.__package__, nw.__package__, lockDetails), + ) % (nw.__appname__, nw.__appname__, lockDetails), QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) if msgRes == QMessageBox.Yes: @@ -872,7 +872,7 @@ class GuiMain(QMainWindow): if msgRes != QMessageBox.Yes: return False - logger.info("Exiting %s" % nw.__package__) + logger.info("Exiting %s" % nw.__appname__) if not self.isFocusMode: self.mainConf.setMainPanePos(self.splitMain.sizes()) @@ -1037,7 +1037,7 @@ class GuiMain(QMainWindow): return True def _setWindowTitle(self, projName=None): - winTitle = "%s" % nw.__package__ + winTitle = "%s" % nw.__appname__ if projName is not None: winTitle += " - %s" % projName self.setWindowTitle(winTitle) From fc017cd8da1f35fdaa842ca29c459eb9bf31d13f Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Fri, 31 Jul 2020 16:41:46 +0200 Subject: [PATCH 2/4] Changed how the application name is passed around --- nw/__init__.py | 21 ++++++++++----------- nw/config.py | 4 ++-- nw/core/project.py | 26 ++++++++++++-------------- nw/gui/about.py | 6 +++--- nw/gui/mainmenu.py | 6 +++--- nw/gui/preferences.py | 10 +++++----- nw/guimain.py | 22 +++++++++++----------- 7 files changed, 46 insertions(+), 49 deletions(-) diff --git a/nw/__init__.py b/nw/__init__.py index b67a6f4f..7b546c14 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -37,7 +37,6 @@ from PyQt5.QtWidgets import QApplication, QErrorMessage from nw.config import Config __package__ = "nw" -__appname__ = "novelWriter" __author__ = "Veronica Berglyd Olsen" __copyright__ = "Copyright 2018–2020, Veronica Berglyd Olsen" __license__ = "GPLv3" @@ -46,7 +45,7 @@ __hexversion__ = "0x001002f0" __date__ = "2020-07-29" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__status__ = "Pre-Release" +__status__ = "Beta" __url__ = "https://github.com/vkbo/novelWriter" __issuesurl__ = "https://github.com/vkbo/novelWriter/issues" __domain__ = "novelwriter.io" @@ -91,7 +90,6 @@ CONFIG = Config() def main(sysArgs=None): """Parses command line, sets up logging, and launches main GUI. """ - if sysArgs is None: sysArgs = sys.argv[1:] @@ -112,7 +110,7 @@ def main(sysArgs=None): ] helpMsg = ( - "{appname} {version} ({status} {date})\n" + "novelWriter {version} ({status} {date})\n" "{copyright}\n" "\n" "This program is distributed in the hope that it will be useful,\n" @@ -133,7 +131,6 @@ def main(sysArgs=None): " --data= Alternative user data path.\n" " --testmode Do not display GUI. Used by the test suite.\n" ).format( - appname = __appname__, version = __version__, status = __status__, copyright = __copyright__, @@ -168,7 +165,9 @@ def main(sysArgs=None): print(helpMsg) sys.exit() elif inOpt in ("-v", "--version"): - print("%s %s Version %s [%s]" % (__appname__,__status__,__version__,__date__)) + print("%s %s Version %s [%s]" % ( + CONFIG.appName, __status__, __version__, __date__) + ) sys.exit() elif inOpt == "--info": debugLevel = logging.INFO @@ -219,7 +218,7 @@ def main(sysArgs=None): logger.setLevel(debugLevel) logger.info("Starting %s %s (%s) %s" % ( - __appname__, __version__, __hexversion__, __date__ + CONFIG.appName, __version__, __hexversion__, __date__ )) # Check Packages and Versions @@ -256,7 +255,7 @@ def main(sysArgs=None): "ERROR: %s cannot start due to the following issues:

" " - %s

Exiting." ) % ( - __appname__, "
 - ".join(errorData) + CONFIG.appName, "
 - ".join(errorData) )) errApp.exec_() sys.exit(1) @@ -270,11 +269,11 @@ def main(sysArgs=None): nwGUI = GuiMain() return nwGUI else: - nwApp = QApplication([__appname__,("-style=%s" % qtStyle)]) - nwApp.setApplicationName(__appname__) + nwApp = QApplication([CONFIG.appName, ("-style=%s" % qtStyle)]) + nwApp.setApplicationName(CONFIG.appName) nwApp.setApplicationVersion(__version__) nwApp.setWindowIcon(QIcon(CONFIG.appIcon)) - nwApp.setOrganizationDomain("novelwriter.io") + nwApp.setOrganizationDomain(__domain__) nwGUI = GuiMain() sys.exit(nwApp.exec_()) diff --git a/nw/config.py b/nw/config.py index fb60fe11..ec397aea 100644 --- a/nw/config.py +++ b/nw/config.py @@ -52,8 +52,8 @@ class Config: def __init__(self): # Set Application Variables - self.appName = nw.__appname__ - self.appHandle = nw.__appname__.lower() + self.appName = "novelWriter" + self.appHandle = self.appName.lower() self.showGUI = True self.debugInfo = False self.cmdOpen = None diff --git a/nw/core/project.py b/nw/core/project.py index 80ae358c..683affbe 100644 --- a/nw/core/project.py +++ b/nw/core/project.py @@ -368,23 +368,21 @@ class NWProject(): if fileVersion == "1.0": msgBox = QMessageBox() msgRes = msgBox.question(self.theParent, "Old Project Version", ( - "The project file and data is created by a %s version lower than 0.7. " - "Do you want to upgrade the project to the most recent format?

" - "Note that after the upgrade, you cannot open the project with an older " - "version of %s any more, so make sure you have a recent backup." - ) % ( - nw.__appname__, nw.__appname__ + "The project file and data is created by a novelWriter version " + "lower than 0.7. Do you want to upgrade the project to the " + "most recent format?

Note that after the upgrade, you " + "cannot open the project with an older version of novelWriter " + "any more, so make sure you have a recent backup." )) if msgRes != QMessageBox.Yes: return False elif fileVersion != "1.1" and fileVersion != "1.2": self.makeAlert(( - "Unknown or unsupported {nw:s} project file format. " - "The project cannot be opened by this version of {nw:s}. " - "The file was saved with {nw:s} version {vers:s}." + "Unknown or unsupported novelWriter project file format. " + "The project cannot be opened by this version of novelWriter. " + "The file was saved with novelWriter version {vers:s}." ).format( - nw = nw.__appname__, vers = appVersion, ), nwAlert.ERROR) return False @@ -395,11 +393,11 @@ class NWProject(): if int(hexVersion, 16) > int(nw.__hexversion__, 16) and self.mainConf.showGUI: msgBox = QMessageBox() msgRes = msgBox.question(self.theParent, "Version Conflict", ( - "This project was saved by a newer version of %s, version %s. This is version %s. " - "If you continue to open the project, some attributes and settings may not be " - "preserved. Continue opening the project?" + "This project was saved by a newer version of novelWriter, version %s. " + "This is version %s. If you continue to open the project, some attributes " + "and settings may not be preserved. Continue opening the project?" ) % ( - nw.__appname__, appVersion, nw.__version__ + appVersion, nw.__version__ )) if msgRes != QMessageBox.Yes: return False diff --git a/nw/gui/about.py b/nw/gui/about.py index 749daeeb..689a0aca 100644 --- a/nw/gui/about.py +++ b/nw/gui/about.py @@ -54,13 +54,13 @@ class GuiAbout(QDialog): self.innerBox = QHBoxLayout() self.innerBox.setSpacing(self.mainConf.pxInt(16)) - self.setWindowTitle("About %s" % nw.__appname__) + self.setWindowTitle("About %s" % self.mainConf.appName) self.setMinimumWidth(self.mainConf.pxInt(650)) self.setMinimumHeight(self.mainConf.pxInt(600)) iPx = self.mainConf.pxInt(96) self.guiDeco = self.theParent.theTheme.loadDecoration("nwicon", (iPx, iPx)) - self.lblName = QLabel("%s" % nw.__appname__) + self.lblName = QLabel("%s" % self.mainConf.appName) self.lblVers = QLabel("v%s" % nw.__version__) self.lblDate = QLabel(datetime.strptime(nw.__date__, "%Y-%m-%d").strftime("%x")) @@ -132,7 +132,7 @@ class GuiAbout(QDialog): "

Credits

" "

{credits:s}

" ).format( - name = nw.__appname__, + name = self.mainConf.appName, copyright = nw.__copyright__, website = nw.__url__, domain = nw.__domain__, diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index 7e17b782..43b95385 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -258,7 +258,7 @@ class GuiMainMenu(QMenuBar): # Project > Exit self.aExitNW = QAction("Exit", self) - self.aExitNW.setStatusTip("Exit %s" % nw.__appname__) + self.aExitNW.setStatusTip("Exit %s" % self.mainConf.appName) self.aExitNW.setShortcut("Ctrl+Q") self.aExitNW.triggered.connect(self._menuExit) self.projMenu.addAction(self.aExitNW) @@ -804,8 +804,8 @@ class GuiMainMenu(QMenuBar): self.helpMenu = self.addMenu("&Help") # Help > About - self.aAboutNW = QAction("About %s" % nw.__appname__, self) - self.aAboutNW.setStatusTip("About %s" % nw.__appname__) + self.aAboutNW = QAction("About %s" % self.mainConf.appName, self) + self.aAboutNW.setStatusTip("About %s" % self.mainConf.appName) self.aAboutNW.triggered.connect(self._showAbout) self.helpMenu.addAction(self.aAboutNW) diff --git a/nw/gui/preferences.py b/nw/gui/preferences.py index 187c664f..6bb39033 100644 --- a/nw/gui/preferences.py +++ b/nw/gui/preferences.py @@ -108,7 +108,7 @@ class GuiPreferences(PagedDialog): msgBox = QMessageBox() msgBox.information( self, "Preferences", - "Some changes will not be applied until %s has been restarted." % nw.__appname__ + "Some changes will not be applied until novelWriter has been restarted." ) if validEntries: @@ -154,7 +154,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Main GUI theme", self.selectTheme, - "Changing this requires restarting %s." % nw.__appname__ + "Changing this requires restarting novelWriter." ) ## Select Icon Theme @@ -170,7 +170,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Main icon theme", self.selectIcons, - "Changing this requires restarting %s." % nw.__appname__ + "Changing this requires restarting novelWriter." ) ## Dark Icons @@ -193,7 +193,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Font family", self.guiFont, - "Changing this requires restarting %s." % nw.__appname__, + "Changing this requires restarting novelWriter.", theButton = self.fontButton ) @@ -206,7 +206,7 @@ class GuiConfigEditGeneralTab(QWidget): self.mainForm.addRow( "Font size", self.guiFontSize, - "Changing this requires restarting %s." % nw.__appname__, + "Changing this requires restarting novelWriter.", theUnit = "pt" ) diff --git a/nw/guimain.py b/nw/guimain.py index ec8064a1..6ea48c9b 100644 --- a/nw/guimain.py +++ b/nw/guimain.py @@ -45,8 +45,8 @@ from nw.gui import ( GuiOutline, GuiOutlineDetails, GuiPreferences, GuiProjectLoad, GuiTheme, GuiProjectSettings, GuiProjectTree, GuiWritingStats ) -from .core import NWProject, NWDoc, NWIndex -from .constants import nwFiles, nwItemType, nwAlert +from nw.core import NWProject, NWDoc, NWIndex +from nw.constants import nwFiles, nwItemType, nwAlert logger = logging.getLogger(__name__) @@ -220,7 +220,7 @@ class GuiMain(QMainWindow): else: self.manageProjects() - logger.debug("%s is ready ..." % nw.__appname__) + logger.debug("novelWriter is ready ...") return @@ -384,13 +384,13 @@ class GuiMain(QMainWindow): msgBox = QMessageBox() msgRes = msgBox.warning( self, "Project Locked", ( - "The project is already open by another instance of %s, and is " - "therefore locked. Override lock and continue anyway?

" + "The project is already open by another instance of novelWriter, and " + "is therefore locked. Override lock and continue anyway?

" "Note: If the program or the computer previously crashed, the lock " - "can safely be overridden. If, however, another instance of %s has " - "the project open, overriding the lock may corrupt the project, and " - "is not recommended.%s" - ) % (nw.__appname__, nw.__appname__, lockDetails), + "can safely be overridden. If, however, another instance of " + "novelWriter has the project open, overriding the lock may corrupt " + "the project, and is not recommended.%s" + ) % lockDetails, QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) if msgRes == QMessageBox.Yes: @@ -872,7 +872,7 @@ class GuiMain(QMainWindow): if msgRes != QMessageBox.Yes: return False - logger.info("Exiting %s" % nw.__appname__) + logger.info("Exiting novelWriter") if not self.isFocusMode: self.mainConf.setMainPanePos(self.splitMain.sizes()) @@ -1037,7 +1037,7 @@ class GuiMain(QMainWindow): return True def _setWindowTitle(self, projName=None): - winTitle = "%s" % nw.__appname__ + winTitle = self.mainConf.appName if projName is not None: winTitle += " - %s" % projName self.setWindowTitle(winTitle) From 9233cdd0146c8ed131b4d25ec57bef19395dfa3a Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Fri, 31 Jul 2020 17:49:10 +0200 Subject: [PATCH 3/4] Added exception handling for the main app itself --- nw/__init__.py | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/nw/__init__.py b/nw/__init__.py index 7b546c14..c3d08fcd 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -252,10 +252,10 @@ def main(sysArgs=None): errMsg.setMinimumWidth(500) errMsg.setMinimumHeight(300) errMsg.showMessage(( - "ERROR: %s cannot start due to the following issues:

" + "ERROR: novelWriter cannot start due to the following issues:

" " - %s

Exiting." ) % ( - CONFIG.appName, "
 - ".join(errorData) + "
 - ".join(errorData) )) errApp.exec_() sys.exit(1) @@ -268,13 +268,43 @@ def main(sysArgs=None): if testMode: nwGUI = GuiMain() return nwGUI + else: nwApp = QApplication([CONFIG.appName, ("-style=%s" % qtStyle)]) nwApp.setApplicationName(CONFIG.appName) nwApp.setApplicationVersion(__version__) nwApp.setWindowIcon(QIcon(CONFIG.appIcon)) nwApp.setOrganizationDomain(__domain__) - nwGUI = GuiMain() - sys.exit(nwApp.exec_()) + + try: + nwGUI = GuiMain() + sys.exit(nwApp.exec_()) + + except: + # novelWriter has crashed! + from traceback import print_tb, format_tb + + eInfo = sys.exc_info() + logger.critical("%s: %s" % (eInfo[0].__name__, eInfo[1])) + print_tb(eInfo[2]) + + del nwApp + + errApp = QApplication([]) + errMsg = QErrorMessage() + errMsg.setWindowTitle("Critical Error") + errMsg.setMinimumWidth(500) + errMsg.setMinimumHeight(300) + errMsg.showMessage(( + "

novelWriter has encountered a critical error!

" + "

%s:
%s

" + "

Traceback:
%s

" + "

Shutting down ...

" + ) % (eInfo[0].__name__, eInfo[1], "
".join(format_tb(eInfo[2])))) + errApp.exec_() + + del eInfo + + sys.exit(1) return From 350d5beed7c4bf20c6a1816e4058677fe0d6d639 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Fri, 31 Jul 2020 21:46:23 +0200 Subject: [PATCH 4/4] Some minor last tweaks to the exception handler --- nw/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/nw/__init__.py b/nw/__init__.py index c3d08fcd..2271157a 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -165,8 +165,8 @@ def main(sysArgs=None): print(helpMsg) sys.exit() elif inOpt in ("-v", "--version"): - print("%s %s Version %s [%s]" % ( - CONFIG.appName, __status__, __version__, __date__) + print("novelWriter %s Version %s [%s]" % ( + __status__, __version__, __date__) ) sys.exit() elif inOpt == "--info": @@ -197,7 +197,7 @@ def main(sysArgs=None): CONFIG.cmdOpen = cmdOpen # Set Logging - logFmt = logging.Formatter(fmt=logFormat, datefmt="%Y-%m-%d %H:%M:%S", style="{") + logFmt = logging.Formatter(fmt=logFormat, style="{") if not logFile == "" and toFile: if path.isfile(logFile+".bak"): @@ -217,8 +217,8 @@ def main(sysArgs=None): logger.addHandler(cHandle) logger.setLevel(debugLevel) - logger.info("Starting %s %s (%s) %s" % ( - CONFIG.appName, __version__, __hexversion__, __date__ + logger.info("Starting novelWriter %s (%s) %s" % ( + __version__, __hexversion__, __date__ )) # Check Packages and Versions @@ -280,7 +280,7 @@ def main(sysArgs=None): nwGUI = GuiMain() sys.exit(nwApp.exec_()) - except: + except Exception: # novelWriter has crashed! from traceback import print_tb, format_tb