{/* Toolbar */}
setSearchQuery(e.target.value)}
/>
{!isShowingRemote && (
)}
{isRemoteConnected && !isProfilerMode && (
)}
{showRemoteIndicator && (
)}
{/* Column Headers */}
handleSortClick('name')}
>
Item Label
{sortColumn === 'name' && (
{sortDirection === 'asc' ? '▲' : '▼'}
)}
handleSortClick('type')}
>
Type
{sortColumn === 'type' && (
{sortDirection === 'asc' ? '▲' : '▼'}
)}
{/* Entity List */}
!isShowingRemote && handleContextMenu(e, null)}>
{displayEntities.length === 0 ? (
{isShowingRemote
? (locale === 'zh' ? '远程游戏中没有实体' : 'No entities in remote game')
: (locale === 'zh' ? '创建实体开始使用' : 'Create an entity to get started')}
) : isShowingRemote ? (
{(displayEntities as RemoteEntity[]).map((entity) => (
handleRemoteEntityClick(entity)}
>
{getEntityIcon(entity.componentTypes?.[0] || 'Entity')}
{entity.name}
{entity.componentTypes?.[0] || 'Entity'}
))}
) : (
{/* World/Scene Root */}
toggleFolderExpand(-1)}
>
{ e.stopPropagation(); toggleFolderExpand(-1); }}
>
{expandedFolders.has(-1) ? : }
{displaySceneName} (Editor)
World
{/* Entity Items */}
{expandedFolders.has(-1) && entities.map((entity, index) => {
const entityType = getEntityType(entity);
return (
handleEntityClick(entity, e)}
onDragStart={(e) => handleDragStart(e, entity.id)}
onDragOver={(e) => handleDragOver(e, index)}
onDragLeave={handleDragLeave}
onDrop={(e) => handleDrop(e, index)}
onDragEnd={handleDragEnd}
onContextMenu={(e) => {
e.stopPropagation();
handleEntityClick(entity, e);
handleContextMenu(e, entity.id);
}}
>
{getEntityIcon(entityType)}
{entity.name || `Entity ${entity.id}`}
{entityType}
);
})}
)}
{/* Status Bar */}
{totalCount} {locale === 'zh' ? '个对象' : 'actors'}
{selectedCount > 0 && (
({selectedCount} {locale === 'zh' ? '个已选中' : 'selected'})
)}
{contextMenu && !isShowingRemote && (
{ handleCreateEntity(); closeContextMenu(); }}
onCreateFromTemplate={async (template) => {
await template.create(contextMenu.entityId ?? undefined);
closeContextMenu();
}}
onDelete={() => { handleDeleteEntity(); closeContextMenu(); }}
onClose={closeContextMenu}
/>
)}
);
}
interface ContextMenuWithSubmenuProps {
x: number;
y: number;
locale: string;
entityId: number | null;
pluginTemplates: EntityCreationTemplate[];
onCreateEmpty: () => void;
onCreateFromTemplate: (template: EntityCreationTemplate) => void;
onDelete: () => void;
onClose: () => void;
}
function ContextMenuWithSubmenu({
x, y, locale, entityId, pluginTemplates,
onCreateEmpty, onCreateFromTemplate, onDelete
}: ContextMenuWithSubmenuProps) {
const [activeSubmenu, setActiveSubmenu] = useState