2025-11-19 14:54:03 +08:00
|
|
|
import React from 'react';
|
2025-11-23 14:49:37 +08:00
|
|
|
import { IFieldEditor, FieldEditorProps, MessageHub } from '@esengine/editor-core';
|
|
|
|
|
import { Core } from '@esengine/ecs-framework';
|
2025-11-19 14:54:03 +08:00
|
|
|
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 || '拖拽或选择资源文件';
|
|
|
|
|
|
2025-11-23 14:49:37 +08:00
|
|
|
const handleNavigate = (path: string) => {
|
|
|
|
|
const messageHub = Core.services.tryResolve(MessageHub);
|
|
|
|
|
if (messageHub) {
|
|
|
|
|
messageHub.publish('asset:reveal', { path });
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-25 22:23:19 +08:00
|
|
|
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);
|
|
|
|
|
|
2025-11-19 14:54:03 +08:00
|
|
|
return (
|
|
|
|
|
<AssetField
|
|
|
|
|
label={label}
|
|
|
|
|
value={value}
|
|
|
|
|
onChange={onChange}
|
|
|
|
|
fileExtension={fileExtension}
|
|
|
|
|
placeholder={placeholder}
|
|
|
|
|
readonly={context.readonly}
|
2025-11-23 14:49:37 +08:00
|
|
|
onNavigate={handleNavigate}
|
2025-11-25 22:23:19 +08:00
|
|
|
onCreate={canCreate ? handleCreate : undefined}
|
2025-11-19 14:54:03 +08:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
2025-11-23 14:49:37 +08:00
|
|
|
}
|