|
@@ -1,229 +1,244 @@
|
|
|
-<template>
|
|
|
- <teleport :to="tags$" v-if="tags$">
|
|
|
- <template :key="index" v-for="(tag, index) in tags">
|
|
|
- <div @mouseenter="onMouseEnter(tag, index)" @mouseleave="onMouseLeave($event, tag)" :style="{ left: tag.x + 'px', top: tag.y + 'px' }" :class="{ visible: tag.visible }">
|
|
|
- <span @click.stop="goTag(tag, index)" class="point zoom" :style="{ 'background-image': 'url(' + getUrl(tag.icon) + ')' }"></span>
|
|
|
- <!-- <div class="content"> -->
|
|
|
- <div class="content">
|
|
|
- <div class="trans" :class="{ active: (isFixed && tag.sid == hotData.sid) || showInfo }">
|
|
|
- <template v-if="hotData && tag.sid == hotData.sid && !showMsg">
|
|
|
- <div class="arrow" :id="`arrow_${tag.sid}`"></div>
|
|
|
- <TagInfo v-if="isEdit && hotData" />
|
|
|
- <ShowTag @click.stop="" v-if="!isEdit && hotData" @open="openInfo" />
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <TagView @click.stop="" v-if="showMsg && toggleIndex == index" @close="closeInfo" />
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </teleport>
|
|
|
- <GoodsList v-if="isShowGoodList" @close="closeGoodsList" />
|
|
|
- <SceneList v-if="isShowSceneList" @close="closeSceneList" />
|
|
|
-</template>
|
|
|
-<script setup>
|
|
|
-import { ref, onMounted, computed, watch, watchEffect, onActivated, onDeactivated, getCurrentInstance, nextTick } from 'vue'
|
|
|
-import { getApp, useApp } from '@/app'
|
|
|
-import { useStore } from 'vuex'
|
|
|
-import common from '../../utils/common'
|
|
|
-import TagView from './tag-view.vue'
|
|
|
-import GoodsList from './goods-list.vue'
|
|
|
-import SceneList from './scene-list.vue'
|
|
|
-
|
|
|
-import TagInfo from './tag-info.vue'
|
|
|
-import ShowTag from './show-tag.vue'
|
|
|
-import { useRoute } from 'vue-router'
|
|
|
-import { useMusicPlayer } from '@/utils/sound'
|
|
|
-const musicPlayer = useMusicPlayer()
|
|
|
-// const route = useRoute()
|
|
|
-let init = true
|
|
|
-const hotData = computed(() => {
|
|
|
- let data = store.getters['tag/hotData']
|
|
|
- if (!data) {
|
|
|
- // musicPlayer.play()
|
|
|
- // musicPlayer.pause(true)
|
|
|
- // if (!getApp().Scene.isCurrentPanoHasVideo) {
|
|
|
- // console.log('resume')
|
|
|
- // console.log(init)
|
|
|
- // musicPlayer.resume()
|
|
|
- // }
|
|
|
- }
|
|
|
- return data
|
|
|
-})
|
|
|
-const isPlay = computed(() => store.getters['tour/isPlay'])
|
|
|
-const router = computed(() => store.getters['router'])
|
|
|
-const flying = computed(() => store.getters['flying'])
|
|
|
-const leaveId = computed(() => store.getters['tag/leaveId'])
|
|
|
-const isEdit = computed(() => store.getters['tag/isEdit'])
|
|
|
-const isShowGoodList = computed(() => store.getters['tag/isShowGoodList'])
|
|
|
-const isShowSceneList = computed(() => store.getters['tag/isShowSceneList'])
|
|
|
-
|
|
|
-const isFixed = computed(() => store.getters['tag/isFixed'])
|
|
|
-const enterVisible = computed(() => store.getters['tag/enterVisible'])
|
|
|
-const editPosition = computed(() => store.getters['tag/editPosition'])
|
|
|
-const toggleIndex = computed(() => store.getters['tag/toggleIndex'])
|
|
|
-const isClick = computed(() => store.getters['tag/isClick'])
|
|
|
-const editModule = computed(() => store.getters['editModule'])
|
|
|
-const positionInfo = computed(() => store.getters['tag/positionInfo'])
|
|
|
-const store = useStore()
|
|
|
-const tags$ = ref(null)
|
|
|
-const tags = computed(() => {
|
|
|
- return store.getters['tag/tags'] || []
|
|
|
-})
|
|
|
-
|
|
|
-watch(
|
|
|
- () => router.value.name,
|
|
|
- (val, old) => {
|
|
|
- // console.log(val)
|
|
|
- if (val !== 'tag') {
|
|
|
- store.commit('tag/setFixed', false)
|
|
|
- }
|
|
|
- }
|
|
|
-)
|
|
|
-
|
|
|
-const showInfo = ref(false)
|
|
|
-const showMsg = ref(false)
|
|
|
-
|
|
|
-// const toggleIndex = ref(null)
|
|
|
-const openInfo = () => {
|
|
|
- showMsg.value = true
|
|
|
- store.commit('tag/setFixed', false)
|
|
|
- showInfo.value = false
|
|
|
-}
|
|
|
-const closeInfo = () => {
|
|
|
- showMsg.value = false
|
|
|
- if (isClick.value) {
|
|
|
- //只有点击定位的才恢复显示
|
|
|
- store.commit('tag/show', toggleIndex.value)
|
|
|
- store.commit('tag/setFixed', true)
|
|
|
- // showInfo.value = true
|
|
|
- showInfo.value = false
|
|
|
- }
|
|
|
- store.commit('tag/setClick', false)
|
|
|
-}
|
|
|
-
|
|
|
-const closeGoodsList = () => {
|
|
|
- store.commit('tag/setShowGoodsList', false)
|
|
|
-}
|
|
|
-
|
|
|
-const closeSceneList = () => {
|
|
|
- store.commit('tag/setShowSceneList', false)
|
|
|
-}
|
|
|
-
|
|
|
-const closeTag = async () => {
|
|
|
- const app = getApp()
|
|
|
- const player = await app.TourManager.player
|
|
|
- //关闭热点面板时候,继续播放之前暂停的音频
|
|
|
- if (!app.Scene.isCurrentPanoHasVideo && !player.isPlaying) {
|
|
|
- if (hotData.value.type == 'audio' || hotData.value.type == 'video') {
|
|
|
- // console.log('resume')
|
|
|
- musicPlayer.resume()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- store.commit('tag/setFixed', false)
|
|
|
- store.commit('tag/closeTag')
|
|
|
- showInfo.value = false
|
|
|
-}
|
|
|
-const goTag = async (item, index) => {
|
|
|
- let player = await getApp().TourManager.player
|
|
|
- if (isPlay.value) {
|
|
|
- player.pause()
|
|
|
- store.commit('tour/setData', { isPlay: false })
|
|
|
- }
|
|
|
- if (flying.value) {
|
|
|
- return
|
|
|
- }
|
|
|
- if (isFixed.value && !isEdit.value && hotData.value.sid == item.sid && !positionInfo.value) {
|
|
|
- closeTag()
|
|
|
- } else {
|
|
|
- if (!enterVisible.value && !editPosition.value) {
|
|
|
- if (!isEdit.value && !positionInfo.value) {
|
|
|
- store.commit('tag/show', index)
|
|
|
- store.commit('tag/setFixed', true)
|
|
|
- showInfo.value = true
|
|
|
- store.commit('tag/setToggleIndex', index)
|
|
|
- store.commit('tag/gotoTag', item)
|
|
|
- }
|
|
|
- store.commit('tag/setClick', true)
|
|
|
- } else {
|
|
|
- //热点可视操作
|
|
|
- getApp().TagManager.edit.setTagVisi(item.sid)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-onMounted(async () => {
|
|
|
- const app = await useApp()
|
|
|
- await app.TagManager.tag()
|
|
|
- init = false
|
|
|
-
|
|
|
- tags$.value = '[xui_tags]'
|
|
|
- app.TagManager.updatePosition(tags.value)
|
|
|
- if (app.config.mobile) {
|
|
|
- nextTick(() => {
|
|
|
- let player = document.querySelector('.player')
|
|
|
- player.addEventListener('touchstart', onClickHandler)
|
|
|
- })
|
|
|
- } else {
|
|
|
- window.addEventListener('click', onClickHandler)
|
|
|
- }
|
|
|
-})
|
|
|
-const getUrl = icon => {
|
|
|
- let url = icon == '' || !icon ? getApp().resource.getAppURL('images/tag_icon_default.svg') : icon
|
|
|
-
|
|
|
- return common.changeUrl(url)
|
|
|
-}
|
|
|
-const onMouseEnter = (tag, index) => {
|
|
|
- if (!getApp().config.mobile) {
|
|
|
- if (flying.value || isPlay.value) {
|
|
|
- return
|
|
|
- }
|
|
|
- if (!enterVisible.value && !editPosition.value && !isEdit.value && !positionInfo.value) {
|
|
|
- // console.log('onMouseEnter')
|
|
|
-
|
|
|
- showInfo.value = true
|
|
|
- store.commit('tag/show', index)
|
|
|
-
|
|
|
- store.commit('tag/setToggleIndex', index)
|
|
|
- if (leaveId.value != tag.sid) {
|
|
|
- //聚焦后 移到其他热点取消fixed
|
|
|
- store.commit('tag/setFixed', false)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const onMouseLeave = (event, tag) => {
|
|
|
- if (!getApp().config.mobile) {
|
|
|
- if (flying.value) {
|
|
|
- return
|
|
|
- }
|
|
|
- if (event.relatedTarget != null) {
|
|
|
- // if (!isEdit.value) {
|
|
|
- showInfo.value = false
|
|
|
- // }
|
|
|
- store.commit('tag/setLeaveId', tag.sid)
|
|
|
- if (!enterVisible.value && !isFixed.value && !showMsg.value && !editPosition.value && !positionInfo.value) {
|
|
|
- closeTag()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const onClickHandler = () => {
|
|
|
- // if (flying.value) {
|
|
|
- // return
|
|
|
- // }
|
|
|
-
|
|
|
- if (!isEdit.value && !positionInfo.value && isFixed.value) {
|
|
|
- closeTag()
|
|
|
- store.commit('tag/setClick', false)
|
|
|
- }
|
|
|
-}
|
|
|
-</script>
|
|
|
-
|
|
|
-<style lang="scss" scoped>
|
|
|
-[xui_tags] .content .trans {
|
|
|
- min-width: 525px;
|
|
|
-}
|
|
|
-</style>
|
|
|
+<template>
|
|
|
+ <teleport :to="tags$" v-if="tags$">
|
|
|
+ <template :key="index" v-for="(tag, index) in tags">
|
|
|
+ <div @mouseenter="onMouseEnter(tag, index)" @mouseleave="onMouseLeave($event, tag)" :style="{ left: tag.x + 'px', top: tag.y + 'px' }" :class="{ visible: tag.visible }">
|
|
|
+ <span @click.stop="goTag(tag, index)" class="point zoom" :style="{ 'background-image': 'url(' + getUrl(tag.icon) + ')' }"></span>
|
|
|
+ <!-- <div class="content"> -->
|
|
|
+ <div class="content">
|
|
|
+ <div :id="`trans_${tag.sid}`" :style="isEdit ? transStyle : ''" class="trans" :class="{ active: (isFixed && tag.sid == hotData.sid) || showInfo }">
|
|
|
+ <template v-if="hotData && tag.sid == hotData.sid && !showMsg">
|
|
|
+ <div class="arrow" :id="`arrow_${tag.sid}`"></div>
|
|
|
+ <TagInfo v-if="isEdit && hotData" />
|
|
|
+ <ShowTag @click.stop="" v-if="!isEdit && hotData" @open="openInfo" />
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <TagView @click.stop="" v-if="showMsg && toggleIndex == index" @close="closeInfo" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </teleport>
|
|
|
+ <GoodsList v-if="isShowGoodList" @close="closeGoodsList" />
|
|
|
+ <SceneList v-if="isShowSceneList" @close="closeSceneList" />
|
|
|
+</template>
|
|
|
+<script setup>
|
|
|
+import { ref, onMounted, computed, watch, watchEffect, onActivated, onDeactivated, getCurrentInstance, nextTick } from 'vue'
|
|
|
+import { getApp, useApp } from '@/app'
|
|
|
+import { useStore } from 'vuex'
|
|
|
+import common from '../../utils/common'
|
|
|
+import TagView from './tag-view.vue'
|
|
|
+import GoodsList from './goods-list.vue'
|
|
|
+import SceneList from './scene-list.vue'
|
|
|
+
|
|
|
+import TagInfo from './tag-info.vue'
|
|
|
+import ShowTag from './show-tag.vue'
|
|
|
+import { useRoute } from 'vue-router'
|
|
|
+import { useMusicPlayer } from '@/utils/sound'
|
|
|
+const musicPlayer = useMusicPlayer()
|
|
|
+// const route = useRoute()
|
|
|
+let init = true
|
|
|
+const transRef = ref(null)
|
|
|
+const hotData = computed(() => {
|
|
|
+ let data = store.getters['tag/hotData']
|
|
|
+ if (!data) {
|
|
|
+ // musicPlayer.play()
|
|
|
+ // musicPlayer.pause(true)
|
|
|
+ // if (!getApp().Scene.isCurrentPanoHasVideo) {
|
|
|
+ // console.log('resume')
|
|
|
+ // console.log(init)
|
|
|
+ // musicPlayer.resume()
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ return data
|
|
|
+})
|
|
|
+const isPlay = computed(() => store.getters['tour/isPlay'])
|
|
|
+const router = computed(() => store.getters['router'])
|
|
|
+const flying = computed(() => store.getters['flying'])
|
|
|
+const leaveId = computed(() => store.getters['tag/leaveId'])
|
|
|
+const isEdit = computed(() => store.getters['tag/isEdit'])
|
|
|
+const isShowGoodList = computed(() => store.getters['tag/isShowGoodList'])
|
|
|
+const isShowSceneList = computed(() => store.getters['tag/isShowSceneList'])
|
|
|
+
|
|
|
+const isFixed = computed(() => store.getters['tag/isFixed'])
|
|
|
+const enterVisible = computed(() => store.getters['tag/enterVisible'])
|
|
|
+const editPosition = computed(() => store.getters['tag/editPosition'])
|
|
|
+const toggleIndex = computed(() => store.getters['tag/toggleIndex'])
|
|
|
+const isClick = computed(() => store.getters['tag/isClick'])
|
|
|
+const editModule = computed(() => store.getters['editModule'])
|
|
|
+const positionInfo = computed(() => store.getters['tag/positionInfo'])
|
|
|
+const store = useStore()
|
|
|
+const tags$ = ref(null)
|
|
|
+const tags = computed(() => {
|
|
|
+ return store.getters['tag/tags'] || []
|
|
|
+})
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => router.value.name,
|
|
|
+ (val, old) => {
|
|
|
+ // console.log(val)
|
|
|
+ if (val !== 'tag') {
|
|
|
+ store.commit('tag/setFixed', false)
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+const transStyle = ref('')
|
|
|
+watch(
|
|
|
+ () => isEdit.value,
|
|
|
+ (val, old) => {
|
|
|
+ // console.log(val)
|
|
|
+ if (val) {
|
|
|
+ nextTick(() => {
|
|
|
+ // let transEle = document.getElementById(`trans_${hotData.value.sid}`)
|
|
|
+ // let transOffsetHeight = transEle.offsetHeight
|
|
|
+ // transStyle.value = `transform:translateY(0) scale(1);margin-top:-${transOffsetHeight / 2}px;transition:none;`
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+const showInfo = ref(false)
|
|
|
+const showMsg = ref(false)
|
|
|
+
|
|
|
+// const toggleIndex = ref(null)
|
|
|
+const openInfo = () => {
|
|
|
+ showMsg.value = true
|
|
|
+ store.commit('tag/setFixed', false)
|
|
|
+ showInfo.value = false
|
|
|
+}
|
|
|
+const closeInfo = () => {
|
|
|
+ showMsg.value = false
|
|
|
+ if (isClick.value) {
|
|
|
+ //只有点击定位的才恢复显示
|
|
|
+ store.commit('tag/show', toggleIndex.value)
|
|
|
+ store.commit('tag/setFixed', true)
|
|
|
+ // showInfo.value = true
|
|
|
+ showInfo.value = false
|
|
|
+ }
|
|
|
+ store.commit('tag/setClick', false)
|
|
|
+}
|
|
|
+
|
|
|
+const closeGoodsList = () => {
|
|
|
+ store.commit('tag/setShowGoodsList', false)
|
|
|
+}
|
|
|
+
|
|
|
+const closeSceneList = () => {
|
|
|
+ store.commit('tag/setShowSceneList', false)
|
|
|
+}
|
|
|
+
|
|
|
+const closeTag = async () => {
|
|
|
+ const app = getApp()
|
|
|
+ const player = await app.TourManager.player
|
|
|
+ //关闭热点面板时候,继续播放之前暂停的音频
|
|
|
+ if (!app.Scene.isCurrentPanoHasVideo && !player.isPlaying) {
|
|
|
+ if (hotData.value.type == 'audio' || hotData.value.type == 'video') {
|
|
|
+ // console.log('resume')
|
|
|
+ musicPlayer.resume()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ store.commit('tag/setFixed', false)
|
|
|
+ store.commit('tag/closeTag')
|
|
|
+ showInfo.value = false
|
|
|
+}
|
|
|
+const goTag = async (item, index) => {
|
|
|
+ let player = await getApp().TourManager.player
|
|
|
+ if (isPlay.value) {
|
|
|
+ player.pause()
|
|
|
+ store.commit('tour/setData', { isPlay: false })
|
|
|
+ }
|
|
|
+ if (flying.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (isFixed.value && !isEdit.value && hotData.value.sid == item.sid && !positionInfo.value) {
|
|
|
+ closeTag()
|
|
|
+ } else {
|
|
|
+ if (!enterVisible.value && !editPosition.value) {
|
|
|
+ if (!isEdit.value && !positionInfo.value) {
|
|
|
+ store.commit('tag/show', index)
|
|
|
+ store.commit('tag/setFixed', true)
|
|
|
+ showInfo.value = true
|
|
|
+ store.commit('tag/setToggleIndex', index)
|
|
|
+ store.commit('tag/gotoTag', item)
|
|
|
+ }
|
|
|
+ store.commit('tag/setClick', true)
|
|
|
+ } else {
|
|
|
+ //热点可视操作
|
|
|
+ getApp().TagManager.edit.setTagVisi(item.sid)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ const app = await useApp()
|
|
|
+ await app.TagManager.tag()
|
|
|
+ init = false
|
|
|
+
|
|
|
+ tags$.value = '[xui_tags]'
|
|
|
+ app.TagManager.updatePosition(tags.value)
|
|
|
+ if (app.config.mobile) {
|
|
|
+ nextTick(() => {
|
|
|
+ let player = document.querySelector('.player')
|
|
|
+ player.addEventListener('touchstart', onClickHandler)
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ window.addEventListener('click', onClickHandler)
|
|
|
+ }
|
|
|
+})
|
|
|
+const getUrl = icon => {
|
|
|
+ let url = icon == '' || !icon ? getApp().resource.getAppURL('images/tag_icon_default.svg') : icon
|
|
|
+
|
|
|
+ return common.changeUrl(url)
|
|
|
+}
|
|
|
+const onMouseEnter = (tag, index) => {
|
|
|
+ if (!getApp().config.mobile) {
|
|
|
+ if (flying.value || isPlay.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!enterVisible.value && !editPosition.value && !isEdit.value && !positionInfo.value) {
|
|
|
+ // console.log('onMouseEnter')
|
|
|
+
|
|
|
+ showInfo.value = true
|
|
|
+ store.commit('tag/show', index)
|
|
|
+
|
|
|
+ store.commit('tag/setToggleIndex', index)
|
|
|
+ if (leaveId.value != tag.sid) {
|
|
|
+ //聚焦后 移到其他热点取消fixed
|
|
|
+ store.commit('tag/setFixed', false)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const onMouseLeave = (event, tag) => {
|
|
|
+ if (!getApp().config.mobile) {
|
|
|
+ if (flying.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (event.relatedTarget != null) {
|
|
|
+ // if (!isEdit.value) {
|
|
|
+ showInfo.value = false
|
|
|
+ // }
|
|
|
+ store.commit('tag/setLeaveId', tag.sid)
|
|
|
+ if (!enterVisible.value && !isFixed.value && !showMsg.value && !editPosition.value && !positionInfo.value) {
|
|
|
+ closeTag()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const onClickHandler = () => {
|
|
|
+ // if (flying.value) {
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+
|
|
|
+ if (!isEdit.value && !positionInfo.value && isFixed.value) {
|
|
|
+ closeTag()
|
|
|
+ store.commit('tag/setClick', false)
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+[xui_tags] .content .trans {
|
|
|
+ min-width: 525px;
|
|
|
+}
|
|
|
+</style>
|