|
@@ -19,7 +19,16 @@
|
|
|
</template>
|
|
|
<t-icon v-else name="control-platform" />
|
|
|
|
|
|
- {{ node.label }}
|
|
|
+ <t-input
|
|
|
+ v-if="node.data.edited"
|
|
|
+ v-model="node.data.label"
|
|
|
+ :autofocus="true"
|
|
|
+ @blur="onDescription(node)"
|
|
|
+ @enter="onDescription(node)"
|
|
|
+ />
|
|
|
+ <span v-else @dblclick="node.data.edited = true">
|
|
|
+ {{ node.label }}
|
|
|
+ </span>
|
|
|
</div>
|
|
|
</template>
|
|
|
<template #operations="{ node }: any">
|
|
@@ -77,10 +86,48 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
</t-tree>
|
|
|
- <div class="groups">
|
|
|
- <div class="flex middle between">
|
|
|
- <div class="title" style="margin-bottom: 8px">图层分组</div>
|
|
|
- <a> +新建分组</a>
|
|
|
+ <div class="groups" style="padding: 8px 0">
|
|
|
+ <div class="flex middle between" style="padding: 0 12px">
|
|
|
+ <div class="title">图层</div>
|
|
|
+ <a @click="addLayer"> +新建图层</a>
|
|
|
+ </div>
|
|
|
+ <div class="layers">
|
|
|
+ <div
|
|
|
+ v-for="(item, i) in data.layers"
|
|
|
+ class="flex middle between hover"
|
|
|
+ :class="{ primary: i == data.activedLayer }"
|
|
|
+ >
|
|
|
+ <span
|
|
|
+ class="flex-grow"
|
|
|
+ v-if="i != data.editedLayer"
|
|
|
+ @click="activeLayer(i)"
|
|
|
+ @dblclick="
|
|
|
+ data.activedLayer = data.editedLayer = i;
|
|
|
+ data.layer = item;
|
|
|
+ "
|
|
|
+ >
|
|
|
+ {{ item }}
|
|
|
+ </span>
|
|
|
+ <t-input
|
|
|
+ v-else
|
|
|
+ v-model="data.layer"
|
|
|
+ :autofocus="true"
|
|
|
+ @blur="setLayer"
|
|
|
+ @enter="setLayer"
|
|
|
+ />
|
|
|
+ <t-popconfirm
|
|
|
+ content="确认删除该图层吗?"
|
|
|
+ @confirm="delLayer"
|
|
|
+ @cancel="data.deleteLayer = undefined"
|
|
|
+ >
|
|
|
+ <t-icon
|
|
|
+ name="delete"
|
|
|
+ class="ml-8"
|
|
|
+ :class="{ block: i == data.deleteLayer }"
|
|
|
+ @click="data.deleteLayer = i"
|
|
|
+ />
|
|
|
+ </t-popconfirm>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -89,11 +136,13 @@
|
|
|
<script lang="ts" setup>
|
|
|
import { onBeforeMount, onBeforeUnmount, reactive, ref } from 'vue';
|
|
|
import { LockState, Pen } from '@meta2d/core';
|
|
|
+import { MessagePlugin } from 'tdesign-vue-next';
|
|
|
|
|
|
const tree = ref<any>(null);
|
|
|
const data = reactive<any>({
|
|
|
tree: [],
|
|
|
actived: [],
|
|
|
+ layers: [],
|
|
|
});
|
|
|
|
|
|
onBeforeMount(() => {
|
|
@@ -105,6 +154,12 @@ onBeforeMount(() => {
|
|
|
meta2d.on('combine', getTree);
|
|
|
|
|
|
getTree();
|
|
|
+
|
|
|
+ const d = meta2d.store.data as any;
|
|
|
+ if (!d.layers) {
|
|
|
+ d.layers = [];
|
|
|
+ }
|
|
|
+ data.layers = d.layers;
|
|
|
});
|
|
|
|
|
|
const getTree = () => {
|
|
@@ -175,7 +230,7 @@ const visible = (node: any, v: boolean) => {
|
|
|
pen && meta2d.setVisible(pen, v);
|
|
|
};
|
|
|
|
|
|
-function setChildrenVisible(node: any, v: boolean) {
|
|
|
+const setChildrenVisible = (node: any, v: boolean) => {
|
|
|
const children = node.getChildren();
|
|
|
if (children && children.length > 0) {
|
|
|
for (const child of children) {
|
|
@@ -183,7 +238,72 @@ function setChildrenVisible(node: any, v: boolean) {
|
|
|
setChildrenVisible(child, v);
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+};
|
|
|
+
|
|
|
+const onDescription = (node: any) => {
|
|
|
+ node.data.edited = false;
|
|
|
+ node.setData({ label: node.data.label });
|
|
|
+ meta2d.setValue({
|
|
|
+ id: node.value,
|
|
|
+ description: node.data.label,
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const addLayer = () => {
|
|
|
+ const i = data.layers.length + 1;
|
|
|
+ data.layer = '图层' + i;
|
|
|
+ data.layers.push(data.layer);
|
|
|
+ data.activedLayer = data.editedLayer = i;
|
|
|
+};
|
|
|
+
|
|
|
+const activeLayer = (i: number) => {
|
|
|
+ data.activedLayer = i;
|
|
|
+ const layer = data.layers[i];
|
|
|
+ const pens: Pen[] = [];
|
|
|
+ for (const item of meta2d.store.data.pens) {
|
|
|
+ // @ts-ignore
|
|
|
+ if (item.layer === layer) {
|
|
|
+ pens.push(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ meta2d.active(pens, false);
|
|
|
+ meta2d.render();
|
|
|
+};
|
|
|
+
|
|
|
+const setLayer = () => {
|
|
|
+ if (data.layers[data.editedLayer] === data.layer) {
|
|
|
+ data.editedLayer = undefined;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data.layers.includes(data.layer)) {
|
|
|
+ MessagePlugin.error('已经存在相同图层!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (const item of meta2d.store.data.pens) {
|
|
|
+ // @ts-ignore
|
|
|
+ if (item.layer === data.layers[data.editedLayer]) {
|
|
|
+ // @ts-ignore
|
|
|
+ item.layer === data.layer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ data.layers[data.editedLayer] = data.layer;
|
|
|
+ data.editedLayer = undefined;
|
|
|
+};
|
|
|
+
|
|
|
+const delLayer = () => {
|
|
|
+ for (const item of meta2d.store.data.pens) {
|
|
|
+ // @ts-ignore
|
|
|
+ if (item.layer === data.layers[data.deleteLayer]) {
|
|
|
+ // @ts-ignore
|
|
|
+ delete item.layer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data.layers.splice(data.deleteLayer, 1);
|
|
|
+ data.deleteLayer = undefined;
|
|
|
+};
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
meta2d.off('opened', getTree);
|
|
@@ -203,18 +323,36 @@ onBeforeUnmount(() => {
|
|
|
& > * {
|
|
|
overflow-y: auto;
|
|
|
width: 100%;
|
|
|
-
|
|
|
- &::-webkit-scrollbar {
|
|
|
- width: 2px;
|
|
|
- height: 6px;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
.groups {
|
|
|
flex-shrink: 0;
|
|
|
height: 240px;
|
|
|
- border-top: 1px solid var(--color-border);
|
|
|
+ border-top: 1px solid var(--color-border-input);
|
|
|
padding: 8px 12px;
|
|
|
}
|
|
|
+
|
|
|
+ .layers {
|
|
|
+ height: calc(100% - 24px);
|
|
|
+ overflow-y: auto;
|
|
|
+ padding: 0 12px 16px 12px;
|
|
|
+ & > div {
|
|
|
+ height: 30px;
|
|
|
+ line-height: 30px;
|
|
|
+
|
|
|
+ svg {
|
|
|
+ display: none;
|
|
|
+ &.block {
|
|
|
+ display: block;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ svg {
|
|
|
+ display: block;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|