WholeProcessPlatform/frontend/src/components/mapController/index.vue

189 lines
3.9 KiB
Vue
Raw Normal View History

2026-03-31 14:17:30 +08:00
<template>
2026-04-02 08:56:49 +08:00
<div class="map-controller" :style="{ right: drawerOpen ? '480px' : '12px' }">
2026-04-02 13:51:36 +08:00
<div class="map-controller-group" v-for="item in controllers">
<a-tooltip
:title="child.name"
:placement="child.key === 'Calculate' ? 'right' : 'left'"
v-for="child in item.children"
:key="child.key"
>
<component v-if="child.component" :is="child.component" />
<div v-else class="map-controller-item" @click="handleControllerClick(child)">
<i class="icon iconfont" :class="'icon-' + child.icon"></i>
2026-04-02 09:27:56 +08:00
</div>
</a-tooltip>
2026-03-31 14:17:30 +08:00
</div>
</div>
</template>
<script setup lang="ts">
2026-04-02 13:51:36 +08:00
import { ref, watch, computed } from "vue";
2026-04-02 08:56:49 +08:00
import { useUiStore } from "@/store/modules/ui";
2026-04-02 13:51:36 +08:00
import Calculate from "./Calculate.vue";
import LayerController from "./LayerController.vue";
2026-04-02 08:56:49 +08:00
// 使用 Pinia store
const uiStore = useUiStore();
const drawerOpen = ref(uiStore.drawerOpen);
// 监听 store 中的 drawerOpen 变化
2026-04-02 09:27:56 +08:00
watch(
() => uiStore.drawerOpen,
(newVal) => {
drawerOpen.value = newVal;
}
);
2026-04-02 08:56:49 +08:00
2026-03-31 14:17:30 +08:00
const isFullScreen = ref(false);
const mapType = ref("2D");
2026-04-02 08:56:49 +08:00
// 响应式的控制器配置
2026-04-02 13:51:36 +08:00
const controllers: any = computed(() => [
2026-03-31 14:17:30 +08:00
{
2026-04-02 09:27:56 +08:00
children: [
{
name: "全屏",
key: "fullScreen",
icon: isFullScreen.value ? "exitFullScreen" : "fullScreen",
},
],
2026-03-31 14:17:30 +08:00
},
2026-04-02 09:27:56 +08:00
2026-03-31 14:17:30 +08:00
{
2026-04-02 09:27:56 +08:00
children: [
2026-04-02 13:51:36 +08:00
// {
// name: "定位",
// key: "positioning",
// icon: "iconGlobal",
// },
2026-04-02 09:27:56 +08:00
{
name: "放大",
key: "zoomIn",
icon: "zoomIn",
},
{
name: "缩小",
key: "zoomOut",
icon: "zoomOut",
},
],
2026-03-31 14:17:30 +08:00
},
{
2026-04-02 13:51:36 +08:00
children: [
{
name: "3D",
key: "dim",
icon: mapType.value === "2D" ? "a-3D" : "a-2D",
},
],
2026-03-31 14:17:30 +08:00
},
{
2026-04-02 13:51:36 +08:00
children: [
{
name: "图层管理",
key: "layerController",
component: LayerController,
},
],
2026-03-31 14:17:30 +08:00
},
{
2026-04-02 13:51:36 +08:00
children: [
{
name: "测量工具",
key: "Calculate",
component: Calculate,
},
],
2026-03-31 14:17:30 +08:00
},
{
2026-04-02 13:51:36 +08:00
children: [
{
name: "梯级",
key: "TJ",
icon: "tiji",
},
],
2026-03-31 14:17:30 +08:00
},
{
2026-04-02 13:51:36 +08:00
children: [
{
name: "下载",
key: "screenShot",
icon: "downLoad",
},
],
2026-03-31 14:17:30 +08:00
},
2026-04-02 13:51:36 +08:00
// {
// name: "倾斜摄影",
// key: "OSBGController",
// icon: "obliquePhotography",
// },
// {
// name: "三维漫游",
// key: "threedRoam",
// icon: "roaming",
// },
2026-03-31 14:17:30 +08:00
]);
2026-04-02 13:51:36 +08:00
// 添加全屏切换功能
const toggleFullScreen = () => {
isFullScreen.value = !isFullScreen.value;
// 这里可以添加实际的浏览器全屏切换逻辑
if (isFullScreen.value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
};
// 控制器点击事件处理
const handleControllerClick = (item: any) => {
switch (item.key) {
case "fullScreen":
toggleFullScreen();
break;
case "rightDrawer":
// 使用全局事件切换右侧面板
// GlobalEvents.get('rightDrawerState').set(!drawerOpen);
break;
// 可以在这里添加其他控制器的处理逻辑
default:
console.log(`点击了控制器: ${item.name}`);
break;
}
};
2026-03-31 14:17:30 +08:00
</script>
<style lang="scss" scoped>
.map-controller {
position: absolute;
right: 480px;
bottom: 114px;
z-index: 10;
.map-controller-group {
box-shadow: 0 1px 2px #00000026;
background-color: #fff;
border: none;
.map-controller-item {
height: 40px;
width: 40px;
color: #000;
line-height: 40px;
text-align: center;
position: relative;
cursor: pointer;
.iconfont {
font-size: 20px;
}
&:hover {
background-color: #005292;
color: #ffffff;
}
}
2026-04-02 13:51:36 +08:00
}
.map-controller-group:not(:first-child) {
margin-top: 10px;
2026-03-31 14:17:30 +08:00
}
}
2026-04-02 09:27:56 +08:00
</style>