From 765bafcc3916f574ca5b4b9d221ed114a9bd6994 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 26 Jan 2021 19:37:03 +0100 Subject: [PATCH] settings entities can create some gui instances --- .../settings/settings/widgets/item_types.py | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py index 2cd49bc941..eb9d104a8c 100644 --- a/pype/tools/settings/settings/widgets/item_types.py +++ b/pype/tools/settings/settings/widgets/item_types.py @@ -11,6 +11,21 @@ from .widgets import ( ) from .multiselection_combobox import MultiSelectionComboBox from .lib import NOT_SET, METADATA_KEY, TypeToKlass, CHILD_OFFSET +from pype.settings.entities import ( + GUIEntity, + DictImmutableKeysEntity, + DictMutableKeysEntity, + ListEntity, + PathEntity, + ListStrictEntity, + + NumberEntity, + BoolEntity, + EnumEntity, + TextEntity, + PathInput, + RawJsonEntity +) from pype.api import Logger from avalon.vendor import qtawesome @@ -4104,9 +4119,238 @@ class SplitterWidget(QtWidgets.QWidget): self.hidden_by_role = False +class BaseWidget(QtWidgets.QWidget): + def __init__(self, entity, entity_widget): + self.entity = entity + self.entity_widget = entity_widget + super(BaseWidget, self).__init__(entity_widget.content_widget) + self.label_widget = None + self.create_ui() + + def show_actions_menu(self, event): + print("Show actions for {}".format(self.entity.path)) + + +class GUIWidget(BaseWidget): + separator_height = 2 + + def create_ui(self): + entity_type = self.entity["type"] + if entity_type == "label": + self._create_label_ui() + elif entity_type in ("separator", "splitter"): + self._create_separator_ui() + else: + raise KeyError("Unknown GUI type {}".format(entity_type)) + + self.entity_widget.add_widget_to_layout(self) + + def _create_label_ui(self): + self.setObjectName("LabelWidget") + + label = self.entity["label"] + label_widget = QtWidgets.QLabel(label, self) + + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(0, 5, 0, 5) + layout.addWidget(label_widget) + + def _create_separator_ui(self): + splitter_item = QtWidgets.QWidget(self) + splitter_item.setObjectName("SplitterItem") + splitter_item.setMinimumHeight(self.separator_height) + splitter_item.setMaximumHeight(self.separator_height) + + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(5, 5, 5, 5) + layout.addWidget(splitter_item) + + +class DictImmutableKeysWidget(BaseWidget): + def create_ui(self): + self.input_fields = [] + + if not self.entity.is_dynamic_item and not self.entity.label: + self._ui_item_without_label() + + else: + self._ui_item_or_as_widget() + + for child_obj in self.entity.children: + self.input_fields.append( + create_ui_for_entity(child_obj, self) + ) + + self.entity_widget.add_widget_to_layout(self) + # 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_item_without_label(self): + self.setObjectName("DictInvisible") + + self.body_widget = None + self.content_widget = self + self.content_layout = QtWidgets.QGridLayout(self) + self.content_layout.setContentsMargins(0, 0, 0, 0) + self.content_layout.setSpacing(5) + + def _ui_item_or_as_widget(self): + content_widget = QtWidgets.QWidget(self) + + if self.entity.is_dynamic_item: + content_widget.setObjectName("DictAsWidgetBody") + show_borders = str(int(self.show_borders)) + content_widget.setProperty("show_borders", show_borders) + content_layout_margins = (5, 5, 5, 5) + main_layout_spacing = 5 + body_widget = None + label_widget = QtWidgets.QLabel(self.entity.label) + + else: + content_widget.setObjectName("ContentWidget") + if self.entity.highlight_content: + content_state = "hightlighted" + bottom_margin = 5 + else: + content_state = "" + bottom_margin = 0 + content_widget.setProperty("content_state", content_state) + content_layout_margins = (CHILD_OFFSET, 5, 0, bottom_margin) + main_layout_spacing = 0 + + body_widget = ExpandingWidget(self.entity.label, self) + label_widget = body_widget.label_widget + body_widget.set_content_widget(content_widget) + + content_layout = QtWidgets.QGridLayout(content_widget) + content_layout.setContentsMargins(*content_layout_margins) + + main_layout = QtWidgets.QHBoxLayout(self) + main_layout.setContentsMargins(0, 0, 0, 0) + main_layout.setSpacing(main_layout_spacing) + if not body_widget: + main_layout.addWidget(content_widget) + else: + main_layout.addWidget(body_widget) + + self.label_widget = label_widget + self.body_widget = body_widget + self.content_widget = content_widget + self.content_layout = content_layout + + if body_widget: + if len(self.input_fields) == 1 and self.checkbox_widget: + body_widget.hide_toolbox(hide_content=True) + + elif self.entity.collapsible: + if not self.entity.collapsed: + body_widget.toggle_content() + else: + body_widget.hide_toolbox(hide_content=False) + + def add_widget_to_layout(self, widget, label=None): + row = self.content_layout.rowCount() + if label: + label_widget = GridLabelWidget(label, widget) + label_widget.input_field = widget + widget.label_widget = label_widget + self.content_layout.addWidget(label_widget, row, 0, 1, 1) + self.content_layout.addWidget(widget, row, 1, 1, 1) + else: + self.content_layout.addWidget(widget, row, 0, 1, 2) + + +class BoolWidget(BaseWidget): + def create_ui(self): + checkbox_height = self.style().pixelMetric( + QtWidgets.QStyle.PM_IndicatorHeight + ) + self.input_field = NiceCheckbox(height=checkbox_height, parent=self) + + spacer = QtWidgets.QWidget(self) + spacer.setAttribute(QtCore.Qt.WA_TranslucentBackground) + + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(5) + + layout.addWidget(self.input_field, 0) + layout.addWidget(spacer, 1) + + self.setFocusProxy(self.input_field) + + self.input_field.stateChanged.connect(self._on_value_change) + self.entity_widget.add_widget_to_layout(self, self.entity.label) + + def _on_value_change(self): + print("value changed", self.entity.path) + + +class TextWidgetTwo(BaseWidget): + def create_ui(self): + multiline = self.entity.multiline + if multiline: + self.input_field = QtWidgets.QPlainTextEdit(self) + else: + self.input_field = QtWidgets.QLineEdit(self) + + placeholder_text = self.entity.placeholder_text + if placeholder_text: + self.input_field.setPlaceholderText(placeholder_text) + + self.setFocusProxy(self.input_field) + + layout_kwargs = {} + if multiline: + layout_kwargs["alignment"] = QtCore.Qt.AlignTop + + layout = QtWidgets.QHBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(5) + layout.addWidget(self.input_field, 1, **layout_kwargs) + + self.input_field.textChanged.connect(self._on_value_change) + + self.entity_widget.add_widget_to_layout(self, self.entity.label) + + def _on_value_change(self): + print("value changed", self.entity.path) + + +class NumberWidgetTwo(BaseWidget): def create_ui_for_entity(entity, entity_widget): + if isinstance(entity, GUIEntity): + return GUIWidget(entity, entity_widget) + + elif isinstance(entity, DictImmutableKeysEntity): + return DictImmutableKeysWidget(entity, entity_widget) + + elif isinstance(entity, BoolEntity): + return BoolWidget(entity, entity_widget) + + elif isinstance(entity, TextEntity): + return TextWidgetTwo(entity, entity_widget) + + elif isinstance(entity, NumberEntity): + return NumberWidgetTwo(entity, entity_widget) + + # DictMutableKeysEntity, + # ListEntity, + # PathEntity, + # ListStrictEntity, + # + # NumberEntity, + # EnumEntity, + # PathInput, + # RawJsonEntity label = "<{}>: {} ({})".format(entity.__class__.__name__, entity.path, entity.current_value) widget = QtWidgets.QLabel(label, entity_widget) entity_widget.add_widget_to_layout(widget)