From 0197eaa5d730a2e360d355d58c7ffe4fdb7a1670 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 24 Mar 2021 16:03:25 +0100 Subject: [PATCH] settings ui can catch exceptions --- pype/settings/entities/__init__.py | 1 + .../settings/settings/widgets/categories.py | 57 ++++++++++++++++--- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/pype/settings/entities/__init__.py b/pype/settings/entities/__init__.py index e0910077df..1cb4be62e7 100644 --- a/pype/settings/entities/__init__.py +++ b/pype/settings/entities/__init__.py @@ -54,6 +54,7 @@ print(system_settings["general"]["studio_name"].value) """ from .exceptions import ( + SchemaError, DefaultsNotDefined, StudioDefaultsNotDefined, InvalidValueType, diff --git a/pype/tools/settings/settings/widgets/categories.py b/pype/tools/settings/settings/widgets/categories.py index 4cab86c30b..d84bf3dc15 100644 --- a/pype/tools/settings/settings/widgets/categories.py +++ b/pype/tools/settings/settings/widgets/categories.py @@ -1,4 +1,6 @@ import os +import sys +import traceback from enum import Enum from Qt import QtWidgets, QtCore, QtGui @@ -21,7 +23,8 @@ from pype.settings.entities import ( RawJsonEntity, DefaultsNotDefined, - StudioDefaultsNotDefined + StudioDefaultsNotDefined, + SchemaError ) from pype.settings.lib import get_system_settings @@ -199,6 +202,7 @@ class SettingsCategoryWidget(QtWidgets.QWidget): save_btn.clicked.connect(self._save) + self.save_btn = save_btn self.scroll_widget = scroll_widget self.content_layout = content_layout self.content_widget = content_widget @@ -280,19 +284,49 @@ class SettingsCategoryWidget(QtWidgets.QWidget): self.content_layout.removeWidget(widget) widget.deleteLater() - self._create_root_entity() + dialog = None + try: + self._create_root_entity() - self.add_children_gui() + self.add_children_gui() - self.ignore_input_changes.set_ignore(True) + self.ignore_input_changes.set_ignore(True) - for input_field in self.input_fields: - input_field.set_entity_value() + for input_field in self.input_fields: + input_field.set_entity_value() - self.ignore_input_changes.set_ignore(False) + self.ignore_input_changes.set_ignore(False) + + except SchemaError as exc: + dialog = QtWidgets.QMessageBox(self) + dialog.setWindowTitle("Schema error") + msg = "Implementation bug!\n\nError: {}".format(str(exc)) + dialog.setText(msg) + dialog.setIcon(QtWidgets.QMessageBox.Warning) + + except Exception as exc: + formatted_traceback = traceback.format_exception(*sys.exc_info()) + dialog = QtWidgets.QMessageBox(self) + msg = "Unexpected error happened!\n\nError: {}".format(str(exc)) + dialog.setText(msg) + dialog.setDetailedText(formatted_traceback) + dialog.setIcon(QtWidgets.QMessageBox.Critical) self.set_state(CategoryState.Idle) + if dialog: + dialog.exec_() + self._on_reset_crash() + else: + self._on_reset_success() + + def _on_reset_crash(self): + self.save_btn.setEnabled(False) + + def _on_reset_success(self): + if not self.save_btn.isEnabled(): + self.save_btn.setEnabled(True) + def add_children_gui(self): for child_obj in self.entity.children: item = self.create_ui_for_entity(self, child_obj, self) @@ -404,6 +438,15 @@ class ProjectWidget(SettingsCategoryWidget): if self is saved_tab_widget: return + def _on_reset_crash(self): + self.project_list_widget.setEnabled(False) + super(ProjectWidget, self)._on_reset_crash() + + def _on_reset_success(self): + if not self.project_list_widget.isEnabled(): + self.project_list_widget.setEnabled(True) + super(ProjectWidget, self)._on_reset_success() + def _create_root_entity(self): self.entity = ProjectSettings(change_state=False) self.entity.on_change_callbacks.append(self._on_entity_change)