Skip to content

Commit bda98a6

Browse files
committed
Add mechanism for displaying errors in loading workflow at application launch.
1 parent 5478819 commit bda98a6

4 files changed

Lines changed: 42 additions & 9 deletions

File tree

src/mapclient/application.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from mapclient.core.provenance import reproducibility_info
4242
from mapclient.core.utils import is_frozen, find_file
4343
from mapclient.core.workflow.workflowscene import create_from
44+
from mapclient.exceptions import ClientRuntimeError
4445
from mapclient.settings.definitions import INTERNAL_WORKFLOWS_ZIP, INTERNAL_WORKFLOWS_AVAILABLE, INTERNAL_WORKFLOW_DIR, UNSET_FLAG, PREVIOUS_WORKFLOW, AUTOLOAD_PREVIOUS_WORKFLOW
4546
from mapclient.settings.info import DEFAULT_WORKFLOW_PROJECT_FILENAME, APPLICATION_ENVIRONMENT_CONFIG_DIR_VARIABLE
4647

@@ -192,19 +193,23 @@ def windows_main(workflow, execute_now):
192193
try:
193194
window.open_workflow(workflow)
194195
except IndexError as e:
195-
logger.error('Failed to load workflow. ' + str(e))
196+
window.add_delayed_error(ClientRuntimeError("Loading Workflow Error", str(e)))
196197
except Exception as e:
197-
logger.error('Failed to load workflow. ' + str(e))
198+
window.add_delayed_error(ClientRuntimeError("Loading Workflow Error", str(e)))
198199
elif workflow:
199-
logger.info(f"Not opening workflow '{workflow}', this workflow is already in use.")
200+
error_message = f"Not opening workflow '{workflow}', this workflow is already in use."
201+
logger.info(error_message)
202+
window.add_delayed_error(ClientRuntimeError("Loading Workflow Error", error_message))
200203

201204
window.start_metrics()
202205
if execute_now:
203206
splash.showMessage('Executing workflow ...', 90)
204207
if wm.canExecute() == 0:
205208
window.execute()
206209
else:
207-
logger.error(f'Could not execute workflow, reason: "{wm.execute_status_message()}"')
210+
error_message = f'Could not execute workflow, reason: "{wm.execute_status_message()}"'
211+
logger.error(error_message)
212+
window.add_delayed_error(ClientRuntimeError("Executing Workflow Error", error_message))
208213

209214
splash.showMessage('Ready ...', 100)
210215
splash.finish(window)

src/mapclient/view/mainwindow.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import logging
2121
import uuid
2222

23-
from PySide6 import QtWidgets, QtGui
23+
from PySide6 import QtWidgets, QtGui, QtCore
2424

2525
from mapclient import version
2626
from mapclient.core.utils import install_package
@@ -41,6 +41,10 @@
4141
ADMIN_MODE = False
4242

4343

