|
@@ -1,441 +1,474 @@
|
|
|
<template>
|
|
|
- <teleport :to="tags$" v-if="tags$">
|
|
|
- <template v-for="(tag, index) in tags">
|
|
|
- <div
|
|
|
- :tag-sid="tag.sid"
|
|
|
- @mouseleave.prevent="onMouseLeave($event, tag)"
|
|
|
- :style="{
|
|
|
- left: `${tag.x}px`,
|
|
|
- top: `${tag.y}px`,
|
|
|
- 'z-index': hotData?.sid == tag.sid ? 1 : 0,
|
|
|
- }"
|
|
|
- :class="{
|
|
|
- visible:
|
|
|
- tag.visible ||
|
|
|
- (tours.length &&
|
|
|
- hotData &&
|
|
|
- tours[partId].list[frameId].tagId == tag.sid &&
|
|
|
- getApp().config.mobile),
|
|
|
- }"
|
|
|
- >
|
|
|
- <!-- <div
|
|
|
- :tag-sid="tag.sid"
|
|
|
- @mouseleave.prevent="onMouseLeave($event, tag)"
|
|
|
- :style="{ transform: `translate3d(${tag.x}px,${tag.y}px,0)`, 'z-index': hotData?.sid == tag.sid ? 1 : 0 }"
|
|
|
- :class="{ visible: tag.visible || (tours.length && hotData && tours[partId].list[frameId].tagId == tag.sid && getApp().config.mobile) }"
|
|
|
- > -->
|
|
|
- <span
|
|
|
- class="point zoom"
|
|
|
- @mouseenter.prevent="onMouseEnter($event, tag, index)"
|
|
|
- @click.stop="goTag($event, tag, index)"
|
|
|
- :style="{ 'background-image': 'url(' + getUrl(tag.icon) + ')' }"
|
|
|
- ></span>
|
|
|
- <p class="tag-title" v-if="metadata.controls.showTagTitle">
|
|
|
- {{ tag.title }}
|
|
|
- </p>
|
|
|
- <div class="content">
|
|
|
- <div
|
|
|
- class="trans"
|
|
|
- :class="{
|
|
|
- fixed: isPlay || getApp().config.mobile,
|
|
|
- active:
|
|
|
- (isFixed && hotData && tag.sid == hotData.sid) ||
|
|
|
- (showInfo && hotData && tag.sid == hotData.sid),
|
|
|
- }"
|
|
|
- >
|
|
|
- <template v-if="hotData && tag.sid == hotData.sid && !showMsg">
|
|
|
- <div class="arrow" :id="`arrow_${tag.sid}`">
|
|
|
- <ui-icon
|
|
|
- @click.stop="closeTag"
|
|
|
- v-if="getApp().config.mobile"
|
|
|
- type="close"
|
|
|
- ></ui-icon>
|
|
|
- </div>
|
|
|
- <ShowTag
|
|
|
- :moveDistance="moveDistance"
|
|
|
- @click.stop=""
|
|
|
- v-if="!isEdit && hotData"
|
|
|
- @open="openInfo"
|
|
|
- />
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <teleport :to="tags$" v-if="tags$">
|
|
|
+ <template v-for="(tag, index) in tags">
|
|
|
+ <div
|
|
|
+ :tag-sid="tag.sid"
|
|
|
+ @mouseleave.prevent="onMouseLeave($event, tag)"
|
|
|
+ :style="{ left: `${tag.x}px`, top: `${tag.y}px`, 'z-index': hotData?.sid == tag.sid ? 1 : 0 }"
|
|
|
+ :class="{ visible: tag.visible || (tours.length && hotData && tours[partId].list[frameId].tagId == tag.sid && getApp().config.mobile) }"
|
|
|
+ >
|
|
|
+ <!-- <div
|
|
|
+ :tag-sid="tag.sid"
|
|
|
+ @mouseleave.prevent="onMouseLeave($event, tag)"
|
|
|
+ :style="{ transform: `translate3d(${tag.x}px,${tag.y}px,0)`, 'z-index': hotData?.sid == tag.sid ? 1 : 0 }"
|
|
|
+ :class="{ visible: tag.visible || (tours.length && hotData && tours[partId].list[frameId].tagId == tag.sid && getApp().config.mobile) }"
|
|
|
+ > -->
|
|
|
+ <span
|
|
|
+ :class="{ 'no-zoom': showDetails && hotData && tag.sid == hotData.sid, visible: tag.visible }"
|
|
|
+ class="point zoom"
|
|
|
+ @mouseenter.prevent="onMouseEnter($event, tag, index)"
|
|
|
+ @click.stop="goTag($event, tag, index)"
|
|
|
+ :style="{ 'background-image': 'url(' + getUrl(tag.icon) + ')' }"
|
|
|
+ ><i v-if="showDetails && hotData && tag.sid == hotData.sid" :style="`background-image:url(${tagFocusIcon});`" class="focus-icon"></i
|
|
|
+ ></span>
|
|
|
+ <p class="tag-title" v-if="metadata.controls.showTagTitle">{{ tag.title }}</p>
|
|
|
+ <div class="content">
|
|
|
+ <div
|
|
|
+ class="trans"
|
|
|
+ :class="{
|
|
|
+ fixed: isPlay || getApp().config.mobile,
|
|
|
+ active: (isFixed && hotData && tag.sid == hotData.sid) || (showInfo && hotData && tag.sid == hotData.sid),
|
|
|
+ hidden: !tag.visible && !isPlay,
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <!-- <template v-if="hotData && tag.sid == hotData.sid && !showMsg && !showDetails"> -->
|
|
|
+ <template v-if="hotData && tag.sid == hotData.sid && !showDetails">
|
|
|
+ <div class="arrow" :id="`arrow_${tag.sid}`">
|
|
|
+ <ui-icon @click.stop="closeTag" v-if="getApp().config.mobile" type="close"></ui-icon>
|
|
|
+ </div>
|
|
|
+ <ShowTag @openDetails="openDetails" :moveDistance="moveDistance" @click.stop="" v-if="!isEdit && hotData" @open="openInfo" />
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <TagView
|
|
|
- @click.stop=""
|
|
|
- v-if="showMsg && toggleIndex == index"
|
|
|
- @close="closeInfo"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </teleport>
|
|
|
+ <TagView @click.stop="" v-if="showMsg && toggleIndex == index" @close="closeInfo" />
|
|
|
+ <!-- <TagDeTails v-if="showDetails && toggleIndex == index && !showMsg" @open="openInfo" /> -->
|
|
|
+ <TagDeTails v-if="showDetails && toggleIndex == index" @open="openInfo" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </teleport>
|
|
|
</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 ShowTag from "./show-tag.vue";
|
|
|
-import { useRoute } from "vue-router";
|
|
|
-import { useMusicPlayer } from "@/utils/sound";
|
|
|
-import browser from "@/utils/browser";
|
|
|
-
|
|
|
-// import { Track, startTrack, endTrack } from "@/utils/track.js";
|
|
|
-const musicPlayer = useMusicPlayer();
|
|
|
-let init = true;
|
|
|
+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 ShowTag from './show-tag.vue'
|
|
|
+import TagDeTails from './tag-details.vue'
|
|
|
+import { useRoute } from 'vue-router'
|
|
|
+import { useMusicPlayer } from '@/utils/sound'
|
|
|
+import browser from '@/utils/browser'
|
|
|
+import { Track, startTrack, endTrack } from '@/utils/track.js'
|
|
|
+import { defaultStyles } from './constant.js'
|
|
|
+const musicPlayer = useMusicPlayer()
|
|
|
+let init = true
|
|
|
const hotData = computed(() => {
|
|
|
- let data = store.getters["tag/hotData"];
|
|
|
- if (!data) {
|
|
|
- // musicPlayer.play()
|
|
|
- // musicPlayer.pause(true)
|
|
|
- // if (!getApp().Scene.isCurrentPanoHasVideo) {
|
|
|
- // musicPlayer.resume()
|
|
|
- // }
|
|
|
- }
|
|
|
- return data;
|
|
|
-});
|
|
|
-const metadata = computed(() => store.getters["scene/metadata"]);
|
|
|
-const isPlay = computed(() => store.getters["tour/isPlay"]);
|
|
|
-const tours = computed(() => store.getters["tour/tours"]);
|
|
|
-const partId = computed(() => store.getters["tour/partId"]);
|
|
|
-const frameId = computed(() => store.getters["tour/frameId"]);
|
|
|
-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 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 panoId = computed(() => store.getters["panoId"]);
|
|
|
-const store = useStore();
|
|
|
-const tags$ = ref(null);
|
|
|
+ let data = store.getters['tag/hotData']
|
|
|
+
|
|
|
+ return data
|
|
|
+})
|
|
|
+const metadata = computed(() => store.getters['scene/metadata'])
|
|
|
+const isPlay = computed(() => store.getters['tour/isPlay'])
|
|
|
+const tours = computed(() => store.getters['tour/tours'])
|
|
|
+const partId = computed(() => store.getters['tour/partId'])
|
|
|
+const frameId = computed(() => store.getters['tour/frameId'])
|
|
|
+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 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 panoId = computed(() => store.getters['panoId'])
|
|
|
+const showDetails = computed(() => store.getters['tag/showDetails'])
|
|
|
+const store = useStore()
|
|
|
+const tags$ = ref(null)
|
|
|
const tags = computed(() => {
|
|
|
- return store.getters["tag/tags"] || [];
|
|
|
-});
|
|
|
+ console.log(store.getters['tag/tags'] || [])
|
|
|
+ return store.getters['tag/tags'] || []
|
|
|
+})
|
|
|
|
|
|
// const flyClose = computed(() => store.getters['tag/flyClose'])
|
|
|
-
|
|
|
+const tagFocusIcon = ref('')
|
|
|
watch(
|
|
|
- () => router.value.name,
|
|
|
- (val, old) => {
|
|
|
- if (val !== "tag") {
|
|
|
- store.commit("tag/setData", { isFixed: false });
|
|
|
+ () => router.value.name,
|
|
|
+ (val, old) => {
|
|
|
+ if (val !== 'tag') {
|
|
|
+ store.commit('tag/setData', { isFixed: false })
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-);
|
|
|
-
|
|
|
-const showInfo = ref(false);
|
|
|
-const showMsg = ref(false);
|
|
|
+)
|
|
|
+watch(
|
|
|
+ () => isFixed.value,
|
|
|
+ val => {
|
|
|
+ if (!val) {
|
|
|
+ moveDistance.value = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+)
|
|
|
+const openDetails = () => {
|
|
|
+ store.commit('tag/setData', { showDetails: true })
|
|
|
+}
|
|
|
+const showInfo = ref(false)
|
|
|
+const showMsg = ref(false)
|
|
|
// const toggleIndex = ref(null)
|
|
|
const openInfo = () => {
|
|
|
- showMsg.value = true;
|
|
|
- store.commit("tag/setData", { isFixed: false, isClick: true });
|
|
|
- showInfo.value = false;
|
|
|
-};
|
|
|
+ showMsg.value = true
|
|
|
+ // store.commit('tag/setData', { isFixed: true, isClick: true })
|
|
|
+ store.commit('tag/setData', { isFixed: true, isClick: true }) //为了查看媒体文件不关闭热点。听音乐
|
|
|
+ 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)
|
|
|
-};
|
|
|
+ showMsg.value = false
|
|
|
+ if (isClick.value) {
|
|
|
+ //只有点击定位的才恢复显示
|
|
|
+ store.commit('tag/show', toggleIndex.value)
|
|
|
+ store.commit('tag/setFixed', true)
|
|
|
+ // showInfo.value = true
|
|
|
+ showInfo.value = 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')
|
|
|
- // if (!isPlay.value) {
|
|
|
- // musicPlayer.resume();
|
|
|
- // }
|
|
|
- window.parent.postMessage(
|
|
|
- {
|
|
|
- source: "qjkankan",
|
|
|
- event: "toggleBgmStatus",
|
|
|
- params: {
|
|
|
- status: true,
|
|
|
- },
|
|
|
- },
|
|
|
- "*"
|
|
|
- );
|
|
|
+ const app = getApp()
|
|
|
+ const player = await app.TourManager.player
|
|
|
+ //关闭热点面板时候,继续播放之前暂停的音频
|
|
|
+ if (!app.Scene.isCurrentPanoHasVideo && !player.isPlaying) {
|
|
|
+ // if (hotData.value && (hotData.value.bgm || (hotData.value.media.length && hotData.value.media[0].type == 'video'))) {
|
|
|
+ if (!isPlay.value) {
|
|
|
+ musicPlayer.resume()
|
|
|
+ }
|
|
|
+ // }
|
|
|
}
|
|
|
- }
|
|
|
- // store.commit('tag/setData', { isFixed: false, isClick: false, flyClose: false })
|
|
|
- store.commit("tag/setData", { isFixed: false, isClick: false });
|
|
|
- store.commit("tag/closeTag");
|
|
|
+ __fixed = false
|
|
|
+ // store.commit('tag/setData', { isFixed: false, isClick: false, flyClose: false })
|
|
|
+ store.commit('tag/setData', { isFixed: false, isClick: false })
|
|
|
+ store.commit('tag/closeTag')
|
|
|
|
|
|
- // store.commit('tag/setFixed', false)
|
|
|
- // store.commit('tag/closeTag')
|
|
|
- // store.commit('tag/setClick', false)
|
|
|
- showInfo.value = false;
|
|
|
-};
|
|
|
+ // store.commit('tag/setFixed', false)
|
|
|
+ // store.commit('tag/closeTag')
|
|
|
+ // store.commit('tag/setClick', false)
|
|
|
+ showInfo.value = false
|
|
|
+}
|
|
|
const goTag = async (event, item, index) => {
|
|
|
- // Track("view-tag", {
|
|
|
- // eventType: "click",
|
|
|
- // click: 1,
|
|
|
- // });
|
|
|
- let player = await getApp().TourManager.player;
|
|
|
- if (isPlay.value && !event.fixed) {
|
|
|
- player.pause();
|
|
|
- store.commit("tour/setData", { isPlay: false });
|
|
|
- }
|
|
|
- if (flying.value) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (
|
|
|
- isFixed.value &&
|
|
|
- !isEdit.value &&
|
|
|
- hotData.value.sid == item.sid &&
|
|
|
- !positionInfo.value
|
|
|
- ) {
|
|
|
- __close = true;
|
|
|
- getApp().TagManager.close(hotData.value.sid);
|
|
|
- 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);
|
|
|
- if (event.fixed) {
|
|
|
- store.commit("tag/gotoTag", { tag: item, fixed: true });
|
|
|
- // store.commit('tag/gotoTag', { tag: item })
|
|
|
- } else {
|
|
|
- store.commit("tag/gotoTag", { tag: item });
|
|
|
- }
|
|
|
- }
|
|
|
- //没有t_id时候 不需要延时
|
|
|
- if (!browser.hasURLParam("t_id")) {
|
|
|
- let timer = setTimeout(() => {
|
|
|
- // store.commit('tag/setData', { flyClose: true })
|
|
|
- clearTimeout(timer);
|
|
|
- timer = null;
|
|
|
- }, 1000);
|
|
|
- }
|
|
|
+ Track('view-tag', {
|
|
|
+ eventType: 'click',
|
|
|
+ click: 1,
|
|
|
+ })
|
|
|
+ let player = await getApp().TourManager.player
|
|
|
|
|
|
- store.commit("tag/setClick", true);
|
|
|
- } else {
|
|
|
- //热点可视操作
|
|
|
- getApp().TagManager.edit.setTagVisi(item.sid);
|
|
|
+ if (isPlay.value && !event.fixed) {
|
|
|
+ player.pause()
|
|
|
+ store.commit('tour/setData', { isPlay: false })
|
|
|
}
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-onMounted(async () => {
|
|
|
- const app = await useApp();
|
|
|
- app.Camera.on("flying.started", (pano) => {
|
|
|
- if (!pano.isTagFlying && hotData.value && !isEdit.value) {
|
|
|
- closeTag();
|
|
|
+ if (flying.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (showDetails.value && item.sid == hotData.value.sid) {
|
|
|
+ //展开详情的时候
|
|
|
+ store.commit('tag/setData', { showDetails: false })
|
|
|
+ return
|
|
|
}
|
|
|
- // if (flyClose.value && hotData.value && !isEdit.value) {
|
|
|
- // getApp().TagManager.close(hotData.value.sid)
|
|
|
- // closeTag()
|
|
|
+ // if (item.bgm) {
|
|
|
+ // musicPlayer.pause(true)
|
|
|
// }
|
|
|
- });
|
|
|
- app.Scene.on("loadeddata", () => {
|
|
|
- if (browser.hasURLParam("t_id")) {
|
|
|
- let t_id = browser.getURLParam("t_id");
|
|
|
- for (let i = 0; i < tags.value.length; i++) {
|
|
|
- if (tags.value[i].sid == t_id) {
|
|
|
- goTag({}, tags.value[i], i);
|
|
|
+ if (isFixed.value && !isEdit.value && hotData.value.sid == item.sid && !positionInfo.value) {
|
|
|
+ __close = true
|
|
|
+ // getApp().TagManager.close(hotData.value.sid)
|
|
|
+ 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)
|
|
|
+ if (event.fixed) {
|
|
|
+ store.commit('tag/setData', { showDetails: false }) //先清除上一个的详情状态
|
|
|
+ store.commit('tag/gotoTag', { tag: item, fixed: true })
|
|
|
+ nextTick(() => {
|
|
|
+ if (tours.value[partId.value].list[frameId.value].tagDetails) {
|
|
|
+ openDetails()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ // store.commit('tag/gotoTag', { tag: item })
|
|
|
+ } else {
|
|
|
+ store.commit('tag/gotoTag', { tag: item })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //没有t_id时候 不需要延时
|
|
|
+ if (!browser.hasURLParam('t_id')) {
|
|
|
+ let timer = setTimeout(() => {
|
|
|
+ // store.commit('tag/setData', { flyClose: true })
|
|
|
+ clearTimeout(timer)
|
|
|
+ timer = null
|
|
|
+ }, 1000)
|
|
|
+ }
|
|
|
+
|
|
|
+ store.commit('tag/setClick', true)
|
|
|
+ } else {
|
|
|
+ //热点可视操作
|
|
|
+ getApp().TagManager.edit.setTagVisi(item.sid)
|
|
|
}
|
|
|
- }
|
|
|
}
|
|
|
- });
|
|
|
- // app.Camera.on('flying.ended', ({ targetPano }) => {
|
|
|
- // })
|
|
|
- await app.TagManager.tag();
|
|
|
- init = false;
|
|
|
+}
|
|
|
+const hanlderTour = async () => {
|
|
|
+ let player = await getApp().TourManager.player
|
|
|
+ // player.on('play', tours => {})
|
|
|
+ player.on('pause', data => {
|
|
|
+ __fixed = false
|
|
|
+ })
|
|
|
+ player.on('end', data => {
|
|
|
+ __fixed = false
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ const app = await useApp()
|
|
|
+ // app.TagManager.on('openTag', sid => {
|
|
|
+ // for (let i = 0; i < tags.value.length; i++) {
|
|
|
+ // if (tags.value[i].sid == sid) {
|
|
|
+ // if (getApp().config.mobile) {
|
|
|
+ // goTag({ fixed: true }, tags.value[i], i)
|
|
|
+ // } else {
|
|
|
+ // onMouseEnter({ fixed: true }, tags.value[i], i)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // })
|
|
|
+ tagFocusIcon.value = getApp().resource.getAppURL('images/tag/focus.svg')
|
|
|
+ hanlderTour()
|
|
|
+ app.Camera.on('flying.started', pano => {
|
|
|
+ if (!pano.isTagFlying && hotData.value && !isEdit.value) {
|
|
|
+ closeTag()
|
|
|
+ }
|
|
|
+ // if (flyClose.value && hotData.value && !isEdit.value) {
|
|
|
+ // getApp().TagManager.close(hotData.value.sid)
|
|
|
+ // closeTag()
|
|
|
+ // }
|
|
|
+ })
|
|
|
+ app.Scene.on('loadeddata', () => {
|
|
|
+ if (browser.hasURLParam('t_id')) {
|
|
|
+ let t_id = browser.getURLParam('t_id')
|
|
|
+ for (let i = 0; i < tags.value.length; i++) {
|
|
|
+ if (tags.value[i].sid == t_id) {
|
|
|
+ goTag({}, tags.value[i], i)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ // app.Camera.on('flying.ended', ({ targetPano }) => {
|
|
|
+ // })
|
|
|
+ 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)
|
|
|
- }
|
|
|
-});
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+})
|
|
|
|
|
|
function getElemDis(el) {
|
|
|
- var tp = document.documentElement.clientTop,
|
|
|
- lt = document.documentElement.clientLeft,
|
|
|
- rect = el.getBoundingClientRect();
|
|
|
- return {
|
|
|
- bodyWidth: document.body.clientWidth,
|
|
|
- bodyHight: document.body.clientHeight,
|
|
|
- width: rect.width,
|
|
|
- height: rect.height,
|
|
|
- top: rect.top - tp,
|
|
|
- right: rect.right - lt,
|
|
|
- bottom: rect.bottom - tp,
|
|
|
- left: rect.left - lt,
|
|
|
- };
|
|
|
+ var tp = document.documentElement.clientTop,
|
|
|
+ lt = document.documentElement.clientLeft,
|
|
|
+ rect = el.getBoundingClientRect()
|
|
|
+ return {
|
|
|
+ bodyWidth: document.body.clientWidth,
|
|
|
+ bodyHight: document.body.clientHeight,
|
|
|
+ width: rect.width,
|
|
|
+ height: rect.height,
|
|
|
+ top: rect.top - tp,
|
|
|
+ right: rect.right - lt,
|
|
|
+ bottom: rect.bottom - tp,
|
|
|
+ left: rect.left - lt,
|
|
|
+ }
|
|
|
+}
|
|
|
+const getUrl = icon => {
|
|
|
+ // let url = icon == '' || !icon ? getApp().resource.getAppURL('images/tag_icon_default.svg') : icon
|
|
|
+ let url
|
|
|
+ if (styleList.value.includes(icon)) {
|
|
|
+ url = getApp().resource.getAppURL('images/tag/' + icon)
|
|
|
+ } else {
|
|
|
+ url = icon == '' || !icon ? getApp().resource.getAppURL('images/tag/hotpot-default.svg') : icon
|
|
|
+ }
|
|
|
+ return common.changeUrl(url, true)
|
|
|
+ // return common.changeUrl(url, true)
|
|
|
}
|
|
|
-const getUrl = (icon) => {
|
|
|
- let url =
|
|
|
- icon == "" || !icon
|
|
|
- ? getApp().resource.getAppURL("images/tag_icon_default.svg")
|
|
|
- : icon;
|
|
|
|
|
|
- return common.changeUrl(url, true);
|
|
|
-};
|
|
|
-let __fixed = false;
|
|
|
-let __close = false;
|
|
|
-const moveDistance = ref(0);
|
|
|
-let moveTimer = null;
|
|
|
+const styleList = computed(() => defaultStyles.value.map(i => i.name))
|
|
|
+
|
|
|
+let __fixed = false
|
|
|
+let __close = false
|
|
|
+const moveDistance = ref(0)
|
|
|
+let moveTimer = null
|
|
|
const onMouseEnter = (event, tag, index) => {
|
|
|
- if (moveTimer) {
|
|
|
- clearTimeout(moveTimer);
|
|
|
- moveTimer = null;
|
|
|
- }
|
|
|
- moveTimer = setTimeout(() => {
|
|
|
- let el = document.getElementById(`tagBox_${tag.sid}`);
|
|
|
- if (!el) {
|
|
|
- return;
|
|
|
+ moveDistance.value = 0
|
|
|
+ if (showDetails.value && !event.fixed) {
|
|
|
+ return
|
|
|
}
|
|
|
- let data = getElemDis(el);
|
|
|
- if (data.top < 0) {
|
|
|
- // console.error('超出上面', Math.abs(data.top))
|
|
|
- moveDistance.value = Math.abs(data.top);
|
|
|
- } else if (data.bottom > data.bodyHight) {
|
|
|
- // console.error('超出下面', data.bodyHight - data.bottom)
|
|
|
- moveDistance.value = data.bodyHight - data.bottom;
|
|
|
- } else {
|
|
|
- // moveDistance.value = 0
|
|
|
+
|
|
|
+ if (!isFixed.value) {
|
|
|
+ if (moveTimer) {
|
|
|
+ clearTimeout(moveTimer)
|
|
|
+ moveTimer = null
|
|
|
+ }
|
|
|
+ moveTimer = setTimeout(() => {
|
|
|
+ let el = document.getElementById(`tagBox_${tag.sid}`)
|
|
|
+ if (!el) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let data = getElemDis(el)
|
|
|
+ if (data.top < 50) {
|
|
|
+ moveDistance.value = Math.abs(50 - data.top)
|
|
|
+ } else if (data.bottom > data.bodyHight) {
|
|
|
+ moveDistance.value = data.bodyHight - data.bottom
|
|
|
+ } else {
|
|
|
+ // moveDistance.value = 0
|
|
|
+ }
|
|
|
+ clearTimeout(moveTimer)
|
|
|
+ moveTimer = null
|
|
|
+ }, 50)
|
|
|
}
|
|
|
- clearTimeout(moveTimer);
|
|
|
- moveTimer = null;
|
|
|
- }, 50);
|
|
|
|
|
|
- if (tag.type == "audio" || tag.type == "video") {
|
|
|
- musicPlayer.pause(true);
|
|
|
- }
|
|
|
- if (__fixed) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (__close) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (event.fixed) {
|
|
|
- // store.commit('tag/setData', { flyClose: true, isFixed: true })
|
|
|
- store.commit("tag/setData", { isFixed: true });
|
|
|
- __fixed = true;
|
|
|
- }
|
|
|
+ // if (tag.bgm) {
|
|
|
+ // musicPlayer.pause(true)
|
|
|
+ // }
|
|
|
+ if (__fixed && isPlay.value && !event.fixed) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (__close) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // if (showDetails.value) {
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ if (event.fixed) {
|
|
|
+ store.commit('tag/setData', { showDetails: false }) //先清除上一个的详情状态
|
|
|
+ // store.commit('tag/setData', { flyClose: true, isFixed: true })
|
|
|
|
|
|
- if (!getApp().config.mobile) {
|
|
|
- // if (flying.value || isPlay.value) {
|
|
|
- if (flying.value) {
|
|
|
- return;
|
|
|
+ store.commit('tag/setData', { isFixed: true })
|
|
|
+ __fixed = true
|
|
|
+ nextTick(() => {
|
|
|
+ if (tours.value[partId.value].list[frameId.value].tagDetails) {
|
|
|
+ openDetails()
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
- // if (!enterVisible.value && !editPosition.value && !isEdit.value && !positionInfo.value && !hotData.value) {
|
|
|
- if (
|
|
|
- !enterVisible.value &&
|
|
|
- !editPosition.value &&
|
|
|
- !isEdit.value &&
|
|
|
- !positionInfo.value
|
|
|
- ) {
|
|
|
- // Track("view-tag", {
|
|
|
- // eventType: "hover",
|
|
|
- // hover: 1,
|
|
|
- // });
|
|
|
- showInfo.value = true;
|
|
|
- store.commit("tag/show", index);
|
|
|
|
|
|
- store.commit("tag/setToggleIndex", index);
|
|
|
- if (leaveId.value && leaveId.value != tag.sid) {
|
|
|
- //聚焦后 移到其他热点取消fixed
|
|
|
- store.commit("tag/setFixed", false);
|
|
|
- }
|
|
|
+ if (!getApp().config.mobile) {
|
|
|
+ // if (flying.value || isPlay.value) {
|
|
|
+ if (flying.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // if (!enterVisible.value && !editPosition.value && !isEdit.value && !positionInfo.value && !hotData.value) {
|
|
|
+ if (!enterVisible.value && !editPosition.value && !isEdit.value && !positionInfo.value) {
|
|
|
+ Track('view-tag', {
|
|
|
+ eventType: 'hover',
|
|
|
+ hover: 1,
|
|
|
+ })
|
|
|
+ showInfo.value = true
|
|
|
+ store.commit('tag/show', index)
|
|
|
+
|
|
|
+ store.commit('tag/setToggleIndex', index)
|
|
|
+ if (leaveId.value && leaveId.value != tag.sid && event.relatedTarget && !__fixed) {
|
|
|
+ //聚焦后 移到其他热点取消fixed
|
|
|
+ store.commit('tag/setFixed', false)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
const onMouseLeave = (event, tag) => {
|
|
|
- if (moveTimer) {
|
|
|
- clearTimeout(moveTimer);
|
|
|
- moveTimer = null;
|
|
|
- }
|
|
|
- moveDistance.value = 0;
|
|
|
- if (event.unfixed) {
|
|
|
- __fixed = false;
|
|
|
- store.commit("tag/setData", { isFixed: false });
|
|
|
- }
|
|
|
- if (__fixed) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (!getApp().config.mobile) {
|
|
|
- if (flying.value) {
|
|
|
- return;
|
|
|
+ if (showDetails.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!isFixed.value) {
|
|
|
+ moveDistance.value = 0
|
|
|
+ if (moveTimer) {
|
|
|
+ clearTimeout(moveTimer)
|
|
|
+ moveTimer = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (event.unfixed) {
|
|
|
+ // store.commit('tag/setData', { isFixed: false })
|
|
|
+ // store.commit('tag/closeTag')
|
|
|
+ closeTag()
|
|
|
+ }
|
|
|
+ if (__fixed) {
|
|
|
+ return
|
|
|
}
|
|
|
- if (event.relatedTarget != null) {
|
|
|
- __close = false;
|
|
|
|
|
|
- // if (!isEdit.value) {
|
|
|
- showInfo.value = false;
|
|
|
- // }
|
|
|
- store.commit("tag/setLeaveId", tag.sid);
|
|
|
- if (
|
|
|
- !enterVisible.value &&
|
|
|
- !isFixed.value &&
|
|
|
- !showMsg.value &&
|
|
|
- !editPosition.value &&
|
|
|
- !positionInfo.value &&
|
|
|
- hotData.value
|
|
|
- ) {
|
|
|
- closeTag();
|
|
|
- }
|
|
|
+ if (!getApp().config.mobile) {
|
|
|
+ if (flying.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (event.relatedTarget != null) {
|
|
|
+ __close = false
|
|
|
+
|
|
|
+ // if (!isEdit.value) {
|
|
|
+ showInfo.value = false
|
|
|
+ // }
|
|
|
+ store.commit('tag/setLeaveId', tag.sid)
|
|
|
+ if (!enterVisible.value && !isFixed.value && !showMsg.value && !editPosition.value && !positionInfo.value && hotData.value) {
|
|
|
+ closeTag()
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-};
|
|
|
+}
|
|
|
|
|
|
const onClickHandler = () => {
|
|
|
- // if (flying.value) {
|
|
|
- // return
|
|
|
- // }
|
|
|
+ // if (flying.value) {
|
|
|
+ // return
|
|
|
+ // }
|
|
|
|
|
|
- if (!isEdit.value && !positionInfo.value && isFixed.value) {
|
|
|
- closeTag();
|
|
|
- }
|
|
|
-};
|
|
|
+ if (!isEdit.value && !positionInfo.value && isFixed.value) {
|
|
|
+ closeTag()
|
|
|
+ }
|
|
|
+}
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
.tag-title {
|
|
|
- position: absolute;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- top: 100%;
|
|
|
- max-width: 200%;
|
|
|
- white-space: nowrap;
|
|
|
- text-overflow: ellipsis;
|
|
|
- overflow: hidden;
|
|
|
- text-align: center;
|
|
|
- pointer-events: none;
|
|
|
- text-shadow: 0 0 4px rgba(0, 0, 0, 0.4);
|
|
|
+ position: absolute;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ top: 100%;
|
|
|
+ max-width: 200%;
|
|
|
+ white-space: nowrap;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ overflow: hidden;
|
|
|
+ text-align: center;
|
|
|
+ pointer-events: none;
|
|
|
+ text-shadow: 0 0 4px rgba(0, 0, 0, 0.4);
|
|
|
+ // visibility: hidden;
|
|
|
+ // &.visible {
|
|
|
+ // visibility: visible;
|
|
|
+ // }
|
|
|
+}
|
|
|
+.point {
|
|
|
+ &.no-zoom {
|
|
|
+ animation: none !important;
|
|
|
+ }
|
|
|
+ .focus-icon {
|
|
|
+ width: 140%;
|
|
|
+ height: 140%;
|
|
|
+ // background: rgba(255, 255, 255, 0.3);
|
|
|
+ position: absolute;
|
|
|
+ left: 50%;
|
|
|
+ top: 50%;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+ z-index: -1;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|