maskedbox.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <!-- 样式编辑控件 -->
  2. <template>
  3. <layout v-if="config.config.fixedWidth && config.config.fixedHeight" v-model:configData="config.config"
  4. v-model:cssData="config.css"></layout>
  5. <div class="box_padding" v-if="config.css">
  6. <div class="same_row_in">
  7. <span class="default_size title_5">基础设置</span>
  8. <el-icon style="cursor: pointer;" :class="basicFlag ? '' : 'putAway'" @click="getbasicSetting('basic')">
  9. <ArrowDown />
  10. </el-icon>
  11. </div>
  12. <div v-if="basicFlag" class="card_second_level">
  13. <digitalSlider v-if="config.config.size" v-model:num="config.config.size" title="层级"></digitalSlider>
  14. <patternMode v-if="config.config.pictureMode" v-model:mode="config.config.pictureMode"></patternMode>
  15. <literalName v-if="'name' in config.config" v-model:name="config.config.name"></literalName>
  16. <boxSize v-if="config.css.width && config.css.height != 'auto' && config.css.height && config.config.resizable"
  17. v-model:width="config.css.width" v-model:height="config.css.height"></boxSize>
  18. <colorSelection v-if="config.css.color" v-model:iconColor="config.css.color" title="颜色"></colorSelection>
  19. <colorSelection v-if="config.css.colorOpen" v-model:iconColor="config.css.colorOpen" title="颜色(开)">
  20. </colorSelection>
  21. <colorSelection v-if="config.css.colorClose" v-model:iconColor="config.css.colorClose" title="颜色(关)">
  22. </colorSelection>
  23. <colorSelection v-if="config.css.backgroundColor" v-model:iconColor="config.css.backgroundColor" title="颜色">
  24. </colorSelection>
  25. <digitalSlider v-if="'borderRadius' in config.css" v-model:num="config.css.borderRadius" title="圆角">
  26. </digitalSlider>
  27. <fontSize v-if="config.css.fontSize && config.css.fontWeight" v-model:fontSize="config.css.fontSize"
  28. v-model:fontWeight="config.css.fontWeight"></fontSize>
  29. <textAlignment v-if="config.css.textAlign" v-model:align="config.css.textAlign"></textAlignment>
  30. <lineNumber v-if="'lineNum' in config.config" v-model:num="config.config.lineNum"></lineNumber>
  31. <digitalSlider v-if="'opacity' in config.css" v-model:num="config.css.opacity" :min="0" :max="1" :step="0.1"
  32. title="透明度">
  33. </digitalSlider>
  34. <digitalSlider v-if="'textWidth' in config.css" v-model:num="config.css.textWidth" title="宽度"></digitalSlider>
  35. </div>
  36. </div>
  37. <div class="box_padding" v-if="config.config.img">
  38. <div class="same_row_in">
  39. <span class="default_size title_5">图标</span>
  40. <el-icon style="cursor: pointer;" :class="imgFlag ? '' : 'putAway'" @click="getbasicSetting('img')">
  41. <ArrowDown />
  42. </el-icon>
  43. </div>
  44. <div v-if="imgFlag" class="card_second_level">
  45. <fontSize v-if="'fontSize' in config.css && 'fontWeight' in config.css" v-model:fontSize="config.css.fontSize"
  46. v-model:fontWeight="config.css.fontWeight"></fontSize>
  47. <iconSize v-if="'iconSize' in config.css && 'img' in config.config" v-model:num="config.css.iconSize"
  48. v-model:iconName="config.config.img" @mousedown.stop @childEvent="childEvent"></iconSize>
  49. <colorSelection v-if="'iconColor' in config.css" v-model:iconColor="config.css.iconColor" title="选择颜色">
  50. </colorSelection>
  51. </div>
  52. </div>
  53. <div class="box_padding" v-if="'picture' in config.config">
  54. <div class="same_row_in">
  55. <span class="default_size title_5">图库</span>
  56. </div>
  57. <div style="padding: 18px 0px 13px;">
  58. <photoGallery></photoGallery>
  59. </div>
  60. </div>
  61. </template>
  62. <script setup lang="ts">
  63. import { ref, watch } from "vue";
  64. import color from 'color';
  65. import layout from '../components/maskedbox/layout.vue';
  66. import patternMode from '../components/maskedbox/pattern.vue';
  67. import literalName from '../components/maskedbox/literalName.vue';
  68. import boxSize from '../components/maskedbox/boxSize.vue';
  69. import fontSize from '../components/maskedbox/fontSize.vue';
  70. import iconSize from '../components/maskedbox/iconSize.vue';
  71. import colorSelection from '../components/maskedbox/colorSelection.vue';
  72. import textAlignment from '../components/maskedbox/textAlignment.vue';
  73. import lineNumber from '../components/maskedbox/lineNumber.vue';
  74. import digitalSlider from '../components/maskedbox/digitalSlider.vue';
  75. import photoGallery from '../components/maskedbox/photoGallery.vue';
  76. const props = defineProps({
  77. config: {
  78. type: Object,
  79. required: true
  80. },
  81. })
  82. const basicFlag = ref(true)
  83. const imgFlag = ref(true)
  84. const backgroundFlag = ref(true)
  85. function getbasicSetting(params: any) {
  86. if (params == 'basic') {
  87. if (basicFlag.value) {
  88. basicFlag.value = false
  89. } else {
  90. basicFlag.value = true
  91. }
  92. } else if (params == 'img') {
  93. if (imgFlag.value) {
  94. imgFlag.value = false
  95. } else {
  96. imgFlag.value = true
  97. }
  98. } else if (params == 'background') {
  99. if (backgroundFlag.value) {
  100. backgroundFlag.value = false
  101. } else {
  102. backgroundFlag.value = true
  103. }
  104. }
  105. }
  106. const alpha = ref(1);
  107. const hexColor = ref('');
  108. // rgba hex颜色格式化
  109. const handleColorChange = (rgbaStr) => {
  110. const hex = color(rgbaStr).hex();
  111. const alpha1 = color(rgbaStr).alpha();
  112. const arrColor = removeChar(hex, "#");
  113. return arrColor
  114. alpha.value = alpha1
  115. function removeChar(str: string, charToRemove: string): string {
  116. return str.replace(new RegExp(charToRemove, 'g'), '');
  117. }
  118. };
  119. const emit = defineEmits(['childEvent', 'updateValue'])
  120. // 选择图标抽屉
  121. function childEvent() {
  122. emit('childEvent');
  123. }
  124. watch(() => props.config, (newValue) => {
  125. if (newValue.css) {
  126. // 初始化hex颜色
  127. hexColor.value = handleColorChange(newValue.css.iconColor)
  128. emit('updateValue', newValue);
  129. }
  130. }, { immediate: true, deep: true })
  131. </script>
  132. <style lang="scss" scoped>
  133. .box_padding {
  134. padding: 7px 0px 4px;
  135. }
  136. .card_second_level {
  137. padding: 9px 0px 4px 18px;
  138. }
  139. .putAway {
  140. transform: rotate(180deg);
  141. }
  142. :deep(.el-input-number.is-controls-right .el-input__wrapper) {
  143. padding-left: 5px;
  144. padding-right: 30px;
  145. }
  146. .card_select_bg {
  147. background-color: #f1f1f7;
  148. padding: 2px;
  149. border-radius: 4px;
  150. }
  151. </style>