From 4391a14da2a2f4063b3692a089b2ae9a1c948040 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 26 Jun 2020 20:28:15 +0300 Subject: [PATCH] feat(resolve): adding Create widget with style --- pype/hosts/resolve/lib.py | 2 +- pype/hosts/resolve/menu_style.qss | 29 +++-- pype/hosts/resolve/plugin.py | 112 +++++++++++++----- .../resolve/create/create_shot_clip.py | 25 ++-- 4 files changed, 116 insertions(+), 52 deletions(-) diff --git a/pype/hosts/resolve/lib.py b/pype/hosts/resolve/lib.py index db3bd989bf..deb4fa6339 100644 --- a/pype/hosts/resolve/lib.py +++ b/pype/hosts/resolve/lib.py @@ -77,7 +77,7 @@ def get_current_track_items( if filter is True: if selecting_color in ti_color: selected_clips.append(data) - ti.ClearClipColor() + # ti.ClearClipColor() else: selected_clips.append(data) diff --git a/pype/hosts/resolve/menu_style.qss b/pype/hosts/resolve/menu_style.qss index f3bfa7a30c..ea11c4ca2e 100644 --- a/pype/hosts/resolve/menu_style.qss +++ b/pype/hosts/resolve/menu_style.qss @@ -1,6 +1,7 @@ QWidget { background-color: #282828; border-radius: 3; + font-size: 13px; } QPushButton { @@ -21,27 +22,37 @@ QPushButton:hover { } QSpinBox { - background-color: #ffffff; - padding: 5; + border: 1px solid #090909; + background-color: #201f1f; + color: #ffffff; + padding: 2; + max-width: 8em; + qproperty-alignment: AlignCenter; } QLineEdit { - background-color: #ffffff; - padding: 5; -} - -QLabel { + border: 1px solid #090909; + border-radius: 3px; + background-color: #201f1f; color: #ffffff; + padding: 2; + min-width: 10em; + qproperty-alignment: AlignCenter; } #PypeMenu { border: 1px solid #fef9ef; } -#Spacer { +QVBoxLayout { background-color: #282828; } -#ContentLayout { +#Devider { + border: 1px solid #090909; background-color: #585858; } + +QLabel { + color: #77776b; +} diff --git a/pype/hosts/resolve/plugin.py b/pype/hosts/resolve/plugin.py index 8c5fd321d1..4e7ac80add 100644 --- a/pype/hosts/resolve/plugin.py +++ b/pype/hosts/resolve/plugin.py @@ -1,4 +1,3 @@ -import sys import re from avalon import api from pype.hosts import resolve @@ -13,10 +12,10 @@ class Universal_widget(QtWidgets.QDialog): # output items items = dict() - def __init__(self, name, presets, parent=None): + def __init__(self, name, info, presets, parent=None): super(Universal_widget, self).__init__(parent) - self.setObjectName("PypeCreatorInput") + self.setObjectName(name) self.setWindowFlags( QtCore.Qt.Window @@ -25,18 +24,25 @@ class Universal_widget(QtWidgets.QDialog): | QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowStaysOnTopHint ) - self.setWindowTitle("CreatorInput") + self.setWindowTitle(name or "Pype Creator Input") # Where inputs and labels are set - content_widget = QtWidgets.QWidget(self) - self.content_layout = QtWidgets.QFormLayout(content_widget) - self.content_layout.setObjectName("ContentLayout") + self.content_widget = [QtWidgets.QWidget(self)] + top_layout = QtWidgets.QFormLayout(self.content_widget[0]) + top_layout.setObjectName("ContentLayout") + top_layout.addWidget(Spacer(5, self)) # first add widget tag line - self.create_row("QLabel", name) + top_layout.addWidget(QtWidgets.QLabel(info)) + + top_layout.addWidget(Spacer(5, self)) + + # main dynamic layout + self.content_widget.append(QtWidgets.QWidget(self)) + content_layout = QtWidgets.QFormLayout(self.content_widget[-1]) # add preset data into input widget layout - self.add_presets_to_layout(presets) + self.items = self.add_presets_to_layout(content_layout, presets) # Confirmation buttons btns_widget = QtWidgets.QWidget(self) @@ -50,10 +56,13 @@ class Universal_widget(QtWidgets.QDialog): # Main layout of the dialog main_layout = QtWidgets.QVBoxLayout(self) - main_layout.setContentsMargins(10, 20, 10, 20) + main_layout.setContentsMargins(10, 10, 10, 10) main_layout.setSpacing(0) - main_layout.addWidget(content_widget) + # adding content widget + for w in self.content_widget: + main_layout.addWidget(w) + main_layout.addWidget(btns_widget) ok_btn.clicked.connect(self._on_ok_clicked) @@ -63,28 +72,34 @@ class Universal_widget(QtWidgets.QDialog): self.setStyleSheet(stylesheet) def _on_ok_clicked(self): - self.value() + self.result = self.value(self.items) 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): + def value(self, data): + for k, v in data.items(): + if isinstance(v, dict): + print(f"nested: {k}") + data[k] = self.value(v) + elif getattr(v, "value", None): + print(f"normal int: {k}") result = getattr(v, "value") + data[k] = result() else: + print(f"normal text: {k}") result = getattr(v, "text") - self.items[k] = result() - self.result = self.items + data[k] = result() + return data 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): + def create_row(self, layout, type, text, **kwargs): # get type attribute from qwidgets attr = getattr(QtWidgets, type) @@ -93,6 +108,7 @@ class Universal_widget(QtWidgets.QDialog): # assign the new text to lable widget label = QtWidgets.QLabel(label_text) + label.setObjectName("LineLabel") # create attribute name text strip of spaces attr_name = text.replace(" ", "") @@ -110,25 +126,57 @@ class Universal_widget(QtWidgets.QDialog): func_attr = getattr(item, func) func_attr(val) - self.content_layout.addRow(label, item) + # add to layout + layout.addRow(label, item) + return item - def add_presets_to_layout(self, data): + def add_presets_to_layout(self, content_layout, 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) + # adding spacer between sections + self.content_widget.append(QtWidgets.QWidget(self)) + devider = QtWidgets.QVBoxLayout(self.content_widget[-1]) + devider.addWidget(Spacer(5, self)) + devider.setObjectName("Devider") - # add it to items for later requests - self.items.update({ - k: item - }) + # adding nested layout with label + self.content_widget.append(QtWidgets.QWidget(self)) + nested_content_layout = QtWidgets.QFormLayout( + self.content_widget[-1]) + nested_content_layout.setObjectName("NestedContentLayout") + + # add nested key as label + self.create_row(nested_content_layout, "QLabel", k) + data[k] = self.add_presets_to_layout(nested_content_layout, v) + elif isinstance(v, str): + print(f"layout.str: {k}") + print(f"content_layout: {content_layout}") + data[k] = self.create_row( + content_layout, "QLineEdit", k, setText=v) + elif isinstance(v, int): + print(f"layout.int: {k}") + print(f"content_layout: {content_layout}") + data[k] = self.create_row( + content_layout, "QSpinBox", k, setValue=v) + return data + + +class Spacer(QtWidgets.QWidget): + def __init__(self, height, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + + self.setFixedHeight(height) + + real_spacer = QtWidgets.QWidget(self) + real_spacer.setObjectName("Spacer") + real_spacer.setFixedHeight(height) + + layout = QtWidgets.QVBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(real_spacer) + + self.setLayout(layout) def get_reference_node_parents(ref): diff --git a/pype/plugins/resolve/create/create_shot_clip.py b/pype/plugins/resolve/create/create_shot_clip.py index 18759a2f98..43207743e2 100644 --- a/pype/plugins/resolve/create/create_shot_clip.py +++ b/pype/plugins/resolve/create/create_shot_clip.py @@ -11,7 +11,8 @@ class CreateShotClip(resolve.Creator): icon = "film" defaults = ["Main"] - gui_name = "Define sequencial rename" + gui_name = "Pype sequencial rename with hirerarchy" + gui_info = "Define sequencial rename and fill hierarchy data." presets = None def process(self): @@ -20,14 +21,11 @@ class CreateShotClip(resolve.Creator): if len(self.selected) < 1: return - widget = self.widget(self.gui_name, self.presets) + widget = self.widget(self.gui_name, self.gui_info, self.presets) widget.exec_() - print(widget.result) - if widget.result: - print("success") - return - else: + if not widget.result: + print("Operation aborted") return # sequence attrs @@ -43,8 +41,15 @@ class CreateShotClip(resolve.Creator): lib.rename_add = 0 for i, t_data in enumerate(self.selected): lib.rename_index = i - print(t_data) + + # clear color after it is done + t_data["clip"]["item"].ClearClipColor() + # convert track item to timeline media pool item c_clip = resolve.create_compound_clip( - t_data, mp_folder, rename=True, **dict( - {"presets": self.presets})) + t_data, + mp_folder, + rename=True, + **dict( + {"presets": widget.result}) + )