RightButtons.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <div class="controls-right-buttons" v-if="mode == 'panorama'" :class="{ 'is-edit': isEdit, disabled: flying || isPlay }">
  3. <div :class="{ hiding: !controls.showVR }" @click="onHandler('vr')" v-show="router.name == 'settings' || isMobile">
  4. <ui-icon type="vr" :tip="$t('mode.vr')" tipV="top"></ui-icon>
  5. <p class="mobile-text">VR</p>
  6. <!-- <i class="iconfont icon-vr"></i> -->
  7. <span @click="onSetControls('showVR')" :class="{ hide: !controls.showVR }">
  8. <i class="iconfont icon-eye-s"></i>
  9. </span>
  10. </div>
  11. <!--
  12. <div>
  13. <i class="iconfont icon-rule"></i>
  14. <span @click="onSetControls('showRule')" :class="{ disable: !controls.showRule }">
  15. <i class="iconfont icon-eye-s"></i>
  16. </span>
  17. </div> -->
  18. <div class="music-icon" v-if="showMusic && !isEdit" @click="onHandler('music')" v-show="router.name == 'info' || isMobile">
  19. <!-- <i class="iconfont icon-music"></i> -->
  20. <ui-icon type="music" :class="{ playing: showMusicPlaying }" :tip="showMusicPlaying ? '' : $t('mode.music')" tipV="top"></ui-icon>
  21. <p class="mobile-text">{{ $t('mode.music') }}</p>
  22. </div>
  23. </div>
  24. </template>
  25. <script setup>
  26. import { computed, ref, defineProps } from 'vue'
  27. import { useStore } from 'vuex'
  28. import { useMusicPlayer } from '@/utils/sound'
  29. import { getApp, getNum } from '@/app'
  30. import { useI18n } from '@/i18n'
  31. const { t } = useI18n({ useScope: 'global' })
  32. const isMobile = computed(() => store.getters['mobile'])
  33. const mode = computed(() => store.getters['mode'])
  34. const musicPlayer = useMusicPlayer()
  35. import { Dialog } from '@kankan/components'
  36. const props = defineProps({
  37. isEdit: Boolean,
  38. })
  39. const store = useStore()
  40. const router = computed(() => store.getters.router)
  41. const controls = computed(() => store.getters['settings/controls'])
  42. const showMusic = computed(() => store.getters['info/musicURL'])
  43. const isPlay = computed(() => store.getters['tour/isPlay'])
  44. const flying = computed(() => store.getters['flying'])
  45. const showMusicPlaying = ref(false)
  46. const onSetControls = name => {
  47. let msg = ''
  48. if (name == 'showVR') {
  49. msg = t('mode.vr')
  50. }
  51. if (controls.value[name]) {
  52. Dialog.toast(msg + t('common.isClose'))
  53. } else {
  54. Dialog.toast(msg + t('common.isOpen'))
  55. }
  56. store.commit('settings/controls', name)
  57. }
  58. const onHandler = name => {
  59. if (props.isEdit) {
  60. return
  61. }
  62. if (name == 'vr') {
  63. Dialog.toast(t('limit.viewInVr'))
  64. } else if (name == 'music') {
  65. showMusicPlaying.value ? musicPlayer.pause() : musicPlayer.play()
  66. }
  67. }
  68. musicPlayer.on('play', () => (showMusicPlaying.value = true))
  69. musicPlayer.on('pause', () => (showMusicPlaying.value = false))
  70. </script>
  71. <style lang="scss" scoped>
  72. .controls-right-buttons {
  73. pointer-events: all;
  74. display: flex;
  75. margin-right: 20px;
  76. margin-bottom: 20px;
  77. &.is-edit {
  78. > div {
  79. cursor: default;
  80. span {
  81. display: flex;
  82. }
  83. }
  84. .hiding {
  85. display: flex;
  86. }
  87. }
  88. > div {
  89. position: relative;
  90. cursor: pointer;
  91. margin-left: 10px;
  92. display: flex;
  93. align-items: center;
  94. justify-content: center;
  95. width: 34px;
  96. height: 34px;
  97. background-color: rgba(0, 0, 0, 0.3);
  98. border-radius: 50%;
  99. pointer-events: all;
  100. &.music-icon {
  101. }
  102. .mobile-text {
  103. display: none;
  104. }
  105. > i {
  106. font-size: 18px;
  107. display: block;
  108. }
  109. span {
  110. cursor: pointer;
  111. display: none;
  112. position: absolute;
  113. top: -14px;
  114. right: -8px;
  115. width: 24px;
  116. height: 24px;
  117. background-color: rgba(0, 0, 0, 0.5);
  118. border-radius: 50%;
  119. align-items: center;
  120. justify-content: center;
  121. color: var(--editor-main-color);
  122. transition: all 0.1s;
  123. &:hover {
  124. transform: scale(1.2);
  125. }
  126. &.disable {
  127. i {
  128. opacity: 0.5;
  129. }
  130. }
  131. }
  132. }
  133. .hide {
  134. color: #999;
  135. }
  136. .hiding {
  137. display: none;
  138. }
  139. }
  140. .playing {
  141. animation: spinner 4s linear infinite;
  142. }
  143. @keyframes spinner {
  144. 0% {
  145. transform: rotate(0);
  146. transform-origin: center center;
  147. }
  148. to {
  149. transform: rotate(1turn);
  150. transform-origin: center center;
  151. }
  152. }
  153. [is-mobile] {
  154. .controls-right-buttons {
  155. flex-direction: column;
  156. bottom: 2.96rem;
  157. left: 0.28rem;
  158. margin-right: 0px;
  159. margin-bottom: 0px;
  160. position: absolute;
  161. padding: 0.2667rem 0.2667rem 0;
  162. > div {
  163. background: transparent;
  164. width: auto;
  165. height: auto;
  166. display: block;
  167. // margin: 0 0 0.4667rem;
  168. margin: 0 0 1rem;
  169. &.music-icon {
  170. // display: none;
  171. }
  172. > .iconfont {
  173. font-size: 0.64rem;
  174. display: inline-block;
  175. }
  176. .mobile-text {
  177. display: block;
  178. text-align: center;
  179. margin-top: 0.2667rem;
  180. font-size: 0.32rem;
  181. font-weight: 500;
  182. color: #fff;
  183. position: absolute;
  184. left: 50%;
  185. transform: translateX(-50%);
  186. bottom: -90%;
  187. white-space: nowrap;
  188. }
  189. }
  190. }
  191. }
  192. </style>