feat(resolve): creator plugin with dynamic widget

This commit is contained in:
Jakub Jezek 2020-06-26 14:13:54 +03:00
parent ccadf98c50
commit 3fb4460b7b
No known key found for this signature in database
GPG key ID: C4B96E101D2A47F3
3 changed files with 69 additions and 58 deletions

View file

@ -41,3 +41,7 @@ QLabel {
#Spacer {
background-color: #282828;
}
#ContentLayout {
background-color: #585858;
}

View file

@ -1,4 +1,5 @@
import sys
import re
from avalon import api
from pype.hosts import resolve
from avalon.vendor import qargparse
@ -8,7 +9,11 @@ from Qt import QtWidgets, QtCore
class Universal_widget(QtWidgets.QDialog):
def __init__(self, widgets, parent=None):
# output items
items = dict()
def __init__(self, name, presets, parent=None):
super(Universal_widget, self).__init__(parent)
self.setObjectName("PypeCreatorInput")
@ -24,28 +29,14 @@ class Universal_widget(QtWidgets.QDialog):
# Where inputs and labels are set
content_widget = QtWidgets.QWidget(self)
content_layout = QtWidgets.QFormLayout(content_widget)
self.content_layout = QtWidgets.QFormLayout(content_widget)
self.content_layout.setObjectName("ContentLayout")
self.items = dict()
for w in widgets:
attr = getattr(QtWidgets, w["type"])
label = QtWidgets.QLabel(w["label"])
attr_name = w["label"].replace(" ", "").lower()
setattr(
self,
attr_name,
attr(parent=self))
item = getattr(self, attr_name)
func = next((k for k in w if k not in ["label", "type"]), None)
if func:
if getattr(item, func):
func_attr = getattr(item, func)
func_attr(w[func])
# first add widget tag line
self.create_row("QLabel", name)
content_layout.addRow(label, item)
self.items.update({
w["label"]: item
})
# add preset data into input widget layout
self.add_presets_to_layout(presets)
# Confirmation buttons
btns_widget = QtWidgets.QWidget(self)
@ -88,6 +79,57 @@ class Universal_widget(QtWidgets.QDialog):
self.items[k] = result()
self.result = self.items
def camel_case_split(self, text):
matches = re.finditer(
'.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)', text)
return " ".join([str(m.group(0)).capitalize() for m in matches])
def create_row(self, type, text, **kwargs):
# get type attribute from qwidgets
attr = getattr(QtWidgets, type)
# convert label text to normal capitalized text with spaces
label_text = self.camel_case_split(text)
# assign the new text to lable widget
label = QtWidgets.QLabel(label_text)
# create attribute name text strip of spaces
attr_name = text.replace(" ", "")
# create attribute and assign default values
setattr(
self,
attr_name,
attr(parent=self))
# assign the created attribute to variable
item = getattr(self, attr_name)
for func, val in kwargs.items():
if getattr(item, func):
func_attr = getattr(item, func)
func_attr(val)
self.content_layout.addRow(label, item)
return item
def add_presets_to_layout(self, data):
for k, v in data.items():
if isinstance(v, dict):
# if nested dict then create label
# TODO: create also new layout
self.create_row("QLabel", k)
self.add_presets_to_layout(v)
elif isinstance(v, str):
item = self.create_row("QLineEdit", k, setText=v)
elif isinstance(v, int):
item = self.create_row("QSpinBox", k, setValue=v)
# add it to items for later requests
self.items.update({
k: item
})
def get_reference_node_parents(ref):
"""Return all parent reference nodes of reference node