feat: UI输入框IME支持和编辑器Inspector重构 (#310)

UI系统改进:
- 添加 IMEHelper 支持中文/日文/韩文输入法
- UIInputFieldComponent 添加组合输入状态管理
- UIInputSystem 添加 IME 事件处理
- UIInputFieldRenderSystem 优化渲染逻辑
- UIRenderCollector 增强纹理处理

引擎改进:
- EngineBridge 添加新的渲染接口
- EngineRenderSystem 优化渲染流程
- Rust 引擎添加新的渲染功能

编辑器改进:
- 新增模块化 Inspector 组件架构
- EntityRefField 增强实体引用选择
- 优化 FlexLayoutDock 和 SceneHierarchy 样式
- 添加国际化文本
This commit is contained in:
YHH
2025-12-19 15:45:14 +08:00
committed by GitHub
parent 536c4c5593
commit ecdb8f2021
46 changed files with 5825 additions and 257 deletions

View File

@@ -51,6 +51,7 @@ import { ConfirmDialog } from './components/ConfirmDialog';
import { ExternalModificationDialog } from './components/ExternalModificationDialog';
import { PluginGeneratorWindow } from './components/PluginGeneratorWindow';
import { BuildSettingsWindow } from './components/BuildSettingsWindow';
import { AssetPickerDialog } from './components/dialogs/AssetPickerDialog';
import { ForumPanel } from './components/forum';
import { ToastProvider, useToast } from './components/Toast';
import { TitleBar } from './components/TitleBar';
@@ -210,6 +211,13 @@ function App() {
externalModificationDialog, setExternalModificationDialog
} = useDialogStore();
// 资产选择器对话框状态 | Asset picker dialog state
const [assetPickerState, setAssetPickerState] = useState<{
isOpen: boolean;
extensions?: string[];
onSelect?: (path: string) => void;
}>({ isOpen: false });
// 全局监听独立调试窗口的数据请求 | Global listener for standalone debug window requests
useEffect(() => {
let broadcastInterval: ReturnType<typeof setInterval> | null = null;
@@ -490,6 +498,26 @@ function App() {
return () => unsubscribe?.();
}, [initialized, addDynamicPanel, setActivePanelId]);
// 资产选择器消息订阅 | Asset picker message subscription
useEffect(() => {
if (!initialized || !messageHubRef.current) return;
const hub = messageHubRef.current;
const unsubscribe = hub.subscribe('asset:pick', (data: {
extensions?: string[];
onSelect?: (path: string) => void;
}) => {
logger.info('Opening asset picker dialog with extensions:', data.extensions);
setAssetPickerState({
isOpen: true,
extensions: data.extensions,
onSelect: data.onSelect
});
});
return () => unsubscribe?.();
}, [initialized]);
useEffect(() => {
if (!initialized || !messageHubRef.current) return;
const hub = messageHubRef.current;
@@ -1427,6 +1455,20 @@ function App() {
/>
)}
{/* 资产选择器对话框 | Asset Picker Dialog */}
<AssetPickerDialog
isOpen={assetPickerState.isOpen}
onClose={() => setAssetPickerState({ isOpen: false })}
onSelect={(path) => {
if (assetPickerState.onSelect) {
assetPickerState.onSelect(path);
}
setAssetPickerState({ isOpen: false });
}}
title={t('asset.selectAsset')}
fileExtensions={assetPickerState.extensions}
/>
{/* 渲染调试面板 | Render Debug Panel */}
<RenderDebugPanel
visible={showRenderDebug}