简化来馆面板并优化地图点位展示

This commit is contained in:
lyf
2026-07-09 18:46:56 +08:00
parent 5b4fe19ce3
commit 3f9c64a36e
5 changed files with 587 additions and 221 deletions

View File

@@ -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'