StylesSetting.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <div v-show="isGroup">
  3. <n-divider n-divider style="margin: 10px 0"></n-divider>
  4. <n-tag type="warning"> 解散分组「 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 」也将消失!</n-tag>
  5. </div>
  6. <collapse-item :name="isCanvas ? '滤镜' : '滤镜 / 变换'">
  7. <template #header>
  8. <n-switch v-model:value="chartStyles.filterShow" size="small"></n-switch>
  9. </template>
  10. <setting-item-box name="色相" :alone="true">
  11. <setting-item :name="`值:${chartStyles.hueRotate}deg`">
  12. <!-- 透明度 -->
  13. <n-slider
  14. v-model:value="chartStyles.hueRotate"
  15. :step="3"
  16. :min="0"
  17. :max="360"
  18. :format-tooltip="degFormatTooltip"
  19. ></n-slider>
  20. </setting-item>
  21. </setting-item-box>
  22. <setting-item-box name="饱和度" :alone="true">
  23. <setting-item :name="`值:${(parseFloat(String(chartStyles.saturate)) * 100).toFixed(0)}%`">
  24. <!-- 透明度 -->
  25. <n-slider
  26. v-model:value="chartStyles.saturate"
  27. :step="0.1"
  28. :min="0"
  29. :max="2"
  30. :format-tooltip="sliderFormatTooltip"
  31. ></n-slider>
  32. </setting-item>
  33. </setting-item-box>
  34. <setting-item-box name="对比度" :alone="true">
  35. <setting-item :name="`值:${(parseFloat(String(chartStyles.contrast)) * 100).toFixed(0)}%`">
  36. <!-- 透明度 -->
  37. <n-slider
  38. v-model:value="chartStyles.contrast"
  39. :step="0.1"
  40. :min="0"
  41. :max="2"
  42. :format-tooltip="sliderFormatTooltip"
  43. ></n-slider>
  44. </setting-item>
  45. </setting-item-box>
  46. <setting-item-box name="亮度" :alone="true">
  47. <setting-item :name="`值:${(parseFloat(String(chartStyles.brightness)) * 100).toFixed(0)}%`">
  48. <!-- 透明度 -->
  49. <n-slider
  50. v-model:value="chartStyles.brightness"
  51. :step="0.1"
  52. :min="0"
  53. :max="2"
  54. :format-tooltip="sliderFormatTooltip"
  55. ></n-slider>
  56. </setting-item>
  57. </setting-item-box>
  58. <setting-item-box name="透明度" :alone="true">
  59. <setting-item :name="`值:${(parseFloat(String(chartStyles.opacity)) * 100).toFixed(0)}%`">
  60. <!-- 透明度 -->
  61. <n-slider
  62. v-model:value="chartStyles.opacity"
  63. :step="0.1"
  64. :min="0"
  65. :max="1"
  66. :format-tooltip="sliderFormatTooltip"
  67. ></n-slider>
  68. </setting-item>
  69. </setting-item-box>
  70. <!-- 预设滤镜 -->
  71. <div v-if="presetImageList.length" class="preset-filter">
  72. <n-image
  73. class="preset-img"
  74. width="46"
  75. preview-disabled
  76. object-fit="scale-down"
  77. v-for="(item, index) in presetImageList"
  78. :key="index"
  79. :class="{ 'active-preset': item.hueRotate === chartStyles.hueRotate }"
  80. :style="{ filter: `hue-rotate(${item.hueRotate}deg)` }"
  81. :src="item.src"
  82. @click="() => (chartStyles.hueRotate = item.hueRotate)"
  83. ></n-image>
  84. </div>
  85. <!-- 混合模式 -->
  86. <setting-item-box v-if="!isCanvas" :alone="true">
  87. <template #name>
  88. <n-text>混合</n-text>
  89. <n-tooltip trigger="hover">
  90. <template #trigger>
  91. <n-icon size="21" :depth="3">
  92. <help-outline-icon></help-outline-icon>
  93. </n-icon>
  94. </template>
  95. <n-text>视频组件需要底色透明一般选中滤色</n-text>
  96. </n-tooltip>
  97. </template>
  98. <setting-item>
  99. <n-select v-model:value="chartStyles.blendMode" size="small" filterable :options="BlendModeEnumList"></n-select>
  100. </setting-item>
  101. </setting-item-box>
  102. <!-- 变换 -->
  103. <setting-item-box v-if="!isCanvas" name="旋转°">
  104. <setting-item name="Z轴(平面) - 旋转">
  105. <!-- 透明度 -->
  106. <n-input-number
  107. v-model:value="chartStyles.rotateZ"
  108. :min="0"
  109. :max="360"
  110. size="small"
  111. placeholder="角度"
  112. ></n-input-number>
  113. </setting-item>
  114. <setting-item name="X轴 - 旋转">
  115. <!-- 透明度 -->
  116. <n-input-number
  117. v-model:value="chartStyles.rotateX"
  118. :min="0"
  119. :max="360"
  120. size="small"
  121. placeholder="角度"
  122. ></n-input-number>
  123. </setting-item>
  124. <setting-item name="Y轴 - 旋转">
  125. <!-- 透明度 -->
  126. <n-input-number
  127. v-model:value="chartStyles.rotateY"
  128. :min="0"
  129. :max="360"
  130. size="small"
  131. placeholder="角度"
  132. ></n-input-number>
  133. </setting-item>
  134. </setting-item-box>
  135. <!-- 倾斜 -->
  136. <setting-item-box v-if="!isCanvas" name="倾斜°">
  137. <setting-item name="X轴 - 倾斜">
  138. <n-input-number
  139. v-model:value="chartStyles.skewX"
  140. :min="0"
  141. :max="360"
  142. size="small"
  143. placeholder="角度"
  144. ></n-input-number>
  145. </setting-item>
  146. <setting-item name="Y轴 - 倾斜">
  147. <n-input-number
  148. v-model:value="chartStyles.skewY"
  149. :min="0"
  150. :max="360"
  151. size="small"
  152. placeholder="角度"
  153. ></n-input-number>
  154. </setting-item>
  155. </setting-item-box>
  156. <!-- 提示 -->
  157. <n-tag type="warning"> 若预览时大屏模糊,可以尝试关闭滤镜进行修复 </n-tag>
  158. </collapse-item>
  159. </template>
  160. <script setup lang="ts">
  161. import { ref, PropType } from 'vue'
  162. import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
  163. import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
  164. import { icon } from '@/plugins'
  165. import logoImg from '@/assets/logo.png'
  166. import { useDesignStore } from '@/store/modules/designStore/designStore'
  167. const props = defineProps({
  168. isGroup: {
  169. type: Boolean,
  170. required: false
  171. },
  172. isCanvas: {
  173. type: Boolean,
  174. default: false
  175. },
  176. chartStyles: {
  177. type: Object,
  178. required: true
  179. }
  180. })
  181. const { HelpOutlineIcon } = icon.ionicons5
  182. // 百分比格式化 person
  183. const sliderFormatTooltip = (v: string) => {
  184. return `${(parseFloat(v) * 100).toFixed(0)}%`
  185. }
  186. // 角度格式化
  187. const degFormatTooltip = (v: string) => {
  188. return `${v}deg`
  189. }
  190. // 预设滤镜
  191. interface presetImageData {
  192. index: number
  193. src: string
  194. hueRotate: number
  195. }
  196. const presetImageList = ref([] as presetImageData[])
  197. for (let i = 1; i <= 12; i++) {
  198. presetImageList.value.push({
  199. index: i,
  200. src: logoImg,
  201. hueRotate: i * 30
  202. })
  203. }
  204. </script>
  205. <style lang="scss" scoped>
  206. // 预设滤镜
  207. .preset-filter {
  208. margin: 20px 0 10px 0;
  209. display: flex;
  210. flex-wrap: wrap;
  211. justify-content: space-between;
  212. .preset-img {
  213. margin-bottom: 10px;
  214. padding: 2px;
  215. border-radius: 6px;
  216. transition: 0.2s all;
  217. cursor: pointer;
  218. &:hover {
  219. box-shadow: 0 0 0 2px #66a9c9;
  220. }
  221. }
  222. .active-preset {
  223. box-shadow: 0 0 0 2px #66a9c9;
  224. }
  225. }
  226. </style>