settings entities can create some gui instances

This commit is contained in:
iLLiCiTiT 2021-01-26 19:37:03 +01:00
parent 8ae478935e
commit 765bafcc39

View file

@ -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)