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

168 lines
4.8 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 functools import partial
from studiovendor.Qt import QtGui
from studiovendor.Qt import QtWidgets
import studiolibrary
from studiolibrarymaya import setsitem
logger = logging.getLogger(__name__)
DIRNAME = os.path.dirname(__file__)
ARROW_ICON_PATH = os.path.join(DIRNAME, "icons", "arrow.png")
def selectContentAction(item, parent=None):
"""
:param item: mayabaseitem.MayaBaseItem
:param parent: QtWidgets.QMenu
"""
arrowIcon = QtGui.QIcon(ARROW_ICON_PATH)
action = QtWidgets.QAction(arrowIcon, "Select content", parent)
action.triggered.connect(item.selectContent)
return action
def showSetsMenu(path, **kwargs):
"""
Show the frame range menu at the current cursor position.
:type path: str
:rtype: QtWidgets.QAction
"""
menu = SetsMenu.fromPath(path, **kwargs)
position = QtGui.QCursor().pos()
action = menu.exec_(position)
return action
class SetsMenu(QtWidgets.QMenu):
@classmethod
def fromPath(cls, path, parent=None, libraryWindow=None, **kwargs):
"""
Return a new SetMenu instance from the given path.
:type path: str
:type parent: QtWidgets.QMenu or None
:type libraryWindow: studiolibrary.LibraryWindow or None
:type kwargs: dict
:rtype: QtWidgets.QAction
"""
item = setsitem.SetsItem(path, libraryWindow=libraryWindow)
return cls(item, parent, enableSelectContent=False, **kwargs)
def __init__(
self,
item,
parent=None,
namespaces=None,
enableSelectContent=True,
):
"""
:type item: studiolibrarymaya.BaseItem
:type parent: QtWidgets.QMenu or None
:type namespaces: list[str] or None
:type enableSelectContent: bool
"""
parent = parent or item.libraryWindow()
QtWidgets.QMenu.__init__(self, "Selection Sets", parent)
icon = QtGui.QIcon(setsitem.SetsItem.ICON_PATH)
self.setIcon(icon)
self._item = item
self._namespaces = namespaces
self._enableSelectContent = enableSelectContent
self.reload()
def item(self):
"""
:rtype: mayabaseitem.MayaBaseItem
"""
return self._item
def namespaces(self):
"""
:rtype: list[str]
"""
return self._namespaces
def selectContent(self):
"""
:rtype: None
"""
self.item().selectContent(namespaces=self.namespaces())
def selectionSets(self):
"""
:rtype: list[setsitem.SetsItem]
"""
path = self.item().path()
paths = studiolibrary.walkup(
path,
match=lambda path: path.endswith(".set"),
depth=10,
)
items = []
paths = list(paths)
libraryWindow = self.item().libraryWindow()
for path in paths:
item = setsitem.SetsItem(path)
item.setLibraryWindow(libraryWindow)
items.append(item)
return items
def reload(self):
"""
:rtype: None
"""
self.clear()
if self._enableSelectContent:
action = selectContentAction(item=self.item(), parent=self)
self.addAction(action)
self.addSeparator()
selectionSets = self.selectionSets()
if selectionSets:
for selectionSet in selectionSets:
dirname = os.path.basename(os.path.dirname(selectionSet.path()))
basename = os.path.basename(selectionSet.path())
basename = basename.replace(selectionSet.EXTENSION, "")
nicename = dirname + ": " + basename
action = QtWidgets.QAction(nicename, self)
callback = partial(selectionSet.load, namespaces=self.namespaces())
action.triggered.connect(callback)
self.addAction(action)
else:
action = QtWidgets.QAction("No selection sets found!", self)
action.setEnabled(False)
self.addAction(action)