Files
esengine/packages/editor-app/src-tauri/src/commands.rs
YHH 009f8af4e1 Feature/ecs behavior tree (#188)
* feat(behavior-tree): 完全 ECS 化的行为树系统

* feat(editor-app): 添加行为树可视化编辑器

* chore: 移除 Cocos Creator 扩展目录

* feat(editor-app): 行为树编辑器功能增强

* fix(editor-app): 修复 TypeScript 类型错误

* feat(editor-app): 使用 FlexLayout 重构面板系统并优化资产浏览器

* feat(editor-app): 改进编辑器UI样式并修复行为树执行顺序

* feat(behavior-tree,editor-app): 添加装饰器系统并优化编辑器性能

* feat(behavior-tree,editor-app): 添加属性绑定系统

* feat(editor-app,behavior-tree): 优化编辑器UI并改进行为树功能

* feat(editor-app,behavior-tree): 添加全局黑板系统并增强资产浏览器功能

* feat(behavior-tree,editor-app): 添加运行时资产导出系统

* feat(behavior-tree,editor-app): 添加SubTree系统和资产选择器

* feat(behavior-tree,editor-app): 优化系统架构并改进编辑器文件管理

* fix(behavior-tree,editor-app): 修复SubTree节点错误显示空节点警告

* fix(editor-app): 修复局部黑板类型定义文件扩展名错误
2025-10-27 09:29:11 +08:00

129 lines
3.5 KiB
Rust

use serde::{Deserialize, Serialize};
use std::sync::Arc;
use tokio::sync::Mutex;
use crate::profiler_ws::ProfilerServer;
#[derive(Debug, Serialize, Deserialize)]
pub struct ProjectInfo {
pub name: String,
pub path: String,
pub version: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EditorConfig {
pub theme: String,
pub auto_save: bool,
pub recent_projects: Vec<String>,
}
impl Default for EditorConfig {
fn default() -> Self {
Self {
theme: "dark".to_string(),
auto_save: true,
recent_projects: Vec::new(),
}
}
}
pub struct ProfilerState {
pub server: Arc<Mutex<Option<Arc<ProfilerServer>>>>,
}
#[tauri::command]
pub async fn start_profiler_server(
port: u16,
state: tauri::State<'_, ProfilerState>,
) -> Result<String, String> {
let mut server_lock = state.server.lock().await;
if server_lock.is_some() {
return Err("Profiler server is already running".to_string());
}
let server = Arc::new(ProfilerServer::new(port));
match server.start().await {
Ok(_) => {
*server_lock = Some(server);
Ok(format!("Profiler server started on port {}", port))
}
Err(e) => Err(format!("Failed to start profiler server: {}", e)),
}
}
#[tauri::command]
pub async fn stop_profiler_server(
state: tauri::State<'_, ProfilerState>,
) -> Result<String, String> {
let mut server_lock = state.server.lock().await;
if server_lock.is_none() {
return Err("Profiler server is not running".to_string());
}
*server_lock = None;
Ok("Profiler server stopped".to_string())
}
#[tauri::command]
pub async fn get_profiler_status(
state: tauri::State<'_, ProfilerState>,
) -> Result<bool, String> {
let server_lock = state.server.lock().await;
Ok(server_lock.is_some())
}
#[tauri::command]
pub async fn read_behavior_tree_file(file_path: String) -> Result<String, String> {
use std::fs;
// 使用 Rust 标准库直接读取文件,绕过 Tauri 的 scope 限制
fs::read_to_string(&file_path)
.map_err(|e| format!("Failed to read file {}: {}", file_path, e))
}
#[tauri::command]
pub async fn write_behavior_tree_file(file_path: String, content: String) -> Result<(), String> {
use std::fs;
// 使用 Rust 标准库直接写入文件
fs::write(&file_path, content)
.map_err(|e| format!("Failed to write file {}: {}", file_path, e))
}
#[tauri::command]
pub async fn read_global_blackboard(project_path: String) -> Result<String, String> {
use std::fs;
use std::path::Path;
let config_path = Path::new(&project_path).join(".ecs").join("global-blackboard.json");
if !config_path.exists() {
return Ok(String::from(r#"{"version":"1.0","variables":[]}"#));
}
fs::read_to_string(&config_path)
.map_err(|e| format!("Failed to read global blackboard: {}", e))
}
#[tauri::command]
pub async fn write_global_blackboard(project_path: String, content: String) -> Result<(), String> {
use std::fs;
use std::path::Path;
let ecs_dir = Path::new(&project_path).join(".ecs");
let config_path = ecs_dir.join("global-blackboard.json");
// 创建 .ecs 目录(如果不存在)
if !ecs_dir.exists() {
fs::create_dir_all(&ecs_dir)
.map_err(|e| format!("Failed to create .ecs directory: {}", e))?;
}
fs::write(&config_path, content)
.map_err(|e| format!("Failed to write global blackboard: {}", e))
}