diff --git a/pype/hosts/resolve/menu_style.qss b/pype/hosts/resolve/menu_style.qss index df4fd7e949..c43886c7c3 100644 --- a/pype/hosts/resolve/menu_style.qss +++ b/pype/hosts/resolve/menu_style.qss @@ -20,6 +20,14 @@ QPushButton:hover { color: #e64b3d; } +QSpinBox { + background-color: #ffffff; +} + +QLineEdit { + background-color: #ffffff; +} + #PypeMenu { border: 1px solid #fef9ef; } diff --git a/pype/hosts/resolve/plugin.py b/pype/hosts/resolve/plugin.py index 002d12106d..2eff278b80 100644 --- a/pype/hosts/resolve/plugin.py +++ b/pype/hosts/resolve/plugin.py @@ -1,8 +1,82 @@ +import sys from avalon import api from pype.hosts import resolve from avalon.vendor import qargparse from pype.api import config +from Qt import QtWidgets + + +class Universal_widget(QtWidgets.QDialog): + def __init__(self, widgets, parent=None): + super(Universal_widget, self).__init__(parent) + + # Where inputs and labels are set + content_widget = QtWidgets.QWidget(self) + content_layout = QtWidgets.QFormLayout(content_widget) + + 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]) + + content_layout.addRow(label, item) + self.items.update({ + w["label"]: item + }) + + # Confirmation buttons + btns_widget = QtWidgets.QWidget(self) + btns_layout = QtWidgets.QHBoxLayout(btns_widget) + + cancel_btn = QtWidgets.QPushButton("Cancel") + btns_layout.addWidget(cancel_btn) + + ok_btn = QtWidgets.QPushButton("Ok") + btns_layout.addWidget(ok_btn) + + # Main layout of the dialog + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.setContentsMargins(0, 0, 0, 0) + main_layout.setSpacing(0) + + main_layout.addWidget(content_widget) + main_layout.addWidget(btns_widget) + + ok_btn.clicked.connect(self._on_ok_clicked) + cancel_btn.clicked.connect(self._on_cancel_clicked) + + stylesheet = resolve.menu.load_stylesheet() + self.setStyleSheet(stylesheet) + + def _on_ok_clicked(self): + self.value() + self.close() + + def _on_cancel_clicked(self): + self.result = None + self.close() + + def value(self): + for k, v in self.items.items(): + if getattr(v, "value", None): + result = getattr(v, "value") + else: + result = getattr(v, "text") + self.items[k] = result() + self.result = self.items + def get_reference_node_parents(ref): """Return all parent reference nodes of reference node @@ -95,4 +169,4 @@ class Creator(api.Creator): else: self.selected = resolve.get_current_track_items(filter=False) - return + self.widget = Universal_widget diff --git a/pype/plugins/resolve/create/create_shot_clip.py b/pype/plugins/resolve/create/create_shot_clip.py index c12d5541d4..bba9851c0f 100644 --- a/pype/plugins/resolve/create/create_shot_clip.py +++ b/pype/plugins/resolve/create/create_shot_clip.py @@ -1,6 +1,13 @@ from pprint import pformat from pype.hosts import resolve -from avalon.vendor import Qt +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): @@ -13,11 +20,51 @@ class CreateShotClip(resolve.Creator): presets = None - def process(self): - from pype.hosts.resolve import lib + # 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.exec_() + + print(widget.result) + if widget.result: + print("success") + return + else: + return + # sequence attrs sq_frame_start = self.sequence.GetStartFrame() sq_markers = self.sequence.GetMarkers()