From 3fb4460b7b412bddff727e438d706c1c567a987f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 26 Jun 2020 14:13:54 +0300 Subject: [PATCH] feat(resolve): creator plugin with dynamic widget --- pype/hosts/resolve/menu_style.qss | 4 + pype/hosts/resolve/plugin.py | 84 ++++++++++++++----- .../resolve/create/create_shot_clip.py | 39 +-------- 3 files changed, 69 insertions(+), 58 deletions(-) diff --git a/pype/hosts/resolve/menu_style.qss b/pype/hosts/resolve/menu_style.qss index 516c9af72b..f3bfa7a30c 100644 --- a/pype/hosts/resolve/menu_style.qss +++ b/pype/hosts/resolve/menu_style.qss @@ -41,3 +41,7 @@ QLabel { #Spacer { background-color: #282828; } + +#ContentLayout { + background-color: #585858; +} diff --git a/pype/hosts/resolve/plugin.py b/pype/hosts/resolve/plugin.py index c1aa05dc7d..8c5fd321d1 100644 --- a/pype/hosts/resolve/plugin.py +++ b/pype/hosts/resolve/plugin.py @@ -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 diff --git a/pype/plugins/resolve/create/create_shot_clip.py b/pype/plugins/resolve/create/create_shot_clip.py index bba9851c0f..18759a2f98 100644 --- a/pype/plugins/resolve/create/create_shot_clip.py +++ b/pype/plugins/resolve/create/create_shot_clip.py @@ -1,13 +1,6 @@ from pprint import pformat from pype.hosts import resolve from pype.hosts.resolve import lib -import re - - -def camel_case_split(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]) class CreateShotClip(resolve.Creator): @@ -18,44 +11,16 @@ class CreateShotClip(resolve.Creator): icon = "film" defaults = ["Main"] + gui_name = "Define sequencial rename" presets = None - # widget - layout = [{ - "type": "QLabel", - "label": "Define sequencial rename" - }] - - def add_presets_to_layout(self, data): - for k, v in data.items(): - if isinstance(v, dict): - self.layout.append({ - "type": "QLabel", - "label": camel_case_split(k) - }) - self.add_presets_to_layout(v) - elif isinstance(v, str): - self.layout.append({ - "type": "QLineEdit", - "label": camel_case_split(k), - "setText": v - }) - elif isinstance(v, int): - self.layout.append({ - "type": "QSpinBox", - "label": camel_case_split(k), - "setValue": v - }) - def process(self): print(f"__ selected_clips: {self.selected}") if len(self.selected) < 1: return - self.add_presets_to_layout(self.presets) - - widget = self.widget(self.layout) + widget = self.widget(self.gui_name, self.presets) widget.exec_() print(widget.result)