Files
esengine/packages/editor-app/src/infrastructure/field-editors/AssetFieldEditor.tsx
YHH 3fb6f919f8 Feature/tilemap editor (#237)
* feat: 添加 Tilemap 编辑器插件和组件生命周期支持

* feat(editor-core): 添加声明式插件注册 API

* feat(editor-core): 改进tiledmap结构合并tileset进tiledmapeditor

* feat: 添加 editor-runtime SDK 和插件系统改进

* fix(ci): 修复SceneResourceManager里变量未使用问题
2025-11-25 22:23:19 +08:00

59 lines
2.2 KiB
TypeScript

import React from 'react';
import { IFieldEditor, FieldEditorProps, MessageHub } from '@esengine/editor-core';
import { Core } from '@esengine/ecs-framework';
import { AssetField } from '../../components/inspectors/fields/AssetField';
export class AssetFieldEditor implements IFieldEditor<string | null> {
readonly type = 'asset';
readonly name = 'Asset Field Editor';
readonly priority = 100;
canHandle(fieldType: string): boolean {
return fieldType === 'asset' || fieldType === 'assetReference' || fieldType === 'resourcePath';
}
render({ label, value, onChange, context }: FieldEditorProps<string | null>): React.ReactElement {
const fileExtension = context.metadata?.fileExtension || '';
const placeholder = context.metadata?.placeholder || '拖拽或选择资源文件';
const handleNavigate = (path: string) => {
const messageHub = Core.services.tryResolve(MessageHub);
if (messageHub) {
messageHub.publish('asset:reveal', { path });
}
};
const handleCreate = () => {
const messageHub = Core.services.tryResolve(MessageHub);
if (messageHub) {
if (fileExtension === '.tilemap.json') {
messageHub.publish('tilemap:create-asset', {
entityId: context.metadata?.entityId,
onChange
});
} else if (fileExtension === '.btree') {
messageHub.publish('behavior-tree:create-asset', {
entityId: context.metadata?.entityId,
onChange
});
}
}
};
const canCreate = ['.tilemap.json', '.btree'].includes(fileExtension);
return (
<AssetField
label={label}
value={value}
onChange={onChange}
fileExtension={fileExtension}
placeholder={placeholder}
readonly={context.readonly}
onNavigate={handleNavigate}
onCreate={canCreate ? handleCreate : undefined}
/>
);
}
}