diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 87f2fcd48e..0b6c22a3e0 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -100,6 +100,8 @@ class SettingObject: self._is_nullable = False self._as_widget = False self._is_group = False + self._roles = None + self.hidden_by_role = False # If value should be stored to environments self._env_group_key = None @@ -125,6 +127,13 @@ class SettingObject: # Only for develop mode self.defaults_not_set = False + def available_for_role(self, role_name=None): + if not self._roles: + return True + if role_name is None: + role_name = self.user_role + return role_name in self._roles + def initial_attributes(self, input_data, parent, as_widget): """Prepare attributes based on entered arguments. @@ -136,10 +145,14 @@ class SettingObject: self._parent = parent self._as_widget = as_widget + self._roles = input_data.get("roles") + if self._roles is not None and not isinstance(self._roles, list): + self._roles = [self._roles] + self._is_group = input_data.get("is_group", False) + self._env_group_key = input_data.get("env_group_key") # TODO not implemented yet self._is_nullable = input_data.get("is_nullable", False) - self._env_group_key = input_data.get("env_group_key") if self.is_environ: if not self.allow_to_environment: @@ -166,15 +179,19 @@ class SettingObject: self._any_parent_is_group = any_parent_is_group + if not self.available_for_role(): + self.hide() + self.hidden_by_role = True + @property - def develop_mode(self): - """Tool is in develop mode or not. + def user_role(self): + """Tool is running with any user role. Returns: - bool + str: user role as string. """ - return self._parent.develop_mode + return self._parent.user_role @property def log(self): @@ -659,7 +676,7 @@ class InputObject(SettingObject): value = parent_values.get(self.key, NOT_SET) if value is NOT_SET: - if self.develop_mode: + if self.available_for_role("developer"): self.defaults_not_set = True value = self.default_input_value if value is NOT_SET: @@ -1000,7 +1017,6 @@ class TextWidget(QtWidgets.QWidget, InputObject): super(TextWidget, self).__init__(parent_widget) self.initial_attributes(input_data, parent, as_widget) - self.multiline = input_data.get("multiline", False) placeholder = input_data.get("placeholder") @@ -1319,6 +1335,7 @@ class RawJsonWidget(QtWidgets.QWidget, InputObject): } return {self.key: value} + class ListItem(QtWidgets.QWidget, SettingObject): _btn_size = 20 value_changed = QtCore.Signal(object) @@ -2390,6 +2407,15 @@ class DictWidget(QtWidgets.QWidget, SettingObject): else: self._ui_as_item(input_data) + any_visible = False + for input_field in self.input_fields: + if not input_field.hidden_by_role: + any_visible = True + break + + if not any_visible: + self.hide() + def _ui_as_item(self, input_data): self.key = input_data["key"] if input_data.get("highlight_content", False): @@ -2485,6 +2511,8 @@ class DictWidget(QtWidgets.QWidget, SettingObject): item.value_changed.connect(self._on_value_change) if label_widget: + if item.hidden_by_role: + label_widget.hide() label_widget.input_field = item self.content_layout.addWidget(item, row, 1, 1, 1) else: @@ -2824,6 +2852,15 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): for child_data in input_data.get("children", []): self.add_children_gui(child_data) + any_visible = False + for input_field in self.input_fields: + if not input_field.hidden_by_role: + any_visible = True + break + + if not any_visible: + self.hide() + def add_children_gui(self, child_configuration): item_type = child_configuration["type"] klass = TypeToKlass.types.get(item_type) @@ -2845,6 +2882,8 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): item.value_changed.connect(self._on_value_change) if label_widget: + if item.hidden_by_role: + label_widget.hide() label_widget.input_field = item self.content_layout.addWidget(item, row, 1, 1, 1) else: @@ -3202,7 +3241,7 @@ class PathWidget(QtWidgets.QWidget, SettingObject): value = parent_values.get(self.key, NOT_SET) if value is NOT_SET: - if self.develop_mode: + if self.available_for_role("developer"): self.defaults_not_set = True value = self.default_input_value if value is NOT_SET: @@ -3450,6 +3489,15 @@ class DictFormWidget(QtWidgets.QWidget, SettingObject): self.setAttribute(QtCore.Qt.WA_TranslucentBackground) + any_visible = False + for input_field in self.input_fields: + if not input_field.hidden_by_role: + any_visible = True + break + + if not any_visible: + self.hide() + def add_children_gui(self, child_configuration): item_type = child_configuration["type"] # Pop label to not be set in child @@ -3462,6 +3510,9 @@ class DictFormWidget(QtWidgets.QWidget, SettingObject): item = klass(child_configuration, self, label_widget=label_widget) label_widget.item = item + if item.hidden_by_role: + label_widget.hide() + item.value_changed.connect(self._on_value_change) self.content_layout.addRow(label_widget, item) self.input_fields.append(item) @@ -3636,7 +3687,7 @@ class DictFormWidget(QtWidgets.QWidget, SettingObject): class LabelWidget(QtWidgets.QWidget): is_input_type = False - def __init__(self, configuration, parent=None): + def __init__(self, configuration, parent): super(LabelWidget, self).__init__(parent) self.setObjectName("LabelWidget") @@ -3647,12 +3698,23 @@ class LabelWidget(QtWidgets.QWidget): label_widget = QtWidgets.QLabel(label, self) layout.addWidget(label_widget) + # Role handling + roles = configuration.get("roles") + if roles is not None and not isinstance(roles, list): + roles = [roles] + + if roles and parent.user_role not in roles: + self.hide() + self.hidden_by_role = True + else: + self.hidden_by_role = False + class SplitterWidget(QtWidgets.QWidget): is_input_type = False _height = 2 - def __init__(self, configuration, parent=None): + def __init__(self, configuration, parent): super(SplitterWidget, self).__init__(parent) layout = QtWidgets.QHBoxLayout(self) @@ -3663,6 +3725,17 @@ class SplitterWidget(QtWidgets.QWidget): splitter_item.setMaximumHeight(self._height) layout.addWidget(splitter_item) + # Role handling + roles = configuration.get("roles") + if roles is not None and not isinstance(roles, list): + roles = [roles] + + if roles and parent.user_role not in roles: + self.hide() + self.hidden_by_role = True + else: + self.hidden_by_role = False + TypeToKlass.types["boolean"] = BooleanWidget TypeToKlass.types["number"] = NumberWidget diff --git a/pype/tools/settings/settings/widgets/window.py b/pype/tools/settings/settings/widgets/window.py index f83da8efe0..670d00fb2b 100644 --- a/pype/tools/settings/settings/widgets/window.py +++ b/pype/tools/settings/settings/widgets/window.py @@ -6,7 +6,7 @@ class MainWidget(QtWidgets.QWidget): widget_width = 1000 widget_height = 600 - def __init__(self, develop, parent=None): + def __init__(self, user_role, parent=None): super(MainWidget, self).__init__(parent) self.setObjectName("MainWidget") self.setWindowTitle("Pype Settings") @@ -15,8 +15,8 @@ class MainWidget(QtWidgets.QWidget): header_tab_widget = QtWidgets.QTabWidget(parent=self) - studio_widget = SystemWidget(develop, header_tab_widget) - project_widget = ProjectWidget(develop, header_tab_widget) + studio_widget = SystemWidget(user_role, header_tab_widget) + project_widget = ProjectWidget(user_role, header_tab_widget) header_tab_widget.addTab(studio_widget, "System") header_tab_widget.addTab(project_widget, "Project")