44+
def _show_install_package_dialog():
45+
install_package('rich')
46+
47+
4448
class MainWindow(QtWidgets.QMainWindow):
4549
"""
4650
This is the main window for the MAP Client.
@@ -54,6 +58,7 @@ def __init__(self, model):
5458
self._ui.setupUi(self)
5559
self._setup_menus()
5660
self.setMenuBar(self._menu_bar)
61+
5762
self._make_connections()
5863
self._dynamic_actions = []
5964

@@ -233,9 +238,10 @@ def _make_connections(self):
233238
self._action_PluginWizard.triggered.connect(self._show_plugin_wizard_dialog)
234239
self._action_PMR.triggered.connect(self._show_pmr_tool)
235240
self._action_Annotation.triggered.connect(self._show_annotation_tool)
236-
self._action_InstallPackage.triggered.connect(self._show_package_manager_dialog)
241+
self._action_InstallPackage.triggered.connect(_show_install_package_dialog)
237242
self._action_RenamePlugin.triggered.connect(self._show_rename_plugin_dialog)
238243
self._action_UpdateWorkflow.triggered.connect(self._show_update_workflow_dialog)
244+
239245
if ADMIN_MODE:
240246
self._action_MAPIcon.triggered.connect(self._show_map_icon_dialog)
241247

@@ -424,6 +430,9 @@ def apply_permission_settings(self):
424430
om = self._model.optionsManager()
425431
metrics_logger.set_permission(om.getOption(METRICS_PERMISSION))
426432

433+
def add_delayed_error(self, error):
434+
self._workflowWidget.add_delayed_error(error)
435+
427436
def _show_package_manager_dialog(self):
428437
from mapclient.view.managers.package.packagemanagerdialog import PackageManagerDialog
429438
pm = self._model.package_manager()
@@ -562,9 +571,6 @@ def _show_annotation_tool(self):
562571
dlg.setModal(True)
563572
dlg.exec_()
564573

565-
def _show_package_manager_dialog(self):
566-
install_package('rich')
567-
568574
def _show_map_icon_dialog(self):
569575
from mapclient.tools.mapicon.mapicondialog import MAPIconDialog
570576
location = self._model.workflowManager().location()

src/mapclient/view/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def do_runtime_error(self, *a, **kw):
107107
QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CursorShape.ArrowCursor)
108108
logger.error('{0}: {1}'.format(e.title, e.description))
109109
ErrorDialog(e.title, e.description, self).exec()
110+
finally:
110111
QtWidgets.QApplication.restoreOverrideCursor()
111112

112113
return do_runtime_error

src/mapclient/view/workflow/workflowwidget.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ def __init__(self, main_window):
6060
self._ui = Ui_WorkflowWidget()
6161
self._ui.setupUi(self)
6262

63+
self._delayed_errors = []
64+
6365
self._pluginUpdater = PluginUpdater()
6466

6567
self._undoStack = QtGui.QUndoStack(self)
@@ -77,6 +79,10 @@ def __init__(self, main_window):
7779

7880
self._graphicsScene.setWorkflowScene(self._workflowManager.scene())
7981

82+
self._delay_timer = QtCore.QTimer()
83+
self._delay_timer.setSingleShot(True)
84+
self._delay_timer.setInterval(300)
85+
8086
self.action_Close = None # Keep a handle to this for modifying the Ui.
8187
self._action_annotation = self._main_window.findChild(QtGui.QAction, "actionAnnotation")
8288
self._create_menu_items()
@@ -97,6 +103,7 @@ def _make_connections(self):
97103
self._graphicsScene.selectionChanged.connect(self._ui.graphicsView.selectionChanged)
98104
self._ui.executeButton.clicked.connect(self.executeWorkflow)
99105
self._undoStack.indexChanged.connect(self.undoStackIndexChanged)
106+
self._delay_timer.timeout.connect(self._raise_delayed_errors)
100107

101108
def model(self):
102109
return self._main_window.model()
@@ -154,12 +161,26 @@ def undoRedoStack(self):
154161

155162
def showEvent(self, *args, **kwargs):
156163
self._update_ui()
164+
self._delay_timer.start()
157165
return QtWidgets.QWidget.showEvent(self, *args, **kwargs)
158166

159167
def hideEvent(self, *args, **kwargs):
160168
self._update_ui()
161169
return QtWidgets.QWidget.hideEvent(self, *args, **kwargs)
162170

171+
@handle_runtime_error
172+
def _raise_delayed_error(self, error):
173+
raise error
174+
175+
def _raise_delayed_errors(self):
176+
for error in self._delayed_errors:
177+
self._raise_delayed_error(error)
178+
179+
self._delayed_errors = []
180+
181+
def add_delayed_error(self, error):
182+
self._delayed_errors.append(error)
183+
163184
@handle_runtime_error
164185
def _abort_execution(self):
165186
self._main_window.abort_execution()

0 commit comments

Comments
 (0)