简化来馆面板并优化地图点位展示
This commit is contained in:
@@ -40,6 +40,9 @@
|
||||
zoom-controls-top="calc(100vh - 292px)"
|
||||
:route-preview="activeRoutePreview"
|
||||
:show-route="Boolean(activeRoutePreview)"
|
||||
:outdoor-markers="arrivalOutdoorMarkers"
|
||||
:active-outdoor-marker-id="activeArrivalMarkerId"
|
||||
:outdoor-focus-offset-y="arrivalOutdoorFocusOffsetY"
|
||||
:disable-auto-exit="disableIndoorAutoExit"
|
||||
:auto-switch-threshold-low="0.58"
|
||||
:auto-switch-threshold-high="1.18"
|
||||
@@ -55,6 +58,7 @@
|
||||
@initial-model-ready="handleInitialModelReady"
|
||||
@initial-model-failed="handleInitialModelFailed"
|
||||
@tool-click="handleIndoorToolClick"
|
||||
@outdoor-marker-click="handleArrivalMarkerClick"
|
||||
>
|
||||
<template #overlay>
|
||||
<view v-if="guideOutdoorState === 'entrance' && !is3DMode" class="entrance-tip">
|
||||
@@ -230,8 +234,14 @@
|
||||
ref="arrivalPanelRef"
|
||||
v-if="currentTab === 'guide'"
|
||||
:visible="showArrivalPanel"
|
||||
:default-collapsed="true"
|
||||
:active-type="activeArrivalType"
|
||||
:targets="activeArrivalTargets"
|
||||
:selected-target-id="selectedArrivalTargetId"
|
||||
:selected-target="selectedArrivalTarget"
|
||||
@update:active-type="handleArrivalTypeChange"
|
||||
@select-target="handleArrivalTargetSelect"
|
||||
@collapsed-change="handleArrivalPanelCollapsedChange"
|
||||
@layout-change="handleArrivalPanelLayoutChange"
|
||||
/>
|
||||
|
||||
<view v-else-if="currentTab === 'explain'" class="explain-page">
|
||||
@@ -332,6 +342,11 @@ import {
|
||||
import type {
|
||||
GuideRenderPoi
|
||||
} from '@/domain/guideModel'
|
||||
import {
|
||||
ARRIVAL_TARGETS_BY_TYPE,
|
||||
type ArrivalSearchTarget,
|
||||
type ArrivalTargetType
|
||||
} from '@/data/arrivalSearchTargets'
|
||||
import type {
|
||||
GuideRouteResult,
|
||||
GuideRouteTarget,
|
||||
@@ -563,6 +578,9 @@ const handleLaunchContinue = () => {
|
||||
const showArrivalPanel = ref(false)
|
||||
const showArrivalPanelCollapsed = ref(false)
|
||||
const arrivalPanelRef = ref<InstanceType<typeof ArrivalPanel> | null>(null)
|
||||
const activeArrivalType = ref<ArrivalTargetType>('bus')
|
||||
const selectedArrivalTargetId = ref('')
|
||||
const arrivalPanelHeight = ref(0)
|
||||
|
||||
const indoorNavAssetBaseUrl = guideUseCase.getAssetBaseUrl()
|
||||
const indoorModelSource = guideUseCase.getModelSource()
|
||||
@@ -637,6 +655,35 @@ const showGuideFloatingActions = computed(() => (
|
||||
&& (!showGuideHomeDock.value || !homeSearchExpanded.value)
|
||||
))
|
||||
|
||||
const activeArrivalTargets = computed(() => ARRIVAL_TARGETS_BY_TYPE[activeArrivalType.value])
|
||||
|
||||
const selectedArrivalTarget = computed(() => (
|
||||
activeArrivalTargets.value.find((target) => target.id === selectedArrivalTargetId.value)
|
||||
|| activeArrivalTargets.value[0]
|
||||
|| null
|
||||
))
|
||||
|
||||
const arrivalOutdoorMarkers = computed(() => {
|
||||
if (!showArrivalPanel.value || is3DMode.value) return []
|
||||
|
||||
return activeArrivalTargets.value.map((target) => ({
|
||||
id: target.id,
|
||||
title: target.title,
|
||||
subtitle: target.subtitle,
|
||||
latitude: target.latitude,
|
||||
longitude: target.longitude
|
||||
}))
|
||||
})
|
||||
|
||||
const activeArrivalMarkerId = computed(() => (
|
||||
showArrivalPanel.value && !is3DMode.value ? selectedArrivalTarget.value?.id || '' : ''
|
||||
))
|
||||
|
||||
const arrivalOutdoorFocusOffsetY = computed(() => {
|
||||
if (!showArrivalPanel.value || showArrivalPanelCollapsed.value || is3DMode.value) return 0
|
||||
return Math.min(260, Math.max(0, Math.round(arrivalPanelHeight.value / 2 + 24)))
|
||||
})
|
||||
|
||||
const guideQuickActiveAction = computed<'indoor' | 'arrival' | 'explain'>(() => {
|
||||
if (currentTab.value === 'explain') return 'explain'
|
||||
if (showArrivalPanel.value) return 'arrival'
|
||||
@@ -1295,15 +1342,46 @@ const handleMoreRouteGuide = () => {
|
||||
showIndoorHint(`当前楼层:${getGuideFloorLabel(renderedFloorId.value || activeGuideFloor.value) || '馆内单层'}`, 3200)
|
||||
}
|
||||
|
||||
const selectFirstArrivalTarget = () => {
|
||||
selectedArrivalTargetId.value = activeArrivalTargets.value[0]?.id || ''
|
||||
}
|
||||
|
||||
const resetArrivalPanelState = () => {
|
||||
activeArrivalType.value = 'bus'
|
||||
selectFirstArrivalTarget()
|
||||
}
|
||||
|
||||
const closeArrivalPanel = () => {
|
||||
showArrivalPanel.value = false
|
||||
showArrivalPanelCollapsed.value = false
|
||||
selectedArrivalTargetId.value = ''
|
||||
arrivalPanelHeight.value = 0
|
||||
}
|
||||
|
||||
const handleArrivalPanelCollapsedChange = (collapsed: boolean) => {
|
||||
showArrivalPanelCollapsed.value = collapsed
|
||||
}
|
||||
|
||||
const handleArrivalPanelLayoutChange = (layout: { height: number; collapsed: boolean }) => {
|
||||
arrivalPanelHeight.value = layout.height
|
||||
showArrivalPanelCollapsed.value = layout.collapsed
|
||||
}
|
||||
|
||||
const handleArrivalTypeChange = (type: ArrivalTargetType) => {
|
||||
activeArrivalType.value = type
|
||||
selectFirstArrivalTarget()
|
||||
}
|
||||
|
||||
const handleArrivalTargetSelect = (target: ArrivalSearchTarget) => {
|
||||
selectedArrivalTargetId.value = target.id
|
||||
}
|
||||
|
||||
const handleArrivalMarkerClick = (markerId: string) => {
|
||||
const target = activeArrivalTargets.value.find((item) => item.id === markerId)
|
||||
if (!target) return
|
||||
selectedArrivalTargetId.value = target.id
|
||||
}
|
||||
|
||||
const closeHomeSearchDock = () => {
|
||||
homeSearchPanelRef.value?.collapseHomePanel?.()
|
||||
homeSearchExpanded.value = false
|
||||
@@ -1316,8 +1394,9 @@ const handleMoreOutdoorNav = () => {
|
||||
return
|
||||
}
|
||||
|
||||
resetArrivalPanelState()
|
||||
showArrivalPanel.value = true
|
||||
showArrivalPanelCollapsed.value = true
|
||||
showArrivalPanelCollapsed.value = false
|
||||
showRoutePlanner.value = false
|
||||
is3DMode.value = false
|
||||
guideOutdoorState.value = 'home'
|
||||
|
||||
Reference in New Issue
Block a user