temp-serial.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <v-group ref="shape" :id="data.id">
  3. <v-ellipse
  4. name="repShape"
  5. :config="{
  6. ...data,
  7. ...matConfig,
  8. zIndex: undefined,
  9. opacity: addMode ? 0.3 : data.opacity,
  10. }"
  11. />
  12. <ShareText
  13. :config="{ ...textConfig, ...textBound }"
  14. :parent-id="data.id"
  15. :editer="editer && !data.disableEditText"
  16. @update-text="(val) => emit('updateContent', val)"
  17. @update:is-edit="(val) => emit('update:isEdit', val)"
  18. />
  19. </v-group>
  20. </template>
  21. <script lang="ts" setup>
  22. import ShareText from "../share/text.vue";
  23. import { SerialData, defaultStyle } from "./index.ts";
  24. import { computed, ref } from "vue";
  25. import { DC } from "@/deconstruction.js";
  26. import { Circle } from "konva/lib/shapes/Circle";
  27. import { Transform } from "konva/lib/Util";
  28. const props = defineProps<{ data: SerialData; addMode?: boolean; editer?: boolean }>();
  29. const emit = defineEmits<{
  30. (e: "updateContent", data: string): void;
  31. (e: "update:isEdit", data: boolean): void;
  32. }>();
  33. const data = computed(() => ({ ...defaultStyle, ...props.data }));
  34. const matConfig = computed(() => {
  35. const mat = new Transform(data.value.mat);
  36. return mat.decompose();
  37. });
  38. const textBound = computed(() => {
  39. const r1 = props.data.radiusX;
  40. const width = (2 * r1) / Math.sqrt(2); // 宽度
  41. const pad = data.value.padding || 0;
  42. const height = Math.min(data.value.fontSize + pad * 2);
  43. const matConfig = new Transform(data.value.mat)
  44. .translate(-width / 2, -height / 2 + data.value.fontSize * 0.1)
  45. .decompose();
  46. return {
  47. padding: pad,
  48. ...matConfig,
  49. width,
  50. height,
  51. };
  52. });
  53. const textConfig = computed(() => ({
  54. fontSize: data.value.fontSize,
  55. align: data.value.align,
  56. fontStyle: data.value.fontStyle,
  57. fill: data.value.fontColor,
  58. text: data.value.content,
  59. }));
  60. const shape = ref<DC<Circle>>();
  61. defineExpose({
  62. get shape() {
  63. return shape.value;
  64. },
  65. });
  66. </script>