diff --git a/src/assets/images/chart/decorates/fullScreen.png b/src/assets/images/chart/decorates/fullScreen.png new file mode 100644 index 00000000..04167ed6 Binary files /dev/null and b/src/assets/images/chart/decorates/fullScreen.png differ diff --git a/src/packages/components/Decorates/Mores/FullScreen/config.ts b/src/packages/components/Decorates/Mores/FullScreen/config.ts new file mode 100644 index 00000000..bed59c06 --- /dev/null +++ b/src/packages/components/Decorates/Mores/FullScreen/config.ts @@ -0,0 +1,18 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { chartInitConfig } from '@/settings/designSetting' +import { FullScreenConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export const option = { + border: 6, + bgColor: '#84a5e9', + borderColor: '#84a5e9' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = FullScreenConfig.key + public attr = { ...chartInitConfig, w: 150, h: 150 } + public chartConfig = cloneDeep(FullScreenConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Decorates/Mores/FullScreen/config.vue b/src/packages/components/Decorates/Mores/FullScreen/config.vue new file mode 100644 index 00000000..450752d7 --- /dev/null +++ b/src/packages/components/Decorates/Mores/FullScreen/config.vue @@ -0,0 +1,28 @@ +<template> + <CollapseItem name="全屏按钮" expanded> + <SettingItemBox name="按钮"> + <SettingItem name="背景色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.bgColor"></n-color-picker> + </SettingItem> + <SettingItem name="边框色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.borderColor"></n-color-picker> + </SettingItem> + <SettingItem name="边框大小"> + <n-input-number v-model:value="optionData.border" size="small" :step="0.5" :min="0"></n-input-number> + </SettingItem> + </SettingItemBox> + </CollapseItem> +</template> + +<script setup lang="ts"> +import { PropType } from 'vue' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' +import { option } from './config' + +const props = defineProps({ + optionData: { + type: Object as PropType<typeof option>, + required: true + } +}) +</script> diff --git a/src/packages/components/Decorates/Mores/FullScreen/index.ts b/src/packages/components/Decorates/Mores/FullScreen/index.ts new file mode 100644 index 00000000..19e37683 --- /dev/null +++ b/src/packages/components/Decorates/Mores/FullScreen/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const FullScreenConfig: ConfigType = { + key: 'FullScreen', + chartKey: 'VFullScreen', + conKey: 'VCFullScreen', + title: '全屏按钮', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.DECORATES, + chartFrame: ChartFrameEnum.STATIC, + image: 'fullScreen.png' +} diff --git a/src/packages/components/Decorates/Mores/FullScreen/index.vue b/src/packages/components/Decorates/Mores/FullScreen/index.vue new file mode 100644 index 00000000..805c8294 --- /dev/null +++ b/src/packages/components/Decorates/Mores/FullScreen/index.vue @@ -0,0 +1,111 @@ +<template> + <svg @click="toggleFullscreen" v-if="!isFullscreen" viewBox="0 0 1024 1024"> + <path + d="M665.6 1017.6c-19.2 0-38.4-19.2-38.4-38.4s19.2-38.4 38.4-38.4h268.8l6.4-268.8c0-19.2 19.2-38.4 38.4-38.4s38.4 19.2 38.4 38.4v294.4c0 32-25.6 51.2-51.2 51.2h-300.8zM51.2 396.8c-19.2 0-38.4-19.2-38.4-38.4V64C12.8 32 38.4 12.8 64 12.8h294.4c19.2 0 38.4 19.2 38.4 38.4s-19.2 38.4-38.4 38.4H89.6v268.8c0 19.2-19.2 38.4-38.4 38.4zM64 1017.6c-32 0-51.2-25.6-51.2-51.2v-294.4c0-19.2 19.2-38.4 38.4-38.4s38.4 19.2 38.4 38.4v217.6l198.4-198.4c6.4-6.4 19.2-12.8 25.6-12.8s19.2 6.4 25.6 12.8c6.4 6.4 12.8 19.2 12.8 25.6 0 12.8-6.4 19.2-12.8 25.6l-198.4 198.4h217.6c19.2 0 38.4 19.2 38.4 38.4s-19.2 38.4-38.4 38.4H64z m915.2-620.8c-19.2 0-38.4-19.2-38.4-38.4V140.8l-198.4 198.4c-6.4 6.4-19.2 12.8-25.6 12.8-12.8 0-19.2-6.4-25.6-12.8-12.8-12.8-12.8-38.4 0-51.2l198.4-198.4h-217.6c-19.2 0-38.4-19.2-38.4-38.4s19.2-38.4 38.4-38.4h294.4c32 0 51.2 25.6 51.2 51.2v294.4c0 19.2-19.2 38.4-38.4 38.4z" + class="fullScreen-border" + ></path> + </svg> + <svg @click="toggleFullscreen" v-else viewBox="0 0 1024 1024"> + <path + d="M379.336 697.237L153.362 921.55c-14.11 14.007-36.905 13.922-50.912-0.188-14.007-14.11-13.922-36.905 0.188-50.912l227.6-225.927H138.645c-18.99 0-34.385-15.446-34.385-34.5 0-19.053 15.395-34.5 34.385-34.5H413.72c18.99 0 34.384 15.447 34.384 34.5v276c0 9.15-3.622 17.926-10.07 24.396a34.326 34.326 0 0 1-24.314 10.104 34.326 34.326 0 0 1-24.314-10.104 34.559 34.559 0 0 1-10.071-24.396V697.237z m263.395-366.88l227.813-227.813c14.059-14.059 36.853-14.059 50.912 0 14.059 14.059 14.059 36.853 0 50.912l-225.18 225.18h187.147c18.99 0 34.385 15.445 34.385 34.5 0 19.053-15.395 34.5-34.385 34.5H608.346c-18.99 0-34.384-15.447-34.384-34.5v-276c0-9.15 3.622-17.926 10.07-24.396a34.326 34.326 0 0 1 24.314-10.105c9.12 0 17.865 3.635 24.314 10.105a34.559 34.559 0 0 1 10.07 24.395v193.223zM99.385 410a34.326 34.326 0 0 1-24.314-10.105A34.559 34.559 0 0 1 65 375.5v-276C65 80.446 80.395 65 99.385 65h275.077c18.99 0 34.384 15.446 34.384 34.5 0 19.054-15.394 34.5-34.384 34.5H133.769v241.5c0 9.15-3.622 17.925-10.07 24.395A34.326 34.326 0 0 1 99.384 410z m825.23 552H649.538c-18.99 0-34.384-15.446-34.384-34.5 0-19.054 15.394-34.5 34.384-34.5h240.693V651.5c0-19.054 15.394-34.5 34.384-34.5 18.99 0 34.385 15.446 34.385 34.5v276c0 19.054-15.395 34.5-34.385 34.5z" + class="fullScreen-border" + ></path> + </svg> +</template> + +<script setup lang="ts"> +import { PropType, toRefs, ref, onMounted, onUnmounted } from 'vue' +import { CreateComponentType } from '@/packages/index.d' +import { option } from './config' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType & typeof option>, + required: true + } +}) + +let { border, bgColor, borderColor } = toRefs(props.chartConfig.option) +const isFullscreen = ref(false) +const checkFullscreen = () => { + isFullscreen.value = !!( + document.fullscreenElement || + document.webkitFullscreenElement || + document.mozFullScreenElement || + document.msFullscreenElement + ) +} +checkFullscreen() + +const requestFullscreen = element => { + if (element.requestFullscreen) { + element.requestFullscreen() + } else if (element.mozRequestFullScreen) { + /* Firefox */ + element.mozRequestFullScreen() + } else if (element.webkitRequestFullscreen) { + /* Chrome, Safari and Opera */ + element.webkitRequestFullscreen() + } else if (element.msRequestFullscreen) { + /* IE/Edge */ + element.msRequestFullscreen() + } +} + +const exitFullscreen = () => { + if (document.fullscreenElement && document.exitFullscreen) { + document.exitFullscreen() + } else if (document.mozFullScreenElement && document.mozCancelFullScreen) { + /* Firefox */ + document.mozCancelFullScreen() + } else if (document.webkitFullscreenElement && document.webkitExitFullscreen) { + /* Chrome, Safari and Opera */ + document.webkitExitFullscreen() + } else if (document.msFullscreenElement && document.msExitFullscreen) { + /* IE/Edge */ + document.msExitFullscreen() + } +} + +const toggleFullscreen = () => { + if (!isFullscreen.value) { + requestFullscreen(document.documentElement) + } else { + exitFullscreen() + } + isFullscreen.value = !isFullscreen.value + // 由于全屏状态的改变不会立即生效,所以需要延迟一段时间再去获取全屏状态 + setTimeout(() => { + checkFullscreen() + }, 1000) +} + +// 监听全屏状态的改变,保证多个全屏组件的状态一致 +onMounted(() => { + document.addEventListener('fullscreenchange', checkFullscreen) + document.addEventListener('webkitfullscreenchange', checkFullscreen) + document.addEventListener('mozfullscreenchange', checkFullscreen) + document.addEventListener('MSFullscreenChange', checkFullscreen) +}) + +onUnmounted(() => { + document.removeEventListener('fullscreenchange', checkFullscreen) + document.removeEventListener('webkitfullscreenchange', checkFullscreen) + document.removeEventListener('mozfullscreenchange', checkFullscreen) + document.removeEventListener('MSFullscreenChange', checkFullscreen) +}) +</script> + +<style lang="scss" scoped> +svg { + display: block; + width: 100%; + height: 100%; + cursor: pointer; +} +.fullScreen-border { + stroke: v-bind('borderColor'); + stroke-width: v-bind('border+"px"'); + fill: v-bind('bgColor'); +} +</style> diff --git a/src/packages/components/Decorates/Mores/index.ts b/src/packages/components/Decorates/Mores/index.ts index 7223832b..489b9c5c 100644 --- a/src/packages/components/Decorates/Mores/index.ts +++ b/src/packages/components/Decorates/Mores/index.ts @@ -1,9 +1,19 @@ import { NumberConfig } from './Number/index' import { TimeCommonConfig } from './TimeCommon/index' import { ClockConfig } from './Clock/index' +import { FullScreenConfig } from './FullScreen/index' import { CountDownConfig } from './CountDown/index' import { FlipperNumberConfig } from './FlipperNumber' import { PipelineHConfig } from './PipelineH/index' import { PipelineVConfig } from './PipelineV/index' -export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig, PipelineHConfig, PipelineVConfig] +export default [ + NumberConfig, + FlipperNumberConfig, + TimeCommonConfig, + CountDownConfig, + ClockConfig, + FullScreenConfig, + PipelineHConfig, + PipelineVConfig +]