|
@@ -1,20 +1,21 @@
|
|
|
<template>
|
|
|
- <div class="list-item"
|
|
|
- :class="{ 'list-item-active': layerData.active }"
|
|
|
+ <div
|
|
|
+ class="list-item"
|
|
|
+ :class="{
|
|
|
+ 'list-item-active': projectStore.selectedElementKeys.includes(data.key),
|
|
|
+ }"
|
|
|
@mouseenter="isHover = true"
|
|
|
@mouseleave="isHover = false"
|
|
|
@click="handleActive"
|
|
|
>
|
|
|
<template v-if="!isEditing">
|
|
|
<span class="list-item-visible">
|
|
|
- <span v-show="isHover">
|
|
|
- <EyeOutlined v-if="true" />
|
|
|
- <EyeInvisibleOutlined v-else />
|
|
|
- </span>
|
|
|
+ <EyeOutlined v-if="data.visible && isHover" @click="handleVisible(false)" />
|
|
|
+ <EyeInvisibleOutlined v-if="!data.visible" @click="handleVisible(true)" />
|
|
|
</span>
|
|
|
<span class="layer-name">
|
|
|
<Tooltip :title="data.name">
|
|
|
- {{ data.name }}
|
|
|
+ <span @dblclick="isEditing = true">{{ data.name }}</span>
|
|
|
</Tooltip>
|
|
|
</span>
|
|
|
<span class="layer-action">
|
|
@@ -30,29 +31,34 @@
|
|
|
</Menu>
|
|
|
</template>
|
|
|
</Dropdown>
|
|
|
+ </span>
|
|
|
|
|
|
- <Tooltip title="锁定" v-if="true">
|
|
|
- <LockOutlined />
|
|
|
- </Tooltip>
|
|
|
- <Tooltip title="解锁" v-else>
|
|
|
- <UnlockOutlined />
|
|
|
+ <Tooltip title="解锁" v-if="data.locked">
|
|
|
+ <LockOutlined @click="handleLock(false)"/>
|
|
|
+ </Tooltip>
|
|
|
+ <span v-else v-show="isHover">
|
|
|
+ <Tooltip title="锁定">
|
|
|
+ <UnlockOutlined @click="handleLock(true)"/>
|
|
|
</Tooltip>
|
|
|
</span>
|
|
|
+
|
|
|
</span>
|
|
|
</template>
|
|
|
|
|
|
- <Input
|
|
|
+ <Input
|
|
|
v-else
|
|
|
- v-model:value="layerData.name"
|
|
|
+ v-model:value="layerName"
|
|
|
placeholder="请输入图层名称"
|
|
|
size="small"
|
|
|
+ :status="!layerName ? 'error' : undefined"
|
|
|
@blur="handleChangeName"
|
|
|
/>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { defineProps, defineEmits, computed, ref } from "vue";
|
|
|
+import type { CustomElement } from "#/project";
|
|
|
+import { defineProps, ref } from "vue";
|
|
|
import { Tooltip, Dropdown, Menu, MenuItem, Input } from "ant-design-vue";
|
|
|
import {
|
|
|
EyeOutlined,
|
|
@@ -63,48 +69,46 @@ import {
|
|
|
EditOutlined,
|
|
|
DeleteOutlined,
|
|
|
} from "@ant-design/icons-vue";
|
|
|
-
|
|
|
-interface LayerItemData {
|
|
|
- // 图层名称
|
|
|
- name: string;
|
|
|
- // 图层id
|
|
|
- id: number;
|
|
|
- // 是否可见
|
|
|
- visible: boolean;
|
|
|
- // 是否锁定
|
|
|
- lock: boolean;
|
|
|
- // 是否激活
|
|
|
- active: boolean;
|
|
|
-}
|
|
|
+import { useProjectStore } from "@/store/modules/project";
|
|
|
|
|
|
const props = defineProps<{
|
|
|
- data: LayerItemData;
|
|
|
+ data: CustomElement;
|
|
|
}>();
|
|
|
|
|
|
-const emit = defineEmits(["change", "delete"]);
|
|
|
+const projectStore = useProjectStore();
|
|
|
|
|
|
-const layerData = computed({
|
|
|
- get: () => props.data,
|
|
|
- set: (value: LayerItemData) => emit("change", value),
|
|
|
-})
|
|
|
+const layerName = ref<string>(props.data.name);
|
|
|
|
|
|
const isEditing = ref(false);
|
|
|
const isHover = ref(false);
|
|
|
|
|
|
-const handleMenuClick = ({key}: {key: 'rename' | 'del'}) => {
|
|
|
- if(key === 'rename') {
|
|
|
+const handleMenuClick = ({ key }: { key: "rename" | "del" }) => {
|
|
|
+ if (key === "rename") {
|
|
|
isEditing.value = true;
|
|
|
} else {
|
|
|
- emit("delete", props.data.id);
|
|
|
+ projectStore.removeElement(props.data.key);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const handleChangeName = () => {
|
|
|
isEditing.value = false;
|
|
|
+ if (!layerName.value) {
|
|
|
+ layerName.value = props.data.name;
|
|
|
+ return;
|
|
|
+ };
|
|
|
+ projectStore.updateElement(props.data.key, "name", layerName.value);
|
|
|
};
|
|
|
|
|
|
const handleActive = () => {
|
|
|
- layerData.value.active = !layerData.value.active;
|
|
|
+ projectStore.setSelectedElementKeys([props.data.key]);
|
|
|
+};
|
|
|
+
|
|
|
+const handleLock = (locked: boolean) => {
|
|
|
+ projectStore.updateElement(props.data.key, "locked", locked);
|
|
|
+};
|
|
|
+
|
|
|
+const handleVisible = (visible: boolean) => {
|
|
|
+ projectStore.updateElement(props.data.key, "visible", visible);
|
|
|
};
|
|
|
</script>
|
|
|
|
|
@@ -138,6 +142,7 @@ const handleActive = () => {
|
|
|
}
|
|
|
.layer-action {
|
|
|
width: 30px;
|
|
|
+ text-align: right;
|
|
|
}
|
|
|
}
|
|
|
</style>
|