Merge pull request #1737 from pypeclub/bugfix/local_settings_crash

Local settings UI crash on missing defaults
This commit is contained in:
Jakub Trllo 2021-06-22 13:36:16 +02:00 committed by GitHub
commit c16879111e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 9 deletions

View file

@ -114,6 +114,7 @@ class LocalSettingsAction(PypeModule, ITrayAction):
# Tray attributes
self.settings_window = None
self._first_trigger = True
def connect_with_modules(self, *_a, **_kw):
return
@ -153,6 +154,9 @@ class LocalSettingsAction(PypeModule, ITrayAction):
self.settings_window.raise_()
self.settings_window.activateWindow()
# Reset content if was not visible
if not was_visible:
# Do not reset if it's first trigger of action
if self._first_trigger:
self._first_trigger = False
elif not was_visible:
# Reset content if was not visible
self.settings_window.reset()

View file

@ -168,9 +168,6 @@ class LocalSettingsWindow(QtWidgets.QWidget):
scroll_widget = QtWidgets.QScrollArea(self)
scroll_widget.setObjectName("GroupWidget")
settings_widget = LocalSettingsWidget(scroll_widget)
scroll_widget.setWidget(settings_widget)
scroll_widget.setWidgetResizable(True)
footer = QtWidgets.QWidget(self)
@ -191,7 +188,12 @@ class LocalSettingsWindow(QtWidgets.QWidget):
save_btn.clicked.connect(self._on_save_clicked)
reset_btn.clicked.connect(self._on_reset_clicked)
self.settings_widget = settings_widget
# Do not create local settings widget in init phase as it's using
# settings objects that must be OK to be able create this widget
# - we want to show dialog if anything goes wrong
# - without reseting nothing is shown
self._settings_widget = None
self._scroll_widget = scroll_widget
self.reset_btn = reset_btn
self.save_btn = save_btn
@ -203,13 +205,53 @@ class LocalSettingsWindow(QtWidgets.QWidget):
def reset(self):
if self._reset_on_show:
self._reset_on_show = False
value = get_local_settings()
self.settings_widget.update_local_settings(value)
error_msg = None
try:
# Create settings widget if is not created yet
if self._settings_widget is None:
self._settings_widget = LocalSettingsWidget(
self._scroll_widget
)
self._scroll_widget.setWidget(self._settings_widget)
value = get_local_settings()
self._settings_widget.update_local_settings(value)
except Exception as exc:
error_msg = str(exc)
crashed = error_msg is not None
# Enable/Disable save button if crashed or not
self.save_btn.setEnabled(not crashed)
# Show/Hide settings widget if crashed or not
if self._settings_widget:
self._settings_widget.setVisible(not crashed)
if not crashed:
return
# Show message with error
title = "Something went wrong"
msg = (
"Bug: Loading of settings failed."
" Please contact your project manager or OpenPype team."
"\n\nError message:\n{}"
).format(error_msg)
dialog = QtWidgets.QMessageBox(
QtWidgets.QMessageBox.Critical,
title,
msg,
QtWidgets.QMessageBox.Ok,
self
)
dialog.exec_()
def _on_reset_clicked(self):
self.reset()
def _on_save_clicked(self):
value = self.settings_widget.settings_value()
value = self._settings_widget.settings_value()
save_local_settings(value)
self.reset()