temp-line.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <v-group :id="data.id" ref="shape">
  3. <v-group>
  4. <singleLine
  5. v-for="item in data.lines"
  6. :key="item.id"
  7. :line="item"
  8. :data="data"
  9. :add-mode="addMode"
  10. :can-edit="!initData && !operMode.mulSelection"
  11. :dragPointIds="dragPointIds"
  12. @add-point="(p) => addPointHandler(p, item)"
  13. @del-point="delPointHandler"
  14. @update-point="updatePointHandler"
  15. @update-before="updateBeforeHandler"
  16. @update="updateHandler"
  17. @del-line="delLineHandler(item)"
  18. @dragLineStart="dragstartLineHandler"
  19. @dragLine="dragLineHandler"
  20. @dragLineEnd="dragendLineHandler"
  21. />
  22. </v-group>
  23. </v-group>
  24. </template>
  25. <script lang="ts" setup>
  26. import { onlyId } from "@/utils/shared.ts";
  27. import { delPoint, LineData } from "./index.ts";
  28. import singleLine from "./single-line.vue";
  29. import { useInitData } from "./use-draw.ts";
  30. import {
  31. genMoveLineHandler,
  32. getInitCtx,
  33. NLineDataCtx,
  34. normalLineData,
  35. } from "./attach-server.ts";
  36. import { computed, ref, watch } from "vue";
  37. import { useZIndex } from "@/core/hook/use-layer.ts";
  38. import { DC } from "@/deconstruction.js";
  39. import { Group } from "konva/lib/Group";
  40. import { useOperMode } from "@/core/hook/use-status.ts";
  41. import { useMouseShapeStatus } from "@/core/hook/use-mouse-status.ts";
  42. import { Pos } from "@/utils/math.ts";
  43. import { useSnapConfig, useSnapResultInfo } from "@/core/hook/use-snap.ts";
  44. const props = defineProps<{
  45. data: LineData;
  46. addMode?: boolean;
  47. canEdit?: boolean;
  48. }>();
  49. watch(
  50. () => props.data,
  51. (ndata, odata) => {
  52. console.log("data change", ndata, odata, ndata === odata);
  53. }
  54. );
  55. const operMode = useOperMode();
  56. const initData = useInitData();
  57. const emit = defineEmits<{
  58. (e: "updateShape"): void;
  59. }>();
  60. const data = computed(() => {
  61. if (!initData.value || props.addMode) return props.data;
  62. return initData.value;
  63. });
  64. const dragPointIds = ref<string[]>();
  65. let track = false;
  66. let ctx: NLineDataCtx;
  67. const updateBeforeHandler = (ids: string[]) => {
  68. dragPointIds.value = ids;
  69. track = true;
  70. ctx = getInitCtx();
  71. };
  72. const delPointHandler = (p: LineData["points"][0]) => {
  73. delPoint(props.data, p.id, ctx);
  74. };
  75. const addPointHandler = (p: LineData["points"][0], l: LineData["lines"][0]) => {
  76. props.data.points.push(p);
  77. ctx.add.points[p.id] = p;
  78. delLineHandler(l);
  79. addLineHandler({ ...l, a: p.id, id: onlyId() });
  80. addLineHandler({ ...l, b: p.id, id: onlyId() });
  81. };
  82. const updatePointHandler = (p: LineData["points"][0]) => {
  83. const ndx = props.data.points.findIndex((pn) => pn.id === p.id);
  84. // props.data.points[ndx] = p;
  85. props.data.points[ndx].x = p.x;
  86. props.data.points[ndx].y = p.y;
  87. ctx.update.points[p.id] = props.data.points[ndx];
  88. };
  89. const delLineHandler = (l: LineData["lines"][0]) => {
  90. ctx.del.lines[l.id] = l;
  91. const ndx = props.data.lines.findIndex((ln) => ln.id === l.id);
  92. ~ndx && props.data.lines.splice(ndx, 1);
  93. };
  94. const addLineHandler = (l: LineData["lines"][0]) => {
  95. ctx.add.lines[l.id] = l;
  96. props.data.lines.push(l);
  97. };
  98. const updateHandler = () => {
  99. normalLineData(props.data, ctx);
  100. emit("updateShape");
  101. track = false;
  102. dragPointIds.value = undefined;
  103. };
  104. const resultInfo = useSnapResultInfo();
  105. const snapConfig = useSnapConfig();
  106. let handler: ReturnType<typeof genMoveLineHandler>;
  107. const dragstartLineHandler = (line: LineData["lines"][0]) => {
  108. updateBeforeHandler([line.a, line.b]);
  109. handler = genMoveLineHandler(props.data, line.id, snapConfig, resultInfo, ctx);
  110. };
  111. const dragLineHandler = (_: any, ps: Pos[]) => {
  112. handler.move(ps);
  113. };
  114. const dragendLineHandler = () => {
  115. handler.end();
  116. updateHandler();
  117. };
  118. const shape = ref<DC<Group>>();
  119. useZIndex(shape, data);
  120. useMouseShapeStatus(shape);
  121. </script>