MetaFusion/scripts/ui/widgets.py
2025-02-06 19:49:53 +08:00

231 lines
7.8 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
from scripts.config import data
try:
from PySide2 import QtCore, QtGui, QtWidgets
from shiboken2 import wrapInstance
except ImportError:
try:
from PySide6 import QtCore, QtGui, QtWidgets
from shiboken6 import wrapInstance
except ImportError:
try:
from PySide import QtCore, QtGui, QtWidgets
from shiboken import wrapInstance
except ImportError as e:
QtCore = QtGui = QtWidgets = None
wrapInstance = None
#===================================== 2. Base Widget Class =====================================
class BaseWidget(QtWidgets.QWidget):
"""基础控件类"""
def __init__(self, parent=None):
super(BaseWidget, self).__init__(parent)
self.SPACING = 4
self.MARGINS = 6
self.setup_ui()
def setup_ui(self):
pass
class IconButton(QtWidgets.QPushButton):
"""图标按钮"""
def __init__(self, icon_name, text, callback=None, parent=None):
super(IconButton, self).__init__(text, parent)
# 设置图标
if icon_name:
icon_path = os.path.join(data.ICONS_PATH, icon_name)
if os.path.exists(icon_path):
self.setIcon(QtGui.QIcon(icon_path))
# 连接回调
if callback:
self.clicked.connect(lambda checked=False, cb=callback: cb())
class LODGroup(QtWidgets.QGroupBox):
"""LOD分组控件"""
def __init__(self, lod_index, parent=None):
super(LODGroup, self).__init__(parent)
self.lod_index = lod_index
self.setTitle(f"LOD{lod_index}")
self.setup_ui()
def setup_ui(self):
layout = QtWidgets.QVBoxLayout(self)
layout.setSpacing(4)
layout.setContentsMargins(6, 6, 6, 6)
class SearchLineEdit(QtWidgets.QLineEdit):
"""搜索输入框"""
def __init__(self, parent=None):
super(SearchLineEdit, self).__init__(parent)
self.setPlaceholderText("搜索...")
self.setClearButtonEnabled(True)
class BlendShapeList(QtWidgets.QGroupBox):
"""BlendShape列表控件"""
def __init__(self, title, parent=None):
super(BlendShapeList, self).__init__(title, parent)
self.setup_ui()
def setup_ui(self):
layout = QtWidgets.QVBoxLayout(self)
self.list_widget = QtWidgets.QListWidget()
layout.addWidget(self.list_widget)
class BlendShapeControls(QtWidgets.QGroupBox):
"""BlendShape控制控件"""
def __init__(self, parent=None):
super(BlendShapeControls, self).__init__("控制", parent)
self.setup_ui()
def setup_ui(self):
layout = QtWidgets.QVBoxLayout(self)
self.value_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
layout.addWidget(self.value_slider)
class DNABrowser(QtWidgets.QGroupBox):
"""DNA浏览器控件"""
dnaSelected = QtCore.Signal(str)
def __init__(self, parent=None):
super(DNABrowser, self).__init__("DNA浏览器", parent)
self.setup_ui()
def setup_ui(self):
layout = QtWidgets.QVBoxLayout(self)
self.list_widget = QtWidgets.QListWidget()
layout.addWidget(self.list_widget)
def selectedItems(self):
"""获取选中项"""
return self.list_widget.selectedItems()
def itemSelectionChanged(self):
"""选择变化信号"""
return self.list_widget.itemSelectionChanged()
def connect(self, callback):
"""连接选择变化信号"""
self.list_widget.itemSelectionChanged.connect(callback)
class DescriptionWidget(QtWidgets.QGroupBox):
"""描述控件"""
def __init__(self, parent=None):
super(DescriptionWidget, self).__init__("描述", parent)
self.setup_ui()
def setup_ui(self):
layout = QtWidgets.QVBoxLayout(self)
self.text_edit = QtWidgets.QTextEdit()
self.text_edit.setReadOnly(True)
layout.addWidget(self.text_edit)
class SliderWithValue(QtWidgets.QWidget):
"""带数值显示的滑块"""
valueChanged = QtCore.Signal(float)
def __init__(self, min_val=0.0, max_val=1.0, default=0.0, parent=None):
super(SliderWithValue, self).__init__(parent)
self.setup_ui(min_val, max_val, default)
def setup_ui(self, min_val, max_val, default):
layout = QtWidgets.QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(int(min_val * 100), int(max_val * 100))
self.slider.setValue(int(default * 100))
self.value_label = QtWidgets.QLabel(f"{default:.2f}")
self.value_label.setMinimumWidth(40)
layout.addWidget(self.slider)
layout.addWidget(self.value_label)
self.slider.valueChanged.connect(self._on_slider_changed)
def _on_slider_changed(self, value):
float_value = value / 100.0
self.value_label.setText(f"{float_value:.2f}")
self.valueChanged.emit(float_value)
class ModernTabWidget(QtWidgets.QTabWidget):
"""现代风格标签页控件"""
def __init__(self, parent=None):
super(ModernTabWidget, self).__init__(parent)
self.setTabBar(TabBar())
self.setDocumentMode(True)
self.setMovable(True)
class TabBar(QtWidgets.QTabBar):
"""自定义标签栏"""
def __init__(self, parent=None):
super(TabBar, self).__init__(parent)
self.setDrawBase(False)
self.setExpanding(False)
class ModernToolBar(QtWidgets.QToolBar):
"""现代风格工具栏"""
def __init__(self, parent=None):
super(ModernToolBar, self).__init__(parent)
self.setMovable(False)
self.setFloatable(False)
self.setIconSize(QtCore.QSize(16, 16))
def addAction(self, icon, text, callback):
"""添加工具栏按钮"""
action = QtWidgets.QAction(text, self)
if icon:
icon_path = os.path.join(data.ICONS_PATH, icon)
if os.path.exists(icon_path):
action.setIcon(QtGui.QIcon(icon_path))
action.triggered.connect(callback)
super(ModernToolBar, self).addAction(action)
return action
def addStretch(self):
"""添加弹性空间"""
spacer = QtWidgets.QWidget()
spacer.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
QtWidgets.QSizePolicy.Preferred)
self.addWidget(spacer)
class GradientGroupBox(QtWidgets.QGroupBox):
"""渐变背景分组框"""
def __init__(self, title, parent=None):
super(GradientGroupBox, self).__init__(title, parent)
class ModernComboBox(QtWidgets.QComboBox):
"""现代风格下拉框"""
def __init__(self, parent=None):
super(ModernComboBox, self).__init__(parent)
class ModernLabel(QtWidgets.QLabel):
"""现代风格标签"""
def __init__(self, text, parent=None):
super(ModernLabel, self).__init__(text, parent)
class ModernLineEdit(QtWidgets.QLineEdit):
"""现代风格输入框"""
def __init__(self, read_only=False, parent=None):
super(ModernLineEdit, self).__init__(parent)
self.setReadOnly(read_only)
class ModernToolButton(QtWidgets.QToolButton):
"""现代风格工具按钮"""
def __init__(self, icon, text, parent=None):
super(ModernToolButton, self).__init__(parent)
self.setText(text)
if icon:
icon_path = os.path.join(data.ICONS_PATH, icon)
if os.path.exists(icon_path):
self.setIcon(QtGui.QIcon(icon_path))
self.setIconSize(QtCore.QSize(16, 16))