This commit is contained in:
2025-05-08 23:57:22 +08:00
parent 24acc2a6f1
commit 7094a5886a
18 changed files with 442 additions and 583 deletions

View File

@@ -17,8 +17,8 @@ Behaviour UI Module for Plugin
- 控制面板查找
"""
#========================================= IMPORT =========================================
from Qt import QtWidgets, QtCore, QtGui
from Qt.QtCompat import wrapInstance
from scripts.ui.Qt import QtWidgets, QtCore, QtGui
from scripts.ui.Qt.QtCompat import wrapInstance
from maya import OpenMayaUI as omui
import maya.cmds as cmds
import maya.mel as mel
@@ -57,51 +57,29 @@ TOOL_WIDTH = config.TOOL_WIDTH
TOOL_HEIGHT = config.TOOL_HEIGHT
#========================================= LOCATION =======================================
from scripts.ui import localization
LANG = localization.LANG
get_text = localization.get_text
TEXT = localization.TEXT
class BehaviourUI(ui_utils.BaseUI):
"""
行为系统UI类 - 负责显示角色行为编辑界面和基础操作
继承自BaseUI类实现行为系统相关的UI功能
"""
# 类变量,存储单例实例
_instance = None
@classmethod
def get_instance(cls):
"""
获取BehaviourUI的单例实例
Returns:
BehaviourUI: 单例实例如果不存在则返回None
"""
return cls._instance
#========================================== INIT ========================================
def __init__(self, parent=None):
"""
初始化行为系统UI
"""
super(BehaviourUI, self).__init__() # 不传递parent参数给BaseUI
# 设置单例实例
BehaviourUI._instance = self
super().__init__(parent)
# 创建主控件
self.main_widget = QtWidgets.QWidget(parent)
self.main_widget = QtWidgets.QWidget()
self.main_widget.setObjectName("behaviourMainWidget")
# 初始化控件、布局和按钮字典
self.controls = {}
self.layouts = {}
self.buttons = {}
self.splitters = {}
# 创建UI组件
self.create_widgets()
self.create_layouts()
self.create_connections()
# 更新UI文本
self.update_language()
# 设置全局样式,确保所有控件都没有最小宽度限制
self.main_widget.setStyleSheet("""
QWidget { min-width: 0px; }
@@ -118,7 +96,7 @@ class BehaviourUI(ui_utils.BaseUI):
包括标题标签、搜索框、控制列表、滑块等
"""
# 标题标签
self.controls["title_label"] = QtWidgets.QLabel(get_text("behaviour_title", "行为系统"))
self.controls["title_label"] = QtWidgets.QLabel(TEXT("behaviour_title", "行为系统"))
self.controls["title_label"].setObjectName("behaviourTitleLabel")
self.controls["title_label"].setAlignment(QtCore.Qt.AlignCenter)
self.controls["title_label"].setStyleSheet("font-size: 14px; font-weight: bold; padding: 5px;")
@@ -141,7 +119,7 @@ class BehaviourUI(ui_utils.BaseUI):
# 搜索框
self.controls["search_input"] = QtWidgets.QLineEdit()
self.controls["search_input"].setObjectName("searchInput")
self.controls["search_input"].setPlaceholderText(get_text("search", "搜索..."))
self.controls["search_input"].setPlaceholderText(TEXT("search", "搜索..."))
self.controls["search_input"].setFixedHeight(25)
# 控制列表
@@ -193,27 +171,27 @@ class BehaviourUI(ui_utils.BaseUI):
self.buttons["page_6"].setCheckable(True)
# 左下角Range按钮
self.buttons["range_minus"] = QtWidgets.QPushButton(get_text(" Range - ", " 范围 - "))
self.buttons["range_minus"] = QtWidgets.QPushButton(TEXT(" Range - ", " 范围 - "))
self.buttons["range_minus"].setObjectName("rangeMinusButton")
self.buttons["range_minus"].setIcon(ui_utils.load_icon("behaviour.png"))
self.buttons["range_minus"].setMinimumWidth(0)
self.buttons["range_plus"] = QtWidgets.QPushButton(get_text(" Range + ", " 范围 + "))
self.buttons["range_plus"] = QtWidgets.QPushButton(TEXT(" Range + ", " 范围 + "))
self.buttons["range_plus"].setObjectName("rangePlusButton")
self.buttons["range_plus"].setIcon(ui_utils.load_icon("behaviour.png"))
self.buttons["range_plus"].setMinimumWidth(0)
# 左侧面板控件 - Raw Control
self.controls["raw_control_group"] = QtWidgets.QGroupBox(get_text("Raw Control", "原始控制"))
self.controls["raw_control_group"] = QtWidgets.QGroupBox(TEXT("Raw Control", "原始控制"))
self.controls["raw_control_group"].setObjectName("rawControlGroup")
self.controls["raw_control_group"].setTitle(get_text("Raw Control", "原始控制"))
self.controls["raw_control_group"].setTitle(TEXT("Raw Control", "原始控制"))
self.controls["raw_control_group"].setFixedHeight(25)
# 右侧面板控件 - Related BlendShapes
self.controls["blendshapes_group"] = QtWidgets.QGroupBox(get_text("Related BlendShapes", "相关BlendShapes"))
self.controls["blendshapes_group"] = QtWidgets.QGroupBox(TEXT("Related BlendShapes", "相关BlendShapes"))
self.controls["blendshapes_group"].setObjectName("blendshapesGroup")
self.controls["blendshapes_group"].setTitle(get_text("Related BlendShapes", "相关BlendShapes"))
self.controls["blendshapes_group"].setTitle(TEXT("Related BlendShapes", "相关BlendShapes"))
self.controls["blendshapes_group"].setFixedHeight(25)
# BlendShapes列表
@@ -239,60 +217,60 @@ class BehaviourUI(ui_utils.BaseUI):
self.controls["bs_slider_all_check"].setObjectName("bsSliderAllCheck")
# 右下角BS Range按钮
self.buttons["bs_range_minus"] = QtWidgets.QPushButton(get_text(" Range - ", " 范围 - "))
self.buttons["bs_range_minus"] = QtWidgets.QPushButton(TEXT(" Range - ", " 范围 - "))
self.buttons["bs_range_minus"].setObjectName("bsRangeMinusButton")
self.buttons["bs_range_minus"].setIcon(ui_utils.load_icon("behaviour.png"))
self.buttons["bs_range_minus"].setMinimumWidth(0)
self.buttons["bs_range_plus"] = QtWidgets.QPushButton(get_text(" Range + ", " 范围 + "))
self.buttons["bs_range_plus"] = QtWidgets.QPushButton(TEXT(" Range + ", " 范围 + "))
self.buttons["bs_range_plus"].setObjectName("bsRangePlusButton")
self.buttons["bs_range_plus"].setIcon(ui_utils.load_icon("behaviour.png"))
self.buttons["bs_range_plus"].setMinimumWidth(0)
# BlendShape操作按钮
self.buttons["flip_target"] = QtWidgets.QPushButton(get_text("Flip Target", "翻转目标"))
self.buttons["flip_target"] = QtWidgets.QPushButton(TEXT("Flip Target", "翻转目标"))
self.buttons["flip_target"].setObjectName("flipTargetButton")
self.buttons["flip_target"].setIcon(ui_utils.load_icon("mirrorL.png"))
self.buttons["mirror_target"] = QtWidgets.QPushButton(get_text("Mirror Target", "镜像目标"))
self.buttons["mirror_target"] = QtWidgets.QPushButton(TEXT("Mirror Target", "镜像目标"))
self.buttons["mirror_target"].setObjectName("mirrorTargetButton")
self.buttons["mirror_target"].setIcon(ui_utils.load_icon("mirror.png"))
self.buttons["find_flip_target"] = QtWidgets.QPushButton(get_text("Find Flip Target", "查找翻转目标"))
self.buttons["find_flip_target"] = QtWidgets.QPushButton(TEXT("Find Flip Target", "查找翻转目标"))
self.buttons["find_flip_target"].setObjectName("findFlipTargetButton")
self.buttons["find_flip_target"].setIcon(ui_utils.load_icon("mirrorR.png"))
self.buttons["add_blendshape"] = QtWidgets.QPushButton(get_text("Add BlendShape", "添加BlendShape"))
self.buttons["add_blendshape"] = QtWidgets.QPushButton(TEXT("Add BlendShape", "添加BlendShape"))
self.buttons["add_blendshape"].setObjectName("addBlendshapeButton")
self.buttons["add_blendshape"].setIcon(ui_utils.load_icon("blendShape.png"))
self.buttons["delete_blendshape"] = QtWidgets.QPushButton(get_text("Delete BlendShape", "删除BlendShape"))
self.buttons["delete_blendshape"] = QtWidgets.QPushButton(TEXT("Delete BlendShape", "删除BlendShape"))
self.buttons["delete_blendshape"].setObjectName("deleteBlendshapeButton")
self.buttons["delete_blendshape"].setIcon(ui_utils.load_icon("blendShape.png"))
self.buttons["batch_blendshape"] = QtWidgets.QPushButton(get_text("Batch BlendShape", "批量BlendShape"))
self.buttons["batch_blendshape"] = QtWidgets.QPushButton(TEXT("Batch BlendShape", "批量BlendShape"))
self.buttons["batch_blendshape"].setObjectName("batchBlendshapeButton")
self.buttons["batch_blendshape"].setIcon(ui_utils.load_icon("blendShape.png"))
self.buttons["bs_range_minus"] = QtWidgets.QPushButton(get_text(" Range - ", " 范围 - "))
self.buttons["bs_range_minus"] = QtWidgets.QPushButton(TEXT(" Range - ", " 范围 - "))
self.buttons["bs_range_minus"].setObjectName("bsRangeMinusButton")
self.buttons["bs_range_minus"].setIcon(ui_utils.load_icon("behaviour.png"))
self.buttons["bs_range_minus"].setMinimumWidth(0)
self.buttons["bs_range_plus"] = QtWidgets.QPushButton(get_text(" Range + ", " 范围 + "))
self.buttons["bs_range_plus"] = QtWidgets.QPushButton(TEXT(" Range + ", " 范围 + "))
self.buttons["bs_range_plus"].setObjectName("bsRangePlusButton")
self.buttons["bs_range_plus"].setIcon(ui_utils.load_icon("behaviour.png"))
self.buttons["bs_range_plus"].setMinimumWidth(0)
self.buttons["rebuild_select"] = QtWidgets.QPushButton(get_text("Rebuild Select", "重建选择"))
self.buttons["rebuild_select"] = QtWidgets.QPushButton(TEXT("Rebuild Select", "重建选择"))
self.buttons["rebuild_select"].setObjectName("rebuildSelectButton")
self.buttons["rebuild_select"].setIcon(ui_utils.load_icon("loading.png"))
self.buttons["reposition_joints"] = QtWidgets.QPushButton(get_text("Reposition Joints", "重新定位关节"))
self.buttons["reposition_joints"] = QtWidgets.QPushButton(TEXT("Reposition Joints", "重新定位关节"))
self.buttons["reposition_joints"].setObjectName("repositionJointsButton")
self.buttons["reposition_joints"].setIcon(ui_utils.load_icon("loading.png"))
self.buttons["blend_select"] = QtWidgets.QPushButton(get_text("Blend Select", "混合选择"))
self.buttons["blend_select"] = QtWidgets.QPushButton(TEXT("Blend Select", "混合选择"))
self.buttons["blend_select"].setObjectName("blendSelectButton")
self.buttons["blend_select"].setIcon(ui_utils.load_icon("loading.png"))
@@ -314,64 +292,64 @@ class BehaviourUI(ui_utils.BaseUI):
self.controls["bottom_slider_all_check"].setObjectName("bottomSliderAllCheck")
# 底部标签页按钮
self.buttons["tab_psd"] = QtWidgets.QPushButton(get_text("PSD", "PSD"))
self.buttons["tab_psd"] = QtWidgets.QPushButton(TEXT("PSD", "PSD"))
self.buttons["tab_psd"].setIcon(ui_utils.load_icon("psd.png"))
self.buttons["tab_psd"].setObjectName("tabPsdButton")
self.buttons["tab_psd"].setCheckable(True)
self.buttons["tab_psd"].setChecked(True)
self.buttons["tab_bse"] = QtWidgets.QPushButton(get_text("BSE", "BSE"))
self.buttons["tab_bse"] = QtWidgets.QPushButton(TEXT("BSE", "BSE"))
self.buttons["tab_bse"].setIcon(ui_utils.load_icon("blendShape.png"))
self.buttons["tab_bse"].setObjectName("tabBseButton")
self.buttons["tab_bse"].setCheckable(True)
self.buttons["tab_bse"].setChecked(True)
self.buttons["tab_key"] = QtWidgets.QPushButton(get_text("KEY", "KEY"))
self.buttons["tab_key"] = QtWidgets.QPushButton(TEXT("KEY", "KEY"))
self.buttons["tab_key"].setIcon(ui_utils.load_icon("setKeyOnAnim.png"))
self.buttons["tab_key"].setObjectName("tabKeyButton")
self.buttons["tab_key"].setCheckable(True)
self.buttons["tab_key"].setChecked(True)
self.buttons["tab_mir"] = QtWidgets.QPushButton(get_text("MIR", "MIR"))
self.buttons["tab_mir"] = QtWidgets.QPushButton(TEXT("MIR", "MIR"))
self.buttons["tab_mir"].setIcon(ui_utils.load_icon("mirrorR.png"))
self.buttons["tab_mir"].setObjectName("tabMirButton")
self.buttons["tab_mir"].setCheckable(True)
self.buttons["tab_mir"].setChecked(True)
self.buttons["tab_ark"] = QtWidgets.QPushButton(get_text("ARK", "ARK"))
self.buttons["tab_ark"] = QtWidgets.QPushButton(TEXT("ARK", "ARK"))
self.buttons["tab_ark"].setIcon(ui_utils.load_icon("ARKit52.png"))
self.buttons["tab_ark"].setObjectName("tabArkButton")
self.buttons["tab_ark"].setCheckable(True)
self.buttons["tab_ark"].setChecked(True)
self.buttons["tab_ctr"] = QtWidgets.QPushButton(get_text("CTR", "CTR"))
self.buttons["tab_ctr"] = QtWidgets.QPushButton(TEXT("CTR", "CTR"))
self.buttons["tab_ctr"].setIcon(ui_utils.load_icon("ctrl_hide.png"))
self.buttons["tab_ctr"].setObjectName("tabCtrButton")
self.buttons["tab_ctr"].setCheckable(True)
self.buttons["tab_ctr"].setChecked(True)
# 底部功能按钮
self.buttons["reset_default_expression"] = QtWidgets.QPushButton(get_text("Reset Default", "重置默认"))
self.buttons["reset_default_expression"] = QtWidgets.QPushButton(TEXT("Reset Default", "重置默认"))
self.buttons["reset_default_expression"].setIcon(ui_utils.load_icon("reset.png"))
self.buttons["reset_default_expression"].setObjectName("resetDefaultExpressionButton")
self.buttons["find_select_expression"] = QtWidgets.QPushButton(get_text("Find Select", "查找选择"))
self.buttons["find_select_expression"] = QtWidgets.QPushButton(TEXT("Find Select", "查找选择"))
self.buttons["find_select_expression"].setIcon(ui_utils.load_icon("expressions_current.png"))
self.buttons["find_select_expression"].setObjectName("findSelectExpressionButton")
self.buttons["write_current_expressions"] = QtWidgets.QPushButton(get_text("Write Current", "写入当前"))
self.buttons["write_current_expressions"] = QtWidgets.QPushButton(TEXT("Write Current", "写入当前"))
self.buttons["write_current_expressions"].setIcon(ui_utils.load_icon("expression.png"))
self.buttons["write_current_expressions"].setObjectName("writeCurrentExpressionsButton")
self.buttons["controller_find"] = QtWidgets.QPushButton(get_text("Controller Find", "控制器查找"))
self.buttons["controller_find"] = QtWidgets.QPushButton(TEXT("Controller Find", "控制器查找"))
self.buttons["controller_find"].setIcon(ui_utils.load_icon("controller.png"))
self.buttons["controller_find"].setObjectName("controllerFindButton")
self.buttons["select_associated_joint"] = QtWidgets.QPushButton(get_text("Select Joint", "选择关节"))
self.buttons["select_associated_joint"] = QtWidgets.QPushButton(TEXT("Select Joint", "选择关节"))
self.buttons["select_associated_joint"].setIcon(ui_utils.load_icon("out_joint.png"))
self.buttons["select_associated_joint"].setObjectName("selectAssociatedJointButton")
self.buttons["write_find_mirror"] = QtWidgets.QPushButton(get_text("Find Mirror", "查找镜像"))
self.buttons["write_find_mirror"] = QtWidgets.QPushButton(TEXT("Find Mirror", "查找镜像"))
self.buttons["write_find_mirror"].setIcon(ui_utils.load_icon("mirror.png"))
self.buttons["write_find_mirror"].setObjectName("writeFindMirrorButton")
@@ -417,7 +395,7 @@ class BehaviourUI(ui_utils.BaseUI):
self.layouts["left_content_layout"].setSpacing(5)
# 添加标题标签
left_title = QtWidgets.QLabel(get_text("Raw Control", "原始控制"))
left_title = QtWidgets.QLabel(TEXT("Raw Control", "原始控制"))
left_title.setStyleSheet("font-weight: bold;")
self.layouts["left_content_layout"].addWidget(left_title)
@@ -481,7 +459,7 @@ class BehaviourUI(ui_utils.BaseUI):
self.layouts["right_content_layout"].setSpacing(5)
# 添加标题标签
right_title = QtWidgets.QLabel(get_text("Related BlendShapes", "相关BlendShapes"))
right_title = QtWidgets.QLabel(TEXT("Related BlendShapes", "相关BlendShapes"))
right_title.setStyleSheet("font-weight: bold;")
self.layouts["right_content_layout"].addWidget(right_title)