feat: UI输入框IME支持和编辑器Inspector重构 (#310)
UI系统改进: - 添加 IMEHelper 支持中文/日文/韩文输入法 - UIInputFieldComponent 添加组合输入状态管理 - UIInputSystem 添加 IME 事件处理 - UIInputFieldRenderSystem 优化渲染逻辑 - UIRenderCollector 增强纹理处理 引擎改进: - EngineBridge 添加新的渲染接口 - EngineRenderSystem 优化渲染流程 - Rust 引擎添加新的渲染功能 编辑器改进: - 新增模块化 Inspector 组件架构 - EntityRefField 增强实体引用选择 - 优化 FlexLayoutDock 和 SceneHierarchy 样式 - 添加国际化文本
This commit is contained in:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user