#!/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))