diff --git a/openpype/tools/settings/settings/categories.py b/openpype/tools/settings/settings/categories.py
index 0410fa1810..2e3c6d9dda 100644
--- a/openpype/tools/settings/settings/categories.py
+++ b/openpype/tools/settings/settings/categories.py
@@ -115,13 +115,19 @@ class SettingsCategoryWidget(QtWidgets.QWidget):
"settings to update them to you current running OpenPype version."
)
- def __init__(self, user_role, parent=None):
+ def __init__(self, controller, parent=None):
super(SettingsCategoryWidget, self).__init__(parent)
- self.user_role = user_role
+ self._controller = controller
+ controller.event_system.add_callback(
+ "edit.mode.changed",
+ self._edit_mode_changed
+ )
self.entity = None
self._edit_mode = None
+ self._last_saved_info = None
+ self._reset_crashed = False
self._state = CategoryState.Idle
@@ -192,11 +198,16 @@ class SettingsCategoryWidget(QtWidgets.QWidget):
)
raise TypeError("Unknown type: {}".format(label))
+ def _edit_mode_changed(self, event):
+ self.set_edit_mode(event["edit_mode"])
+
def set_edit_mode(self, enabled):
if enabled is self._edit_mode:
return
- self.save_btn.setEnabled(enabled)
+ self._edit_mode = enabled
+
+ self.save_btn.setEnabled(enabled and not self._reset_crashed)
if enabled:
tooltip = (
"Someone else has opened settings UI."
@@ -302,7 +313,7 @@ class SettingsCategoryWidget(QtWidgets.QWidget):
footer_layout = QtWidgets.QHBoxLayout(footer_widget)
footer_layout.setContentsMargins(5, 5, 5, 5)
- if self.user_role == "developer":
+ if self._controller.user_role == "developer":
self._add_developer_ui(footer_layout, footer_widget)
footer_layout.addWidget(empty_label, 1)
@@ -683,14 +694,16 @@ class SettingsCategoryWidget(QtWidgets.QWidget):
)
def _on_reset_crash(self):
+ self._reset_crashed = True
self.save_btn.setEnabled(False)
if self.breadcrumbs_model is not None:
self.breadcrumbs_model.set_entity(None)
def _on_reset_success(self):
+ self._reset_crashed = True
if not self.save_btn.isEnabled():
- self.save_btn.setEnabled(True)
+ self.save_btn.setEnabled(self._edit_mode)
if self.breadcrumbs_model is not None:
path = self.breadcrumbs_bar.path()
diff --git a/openpype/tools/settings/settings/window.py b/openpype/tools/settings/settings/window.py
index 013a273e98..612975e30a 100644
--- a/openpype/tools/settings/settings/window.py
+++ b/openpype/tools/settings/settings/window.py
@@ -3,6 +3,7 @@ from Qt import QtWidgets, QtGui, QtCore
from openpype import style
from openpype.lib import is_admin_password_required
+from openpype.lib.events import EventSystem
from openpype.widgets import PasswordDialog
from openpype.settings.lib import (
@@ -24,6 +25,81 @@ from .widgets import (
from .search_dialog import SearchEntitiesDialog
+class SettingsController:
+ """Controller for settings tools.
+
+ Added when tool was finished for checks of last opened in settings
+ categories and being able communicated with main widget logic.
+ """
+
+ def __init__(self, user_role):
+ self._user_role = user_role
+ self._event_system = EventSystem()
+
+ self._opened_info = None
+ self._last_opened_info = None
+ self._edit_mode = None
+
+ @property
+ def user_role(self):
+ return self._user_role
+
+ @property
+ def event_system(self):
+ return self._event_system
+
+ @property
+ def opened_info(self):
+ return self._opened_info
+
+ @property
+ def last_opened_info(self):
+ return self._last_opened_info
+
+ @property
+ def edit_mode(self):
+ return self._edit_mode
+
+ def ui_closed(self):
+ if self._opened_info is not None:
+ closed_settings_ui(self._opened_info)
+
+ self._opened_info = None
+ self._edit_mode = None
+
+ def set_edit_mode(self, enabled):
+ if self._edit_mode is enabled:
+ return
+
+ opened_info = None
+ if enabled:
+ opened_info = opened_settings_ui()
+ self._last_opened_info = opened_info
+
+ self._opened_info = opened_info
+ self._edit_mode = enabled
+
+ self.event_system.emit(
+ "edit.mode.changed",
+ {"edit_mode": enabled},
+ "controller"
+ )
+
+ def update_last_opened_info(self):
+ print("update_last_opened_info")
+ last_opened_info = get_last_opened_info()
+ enabled = False
+ if (
+ last_opened_info is None
+ or self._opened_info == last_opened_info
+ ):
+ enabled = True
+
+ self._last_opened_info = last_opened_info
+
+ self.set_edit_mode(enabled)
+
+
class MainWidget(QtWidgets.QWidget):
trigger_restart = QtCore.Signal()
@@ -33,11 +109,12 @@ class MainWidget(QtWidgets.QWidget):
def __init__(self, user_role, parent=None, reset_on_show=True):
super(MainWidget, self).__init__(parent)
+ controller = SettingsController(user_role)
+
# Object referencing to this machine and time when UI was opened
# - is used on close event
- self._last_opened_info = None
- self._edit_mode = None
self._main_reset = False
+ self._controller = controller
self._user_passed = False
self._reset_on_show = reset_on_show
@@ -55,8 +132,8 @@ class MainWidget(QtWidgets.QWidget):
header_tab_widget = SettingsTabWidget(parent=self)
- studio_widget = SystemWidget(user_role, header_tab_widget)
- project_widget = ProjectWidget(user_role, header_tab_widget)
+ studio_widget = SystemWidget(controller, header_tab_widget)
+ project_widget = ProjectWidget(controller, header_tab_widget)
tab_widgets = [
studio_widget,
@@ -151,45 +228,24 @@ class MainWidget(QtWidgets.QWidget):
# Trigger reset with 100ms delay
QtCore.QTimer.singleShot(100, self.reset)
- elif not self._last_opened_info:
- self._check_on_ui_open()
-
def closeEvent(self, event):
- if self._last_opened_info:
- closed_settings_ui(self._last_opened_info)
- self._last_opened_info = None
+ self._controller.ui_closed()
+
super(MainWidget, self).closeEvent(event)
- def _check_on_ui_open(self):
- last_opened_info = get_last_opened_info()
- if last_opened_info is not None:
- if self._last_opened_info != last_opened_info:
- self._last_opened_info = None
- else:
- self._last_opened_info = opened_settings_ui()
-
- if self._last_opened_info is not None:
- if self._edit_mode is not True:
- self._set_edit_mode(True)
+ def _check_on_reset(self):
+ self._controller.update_last_opened_info()
+ if self._controller.edit_mode:
return
- if self._edit_mode is False:
- return
+ # if self._edit_mode is False:
+ # return
- dialog = SettingsUIOpenedElsewhere(last_opened_info, self)
+ dialog = SettingsUIOpenedElsewhere(
+ self._controller.last_opened_info, self
+ )
dialog.exec_()
- edit_enabled = dialog.result() == 1
- if edit_enabled:
- self._last_opened_info = opened_settings_ui()
- self._set_edit_mode(edit_enabled)
-
- def _set_edit_mode(self, mode):
- if self._edit_mode is mode:
- return
-
- self._edit_mode = mode
- for tab_widget in self.tab_widgets:
- tab_widget.set_edit_mode(mode)
+ self._controller.set_edit_mode(dialog.result() == 1)
def _show_password_dialog(self):
if self._password_dialog:
@@ -235,7 +291,7 @@ class MainWidget(QtWidgets.QWidget):
for tab_widget in self.tab_widgets:
tab_widget.reset()
self._main_reset = False
- self._check_on_ui_open()
+ self._check_on_reset()
def _update_search_dialog(self, clear=False):
if self._search_dialog.isVisible():
@@ -280,7 +336,7 @@ class MainWidget(QtWidgets.QWidget):
self._update_search_dialog()
if not self._main_reset:
- self._check_on_ui_open()
+ self._check_on_reset()
def keyPressEvent(self, event):
if event.matches(QtGui.QKeySequence.Find):
@@ -306,8 +362,8 @@ class SettingsUIOpenedElsewhere(QtWidgets.QDialog):
"Someone else has opened Settings UI. That may cause data loss."
" Please contact the person on the other side."
"
You can open the UI in view-only mode or take"
- " the control which will cause the other settings won't be able"
- " to save changes.
"
+ " the control which will cause settings on the other side"
+ " won't be able to save changes.
"
), self)
message_label.setWordWrap(True)