Files
MetaFusion/scripts/ui/toolbar.py
2025-05-03 17:28:33 +08:00

197 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Toolbar UI Module for Plugin
工具栏UI模块 - 负责显示工具栏界面和基础操作
基本功能:
- 加载预设
- 保存预设
- 导入DNA
- 导出DNA
- 创建RL4节点用于切换DNA编辑的状态
- 删除RL4节点用于切换DNA编辑的状态
"""
#===================================== IMPORT MODULES =====================================
from Qt import QtWidgets, QtCore, QtGui
from Qt.QtCompat import wrapInstance
from maya import OpenMayaUI as omui
import sys
import os
#===================================== IMPORT FUNCTIONS ===================================
from scripts.utils import utils_toolbar as utils_toolbar
from scripts.ui import ui_utils
import config
# 导入图标路径
ICONS_PATH = config.ICONS_PATH
#========================================== WIDGETS ==========================================
# 全局变量存储UI控件
toolbar_buttons = {}
status_label = None
# 按钮图标和提示文本映射
button_configs = {
"open_file": {"icon": "open.png", "tooltip": "打开文件"},
"save_file": {"icon": "save.png", "tooltip": "保存文件"},
"save_as": {"icon": "save_new.png", "tooltip": "另存为"},
"load_preset": {"icon": "import_preset.png", "tooltip": "加载预设"},
"save_preset": {"icon": "export_preset.png", "tooltip": "导出预设"},
"import_dna": {"icon": "import_dna.png", "tooltip": "导入DNA"},
"export_dna": {"icon": "export_dna.png", "tooltip": "导出DNA"},
"create_rl4": {"icon": "create_rl4_node.png", "tooltip": "创建RL4节点"},
"delete_rl4": {"icon": "delete_rl4_node.png", "tooltip": "删除RL4节点"}
}
def widgets():
"""
创建工具栏UI控件
"""
global toolbar_buttons, status_label
# 创建按钮的辅助函数
def create_icon_button(button_id, size=24):
config = button_configs[button_id]
button = QtWidgets.QPushButton()
button.setToolTip(config["tooltip"]) # 设置提示文本
button.setFixedSize(size, size) # 设置固定大小
# 设置样式类名
button.setObjectName("ToolbarIconButton")
# 设置图标
icon_path = os.path.abspath(os.path.join(ICONS_PATH, config["icon"]))
if os.path.exists(icon_path):
icon = QtGui.QIcon(icon_path)
if not icon.isNull():
button.setIcon(icon)
button.setIconSize(QtCore.QSize(size-4, size-4)) # 图标尺寸稍小于按钮
print(f"成功设置按钮图标 {button_id}: {icon_path}")
else:
print(f"图标加载失败 {button_id}: {icon_path}")
else:
print(f"警告: 图标文件未找到 {button_id}: {icon_path}")
return button
# 创建所有按钮
# 文件操作按钮
toolbar_buttons["open_file"] = create_icon_button("open_file")
toolbar_buttons["save_file"] = create_icon_button("save_file")
toolbar_buttons["save_as"] = create_icon_button("save_as")
# 预设操作按钮
toolbar_buttons["load_preset"] = create_icon_button("load_preset")
toolbar_buttons["save_preset"] = create_icon_button("save_preset")
# DNA操作按钮
toolbar_buttons["import_dna"] = create_icon_button("import_dna")
toolbar_buttons["export_dna"] = create_icon_button("export_dna")
# RL4节点操作按钮
toolbar_buttons["create_rl4"] = create_icon_button("create_rl4")
toolbar_buttons["delete_rl4"] = create_icon_button("delete_rl4")
# 移除DNA下拉菜单
# 状态标签
status_label = QtWidgets.QLabel("就绪")
status_label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
status_label.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
status_label.setObjectName("StatusLabel")
# status_label.setStyleSheet("""
# QLabel {
# color: #CCCCCC;
# padding-right: 5px;
# font-size: 9pt;
# }
# """)
#========================================== LAYOUTS ==========================================
def layouts(parent_frame=None):
"""
创建工具栏UI布局
Args:
parent_frame: 父容器控件由Main.py传入
"""
# 获取父容器在Main.py中创建的toolbar_frame
if not parent_frame:
parent_frame = ui_utils.get_parent_widget("toolbar_frame")
if not parent_frame:
print("无法获取父容器,布局创建失败")
return
# 创建主布局
main_layout = parent_frame.layout()
if not main_layout:
print("父容器没有布局,布局创建失败")
return
# 创建工具栏布局
toolbar_layout = QtWidgets.QHBoxLayout()
toolbar_layout.setContentsMargins(2, 2, 2, 2)
toolbar_layout.setSpacing(2) # 减小按钮之间的间距
toolbar_layout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) # 设置布局约束为默认,允许自适应
# 创建分隔符样式
def create_separator():
separator = QtWidgets.QFrame()
separator.setFrameShape(QtWidgets.QFrame.VLine)
separator.setFrameShadow(QtWidgets.QFrame.Sunken)
separator.setObjectName("ToolbarSeparator")
return separator
# 添加文件操作按钮
toolbar_layout.addWidget(toolbar_buttons["open_file"])
toolbar_layout.addWidget(toolbar_buttons["save_file"])
toolbar_layout.addWidget(toolbar_buttons["save_as"])
toolbar_layout.addWidget(create_separator()) # 使用自定义分隔符
# 添加预设操作按钮
toolbar_layout.addWidget(toolbar_buttons["load_preset"])
toolbar_layout.addWidget(toolbar_buttons["save_preset"])
toolbar_layout.addWidget(create_separator()) # 使用自定义分隔符
# 添加DNA操作按钮
toolbar_layout.addWidget(toolbar_buttons["import_dna"])
toolbar_layout.addWidget(toolbar_buttons["export_dna"])
toolbar_layout.addWidget(create_separator()) # 使用自定义分隔符
# 添加RL4节点操作按钮
toolbar_layout.addWidget(toolbar_buttons["create_rl4"])
toolbar_layout.addWidget(toolbar_buttons["delete_rl4"])
toolbar_layout.addStretch()
toolbar_layout.addWidget(status_label)
# 添加到主布局
main_layout.addLayout(toolbar_layout)
#========================================== CONNECTIONS ==========================================
def connections():
"""
连接工具栏UI信号和槽
"""
# 文件操作按钮连接
toolbar_buttons["open_file"].clicked.connect(lambda: print("打开文件功能待实现"))
toolbar_buttons["save_file"].clicked.connect(lambda: print("保存文件功能待实现"))
toolbar_buttons["save_as"].clicked.connect(lambda: print("另存为功能待实现"))
# 预设操作按钮连接
toolbar_buttons["load_preset"].clicked.connect(lambda: print("加载预设功能待实现"))
toolbar_buttons["save_preset"].clicked.connect(lambda: print("导出预设功能待实现"))
# DNA操作按钮连接
toolbar_buttons["import_dna"].clicked.connect(lambda: print("导入DNA功能待实现"))
toolbar_buttons["export_dna"].clicked.connect(lambda: print("导出DNA功能待实现"))
# RL4节点操作按钮连接
toolbar_buttons["create_rl4"].clicked.connect(lambda: print("创建RL4节点功能待实现"))
toolbar_buttons["delete_rl4"].clicked.connect(lambda: print("删除RL4节点功能待实现"))
#===================================== PLACEHOLDER FUNCTION ===================================
def toolbar_temp_function():
return utils_toolbar.toolbar_temp_utils_function()