项目打开功能

This commit is contained in:
YHH
2025-10-15 00:23:19 +08:00
parent 4550a6146a
commit b757c1d06c
7 changed files with 172 additions and 8 deletions

View File

@@ -2,6 +2,7 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use tauri::Manager;
use tauri::AppHandle;
// IPC Commands
#[tauri::command]
@@ -25,12 +26,22 @@ fn save_project(path: String, data: String) -> Result<(), String> {
#[tauri::command]
fn export_binary(data: Vec<u8>, output_path: String) -> Result<(), String> {
// 二进制导出逻辑
std::fs::write(&output_path, data)
.map_err(|e| format!("Failed to export binary: {}", e))?;
Ok(())
}
#[tauri::command]
async fn open_project_dialog(app: AppHandle) -> Result<Option<String>, String> {
use tauri::api::dialog::blocking::FileDialogBuilder;
let result = FileDialogBuilder::new()
.set_title("Select Project Directory")
.pick_folder();
Ok(result.map(|path| path.to_string_lossy().to_string()))
}
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
@@ -47,7 +58,8 @@ fn main() {
greet,
open_project,
save_project,
export_binary
export_binary,
open_project_dialog
])
.run(tauri::generate_context!())
.expect("error while running tauri application");

View File

@@ -1,6 +1,6 @@
import { useState, useEffect } from 'react';
import { Core, Scene } from '@esengine/ecs-framework';
import { EditorPluginManager, UIRegistry, MessageHub, SerializerRegistry, EntityStoreService, ComponentRegistry, LocaleService, PropertyMetadataService } from '@esengine/editor-core';
import { EditorPluginManager, UIRegistry, MessageHub, SerializerRegistry, EntityStoreService, ComponentRegistry, LocaleService, PropertyMetadataService, ProjectService } from '@esengine/editor-core';
import { SceneInspectorPlugin } from './plugins/SceneInspectorPlugin';
import { SceneHierarchy } from './components/SceneHierarchy';
import { EntityInspector } from './components/EntityInspector';
@@ -69,6 +69,7 @@ function App() {
const serializerRegistry = new SerializerRegistry();
const entityStore = new EntityStoreService(messageHub);
const componentRegistry = new ComponentRegistry();
const projectService = new ProjectService(messageHub);
componentRegistry.register({
name: 'Transform',
@@ -96,6 +97,7 @@ function App() {
Core.services.registerInstance(SerializerRegistry, serializerRegistry);
Core.services.registerInstance(EntityStoreService, entityStore);
Core.services.registerInstance(ComponentRegistry, componentRegistry);
Core.services.registerInstance(ProjectService, projectService);
const pluginMgr = new EditorPluginManager();
pluginMgr.initialize(coreInstance, Core.services);
@@ -142,11 +144,30 @@ function App() {
changeLocale(newLocale);
};
const handleOpenProject = async () => {
try {
const projectPath = await TauriAPI.openProjectDialog();
if (projectPath) {
const projectService = Core.services.resolve(ProjectService);
if (projectService) {
await projectService.openProject(projectPath);
setStatus(t('header.status.projectOpened'));
}
}
} catch (error) {
console.error('Failed to open project:', error);
setStatus(t('header.status.failed'));
}
};
return (
<div className="editor-container">
<div className="editor-header">
<h1>{t('app.title')}</h1>
<div className="header-toolbar">
<button onClick={handleOpenProject} disabled={!initialized} className="toolbar-btn">
{t('header.toolbar.openProject')}
</button>
<button onClick={handleCreateEntity} disabled={!initialized} className="toolbar-btn">
{t('header.toolbar.createEntity')}
</button>

View File

@@ -11,9 +11,10 @@ export class TauriAPI {
return await invoke<string>('greet', { name });
}
/**
* 打开项目
*/
static async openProjectDialog(): Promise<string | null> {
return await invoke<string | null>('open_project_dialog');
}
static async openProject(path: string): Promise<string> {
return await invoke<string>('open_project', { path });
}

View File

@@ -6,13 +6,15 @@ export const en: Translations = {
},
header: {
toolbar: {
openProject: 'Open Project',
createEntity: 'Create Entity',
deleteEntity: 'Delete Entity'
},
status: {
initializing: 'Initializing...',
ready: 'Editor Ready',
failed: 'Initialization Failed'
failed: 'Initialization Failed',
projectOpened: 'Project Opened'
}
},
hierarchy: {

View File

@@ -6,13 +6,15 @@ export const zh: Translations = {
},
header: {
toolbar: {
openProject: '打开项目',
createEntity: '创建实体',
deleteEntity: '删除实体'
},
status: {
initializing: '初始化中...',
ready: '编辑器就绪',
failed: '初始化失败'
failed: '初始化失败',
projectOpened: '项目已打开'
}
},
hierarchy: {