Files
Nexus/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py
2025-11-24 00:15:32 +08:00

256 lines
7.6 KiB
Python

# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
#
# This library is free software: you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version. This library is distributed in the
# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
import os
import logging
from studiovendor.Qt import QtGui
from studiovendor.Qt import QtCore
from studiovendor.Qt import QtWidgets
import studioqt
import studiolibrary
import studiolibrary.widgets
try:
import mutils
import mutils.gui
import maya.cmds
except ImportError as error:
print(error)
logger = logging.getLogger(__name__)
class BaseLoadWidget(QtWidgets.QWidget):
"""Base widget for loading items."""
def __init__(self, item, parent=None):
"""
:type item: studiolibrarymaya.BaseItem
:type parent: QtWidgets.QWidget or None
"""
QtWidgets.QWidget.__init__(self, parent)
self.setObjectName("studioLibraryBaseLoadWidget")
self.setWindowTitle("Load Item")
self.loadUi()
self._item = item
self._scriptJob = None
self._formWidget = None
widget = self.createTitleWidget()
widget.ui.menuButton.clicked.connect(self.showMenu)
self.ui.titleFrame.layout().addWidget(widget)
# Create the icon group box
groupBox = studiolibrary.widgets.GroupBoxWidget("Icon", self.ui.iconFrame)
groupBox.setObjectName("iconGroupBoxWidget")
groupBox.setPersistent(True)
self.ui.iconTitleFrame.layout().addWidget(groupBox)
# Create the thumbnail widget and set the image
self.ui.thumbnailButton = studiolibrary.widgets.ImageSequenceWidget(self)
self.ui.thumbnailButton.setObjectName("thumbnailButton")
self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton)
if os.path.exists(item.imageSequencePath()):
self.ui.thumbnailButton.setPath(item.imageSequencePath())
elif os.path.exists(item.thumbnailPath()):
self.ui.thumbnailButton.setPath(item.thumbnailPath())
# Create the load widget and set the load schema
self._formWidget = studiolibrary.widgets.FormWidget(self)
self._formWidget.setObjectName(item.__class__.__name__ + "Form")
self._formWidget.setSchema(item.loadSchema())
self._formWidget.setValidator(self.loadValidator)
self._formWidget.validate()
self.ui.formFrame.layout().addWidget(self._formWidget)
try:
self.selectionChanged()
self.setScriptJobEnabled(True)
except NameError as error:
logger.exception(error)
self.updateThumbnailSize()
self._item.loadValueChanged.connect(self._itemValueChanged)
self.ui.acceptButton.clicked.connect(self.accept)
self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu)
def loadValidator(self, *args, **kwargs):
return self.item().loadValidator(*args, **kwargs)
def createTitleWidget(self):
"""
Create a new instance of the title bar widget.
:rtype: QtWidgets.QFrame
"""
class UI(object):
"""Proxy class for attaching ui widgets as properties."""
pass
titleWidget = QtWidgets.QFrame(self)
titleWidget.setObjectName("titleWidget")
titleWidget.ui = UI()
vlayout = QtWidgets.QVBoxLayout()
vlayout.setSpacing(0)
vlayout.setContentsMargins(0, 0, 0, 0)
hlayout = QtWidgets.QHBoxLayout()
hlayout.setSpacing(0)
hlayout.setContentsMargins(0, 0, 0, 0)
vlayout.addLayout(hlayout)
titleButton = QtWidgets.QLabel(self)
titleButton.setText(self.item().NAME)
titleButton.setObjectName("titleButton")
titleWidget.ui.titleButton = titleButton
hlayout.addWidget(titleButton)
menuButton = QtWidgets.QPushButton(self)
menuButton.setText("...")
menuButton.setObjectName("menuButton")
titleWidget.ui.menuButton = menuButton
hlayout.addWidget(menuButton)
titleWidget.setLayout(vlayout)
return titleWidget
def _itemValueChanged(self, field, value):
"""
Triggered when the a field value has changed.
:type field: str
:type value: object
"""
self._formWidget.setValue(field, value)
def showMenu(self):
"""
Show the edit menu at the current cursor position.
:rtype: QtWidgets.QAction
"""
menu = QtWidgets.QMenu(self)
self.item().contextEditMenu(menu)
point = QtGui.QCursor.pos()
point.setX(point.x() + 3)
point.setY(point.y() + 3)
return menu.exec_(point)
def loadUi(self):
"""Convenience method for loading the .ui file."""
studioqt.loadUi(self, cls=BaseLoadWidget)
def formWidget(self):
"""
Get the form widget instance.
:rtype: studiolibrary.widgets.formwidget.FormWidget
"""
return self._formWidget
def setCustomWidget(self, widget):
"""Convenience method for adding a custom widget when loading."""
self.ui.customWidgetFrame.layout().addWidget(widget)
def item(self):
"""
Get the library item to be created.
:rtype: studiolibrarymaya.BaseItem
"""
return self._item
def showSelectionSetsMenu(self):
"""Show the selection sets menu."""
item = self.item()
item.showSelectionSetsMenu()
def resizeEvent(self, event):
"""
Overriding to adjust the image size when the widget changes size.
:type event: QtCore.QSizeEvent
"""
self.updateThumbnailSize()
def updateThumbnailSize(self):
"""Update the thumbnail button to the size of the widget."""
width = self.width() - 10
if width > 250:
width = 250
size = QtCore.QSize(width, width)
self.ui.thumbnailButton.setIconSize(size)
self.ui.thumbnailButton.setMaximumSize(size)
self.ui.thumbnailFrame.setMaximumSize(size)
def close(self):
"""Overriding this method to disable the script job when closed."""
self.setScriptJobEnabled(False)
if self.formWidget():
self.formWidget().savePersistentValues()
QtWidgets.QWidget.close(self)
def scriptJob(self):
"""
Get the script job object used when the users selection changes.
:rtype: mutils.ScriptJob
"""
return self._scriptJob
def setScriptJobEnabled(self, enabled):
"""
Enable the script job used when the users selection changes.
:type enabled: bool
"""
if enabled:
if not self._scriptJob:
event = ['SelectionChanged', self.selectionChanged]
self._scriptJob = mutils.ScriptJob(event=event)
else:
sj = self.scriptJob()
if sj:
sj.kill()
self._scriptJob = None
def selectionChanged(self):
"""Triggered when the users Maya selection has changed."""
self.formWidget().validate()
def accept(self):
"""Called when the user clicks the apply button."""
self.item().loadFromCurrentValues()