diff --git a/UI/__pycache__/tinyblast_options.cpython-311.pyc b/UI/__pycache__/tinyblast_options.cpython-311.pyc index 9bf954d..433c8a6 100644 Binary files a/UI/__pycache__/tinyblast_options.cpython-311.pyc and b/UI/__pycache__/tinyblast_options.cpython-311.pyc differ diff --git a/UI/tinyblast_options.py b/UI/tinyblast_options.py index ede217f..da81d41 100644 --- a/UI/tinyblast_options.py +++ b/UI/tinyblast_options.py @@ -70,6 +70,7 @@ class Ui_TinyblastOptions(object): self.qualitySlider = QSlider(self.scrollAreaWidgetContents) self.qualitySlider.setObjectName(u"qualitySlider") + self.qualitySlider.setMaximum(100) self.qualitySlider.setSliderPosition(50) self.qualitySlider.setOrientation(Qt.Horizontal) @@ -87,37 +88,12 @@ class Ui_TinyblastOptions(object): self.gridLayout.addWidget(self.line_01, 8, 0, 1, 4) - self.encodingComboBox = QComboBox(self.scrollAreaWidgetContents) - self.encodingComboBox.addItem("") - self.encodingComboBox.addItem("") - self.encodingComboBox.addItem("") - self.encodingComboBox.addItem("") - self.encodingComboBox.addItem("") - self.encodingComboBox.addItem("") - self.encodingComboBox.setObjectName(u"encodingComboBox") - self.encodingComboBox.setMinimumSize(QSize(80, 0)) - self.encodingComboBox.setMaximumSize(QSize(80, 16777215)) - - self.gridLayout.addWidget(self.encodingComboBox, 1, 1, 1, 1) - self.encodingLabel = QLabel(self.scrollAreaWidgetContents) self.encodingLabel.setObjectName(u"encodingLabel") self.encodingLabel.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.gridLayout.addWidget(self.encodingLabel, 1, 0, 1, 1) - self.formattingComboBox = QComboBox(self.scrollAreaWidgetContents) - self.formattingComboBox.addItem("") - self.formattingComboBox.addItem("") - self.formattingComboBox.addItem("") - self.formattingComboBox.addItem("") - self.formattingComboBox.addItem("") - self.formattingComboBox.setObjectName(u"formattingComboBox") - self.formattingComboBox.setMinimumSize(QSize(80, 0)) - self.formattingComboBox.setMaximumSize(QSize(80, 16777215)) - - self.gridLayout.addWidget(self.formattingComboBox, 0, 1, 1, 1) - self.displaySizeComboBox = QComboBox(self.scrollAreaWidgetContents) self.displaySizeComboBox.addItem("") self.displaySizeComboBox.addItem("") @@ -202,60 +178,84 @@ class Ui_TinyblastOptions(object): self.gridLayout.addWidget(self.qualityLabel, 2, 0, 1, 1) - self.doubleSpinBox = QDoubleSpinBox(self.scrollAreaWidgetContents) - self.doubleSpinBox.setObjectName(u"doubleSpinBox") - self.doubleSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) - self.doubleSpinBox.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) - self.doubleSpinBox.setMaximum(1.000000000000000) - self.doubleSpinBox.setValue(1.000000000000000) + self.scaleSpinBox = QDoubleSpinBox(self.scrollAreaWidgetContents) + self.scaleSpinBox.setObjectName(u"scaleSpinBox") + self.scaleSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.scaleSpinBox.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) + self.scaleSpinBox.setMaximum(1.000000000000000) + self.scaleSpinBox.setValue(1.000000000000000) - self.gridLayout.addWidget(self.doubleSpinBox, 6, 1, 1, 1) + self.gridLayout.addWidget(self.scaleSpinBox, 6, 1, 1, 1) - self.spinBox = QSpinBox(self.scrollAreaWidgetContents) - self.spinBox.setObjectName(u"spinBox") - self.spinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) - self.spinBox.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) - self.spinBox.setMinimum(0) - self.spinBox.setMaximum(100) - self.spinBox.setValue(50) + self.qualitySpinBox = QSpinBox(self.scrollAreaWidgetContents) + self.qualitySpinBox.setObjectName(u"qualitySpinBox") + self.qualitySpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.qualitySpinBox.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) + self.qualitySpinBox.setMinimum(0) + self.qualitySpinBox.setMaximum(100) + self.qualitySpinBox.setValue(50) - self.gridLayout.addWidget(self.spinBox, 2, 1, 1, 1) + self.gridLayout.addWidget(self.qualitySpinBox, 2, 1, 1, 1) - self.spinBox_2 = QSpinBox(self.scrollAreaWidgetContents) - self.spinBox_2.setObjectName(u"spinBox_2") - self.spinBox_2.setButtonSymbols(QAbstractSpinBox.NoButtons) - self.spinBox_2.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) - self.spinBox_2.setMaximum(10) - self.spinBox_2.setValue(4) + self.framePaddingSpinBox = QSpinBox(self.scrollAreaWidgetContents) + self.framePaddingSpinBox.setObjectName(u"framePaddingSpinBox") + self.framePaddingSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.framePaddingSpinBox.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) + self.framePaddingSpinBox.setMaximum(10) + self.framePaddingSpinBox.setValue(4) - self.gridLayout.addWidget(self.spinBox_2, 7, 1, 1, 1) + self.gridLayout.addWidget(self.framePaddingSpinBox, 7, 1, 1, 1) - self.spinBox_3 = QSpinBox(self.scrollAreaWidgetContents) - self.spinBox_3.setObjectName(u"spinBox_3") - self.spinBox_3.setEnabled(False) - self.spinBox_3.setMaximumSize(QSize(80, 16777215)) - self.spinBox_3.setButtonSymbols(QAbstractSpinBox.NoButtons) - self.spinBox_3.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) - self.spinBox_3.setMaximum(999999999) - self.spinBox_3.setValue(1920) + self.widthSpinBox = QSpinBox(self.scrollAreaWidgetContents) + self.widthSpinBox.setObjectName(u"widthSpinBox") + self.widthSpinBox.setEnabled(False) + self.widthSpinBox.setMaximumSize(QSize(80, 16777215)) + self.widthSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.widthSpinBox.setCorrectionMode(QAbstractSpinBox.CorrectToNearestValue) + self.widthSpinBox.setMaximum(999999999) + self.widthSpinBox.setValue(1920) - self.gridLayout.addWidget(self.spinBox_3, 5, 1, 1, 1) + self.gridLayout.addWidget(self.widthSpinBox, 5, 1, 1, 1) - self.spinBox_4 = QSpinBox(self.scrollAreaWidgetContents) - self.spinBox_4.setObjectName(u"spinBox_4") - self.spinBox_4.setEnabled(False) - self.spinBox_4.setMaximumSize(QSize(80, 16777215)) - self.spinBox_4.setButtonSymbols(QAbstractSpinBox.NoButtons) - self.spinBox_4.setMaximum(999999999) - self.spinBox_4.setValue(1080) + self.heightSpinBox = QSpinBox(self.scrollAreaWidgetContents) + self.heightSpinBox.setObjectName(u"heightSpinBox") + self.heightSpinBox.setEnabled(False) + self.heightSpinBox.setMaximumSize(QSize(80, 16777215)) + self.heightSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.heightSpinBox.setMaximum(999999999) + self.heightSpinBox.setValue(1080) - self.gridLayout.addWidget(self.spinBox_4, 5, 2, 1, 1) + self.gridLayout.addWidget(self.heightSpinBox, 5, 2, 1, 1) self.browseButton = QPushButton(self.scrollAreaWidgetContents) self.browseButton.setObjectName(u"browseButton") self.gridLayout.addWidget(self.browseButton, 11, 1, 1, 2) + self.encodingComboBox = QComboBox(self.scrollAreaWidgetContents) + self.encodingComboBox.addItem("") + self.encodingComboBox.addItem("") + self.encodingComboBox.addItem("") + self.encodingComboBox.addItem("") + self.encodingComboBox.addItem("") + self.encodingComboBox.setObjectName(u"encodingComboBox") + self.encodingComboBox.setMinimumSize(QSize(0, 0)) + self.encodingComboBox.setMaximumSize(QSize(16777215, 16777215)) + + self.gridLayout.addWidget(self.encodingComboBox, 1, 1, 1, 2) + + self.formattingComboBox = QComboBox(self.scrollAreaWidgetContents) + self.formattingComboBox.addItem("") + self.formattingComboBox.addItem("") + self.formattingComboBox.addItem("") + self.formattingComboBox.addItem("") + self.formattingComboBox.addItem("") + self.formattingComboBox.setObjectName(u"formattingComboBox") + self.formattingComboBox.setMinimumSize(QSize(0, 0)) + self.formattingComboBox.setMaximumSize(QSize(16777215, 16777215)) + + self.gridLayout.addWidget(self.formattingComboBox, 0, 1, 1, 2) + self.verticalLayout_3.addLayout(self.gridLayout) @@ -315,14 +315,25 @@ class Ui_TinyblastOptions(object): self.Title.setText(QCoreApplication.translate("TinyblastOptions", u"Tinyblast", None)) self.filePathLabel.setText(QCoreApplication.translate("TinyblastOptions", u"File Path", None)) self.blankLabel.setText("") - self.encodingComboBox.setItemText(0, QCoreApplication.translate("TinyblastOptions", u"H.264", None)) - self.encodingComboBox.setItemText(1, QCoreApplication.translate("TinyblastOptions", u"H.265", None)) - self.encodingComboBox.setItemText(2, QCoreApplication.translate("TinyblastOptions", u"VP9", None)) - self.encodingComboBox.setItemText(3, QCoreApplication.translate("TinyblastOptions", u"ProRes", None)) - self.encodingComboBox.setItemText(4, QCoreApplication.translate("TinyblastOptions", u"AV1", None)) - self.encodingComboBox.setItemText(5, QCoreApplication.translate("TinyblastOptions", u"MPEG-4", None)) - self.encodingLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Encoding", None)) + self.displaySizeComboBox.setItemText(0, QCoreApplication.translate("TinyblastOptions", u"From Window", None)) + self.displaySizeComboBox.setItemText(1, QCoreApplication.translate("TinyblastOptions", u"From Render Settings", None)) + self.displaySizeComboBox.setItemText(2, QCoreApplication.translate("TinyblastOptions", u"Custom", None)) + + self.displaySizeLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Display Size", None)) + self.saveToFileCheckBox.setText("") + self.framePaddingLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Frame Padding", None)) + self.saveToFileLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Save to File", None)) + self.scaleLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Scale", None)) + self.formattingLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Format", None)) + self.qualityLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Quality", None)) + self.browseButton.setText(QCoreApplication.translate("TinyblastOptions", u"Browse...", None)) + self.encodingComboBox.setItemText(0, QCoreApplication.translate("TinyblastOptions", u"HEVC (H.265)", None)) + self.encodingComboBox.setItemText(1, QCoreApplication.translate("TinyblastOptions", u"H.264", None)) + self.encodingComboBox.setItemText(2, QCoreApplication.translate("TinyblastOptions", u"AV1", None)) + self.encodingComboBox.setItemText(3, QCoreApplication.translate("TinyblastOptions", u"MPEG-4", None)) + self.encodingComboBox.setItemText(4, QCoreApplication.translate("TinyblastOptions", u"VP9", None)) + self.formattingComboBox.setItemText(0, QCoreApplication.translate("TinyblastOptions", u"MP4", None)) self.formattingComboBox.setItemText(1, QCoreApplication.translate("TinyblastOptions", u"MKV", None)) self.formattingComboBox.setItemText(2, QCoreApplication.translate("TinyblastOptions", u"MOV", None)) @@ -341,18 +352,6 @@ class Ui_TinyblastOptions(object): #if QT_CONFIG(accessibility) self.formattingComboBox.setAccessibleDescription("") #endif // QT_CONFIG(accessibility) - self.displaySizeComboBox.setItemText(0, QCoreApplication.translate("TinyblastOptions", u"From Window", None)) - self.displaySizeComboBox.setItemText(1, QCoreApplication.translate("TinyblastOptions", u"From Render Settings", None)) - self.displaySizeComboBox.setItemText(2, QCoreApplication.translate("TinyblastOptions", u"Custom", None)) - - self.displaySizeLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Display Size", None)) - self.saveToFileCheckBox.setText("") - self.framePaddingLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Frame Padding", None)) - self.saveToFileLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Save to File", None)) - self.scaleLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Scale", None)) - self.formattingLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Format", None)) - self.qualityLabel.setText(QCoreApplication.translate("TinyblastOptions", u"Quality", None)) - self.browseButton.setText(QCoreApplication.translate("TinyblastOptions", u"Browse...", None)) self.tinyblastButton.setText(QCoreApplication.translate("TinyblastOptions", u"Tinyblast", None)) self.applyButton.setText(QCoreApplication.translate("TinyblastOptions", u"Apply", None)) self.quitButton.setText(QCoreApplication.translate("TinyblastOptions", u"Quit", None)) diff --git a/UI/tinyblast_options.ui b/UI/tinyblast_options.ui index 8486fd0..9f8a996 100644 --- a/UI/tinyblast_options.ui +++ b/UI/tinyblast_options.ui @@ -71,6 +71,9 @@ + + 100 + 50 @@ -93,52 +96,6 @@ - - - - - 80 - 0 - - - - - 80 - 16777215 - - - - - H.264 - - - - - H.265 - - - - - VP9 - - - - - ProRes - - - - - AV1 - - - - - MPEG-4 - - - - @@ -149,59 +106,6 @@ - - - - - 80 - 0 - - - - - 80 - 16777215 - - - - - - - - - - - - - - - - - MP4 - - - - - MKV - - - - - MOV - - - - - AVI - - - - - WebM - - - - @@ -358,7 +262,7 @@ - + QAbstractSpinBox::NoButtons @@ -374,7 +278,7 @@ - + QAbstractSpinBox::NoButtons @@ -393,7 +297,7 @@ - + QAbstractSpinBox::NoButtons @@ -409,7 +313,7 @@ - + false @@ -434,7 +338,7 @@ - + false @@ -462,6 +366,100 @@ + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + HEVC (H.265) + + + + + H.264 + + + + + AV1 + + + + + MPEG-4 + + + + + VP9 + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + + + + + + + + + MP4 + + + + + MKV + + + + + MOV + + + + + AVI + + + + + WebM + + + + diff --git a/tinyblast.py b/tinyblast.py index b65f33e..1b718e4 100644 --- a/tinyblast.py +++ b/tinyblast.py @@ -1,14 +1,18 @@ import maya.cmds as cmds import maya.OpenMaya as om import maya.OpenMayaMPx as ompx + import os import subprocess import sys +import tkinter as tk +from tkinter import filedialog + +from ui.tinyblast_options import Ui_TinyblastOptions -from UI.tinyblast_options import Ui_TinyblastOptions from PySide6 import QtCore -from PySide6.QtWidgets import QMainWindow - +from PySide6.QtWidgets import QMainWindow, QFileDialog +from PySide6.QtCore import QCoreApplication import shiboken6 # Global variable to store the scriptJob ID @@ -22,7 +26,7 @@ def get_plugin_directory(): return os.path.dirname(plugin_path) def custom_playblast(*args, **kwargs): - print("Running playblast...") + print("Running tinyblast...") kwargs['format'] = 'avi' kwargs['percent'] = 100 @@ -148,7 +152,7 @@ class Tinyblast(ompx.MPxCommand): ompx.MPxCommand.__init__(self) def doIt(selfself, args): - print("Executing custom playblast command.") + print("Tinyblasting...") cmds.playblast() @staticmethod @@ -165,23 +169,167 @@ def get_maya_window(): return None -class MyDialog(QMainWindow): +class TinyblastOptionsWindow(QMainWindow): def __init__(self, parent=None): - super(MyDialog, self).__init__(parent or get_maya_window()) + super(TinyblastOptionsWindow, self).__init__(parent or get_maya_window()) self.ui = Ui_TinyblastOptions() self.ui.setupUi(self) - # Additional setup if needed + self.ui.formattingComboBox.currentIndexChanged.connect(self.update_format) + + self.ui.tinyblastButton.clicked.connect(self.tinyblast) + self.ui.applyButton.clicked.connect(self.apply_settings) + self.ui.quitButton.clicked.connect(self.quit_window) + + self.ui.qualitySlider.valueChanged.connect(self.update_quality_slider) + self.ui.qualitySpinBox.valueChanged.connect(self.update_quality_spinbox) + + self.ui.displaySizeComboBox.currentIndexChanged.connect(self.update_display_size) + + self.ui.scaleSlider.valueChanged.connect(self.update_scale_slider) + self.ui.scaleSpinBox.valueChanged.connect(self.update_scale_spinbox) + + self.ui.framePaddingSlider.valueChanged.connect(self.update_frame_padding_slider) + self.ui.framePaddingSpinBox.valueChanged.connect(self.update_frame_padding_spinbox) + + self.ui.saveToFileCheckBox.toggled.connect(self.save_to_file_toggle) + self.ui.browseButton.clicked.connect(self.browse_files) + + def update_format(self, index): + self.ui.encodingComboBox.clear() + # MP4 + if index == 0: + self.ui.encodingComboBox.addItems([ + QCoreApplication.translate("TinyblastOptions", u"HEVC (H.265)", None), + QCoreApplication.translate("TinyblastOptions", u"H.264", None), + QCoreApplication.translate("TinyblastOptions", u"AV1", None), + QCoreApplication.translate("TinyblastOptions", u"MPEG-4", None), + QCoreApplication.translate("TinyblastOptions", u"VP9", None) + ]) + + if self.ui.filePathTextBox.text(): + split_path = self.ui.filePathTextBox.text().rsplit('.', 1) + self.ui.filePathTextBox.setText(f"{split_path[0]}.mp4") + + # MKV + if index == 1: + self.ui.encodingComboBox.addItems([ + QCoreApplication.translate("TinyblastOptions", u"HEVC (H.265)", None), + QCoreApplication.translate("TinyblastOptions", u"H.264", None), + QCoreApplication.translate("TinyblastOptions", u"AV1", None), + QCoreApplication.translate("TinyblastOptions", u"VP9", None), + QCoreApplication.translate("TinyblastOptions", u"VP8", None), + QCoreApplication.translate("TinyblastOptions", u"Theora", None) + ]) + + if self.ui.filePathTextBox.text(): + split_path = self.ui.filePathTextBox.text().rsplit('.', 1) + self.ui.filePathTextBox.setText(f"{split_path[0]}.mkv") + # MOV + if index == 2: + self.ui.encodingComboBox.addItems([ + QCoreApplication.translate("TinyblastOptions", u"Apple ProRes", None), + QCoreApplication.translate("TinyblastOptions", u"HEVC (H.265)", None), + QCoreApplication.translate("TinyblastOptions", u"H.264", None), + QCoreApplication.translate("TinyblastOptions", u"MPEG-4", None) + ]) + + if self.ui.filePathTextBox.text(): + split_path = self.ui.filePathTextBox.text().rsplit('.', 1) + self.ui.filePathTextBox.setText(f"{split_path[0]}.mov") + # AVI + if index == 3: + self.ui.encodingComboBox.addItems([ + QCoreApplication.translate("TinyblastOptions", u"H.264", None), + QCoreApplication.translate("TinyblastOptions", u"MPEG-4", None), + QCoreApplication.translate("TinyblastOptions", u"DivX", None), + QCoreApplication.translate("TinyblastOptions", u"Xvid", None), + QCoreApplication.translate("TinyblastOptions", u"Motion JPEG", None), + ]) + + if self.ui.filePathTextBox.text(): + split_path = self.ui.filePathTextBox.text().rsplit('.', 1) + self.ui.filePathTextBox.setText(f"{split_path[0]}.avi") + # WEBM + if index == 4: + self.ui.encodingComboBox.addItems([ + QCoreApplication.translate("TinyblastOptions", u"AV1", None), + QCoreApplication.translate("TinyblastOptions", u"VP9", None), + QCoreApplication.translate("TinyblastOptions", u"VP8", None) + ]) + + if self.ui.filePathTextBox.text(): + split_path = self.ui.filePathTextBox.text().rsplit('.', 1) + self.ui.filePathTextBox.setText(f"{split_path[0]}.webm") + + def tinyblast(self): + print("Tinyblasting...") + cmds.playblast() + + def apply_settings(self): + print("TODO") + + def quit_window(self): + tb_window.close() + + def update_quality_slider(self, value): + self.ui.qualitySpinBox.setValue(value) + def update_quality_spinbox(self, value): + self.ui.qualitySlider.setValue(value) + + def update_display_size(self, index): + if index == 0: + self.ui.widthSpinBox.setEnabled(False) + self.ui.heightSpinBox.setEnabled(False) + if index == 1: + self.ui.widthSpinBox.setEnabled(False) + self.ui.heightSpinBox.setEnabled(False) + if index == 2: + self.ui.widthSpinBox.setEnabled(True) + self.ui.heightSpinBox.setEnabled(True) + + + def update_scale_slider(self, value): + self.ui.scaleSpinBox.setValue(float(value/1000.0)) + def update_scale_spinbox(self, value): + self.ui.scaleSlider.setValue(int(value*1000)) + + def update_frame_padding_slider(self, value): + self.ui.framePaddingSpinBox.setValue(value) + def update_frame_padding_spinbox(self, value): + self.ui.framePaddingSlider.setValue(value) + + def save_to_file_toggle(self): + if self.ui.saveToFileCheckBox.isChecked(): + self.ui.browseButton.setEnabled(True) + self.ui.filePathTextBox.setEnabled(True) + else: + self.ui.browseButton.setEnabled(False) + self.ui.filePathTextBox.setEnabled(False) + + def browse_files(self): + path = self.choose_save_path() + self.ui.filePathTextBox.setText(f"{path}") + + def choose_save_path(self): + current_container = str(self.ui.formattingComboBox.currentText()).lower() + save_path, _ = QFileDialog.getSaveFileName( + None, + "Choose Save Location", + "", + f"Video (*.{current_container});;All Files (*)" + ) + return save_path def show_my_window(): - global my_dialog + global tb_window try: - my_dialog.close() - my_dialog.deleteLater() + tb_window.close() + tb_window.deleteLater() except: pass - my_dialog = MyDialog() - my_dialog.show() + tb_window = TinyblastOptionsWindow() + tb_window.show() class MyPluginCommand(ompx.MPxCommand): def __init__(self): @@ -208,6 +356,7 @@ def initializePlugin(mobject): def uninitializePlugin(mobject): try: mplugin = ompx.MFnPlugin(mobject) + tb_window.close() mplugin.deregisterCommand("tinyblast") mplugin.deregisterCommand("myPluginCommand") om.MGlobal.displayInfo("Tinyblast plugin unloaded.")