From d91f67a799a4faf8a8251047242d37aafa19e414 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:47:57 +0200 Subject: [PATCH 01/12] ListItem and ModifiableDictItem expect one argument less --- pype/tools/settings/settings/widgets/item_types.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 0419c48c5c..406565c950 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1190,8 +1190,7 @@ class ListItem(QtWidgets.QWidget, SettingObject): value_changed = QtCore.Signal(object) def __init__( - self, object_type, input_modifiers, config_parent, parent, - is_strict=False + self, item_schema, config_parent, parent, is_strict=False ): super(ListItem, self).__init__(parent) @@ -1243,9 +1242,9 @@ class ListItem(QtWidgets.QWidget, SettingObject): layout.addWidget(self.add_btn, 0) layout.addWidget(self.remove_btn, 0) - ItemKlass = TypeToKlass.types[object_type] + ItemKlass = TypeToKlass.types[item_schema["type"]] self.value_input = ItemKlass( - input_modifiers, + item_schema, self, as_widget=True, label_widget=None @@ -1759,7 +1758,7 @@ class ModifiableDictItem(QtWidgets.QWidget, SettingObject): _btn_size = 20 value_changed = QtCore.Signal(object) - def __init__(self, object_type, input_modifiers, config_parent, parent): + def __init__(self, item_schema, config_parent, parent): super(ModifiableDictItem, self).__init__(parent) self._set_default_attributes() @@ -1779,13 +1778,13 @@ class ModifiableDictItem(QtWidgets.QWidget, SettingObject): layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(3) - ItemKlass = TypeToKlass.types[object_type] + ItemKlass = TypeToKlass.types[item_schema["type"]] self.key_input = QtWidgets.QLineEdit(self) self.key_input.setObjectName("DictKey") self.value_input = ItemKlass( - input_modifiers, + item_schema, self, as_widget=True, label_widget=None From ddc1042d6cf3d1f33a923f67167212b23d5c3a07 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:48:09 +0200 Subject: [PATCH 02/12] use pype logger inside --- pype/tools/settings/settings/widgets/item_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 406565c950..6f092b4bd8 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1,5 +1,4 @@ import json -import logging import collections from Qt import QtWidgets, QtCore, QtGui from .widgets import ( @@ -11,6 +10,7 @@ from .widgets import ( ) from .multiselection_combobox import MultiSelectionComboBox from .lib import NOT_SET, METADATA_KEY, TypeToKlass, CHILD_OFFSET +from pype.api import Logger from avalon.vendor import qtawesome @@ -111,7 +111,7 @@ class SettingObject: def log(self): """Auto created logger for debugging.""" if self._log is None: - self._log = logging.getLogger(self.__class__.__name__) + self._log = Logger().get_logger(self.__class__.__name__) return self._log @property From 83eab6b2ca5f5776d630b1b6f1f12cd93e55dfc2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:49:14 +0200 Subject: [PATCH 03/12] ModifiableDict and List are able to handle new way of their item definition with backwards compatibility --- .../settings/settings/widgets/item_types.py | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 6f092b4bd8..ba343b3979 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1381,8 +1381,21 @@ class ListWidget(QtWidgets.QWidget, InputObject): self.initial_attributes(input_data, parent, as_widget) - self.object_type = input_data["object_type"] - self.input_modifiers = input_data.get("input_modifiers") or {} + object_type = input_data["object_type"] + if isinstance(object_type, dict): + self.item_schema = object_type + else: + self.item_schema = { + "type": object_type + } + # Backwards compatibility + input_modifiers = input_data.get("input_modifiers") or {} + if input_modifiers: + self.log.info(( + "Used deprecated key `input_modifiers` to define item." + " Rather use `object_type` as dictionary with modifiers." + )) + self.item_schema.update(input_modifiers) self.input_fields = [] @@ -1949,6 +1962,22 @@ class ModifiableDict(QtWidgets.QWidget, InputObject): self.key = input_data["key"] + object_type = input_data["object_type"] + if isinstance(object_type, dict): + self.item_schema = object_type + else: + # Backwards compatibility + self.item_schema = { + "type": object_type + } + input_modifiers = input_data.get("input_modifiers") or {} + if input_modifiers: + self.log.info(( + "Used deprecated key `input_modifiers` to define item." + " Rather use `object_type` as dictionary with modifiers." + )) + self.item_schema.update(input_modifiers) + if input_data.get("highlight_content", False): content_state = "hightlighted" bottom_margin = 5 From a1715355a35b1874b3ebda32f08ba27d150fb492 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:50:22 +0200 Subject: [PATCH 04/12] List and ModifiableDict are creating new items in right way --- pype/tools/settings/settings/widgets/item_types.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index ba343b3979..d6858d390b 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1464,9 +1464,7 @@ class ListWidget(QtWidgets.QWidget, InputObject): def add_row(self, row=None, value=None, is_empty=False): # Create new item - item_widget = ListItem( - self.object_type, self.input_modifiers, self, self.inputs_widget - ) + item_widget = ListItem(self.item_schema, self, self.inputs_widget) previous_field = None next_field = None @@ -1652,11 +1650,8 @@ class ListStrictWidget(QtWidgets.QWidget, InputObject): children_item_mapping = [] for child_configuration in input_data["object_types"]: - object_type = child_configuration["type"] - item_widget = ListItem( - object_type, child_configuration, self, self.inputs_widget, - is_strict=True + child_configuration, self, self.inputs_widget, is_strict=True ) self.input_fields.append(item_widget) @@ -2030,9 +2025,6 @@ class ModifiableDict(QtWidgets.QWidget, InputObject): self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.object_type = input_data["object_type"] - self.input_modifiers = input_data.get("input_modifiers") or {} - self.add_row(is_empty=True) def count(self): @@ -2132,7 +2124,7 @@ class ModifiableDict(QtWidgets.QWidget, InputObject): def add_row(self, row=None, key=None, value=None, is_empty=False): # Create new item item_widget = ModifiableDictItem( - self.object_type, self.input_modifiers, self, self.content_widget + self.item_schema, self, self.content_widget ) if is_empty: item_widget.set_as_empty() From d241a450375f6fd0ce45885777d214e78035e0b5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:51:59 +0200 Subject: [PATCH 05/12] info changed to warning --- pype/tools/settings/settings/widgets/item_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index d6858d390b..ed8a5d6305 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1391,7 +1391,7 @@ class ListWidget(QtWidgets.QWidget, InputObject): # Backwards compatibility input_modifiers = input_data.get("input_modifiers") or {} if input_modifiers: - self.log.info(( + self.log.warning(( "Used deprecated key `input_modifiers` to define item." " Rather use `object_type` as dictionary with modifiers." )) @@ -1967,7 +1967,7 @@ class ModifiableDict(QtWidgets.QWidget, InputObject): } input_modifiers = input_data.get("input_modifiers") or {} if input_modifiers: - self.log.info(( + self.log.warning(( "Used deprecated key `input_modifiers` to define item." " Rather use `object_type` as dictionary with modifiers." )) From 069f25f1cbf8ab570878b148adf805f50dee742a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:56:34 +0200 Subject: [PATCH 06/12] skip input modifiers in anatomy --- pype/tools/settings/settings/widgets/anatomy_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/tools/settings/settings/widgets/anatomy_types.py b/pype/tools/settings/settings/widgets/anatomy_types.py index 6d7b3292ce..e1a726187c 100644 --- a/pype/tools/settings/settings/widgets/anatomy_types.py +++ b/pype/tools/settings/settings/widgets/anatomy_types.py @@ -271,9 +271,9 @@ class RootsWidget(QtWidgets.QWidget, SettingObject): ) multiroot_data = { "key": self.key, - "object_type": "path-widget", "expandable": False, - "input_modifiers": { + "object_type": { + "type": "path-widget", "multiplatform": True } } From 8cc5a906ffdca51f1fcdbda8468732e06be07902 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:57:07 +0200 Subject: [PATCH 07/12] modified schema to use new object_type definition --- .../projects_schema/1_plugins_gui_schema.json | 8 ++++---- .../gui_schemas/system_schema/1_examples.json | 16 ++++++++-------- .../system_schema/1_modules_gui_schema.json | 18 +++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json b/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json index 2fefe8df2d..f70d9345e5 100644 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json +++ b/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json @@ -172,8 +172,8 @@ "type": "list", "key": "profiles", "label": "Profiles", - "object_type": "dict", - "input_modifiers": { + "object_type": { + "type": "dict", "children": [ { "key": "families", @@ -192,8 +192,8 @@ "label": "Output Definitions", "type": "dict-modifiable", "highlight_content": true, - "object_type": "dict", - "input_modifiers": { + "object_type": { + "type": "dict", "children": [ { "key": "ext", diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json index 00aef304a9..dd0f7f20d1 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json @@ -67,16 +67,16 @@ "type": "list", "key": "list_item_of_multiline_texts", "label": "List of multiline texts", - "object_type": "text", - "input_modifiers": { + "object_type": { + "type": "text", "multiline": true } }, { "type": "list", "key": "list_item_of_floats", "label": "List of floats", - "object_type": "number", - "input_modifiers": { + "object_type": { + "type": "number", "decimal": 3, "minimum": 1000, "maximum": 2000 @@ -85,8 +85,8 @@ "type": "dict-modifiable", "key": "modifiable_dict_of_integers", "label": "Modifiable dict of integers", - "object_type": "number", - "input_modifiers": { + "object_type": { + "type": "number", "decimal": 0, "minimum": 10, "maximum": 100 @@ -213,8 +213,8 @@ "type": "list", "key": "dict_item", "label": "DictItem in List", - "object_type": "dict-item", - "input_modifiers": { + "object_type": { + "type": "dict-item", "children": [ { "key": "families", diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json index 7b3d8cdd13..d78c11838a 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json @@ -80,8 +80,8 @@ "type": "list", "key": "statuses_name_change", "label": "Status name change", - "object_type": "text", - "input_modifiers": { + "object_type": { + "type": "text", "multiline": false } }] @@ -96,9 +96,9 @@ "type": "dict-modifiable", "key": "status_update", "label": "Status Updates", - "object_type": "list", - "input_modifiers": { - "object_type": "text" + "object_type": { + "type": "list", + "object_type": "text" } }, { @@ -133,10 +133,10 @@ }, { "type": "list", - "object_type": "number", "key": "exclude_ports", "label": "Exclude ports", - "input_modifiers": { + "object_type": { + "type": "number", "minimum": 1, "maximum": 65535 } @@ -213,8 +213,8 @@ "label": "Muster Resl URL" },{ "type": "dict-modifiable", - "object_type": "number", - "input_modifiers": { + "object_type": { + "type": "number", "minimum": 0, "maximum": 300 }, From 7c80946cef55ea803fed79d76286b482cf3117b3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 17:57:15 +0200 Subject: [PATCH 08/12] modified readme --- pype/tools/settings/settings/README.md | 52 ++++++++++++++++++++------ 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/pype/tools/settings/settings/README.md b/pype/tools/settings/settings/README.md index 9492d8bc7b..e8b7fcdb57 100644 --- a/pype/tools/settings/settings/README.md +++ b/pype/tools/settings/settings/README.md @@ -84,8 +84,8 @@ "type": "list", "key": "profiles", "label": "Profiles", - "object_type": "dict-item", - "input_modifiers": { + "object_type": { + "type": "dict-item", "children": [ { "key": "families", @@ -199,37 +199,53 @@ - output is list - items can be added and removed - items in list must be the same type - - type of items is defined with key `"object_type"` where Pure input name is entered (e.g. `number`) - - because Pure inputs may have modifiers (`number` input has `minimum`, `maximum` and `decimals`) you can set these in key `"input_modifiers"` +- type of items is defined with key `"object_type"` +- there are 2 possible ways how to set the type: + 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) + 2.) item type name as string without modifiers (e.g. `text`) +1.) with item modifiers ``` { "type": "list", - "object_type": "number", "key": "exclude_ports", "label": "Exclude ports", - "input_modifiers": { - "minimum": 1, - "maximum": 65535 + "object_type": { + "type": "number", # number item type + "minimum": 1, # minimum modifier + "maximum": 65535 # maximum modifier } } ``` +2.) without modifiers +``` +{ + "type": "list", + "key": "exclude_ports", + "label": "Exclude ports", + "object_type": "text" +} +``` + ### dict-modifiable - one of dictionary inputs, this is only used as value input - items in this input can be removed and added same way as in `list` input - value items in dictionary must be the same type - - type of items is defined with key `"object_type"` where Pure input name is entered (e.g. `number`) - - because Pure inputs may have modifiers (`number` input has `minimum`, `maximum` and `decimals`) you can set these in key `"input_modifiers"` +- type of items is defined with key `"object_type"` +- there are 2 possible ways how to set the type: + 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) + 2.) item type name as string without modifiers (e.g. `text`) - this input can be expandable - that can be set with key `"expandable"` as `True`/`False` (Default: `True`) - with key `"expanded"` as `True`/`False` can be set that is expanded when GUI is opened (Default: `False`) +1.) with item modifiers ``` { "type": "dict-modifiable", - "object_type": "number", - "input_modifiers": { + "object_type": { + "type": "number", "minimum": 0, "maximum": 300 }, @@ -240,6 +256,18 @@ } ``` +2.) without modifiers +``` +{ + "type": "dict-modifiable", + "object_type": "text", + "is_group": true, + "key": "templates_mapping", + "label": "Muster - Templates mapping", + "is_file": true +} +``` + ### path-widget - input for paths, use `path-input` internally - has 2 input modifiers `"multiplatform"` and `"multipath"` From 0f05901ac7979b84d2b6f624dd8bf23163d07b48 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 19:11:03 +0200 Subject: [PATCH 09/12] simplified PathWidget with usage of dict as widget --- .../settings/settings/widgets/item_types.py | 146 +++++++----------- 1 file changed, 56 insertions(+), 90 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 0419c48c5c..9512680a39 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -2835,13 +2835,13 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self.multiplatform = input_data.get("multiplatform", False) self.multipath = input_data.get("multipath", False) - self.input_fields = [] + self.input_field = None layout = QtWidgets.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(5) - if not self._as_widget: + if not self.as_widget: self.key = input_data["key"] if not label_widget: label = input_data["label"] @@ -2882,45 +2882,49 @@ class PathWidget(QtWidgets.QWidget, SettingObject): ) self.setFocusProxy(path_input) self.content_layout.addWidget(path_input) - self.input_fields.append(path_input) + self.input_field = path_input path_input.value_changed.connect(self._on_value_change) return - input_data_for_list = { - "object_type": "path-input" - } if not self.multiplatform: - input_data_for_list["key"] = self.key + item_schema = { + "key": self.key, + "object_type": "path-input" + } input_widget = ListWidget( - input_data_for_list, self, label_widget=self.label_widget + item_schema, self, label_widget=self.label_widget ) self.setFocusProxy(input_widget) self.content_layout.addWidget(input_widget) - self.input_fields.append(input_widget) + self.input_field = input_widget input_widget.value_changed.connect(self._on_value_change) return - proxy_widget = QtWidgets.QWidget(self.content_widget) - proxy_layout = QtWidgets.QFormLayout(proxy_widget) + item_schema = { + "type": "dict", + "show_borders": False, + "children": [] + } for platform_key in self.platforms: platform_label = self.platform_labels_mapping[platform_key] - label_widget = QtWidgets.QLabel(platform_label, proxy_widget) + child_item = { + "key": platform_key, + "label": platform_label + } if self.multipath: - input_data_for_list["key"] = platform_key - input_widget = ListWidget( - input_data_for_list, self, label_widget=label_widget - ) + child_item["type"] = "list" + child_item["object_type"] = "path-input" else: - input_data = {"key": platform_key} - input_widget = PathInputWidget( - input_data, self, label_widget=label_widget - ) - proxy_layout.addRow(label_widget, input_widget) - self.input_fields.append(input_widget) - input_widget.value_changed.connect(self._on_value_change) + child_item["type"] = "path-input" - self.setFocusProxy(self.input_fields[0]) - self.content_layout.addWidget(proxy_widget) + item_schema["children"].append(child_item) + + input_widget = DictWidget( + item_schema, self, as_widget=True, label_widget=self.label_widget + ) + self.content_layout.addWidget(input_widget) + self.input_field = input_widget + input_widget.value_changed.connect(self._on_value_change) def update_default_values(self, parent_values): self._state = None @@ -2960,11 +2964,8 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._has_studio_override = False self._had_studio_override = False - if not self.multiplatform: - self.input_fields[0].update_default_values(value) - else: - for input_field in self.input_fields: - input_field.update_default_values(value) + # TODO handle invalid value type + self.input_field.update_default_values(value) def update_studio_values(self, parent_values): self._state = None @@ -2989,11 +2990,8 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._had_studio_override = False value = self.default_value - if not self.multiplatform: - self.input_fields[0].update_studio_values(value) - else: - for input_field in self.input_fields: - input_field.update_studio_values(value) + # TODO handle invalid value type + self.input_field.update_studio_values(value) def apply_overrides(self, parent_values): self._is_modified = False @@ -3012,11 +3010,8 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._is_overriden = override_values is not NOT_SET self._was_overriden = bool(self._is_overriden) - if not self.multiplatform: - self.input_fields[0].apply_overrides(parent_values) - else: - for input_field in self.input_fields: - input_field.apply_overrides(override_values) + # TODO handle invalid value type + self.input_field.update_studio_values(override_values) if not self._is_overriden: self._is_overriden = ( @@ -3029,12 +3024,13 @@ class PathWidget(QtWidgets.QWidget, SettingObject): def set_value(self, value): if not self.multiplatform: - self.input_fields[0].set_value(value) + return self.input_field.set_value(value) - else: - for input_field in self.input_fields: - _value = value[input_field.key] - input_field.set_value(_value) + for _input_field in self.input_field.input_fields: + _value = value.get(_input_field.key, NOT_SET) + if _value is NOT_SET: + continue + _input_field.set_value(_value) def _on_value_change(self, item=None): if self.ignore_value_changes: @@ -3095,17 +3091,14 @@ class PathWidget(QtWidgets.QWidget, SettingObject): def remove_overrides(self): self._is_overriden = False self._is_modified = False - for input_field in self.input_fields: - input_field.remove_overrides() + self.input_field.remove_overrides() def reset_to_pype_default(self): - for input_field in self.input_fields: - input_field.reset_to_pype_default() + self.input_field.reset_to_pype_default() self._has_studio_override = False def set_studio_default(self): - for input_field in self.input_fields: - input_field.set_studio_default() + self.input_field.set_studio_default() if self.is_group: self._has_studio_override = True @@ -3114,8 +3107,7 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._is_modified = False self._is_overriden = self._was_overriden - for input_field in self.input_fields: - input_field.discard_changes() + self.input_field.discard_changes() self._is_modified = self.child_modified @@ -3124,51 +3116,29 @@ class PathWidget(QtWidgets.QWidget, SettingObject): @property def child_has_studio_override(self): - for input_field in self.input_fields: - if ( - input_field.has_studio_override - or input_field.child_has_studio_override - ): - return True - return False + return ( + self.input_field.has_studio_override + or self.input_field.child_has_studio_override + ) @property def child_modified(self): - for input_field in self.input_fields: - if input_field.child_modified: - return True - return False + return self.input_field.child_modified @property def child_overriden(self): - for input_field in self.input_fields: - if input_field.child_overriden: - return True - return False + return self.input_field.child_overriden @property def child_invalid(self): - for input_field in self.input_fields: - if input_field.child_invalid: - return True - return False + return self.input_field.child_invalid def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() + self.input_field.hierarchical_style_update() self.update_style() def item_value(self): - if not self.multiplatform and not self.multipath: - return self.input_fields[0].item_value() - - if not self.multiplatform: - return self.input_fields[0].item_value() - - output = {} - for input_field in self.input_fields: - output.update(input_field.config_value()) - return output + return self.input_field.item_value() def studio_overrides(self): if ( @@ -3178,18 +3148,14 @@ class PathWidget(QtWidgets.QWidget, SettingObject): ): return NOT_SET, False - value = self.item_value() - if not self.multiplatform: - value = {self.key: value} + value = {self.key: self.item_value()} return value, self.is_group def overrides(self): if not self.is_overriden and not self.child_overriden: return NOT_SET, False - value = self.item_value() - if not self.multiplatform: - value = {self.key: value} + value = {self.key: self.item_value()} return value, self.is_group From 3a6c8e32eb518b74e1b56ebb0217b5641155eeb1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 19:14:20 +0200 Subject: [PATCH 10/12] DictWidget used as widget has ability to not add borders around the widget --- pype/tools/settings/settings/widgets/item_types.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 9512680a39..fd284bb339 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -2244,6 +2244,8 @@ class DictWidget(QtWidgets.QWidget, SettingObject): def _ui_as_widget(self, input_data): body = QtWidgets.QWidget(self) body.setObjectName("DictAsWidgetBody") + show_borders = str(int(input_data.get("show_borders", True))) + body.setProperty("show_borders", show_borders) content_layout = QtWidgets.QGridLayout(body) content_layout.setContentsMargins(5, 5, 5, 5) From 36a2edf2fbae8636c0684ffba7517cfbec279929 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 19:14:39 +0200 Subject: [PATCH 11/12] modified styles for dict widget --- pype/tools/settings/settings/style/style.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pype/tools/settings/settings/style/style.css b/pype/tools/settings/settings/style/style.css index ebea87203d..dcc7a5effe 100644 --- a/pype/tools/settings/settings/style/style.css +++ b/pype/tools/settings/settings/style/style.css @@ -168,8 +168,10 @@ QPushButton[btn-type="expand-toggle"] { background: #141a1f; } -#DictAsWidgetBody{ +#DictAsWidgetBody { background: transparent; +} +#DictAsWidgetBody[show_borders="1"] { border: 2px solid #cccccc; border-radius: 5px; } From c51daf918b706416cdb2bbb65cbce0e0af295bce Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 23 Sep 2020 19:40:29 +0200 Subject: [PATCH 12/12] fixed a lot of in path widget --- .../settings/settings/widgets/item_types.py | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index fd284bb339..379f058fab 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -2873,14 +2873,14 @@ class PathWidget(QtWidgets.QWidget, SettingObject): platform: value_type() for platform in self.platforms } - else: - return value_type() + return value_type() def create_gui(self): if not self.multiplatform and not self.multipath: input_data = {"key": self.key} path_input = PathInputWidget( - input_data, self, label_widget=self.label_widget + input_data, self, + as_widget=True, label_widget=self.label_widget ) self.setFocusProxy(path_input) self.content_layout.addWidget(path_input) @@ -2894,7 +2894,8 @@ class PathWidget(QtWidgets.QWidget, SettingObject): "object_type": "path-input" } input_widget = ListWidget( - item_schema, self, label_widget=self.label_widget + item_schema, self, + as_widget=True, label_widget=self.label_widget ) self.setFocusProxy(input_widget) self.content_layout.addWidget(input_widget) @@ -2934,21 +2935,15 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._is_modified = False value = NOT_SET - if self._as_widget: + if self.as_widget: value = parent_values elif parent_values is not NOT_SET: - if not self.multiplatform: - value = parent_values - else: - value = parent_values.get(self.key, NOT_SET) + value = parent_values.get(self.key, NOT_SET) if value is NOT_SET: if self.develop_mode: - if self._as_widget or not self.multiplatform: - value = {self.key: self.default_input_value} - else: - value = self.default_input_value self.defaults_not_set = True + value = self.default_input_value if value is NOT_SET: raise NotImplementedError(( "{} Does not have implemented" @@ -2975,13 +2970,10 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._is_modified = False value = NOT_SET - if self._as_widget: + if self.as_widget: value = parent_values elif parent_values is not NOT_SET: - if not self.multiplatform: - value = parent_values - else: - value = parent_values.get(self.key, NOT_SET) + value = parent_values.get(self.key, NOT_SET) self.studio_value = value if value is not NOT_SET: @@ -2990,7 +2982,6 @@ class PathWidget(QtWidgets.QWidget, SettingObject): else: self._has_studio_override = False self._had_studio_override = False - value = self.default_value # TODO handle invalid value type self.input_field.update_studio_values(value) @@ -3004,10 +2995,7 @@ class PathWidget(QtWidgets.QWidget, SettingObject): if self._as_widget: override_values = parent_values elif parent_values is not NOT_SET: - if not self.multiplatform: - override_values = parent_values - else: - override_values = parent_values.get(self.key, NOT_SET) + override_values = parent_values.get(self.key, NOT_SET) self._is_overriden = override_values is not NOT_SET self._was_overriden = bool(self._is_overriden) @@ -3075,7 +3063,7 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self.style().polish(self) self._child_state = child_state - if not self._as_widget: + if self.label_widget: state = self.style_state( child_has_studio_override, child_invalid, @@ -3106,30 +3094,36 @@ class PathWidget(QtWidgets.QWidget, SettingObject): self._has_studio_override = True def discard_changes(self): - self._is_modified = False self._is_overriden = self._was_overriden + self._has_studio_override = self._had_studio_override self.input_field.discard_changes() - self._is_modified = self.child_modified + if not self.is_overidable: + if self.has_studio_override: + self._is_modified = self.studio_value != self.item_value() + else: + self._is_modified = self.default_value != self.item_value() + self._is_overriden = False + return + + self._is_modified = False + self._is_overriden = self._was_overriden def set_as_overriden(self): self._is_overriden = True @property def child_has_studio_override(self): - return ( - self.input_field.has_studio_override - or self.input_field.child_has_studio_override - ) + return self.has_studio_override @property def child_modified(self): - return self.input_field.child_modified + return self.is_modified @property def child_overriden(self): - return self.input_field.child_overriden + return self.is_overriden @property def child_invalid(self):