Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1737 from pypeclub/bugfix/local_settings_crash
Browse files Browse the repository at this point in the history
Local settings UI crash on missing defaults
  • Loading branch information
iLLiCiTiT authored Jun 22, 2021
2 parents 076d1d8 + ba13064 commit c168791
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 9 deletions.
8 changes: 6 additions & 2 deletions openpype/modules/settings_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ def initialize(self, _modules_settings):

# Tray attributes
self.settings_window = None
self._first_trigger = True

def connect_with_modules(self, *_a, **_kw):
return
Expand Down Expand Up @@ -153,6 +154,9 @@ def show_settings_window(self):
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()
56 changes: 49 additions & 7 deletions openpype/tools/settings/local_settings/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,9 +168,6 @@ def __init__(self, parent=None):

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)
Expand All @@ -191,7 +188,12 @@ def __init__(self, parent=None):
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

Expand All @@ -203,13 +205,53 @@ def showEvent(self, event):
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()

0 comments on commit c168791

Please sign in to comment.