| | |
| | | :style="layerControlCardStyle" |
| | | @mousedown="startDrag" |
| | | > |
| | | |
| | | <el-icon class="absolute top-2 right-2 cursor-pointer z-10" @click="closePanel"> |
| | | <Close /> |
| | | </el-icon> |
| | |
| | | <el-tab-pane label="底图" name="components" |
| | | ><div class="flex flex-col gap-2"> |
| | | <el-radio-group v-model="activeSourceType" class="flex flex-col gap-2" @change="changeSourceType"> |
| | | <el-radio class="w-full mr-0" v-for="item in Object.keys(gaoDeSourceTypeMap)" :key="item" :label="parseInt(item)"> |
| | | <el-radio class="w-full mr-0" v-for="item in layerList" :key="item" :label="item"> |
| | | <span>{{ gaoDeSourceTypeMap[item] }}</span> |
| | | </el-radio> |
| | | </el-radio-group> |
| | | </div></el-tab-pane |
| | | > |
| | | <el-tab-pane label="覆盖层" name="overlays"> |
| | | <el-tab-pane label="覆盖物" name="overlays"> |
| | | <el-tree |
| | | class="w-full" |
| | | :data="treeData" |
| | | :props="defaultProps" |
| | | show-checkbox |
| | | node-key="id" |
| | | default-expand-all |
| | | :filter-node-method="filterNode" |
| | | ref="overlayTreeRef" |
| | | @check="handleCheck" |
| | | @node-click="handleNodeClick" |
| | | > |
| | | <template #default="{ node, data }"> |
| | | <span>{{ node.label }}</span> |
| | | </template> |
| | | </el-tree> |
| | | </el-tab-pane> |
| | | <!-- <el-tab-pane label="覆盖层" name="overlays"> |
| | | <el-tree |
| | | class="w-full" |
| | | :data="treeData" |
| | |
| | | <span>{{ node.label }}</span> |
| | | </template> |
| | | </el-tree> |
| | | </el-tab-pane> |
| | | </el-tab-pane> --> |
| | | </el-tabs> |
| | | </el-card> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { Close, Folder, FolderOpened, Search } from '@element-plus/icons-vue'; |
| | | import { onMounted, ref, watch } from 'vue'; |
| | | import { useDrag } from '/@/hooks/useDrag'; |
| | | import type { GaoDeSourceType, OLMap } from '/@/model/map/OLMap'; |
| | | import { gaoDeSourceTypeMap } from '/@/model/map/OLMap'; |
| | | import { Close } from '@element-plus/icons-vue'; |
| | | import { ElTree } from 'element-plus'; |
| | | import { computed, onMounted, ref, watch } from 'vue'; |
| | | import { useDrag } from '/@/hooks/useDrag'; |
| | | import type { OLMap } from '/@/model/map/OLMap'; |
| | | import { GaoDeSourceType, gaoDeSourceTypeMap, OverlayType } from '/@/model/map/OLMap'; |
| | | import { sleep } from '/@/utils/util'; |
| | | const searchText = ref(''); |
| | | const activeTab = ref('components'); |
| | | const treeRef = ref(); |
| | | |
| | | const layerList = [GaoDeSourceType.Vector, GaoDeSourceType.Satellite, GaoDeSourceType.SatelliteRoad]; |
| | | const props = defineProps<{ |
| | | olMap: OLMap; |
| | | }>(); |
| | | |
| | | enum ROOT_OVERLAY_TYPE { |
| | | Marker = 'marker', |
| | | } |
| | | type TreeData = { |
| | | id: string; |
| | | label: string; |
| | | checked?: boolean; |
| | | children?: TreeData[]; |
| | | }; |
| | | const activeSourceType = ref(props.olMap.activeSourceType); |
| | | |
| | | const changeSourceType = (val: GaoDeSourceType) => { |
| | | props.olMap.setSourceUrl(val); |
| | | props.olMap.applySourceType(val); |
| | | }; |
| | | |
| | | const overlayTreeRef = ref<InstanceType<typeof ElTree>>(); |
| | | |
| | | const treeData = [ |
| | | const treeData = ref<TreeData[]>([ |
| | | { |
| | | id: 1, |
| | | id: ROOT_OVERLAY_TYPE.Marker, |
| | | label: '设备', |
| | | checked: props.olMap.overlayIsVisible.value, |
| | | checked: props.olMap.markerIsVisible.value, |
| | | }, |
| | | ]; |
| | | ]); |
| | | const initTreeChecked = () => { |
| | | treeData.forEach((item) => { |
| | | treeData.value.forEach((item) => { |
| | | if (item.checked) { |
| | | overlayTreeRef.value?.setCheckedKeys([item.id]); |
| | | } |
| | | }); |
| | | }; |
| | | const handleCheck = (data: any, node: any) => { |
| | | const checkedKeys = node.checkedKeys; |
| | | const isVisible = checkedKeys.includes(1); |
| | | props.olMap.toggleMarkerOverlayVisible(isVisible); |
| | | |
| | | const setTreeChecked = (checked: boolean) => { |
| | | treeData.value.forEach((item) => { |
| | | if (checked) { |
| | | overlayTreeRef.value?.setCheckedKeys([ROOT_OVERLAY_TYPE.Marker]); |
| | | } else { |
| | | overlayTreeRef.value?.setCheckedKeys([]); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | let isHumanCheckTrigger = false; |
| | | watch( |
| | | () => props.olMap.markerIsVisible.value, |
| | | (val) => { |
| | | if (isHumanCheckTrigger) { |
| | | isHumanCheckTrigger = false; |
| | | return; |
| | | } |
| | | setTreeChecked(val); |
| | | } |
| | | ); |
| | | |
| | | const handleNodeClick = (data: any, node: any) => { |
| | | if (data.id === ROOT_OVERLAY_TYPE.Marker) { |
| | | props.olMap.adjustViewToMarkers(); |
| | | } |
| | | }; |
| | | |
| | | const iniTreeData = async () => { |
| | | await sleep(0.4); |
| | | const foundMarker = treeData.value.find((item) => item.id === ROOT_OVERLAY_TYPE.Marker); |
| | | if (!foundMarker) { |
| | | return; |
| | | } |
| | | foundMarker.children = props.olMap.map |
| | | .getOverlays() |
| | | .getArray() |
| | | .map((item) => { |
| | | const extData = item.get('extData'); |
| | | return { |
| | | id: item.getId() as string, |
| | | label: extData?.name, |
| | | // checked: item.getVisible(), |
| | | }; |
| | | }); |
| | | }; |
| | | const handleCheck = (data: any, node: any) => { |
| | | const checkedKeys = node.checkedKeys; |
| | | isHumanCheckTrigger = true; |
| | | const isVisible = checkedKeys.includes(ROOT_OVERLAY_TYPE.Marker); |
| | | props.olMap.toggleMarkerOverlayVisible(isVisible); |
| | | }; |
| | | |
| | | const layerControlCard = ref<HTMLDivElement>(null); |
| | | |
| | |
| | | treeRef.value?.filter(val); |
| | | }); |
| | | onMounted(() => { |
| | | |
| | | initTreeChecked(); |
| | | // iniTreeData(); |
| | | // window.olMap = props.olMap; |
| | | // window.map = props.olMap.map; |
| | | }); |
| | | defineEmits(['close']); |
| | | </script> |
| | |
| | | :deep(.el-card) { |
| | | cursor: inherit; |
| | | } |
| | | |
| | | :deep(.el-tree-node__expand-icon.is-leaf) { |
| | | display: none; |
| | | } |
| | | </style> |