From 2ee94bd890d0f86052f4d6278f751383d688a82b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 17:33:07 +0200 Subject: [PATCH 01/10] ListItem can be set as strict --- .../settings/settings/widgets/item_types.py | 76 ++++++++++--------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 68cebf6642..8c9fbd8640 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1291,11 +1291,16 @@ class ListItem(QtWidgets.QWidget, SettingObject): _btn_size = 20 value_changed = QtCore.Signal(object) - def __init__(self, object_type, input_modifiers, config_parent, parent): + def __init__( + self, object_type, input_modifiers, config_parent, parent, + is_strict=False + ): super(ListItem, self).__init__(parent) self._set_default_attributes() + self._is_strict = is_strict + self._parent = config_parent self._any_parent_is_group = True self._is_empty = False @@ -1307,34 +1312,38 @@ class ListItem(QtWidgets.QWidget, SettingObject): char_up = qtawesome.charmap("fa.angle-up") char_down = qtawesome.charmap("fa.angle-down") - self.add_btn = QtWidgets.QPushButton("+") - self.remove_btn = QtWidgets.QPushButton("-") - self.up_btn = QtWidgets.QPushButton(char_up) - self.down_btn = QtWidgets.QPushButton(char_down) + if not self._is_strict: + self.add_btn = QtWidgets.QPushButton("+") + self.remove_btn = QtWidgets.QPushButton("-") + self.up_btn = QtWidgets.QPushButton(char_up) + self.down_btn = QtWidgets.QPushButton(char_down) - font_up_down = qtawesome.font("fa", 13) - self.up_btn.setFont(font_up_down) - self.down_btn.setFont(font_up_down) + font_up_down = qtawesome.font("fa", 13) + self.up_btn.setFont(font_up_down) + self.down_btn.setFont(font_up_down) - self.add_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.remove_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.up_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.down_btn.setFocusPolicy(QtCore.Qt.ClickFocus) + self.add_btn.setFocusPolicy(QtCore.Qt.ClickFocus) + self.remove_btn.setFocusPolicy(QtCore.Qt.ClickFocus) + self.up_btn.setFocusPolicy(QtCore.Qt.ClickFocus) + self.down_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.add_btn.setFixedSize(self._btn_size, self._btn_size) - self.remove_btn.setFixedSize(self._btn_size, self._btn_size) - self.up_btn.setFixedSize(self._btn_size, self._btn_size) - self.down_btn.setFixedSize(self._btn_size, self._btn_size) + self.add_btn.setFixedSize(self._btn_size, self._btn_size) + self.remove_btn.setFixedSize(self._btn_size, self._btn_size) + self.up_btn.setFixedSize(self._btn_size, self._btn_size) + self.down_btn.setFixedSize(self._btn_size, self._btn_size) - self.add_btn.setProperty("btn-type", "tool-item") - self.remove_btn.setProperty("btn-type", "tool-item") - self.up_btn.setProperty("btn-type", "tool-item") - self.down_btn.setProperty("btn-type", "tool-item") + self.add_btn.setProperty("btn-type", "tool-item") + self.remove_btn.setProperty("btn-type", "tool-item") + self.up_btn.setProperty("btn-type", "tool-item") + self.down_btn.setProperty("btn-type", "tool-item") - self.add_btn.clicked.connect(self._on_add_clicked) - self.remove_btn.clicked.connect(self._on_remove_clicked) - self.up_btn.clicked.connect(self._on_up_clicked) - self.down_btn.clicked.connect(self._on_down_clicked) + self.add_btn.clicked.connect(self._on_add_clicked) + self.remove_btn.clicked.connect(self._on_remove_clicked) + self.up_btn.clicked.connect(self._on_up_clicked) + self.down_btn.clicked.connect(self._on_down_clicked) + + layout.addWidget(self.add_btn, 0) + layout.addWidget(self.remove_btn, 0) ItemKlass = TypeToKlass.types[object_type] self.value_input = ItemKlass( @@ -1344,18 +1353,17 @@ class ListItem(QtWidgets.QWidget, SettingObject): label_widget=None ) - self.spacer_widget = QtWidgets.QWidget(self) - self.spacer_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.spacer_widget.setVisible(False) - - layout.addWidget(self.add_btn, 0) - layout.addWidget(self.remove_btn, 0) - layout.addWidget(self.value_input, 1) - layout.addWidget(self.spacer_widget, 1) - layout.addWidget(self.up_btn, 0) - layout.addWidget(self.down_btn, 0) + if not self._is_strict: + self.spacer_widget = QtWidgets.QWidget(self) + self.spacer_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) + self.spacer_widget.setVisible(False) + + layout.addWidget(self.spacer_widget, 1) + + layout.addWidget(self.up_btn, 0) + layout.addWidget(self.down_btn, 0) self.value_input.value_changed.connect(self._on_value_change) From 0cccd9e3a7fe7a12866ba627f8d6770813838eca Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 17:44:55 +0200 Subject: [PATCH 02/10] implemented strict list --- .../settings/settings/widgets/item_types.py | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 8c9fbd8640..7afa6fca18 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1705,6 +1705,153 @@ class ListWidget(QtWidgets.QWidget, InputObject): return output +class ListStrictWidget(QtWidgets.QWidget, InputObject): + value_changed = QtCore.Signal(object) + _default_input_value = None + + def __init__( + self, input_data, parent, + as_widget=False, label_widget=None, parent_widget=None + ): + if parent_widget is None: + parent_widget = parent + super(ListStrictWidget, self).__init__(parent_widget) + self.setObjectName("ListStrictWidget") + + horizontal = input_data.get("horizontal", True) + + self.initial_attributes(input_data, parent, as_widget) + + self.input_fields = [] + + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 5) + layout.setSpacing(5) + + if not self.as_widget: + self.key = input_data["key"] + if not label_widget: + label_widget = QtWidgets.QLabel(input_data["label"], self) + layout.addWidget(label_widget, alignment=QtCore.Qt.AlignTop) + + self.label_widget = label_widget + + inputs_widget = QtWidgets.QWidget(self) + inputs_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) + layout.addWidget(inputs_widget) + + if horizontal: + inputs_layout = QtWidgets.QHBoxLayout(inputs_widget) + else: + inputs_layout = QtWidgets.QVBoxLayout(inputs_widget) + inputs_layout.setContentsMargins(0, 0, 0, 0) + inputs_layout.setSpacing(3) + + self.inputs_widget = inputs_widget + self.inputs_layout = inputs_layout + + for child_configuration in input_data["object_types"]: + object_type = child_configuration["type"] + + proxy_widget = QtWidgets.QWidget(self) + proxy_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) + + item_widget = ListItem( + object_type, child_configuration, self, proxy_widget, + is_strict=True + ) + + self.input_fields.append(item_widget) + item_widget.value_changed.connect(self._on_value_change) + + proxy_layout = QtWidgets.QHBoxLayout(proxy_widget) + proxy_layout.setContentsMargins(0, 0, 0, 0) + proxy_layout.setSpacing(5) + + label = child_configuration.get("label") + label_widget = None + if label: + label_widget = QtWidgets.QLabel(label, self) + proxy_layout.addWidget(label_widget, 0) + + proxy_layout.addWidget(item_widget, 0) + + if not horizontal: + spacer_widget = QtWidgets.QWidget(proxy_widget) + proxy_layout.addWidget(spacer_widget, 1) + + self.inputs_layout.addWidget(proxy_widget) + + if horizontal: + spacer_widget = QtWidgets.QWidget(proxy_widget) + self.inputs_layout.addWidget(spacer_widget, 1) + + self.updateGeometry() + + @property + def default_input_value(self): + if self._default_input_value is None: + self.set_value(NOT_SET) + self._default_input_value = self.item_value() + return self._default_input_value + + def set_value(self, value): + if self._is_overriden: + method_name = "apply_overrides" + elif not self._has_studio_override: + method_name = "update_default_values" + else: + method_name = "update_studio_values" + + for idx, input_field in enumerate(self.input_fields): + if value is NOT_SET: + _value = value + else: + if idx > len(value) - 1: + _value = NOT_SET + else: + _value = value[idx] + _method = getattr(input_field, method_name) + _method(_value) + + def hierarchical_style_update(self): + for input_field in self.input_fields: + input_field.hierarchical_style_update() + self.update_style() + + def update_style(self): + if self._as_widget: + if not self.isEnabled(): + state = self.style_state(False, False, False, False) + else: + state = self.style_state( + False, + self._is_invalid, + False, + self._is_modified + ) + else: + state = self.style_state( + self.has_studio_override, + self.is_invalid, + self.is_overriden, + self.is_modified + ) + + if self._state == state: + return + + if self.label_widget: + self.label_widget.setProperty("state", state) + self.label_widget.style().polish(self.label_widget) + + def item_value(self): + output = [] + for item in self.input_fields: + output.append(item.config_value()) + return output + + class ModifiableDictItem(QtWidgets.QWidget, SettingObject): _btn_size = 20 value_changed = QtCore.Signal(object) @@ -3360,6 +3507,7 @@ TypeToKlass.types["text"] = TextWidget TypeToKlass.types["path-input"] = PathInputWidget TypeToKlass.types["raw-json"] = RawJsonWidget TypeToKlass.types["list"] = ListWidget +TypeToKlass.types["list-strict"] = ListStrictWidget TypeToKlass.types["dict-modifiable"] = ModifiableDict TypeToKlass.types["dict-item"] = DictItemWidget TypeToKlass.types["dict"] = DictWidget From a13755c341d67a91b9a70ce23440c16ce0d544d9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 17:46:08 +0200 Subject: [PATCH 03/10] make sure defaults_not_set is set to False if defaults are available --- pype/tools/settings/settings/widgets/item_types.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 7afa6fca18..4a9e092a99 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -547,6 +547,7 @@ class InputObject(SettingObject): Class is for item types not creating or using other item types, most of methods has same code in that case. """ + def update_default_values(self, parent_values): self._state = None self._is_modified = False @@ -559,8 +560,8 @@ class InputObject(SettingObject): if value is NOT_SET: if self.develop_mode: - 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" @@ -571,6 +572,8 @@ class InputObject(SettingObject): raise ValueError( "Default value is not set. This is implementation BUG." ) + else: + self.defaults_not_set = False self.default_value = value self._has_studio_override = False @@ -3024,6 +3027,8 @@ class PathWidget(QtWidgets.QWidget, SettingObject): raise ValueError( "Default value is not set. This is implementation BUG." ) + else: + self.defaults_not_set = False self.default_value = value self._has_studio_override = False From d3e61cea7dd01d4d950c9786d9184d20a0b59485 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 17:46:24 +0200 Subject: [PATCH 04/10] added strict list and dict-item to readme --- pype/tools/settings/settings/README.md | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/pype/tools/settings/settings/README.md b/pype/tools/settings/settings/README.md index db444eb3bd..9d12467cc9 100644 --- a/pype/tools/settings/settings/README.md +++ b/pype/tools/settings/settings/README.md @@ -207,6 +207,85 @@ } ``` +### dict-item +- item represents dictionary with strict keys in and data types of its values +- can be used only as widget (in `list` or `dict-modifiable`) + - only key modifier is `children` which is list of it's keys +- USAGE: e.g. List of dictionaries where each dictionary have same structure. + +``` +{ + "type": "list", + "key": "profiles", + "label": "Profiles", + "object_type": "dict-item", + "input_modifiers": { + "children": [ + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, { + "key": "hosts", + "label": "Hosts", + "type": "list", + "object_type": "text" + } + ... + ] + } +} +``` + +### list-strict +- input for strict number of items in list +- each child item can be different type with different possible modifiers +- it is possible to display them in horizontal or vertical layout + - key `"horizontal"` as `True`/`False` (Default: `True`) +- each child may have defined `"label"` which is shown next to input + - label does not reflect modifications or overrides (TODO) +- children item are defined under key `"object_types"` which is list of dictionaries + - key `"children"` is not used because is used for hierarchy validations in schema +- USAGE: For colors, transformations, etc. Custom number and different modifiers + give ability to define if color is HUE or RGB, 0-255, 0-1, 0-100 etc. + +``` +{ + "type": "list-strict", + "key": "color", + "label": "Color", + "object_types": [ + { + "label": "Red", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Green", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Blue", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Alpha", + "type": "number", + "minimum": 0, + "maximum": 1, + "decimal": 6 + } + ] +} +``` + + ## Noninteractive widgets - have nothing to do with data From 060aa04f93f6999ddc9146ba762d81eb9ffeb8fa Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 17:49:16 +0200 Subject: [PATCH 05/10] added dict-item and list-strict to examples --- .../gui_schemas/system_schema/1_examples.json | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) 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 73f72c875c..1284c9948b 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 @@ -72,6 +72,57 @@ "minimum": 10, "maximum": 100 } + }, { + "type": "list-strict", + "key": "strict_list", + "label": "StrictList (color)", + "object_types": [ + { + "label": "Red", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Green", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Blue", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Alpha", + "type": "number", + "minimum": 0, + "maximum": 1, + "decimal": 6 + } + ] + }, { + "type": "list", + "key": "dict_item", + "label": "DictItem in List", + "object_type": "dict-item", + "input_modifiers": { + "children": [ + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, { + "key": "hosts", + "label": "Hosts", + "type": "list", + "object_type": "text" + } + ] + } }, { "type": "path-widget", "key": "single_path_input", From 8f967c9d6df25f85bad8ef633890688f51a54aff Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 18:16:21 +0200 Subject: [PATCH 06/10] added more variants to list-strict --- .../gui_schemas/system_schema/1_examples.json | 91 ++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) 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 1284c9948b..0578968508 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 @@ -74,8 +74,8 @@ } }, { "type": "list-strict", - "key": "strict_list", - "label": "StrictList (color)", + "key": "strict_list_labels_horizontal", + "label": "StrictList-labels-horizontal (color)", "object_types": [ { "label": "Red", @@ -103,6 +103,93 @@ "decimal": 6 } ] + }, { + "type": "list-strict", + "key": "strict_list_labels_vertical", + "label": "StrictList-labels-vertical (color)", + "horizontal": false, + "object_types": [ + { + "label": "Red", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Green", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Blue", + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "label": "Alpha", + "type": "number", + "minimum": 0, + "maximum": 1, + "decimal": 6 + } + ] + }, { + "type": "list-strict", + "key": "strict_list_nolabels_horizontal", + "label": "StrictList-nolabels-horizontal (color)", + "object_types": [ + { + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "type": "number", + "minimum": 0, + "maximum": 1, + "decimal": 6 + } + ] + }, { + "type": "list-strict", + "key": "strict_list_nolabels_vertical", + "label": "StrictList-nolabels-vertical (color)", + "horizontal": false, + "object_types": [ + { + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "type": "number", + "minimum": 0, + "maximum": 255, + "decimal": 0 + }, { + "type": "number", + "minimum": 0, + "maximum": 1, + "decimal": 6 + } + ] }, { "type": "list", "key": "dict_item", From 85a55b4f1b649c5d9d6bd3f27360ae2deaca6239 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 18:16:34 +0200 Subject: [PATCH 07/10] list-strict use grid layout now --- .../settings/settings/widgets/item_types.py | 90 ++++++++++++++----- 1 file changed, 67 insertions(+), 23 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 4a9e092a99..01dab9ccc9 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -1721,8 +1721,6 @@ class ListStrictWidget(QtWidgets.QWidget, InputObject): super(ListStrictWidget, self).__init__(parent_widget) self.setObjectName("ListStrictWidget") - horizontal = input_data.get("horizontal", True) - self.initial_attributes(input_data, parent, as_widget) self.input_fields = [] @@ -1739,58 +1737,91 @@ class ListStrictWidget(QtWidgets.QWidget, InputObject): self.label_widget = label_widget + self._add_children(layout, input_data) + + def _add_children(self, layout, input_data): inputs_widget = QtWidgets.QWidget(self) inputs_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) layout.addWidget(inputs_widget) + horizontal = input_data.get("horizontal", True) if horizontal: inputs_layout = QtWidgets.QHBoxLayout(inputs_widget) else: - inputs_layout = QtWidgets.QVBoxLayout(inputs_widget) + inputs_layout = QtWidgets.QGridLayout(inputs_widget) + inputs_layout.setContentsMargins(0, 0, 0, 0) inputs_layout.setSpacing(3) self.inputs_widget = inputs_widget self.inputs_layout = inputs_layout + children_item_mapping = [] for child_configuration in input_data["object_types"]: object_type = child_configuration["type"] - proxy_widget = QtWidgets.QWidget(self) - proxy_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - item_widget = ListItem( - object_type, child_configuration, self, proxy_widget, + object_type, child_configuration, self, self.inputs_widget, is_strict=True ) self.input_fields.append(item_widget) item_widget.value_changed.connect(self._on_value_change) - proxy_layout = QtWidgets.QHBoxLayout(proxy_widget) - proxy_layout.setContentsMargins(0, 0, 0, 0) - proxy_layout.setSpacing(5) - label = child_configuration.get("label") label_widget = None if label: label_widget = QtWidgets.QLabel(label, self) - proxy_layout.addWidget(label_widget, 0) - proxy_layout.addWidget(item_widget, 0) - - if not horizontal: - spacer_widget = QtWidgets.QWidget(proxy_widget) - proxy_layout.addWidget(spacer_widget, 1) - - self.inputs_layout.addWidget(proxy_widget) + children_item_mapping.append((label_widget, item_widget)) if horizontal: - spacer_widget = QtWidgets.QWidget(proxy_widget) - self.inputs_layout.addWidget(spacer_widget, 1) + self._add_children_horizontally(children_item_mapping) + else: + self._add_children_vertically(children_item_mapping) self.updateGeometry() + def _add_children_vertically(self, children_item_mapping): + any_has_label = False + for item_mapping in children_item_mapping: + if item_mapping[0]: + any_has_label = True + break + + row = self.inputs_layout.count() + if not any_has_label: + self.inputs_layout.setColumnStretch(1, 1) + for item_mapping in children_item_mapping: + item_widget = item_mapping[1] + self.inputs_layout.addWidget(item_widget, row, 0, 1, 1) + + spacer_widget = QtWidgets.QWidget(self.inputs_widget) + self.inputs_layout.addWidget(spacer_widget, row, 1, 1, 1) + row += 1 + + else: + self.inputs_layout.setColumnStretch(2, 1) + for label_widget, item_widget in children_item_mapping: + self.inputs_layout.addWidget( + label_widget, row, 0, 1, 1, + alignment=QtCore.Qt.AlignRight | QtCore.Qt.AlignTop + ) + self.inputs_layout.addWidget(item_widget, row, 1, 1, 1) + + spacer_widget = QtWidgets.QWidget(self.inputs_widget) + self.inputs_layout.addWidget(spacer_widget, row, 2, 1, 1) + row += 1 + + def _add_children_horizontally(self, children_item_mapping): + for label_widget, item_widget in children_item_mapping: + if label_widget: + self.inputs_layout.addWidget(label_widget, 0) + self.inputs_layout.addWidget(item_widget, 0) + + spacer_widget = QtWidgets.QWidget(self.inputs_widget) + self.inputs_layout.addWidget(spacer_widget, 1) + @property def default_input_value(self): if self._default_input_value is None: @@ -1840,7 +1871,7 @@ class ListStrictWidget(QtWidgets.QWidget, InputObject): self.is_overriden, self.is_modified ) - + if self._state == state: return @@ -2630,6 +2661,18 @@ class DictWidget(QtWidgets.QWidget, SettingObject): return {self.key: values}, self.is_group +class GridLabel(QtWidgets.QLabel): + def __init__(self, *args, **kwargs): + super(GridLabel, self).__init__(*args, **kwargs) + self.input_field = None + + def mouseReleaseEvent(self, event): + if self.input_field: + print("here", self.input_field) + self.input_field.mouseReleaseEvent(event) + return super(GridLabel, self).mouseReleaseEvent(event) + + class DictInvisible(QtWidgets.QWidget, SettingObject): # TODO is not overridable by itself value_changed = QtCore.Signal(object) @@ -2679,7 +2722,7 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): if not klass.expand_in_grid: label = child_configuration.get("label") if label is not None: - label_widget = QtWidgets.QLabel(label, self) + label_widget = GridLabel(label, self) self.content_layout.addWidget( label_widget, row, 0, 1, 1, alignment=QtCore.Qt.AlignRight | QtCore.Qt.AlignTop @@ -2689,6 +2732,7 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): item.value_changed.connect(self._on_value_change) if label_widget: + label_widget.input_field = item self.content_layout.addWidget(item, row, 1, 1, 1) else: self.content_layout.addWidget(item, row, 0, 1, 2) From dcb0db7937a94e438568308d942cbd13e76d48bc Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 18:19:51 +0200 Subject: [PATCH 08/10] reverse testing changes --- .../tools/settings/settings/widgets/item_types.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 01dab9ccc9..3bbf352f8b 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -2661,18 +2661,6 @@ class DictWidget(QtWidgets.QWidget, SettingObject): return {self.key: values}, self.is_group -class GridLabel(QtWidgets.QLabel): - def __init__(self, *args, **kwargs): - super(GridLabel, self).__init__(*args, **kwargs) - self.input_field = None - - def mouseReleaseEvent(self, event): - if self.input_field: - print("here", self.input_field) - self.input_field.mouseReleaseEvent(event) - return super(GridLabel, self).mouseReleaseEvent(event) - - class DictInvisible(QtWidgets.QWidget, SettingObject): # TODO is not overridable by itself value_changed = QtCore.Signal(object) @@ -2722,7 +2710,7 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): if not klass.expand_in_grid: label = child_configuration.get("label") if label is not None: - label_widget = GridLabel(label, self) + label_widget = QtWidget.QLabel(label, self) self.content_layout.addWidget( label_widget, row, 0, 1, 1, alignment=QtCore.Qt.AlignRight | QtCore.Qt.AlignTop @@ -2732,7 +2720,6 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): item.value_changed.connect(self._on_value_change) if label_widget: - label_widget.input_field = item self.content_layout.addWidget(item, row, 1, 1, 1) else: self.content_layout.addWidget(item, row, 0, 1, 2) From cc8faba5bffbabec5e6f0d6f7d253ebd4a59aa8d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 18 Sep 2020 18:20:52 +0200 Subject: [PATCH 09/10] typo fix --- pype/tools/settings/settings/widgets/item_types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 3bbf352f8b..bf9155f765 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -2710,7 +2710,7 @@ class DictInvisible(QtWidgets.QWidget, SettingObject): if not klass.expand_in_grid: label = child_configuration.get("label") if label is not None: - label_widget = QtWidget.QLabel(label, self) + label_widget = QtWidgets.QLabel(label, self) self.content_layout.addWidget( label_widget, row, 0, 1, 1, alignment=QtCore.Qt.AlignRight | QtCore.Qt.AlignTop From 83ff6bc85bd8c0016c97fca91e8ac07169ac4a58 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 21 Sep 2020 12:03:57 +0200 Subject: [PATCH 10/10] removed dict-item from readme --- pype/tools/settings/settings/README.md | 31 -------------------------- 1 file changed, 31 deletions(-) diff --git a/pype/tools/settings/settings/README.md b/pype/tools/settings/settings/README.md index 9d12467cc9..8fa0a4616a 100644 --- a/pype/tools/settings/settings/README.md +++ b/pype/tools/settings/settings/README.md @@ -207,37 +207,6 @@ } ``` -### dict-item -- item represents dictionary with strict keys in and data types of its values -- can be used only as widget (in `list` or `dict-modifiable`) - - only key modifier is `children` which is list of it's keys -- USAGE: e.g. List of dictionaries where each dictionary have same structure. - -``` -{ - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": "dict-item", - "input_modifiers": { - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - } - ... - ] - } -} -``` - ### list-strict - input for strict number of items in list - each child item can be different type with different possible modifiers