2025-04-27 00:05:18 +08:00
|
|
|
<script setup lang="ts">
|
2025-04-30 00:17:09 +08:00
|
|
|
import type { RobotGroup } from '@api/robot';
|
|
|
|
import { getSceneById } from '@api/scene';
|
2025-04-27 00:05:18 +08:00
|
|
|
import { EditorService } from '@core/editor.service';
|
2025-04-30 00:17:09 +08:00
|
|
|
import { watch } from 'vue';
|
|
|
|
import { ref } from 'vue';
|
2025-04-27 00:05:18 +08:00
|
|
|
import { onMounted, provide, shallowRef } from 'vue';
|
|
|
|
|
|
|
|
const EDITOR_KEY = Symbol('editor-key');
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
id: string;
|
|
|
|
};
|
|
|
|
const props = defineProps<Props>();
|
|
|
|
|
2025-04-30 00:17:09 +08:00
|
|
|
const title = ref<string>('');
|
|
|
|
const groups = ref<RobotGroup[]>([]);
|
|
|
|
const map = ref<string>('');
|
|
|
|
onMounted(() => {
|
|
|
|
getSceneById(props.id).then((res) => {
|
|
|
|
title.value = res?.label ?? '';
|
|
|
|
groups.value = res?.robotGroups ?? [];
|
|
|
|
map.value = res?.map ?? '';
|
|
|
|
});
|
|
|
|
});
|
|
|
|
watch(map, (v) => {
|
|
|
|
editor.value?.load(v, !editable.value);
|
|
|
|
});
|
|
|
|
|
2025-04-27 00:05:18 +08:00
|
|
|
const container = shallowRef<HTMLDivElement>();
|
|
|
|
const editor = shallowRef<EditorService>();
|
|
|
|
provide(EDITOR_KEY, editor);
|
|
|
|
onMounted(() => {
|
|
|
|
editor.value = new EditorService(container.value!);
|
|
|
|
});
|
2025-04-30 00:17:09 +08:00
|
|
|
|
|
|
|
const editable = ref<boolean>(false);
|
2025-05-02 00:35:53 +08:00
|
|
|
watch(editable, (v) => {
|
|
|
|
editor.value?.setState(v);
|
|
|
|
});
|
2025-04-27 00:05:18 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<a-layout class="full">
|
2025-05-01 01:07:16 +08:00
|
|
|
<a-layout-header class="p-16" style="height: 64px">
|
|
|
|
<a-flex justify="space-between" align="center">
|
2025-04-30 00:17:09 +08:00
|
|
|
<a-typography-text strong>{{ title }}</a-typography-text>
|
2025-05-01 01:07:16 +08:00
|
|
|
<a-space align="center">
|
2025-05-02 00:35:53 +08:00
|
|
|
<a-button v-if="editable" class="warning" @click="editable = false">
|
|
|
|
<i class="icon exit mr-8" />
|
|
|
|
<span>{{ $t('退出编辑器') }}</span>
|
|
|
|
</a-button>
|
|
|
|
<a-button v-else type="primary" @click="editable = true">
|
|
|
|
<i class="icon edit mr-8" />
|
2025-05-01 01:07:16 +08:00
|
|
|
<span>{{ $t('启用编辑器') }}</span>
|
|
|
|
</a-button>
|
|
|
|
<a-button>{{ $t('推送') }}</a-button>
|
|
|
|
<a-button>{{ $t('导入') }}</a-button>
|
|
|
|
<a-button>{{ $t('导出') }}</a-button>
|
|
|
|
</a-space>
|
2025-04-30 00:17:09 +08:00
|
|
|
</a-flex>
|
|
|
|
</a-layout-header>
|
2025-04-27 00:05:18 +08:00
|
|
|
|
2025-05-01 01:07:16 +08:00
|
|
|
<a-layout class="p-16">
|
|
|
|
<a-layout-sider :width="320">
|
|
|
|
<a-tabs class="full" type="card">
|
|
|
|
<a-tab-pane key="1" :tab="$t('机器人')">
|
2025-05-02 00:35:53 +08:00
|
|
|
<RobotGroup v-if="editor" :editor="EDITOR_KEY" :editable="editable" :groups="groups" />
|
2025-05-01 01:07:16 +08:00
|
|
|
</a-tab-pane>
|
|
|
|
<a-tab-pane key="2" :tab="$t('库区')">Content of Tab Pane 2</a-tab-pane>
|
|
|
|
<a-tab-pane key="3" :tab="$t('高级组')">Content of Tab Pane 3</a-tab-pane>
|
|
|
|
</a-tabs>
|
2025-04-27 00:05:18 +08:00
|
|
|
</a-layout-sider>
|
|
|
|
<a-layout-content>
|
2025-05-01 01:07:16 +08:00
|
|
|
<div ref="container" class="editor-container full"></div>
|
2025-04-27 00:05:18 +08:00
|
|
|
</a-layout-content>
|
|
|
|
</a-layout>
|
|
|
|
</a-layout>
|
|
|
|
</template>
|
|
|
|
|
2025-05-01 01:07:16 +08:00
|
|
|
<style scoped lang="scss">
|
|
|
|
.editor-container {
|
|
|
|
background-color: transparent !important;
|
|
|
|
}
|
|
|
|
</style>
|