| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- <template>
- <div v-show="isGroup">
- <n-divider n-divider style="margin: 10px 0"></n-divider>
- <n-tag type="warning"> 解散分组「 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 」也将消失!</n-tag>
- </div>
- <collapse-item :name="isCanvas ? '滤镜' : '滤镜 / 变换'">
- <template #header>
- <n-switch v-model:value="chartStyles.filterShow" size="small"></n-switch>
- </template>
- <setting-item-box name="色相" :alone="true">
- <setting-item :name="`值:${chartStyles.hueRotate}deg`">
- <!-- 透明度 -->
- <n-slider
- v-model:value="chartStyles.hueRotate"
- :step="3"
- :min="0"
- :max="360"
- :format-tooltip="degFormatTooltip"
- ></n-slider>
- </setting-item>
- </setting-item-box>
- <setting-item-box name="饱和度" :alone="true">
- <setting-item :name="`值:${(parseFloat(String(chartStyles.saturate)) * 100).toFixed(0)}%`">
- <!-- 透明度 -->
- <n-slider
- v-model:value="chartStyles.saturate"
- :step="0.1"
- :min="0"
- :max="2"
- :format-tooltip="sliderFormatTooltip"
- ></n-slider>
- </setting-item>
- </setting-item-box>
- <setting-item-box name="对比度" :alone="true">
- <setting-item :name="`值:${(parseFloat(String(chartStyles.contrast)) * 100).toFixed(0)}%`">
- <!-- 透明度 -->
- <n-slider
- v-model:value="chartStyles.contrast"
- :step="0.1"
- :min="0"
- :max="2"
- :format-tooltip="sliderFormatTooltip"
- ></n-slider>
- </setting-item>
- </setting-item-box>
- <setting-item-box name="亮度" :alone="true">
- <setting-item :name="`值:${(parseFloat(String(chartStyles.brightness)) * 100).toFixed(0)}%`">
- <!-- 透明度 -->
- <n-slider
- v-model:value="chartStyles.brightness"
- :step="0.1"
- :min="0"
- :max="2"
- :format-tooltip="sliderFormatTooltip"
- ></n-slider>
- </setting-item>
- </setting-item-box>
- <setting-item-box name="透明度" :alone="true">
- <setting-item :name="`值:${(parseFloat(String(chartStyles.opacity)) * 100).toFixed(0)}%`">
- <!-- 透明度 -->
- <n-slider
- v-model:value="chartStyles.opacity"
- :step="0.1"
- :min="0"
- :max="1"
- :format-tooltip="sliderFormatTooltip"
- ></n-slider>
- </setting-item>
- </setting-item-box>
- <!-- 预设滤镜 -->
- <div v-if="presetImageList.length" class="preset-filter">
- <n-image
- class="preset-img"
- width="46"
- preview-disabled
- object-fit="scale-down"
- v-for="(item, index) in presetImageList"
- :key="index"
- :class="{ 'active-preset': item.hueRotate === chartStyles.hueRotate }"
- :style="{ filter: `hue-rotate(${item.hueRotate}deg)` }"
- :src="item.src"
- @click="() => (chartStyles.hueRotate = item.hueRotate)"
- ></n-image>
- </div>
- <!-- 混合模式 -->
- <setting-item-box v-if="!isCanvas" :alone="true">
- <template #name>
- <n-text>混合</n-text>
- <n-tooltip trigger="hover">
- <template #trigger>
- <n-icon size="21" :depth="3">
- <help-outline-icon></help-outline-icon>
- </n-icon>
- </template>
- <n-text>视频组件需要底色透明一般选中滤色</n-text>
- </n-tooltip>
- </template>
- <setting-item>
- <n-select v-model:value="chartStyles.blendMode" size="small" filterable :options="BlendModeEnumList"></n-select>
- </setting-item>
- </setting-item-box>
- <!-- 变换 -->
- <setting-item-box v-if="!isCanvas" name="旋转°">
- <setting-item name="Z轴(平面) - 旋转">
- <!-- 透明度 -->
- <n-input-number
- v-model:value="chartStyles.rotateZ"
- :min="0"
- :max="360"
- size="small"
- placeholder="角度"
- ></n-input-number>
- </setting-item>
- <setting-item name="X轴 - 旋转">
- <!-- 透明度 -->
- <n-input-number
- v-model:value="chartStyles.rotateX"
- :min="0"
- :max="360"
- size="small"
- placeholder="角度"
- ></n-input-number>
- </setting-item>
- <setting-item name="Y轴 - 旋转">
- <!-- 透明度 -->
- <n-input-number
- v-model:value="chartStyles.rotateY"
- :min="0"
- :max="360"
- size="small"
- placeholder="角度"
- ></n-input-number>
- </setting-item>
- </setting-item-box>
- <!-- 倾斜 -->
- <setting-item-box v-if="!isCanvas" name="倾斜°">
- <setting-item name="X轴 - 倾斜">
- <n-input-number
- v-model:value="chartStyles.skewX"
- :min="0"
- :max="360"
- size="small"
- placeholder="角度"
- ></n-input-number>
- </setting-item>
- <setting-item name="Y轴 - 倾斜">
- <n-input-number
- v-model:value="chartStyles.skewY"
- :min="0"
- :max="360"
- size="small"
- placeholder="角度"
- ></n-input-number>
- </setting-item>
- </setting-item-box>
- <!-- 提示 -->
- <n-tag type="warning"> 若预览时大屏模糊,可以尝试关闭滤镜进行修复 </n-tag>
- </collapse-item>
- </template>
- <script setup lang="ts">
- import { ref, PropType } from 'vue'
- import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
- import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
- import { icon } from '@/plugins'
- import logoImg from '@/assets/logo.png'
- import { useDesignStore } from '@/store/modules/designStore/designStore'
- const props = defineProps({
- isGroup: {
- type: Boolean,
- required: false
- },
- isCanvas: {
- type: Boolean,
- default: false
- },
- chartStyles: {
- type: Object,
- required: true
- }
- })
- const { HelpOutlineIcon } = icon.ionicons5
- // 百分比格式化 person
- const sliderFormatTooltip = (v: string) => {
- return `${(parseFloat(v) * 100).toFixed(0)}%`
- }
- // 角度格式化
- const degFormatTooltip = (v: string) => {
- return `${v}deg`
- }
- // 预设滤镜
- interface presetImageData {
- index: number
- src: string
- hueRotate: number
- }
- const presetImageList = ref([] as presetImageData[])
- for (let i = 1; i <= 12; i++) {
- presetImageList.value.push({
- index: i,
- src: logoImg,
- hueRotate: i * 30
- })
- }
- </script>
- <style lang="scss" scoped>
- // 预设滤镜
- .preset-filter {
- margin: 20px 0 10px 0;
- display: flex;
- flex-wrap: wrap;
- justify-content: space-between;
- .preset-img {
- margin-bottom: 10px;
- padding: 2px;
- border-radius: 6px;
- transition: 0.2s all;
- cursor: pointer;
- &:hover {
- box-shadow: 0 0 0 2px #66a9c9;
- }
- }
- .active-preset {
- box-shadow: 0 0 0 2px #66a9c9;
- }
- }
- </style>
|