index.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { Transform } from "konva/lib/Util";
  2. import {
  3. BaseItem,
  4. generateSnapInfos,
  5. getBaseItem,
  6. getRectSnapPoints,
  7. } from "../util.ts";
  8. import { getMouseColors } from "@/utils/colors.ts";
  9. import { imageInfo } from "@/utils/resource.ts";
  10. import { InteractiveFix, InteractiveTo, MatResponseProps } from "../index.ts";
  11. import { Size } from "@/utils/math.ts";
  12. import { themeColor } from "@/constant/help-style.ts";
  13. export { default as Component } from "./image.vue";
  14. export { default as TempComponent } from "./temp-image.vue";
  15. export const shapeName = "图片";
  16. export const defaultStyle = {
  17. strokeWidth: 0,
  18. stroke: "#000000",
  19. };
  20. export const addMode = "dot";
  21. export const getMouseStyle = (data: ImageData) => {
  22. const strokeStatus = getMouseColors(data.stroke || themeColor);
  23. return {
  24. default: { stroke: data.stroke || defaultStyle.stroke },
  25. hover: { stroke: strokeStatus.hover },
  26. focus: { stroke: strokeStatus.hover },
  27. select: { stroke: strokeStatus.select },
  28. press: { stroke: strokeStatus.press },
  29. };
  30. };
  31. export const getSnapInfos = (data: ImageData) => {
  32. return generateSnapInfos(getSnapPoints(data), true, false);
  33. };
  34. export const getSnapPoints = (data: ImageData) => {
  35. const tf = new Transform(data.mat);
  36. const useData = data.width && data.height;
  37. if (!useData && !(data.url in imageInfo)) {
  38. return [];
  39. }
  40. const w = useData ? data.width : imageInfo[data.url].width;
  41. const h = useData ? data.height : imageInfo[data.url].height;
  42. const points = getRectSnapPoints(w, h);
  43. return points.map((v) => tf.point(v));
  44. };
  45. export type ImageData = Partial<typeof defaultStyle> &
  46. BaseItem & Size & {
  47. fill?: string;
  48. stroke?: string;
  49. strokeWidth?: number;
  50. cornerRadius: number;
  51. url: string;
  52. mat: number[];
  53. };
  54. export const interactiveToData: InteractiveTo<"image"> = ({
  55. info,
  56. preset = {},
  57. ...args
  58. }) => {
  59. if (info.cur) {
  60. return interactiveFixData({
  61. ...args,
  62. info,
  63. data: { ...getBaseItem(), ...preset } as unknown as ImageData,
  64. });
  65. }
  66. };
  67. export const interactiveFixData: InteractiveFix<"image"> = ({ data, info }) => {
  68. const mat = new Transform().translate(info.cur!.x, info.cur!.y);
  69. data.mat = mat.m;
  70. return data;
  71. };
  72. export const matResponse = ({data, mat, increment}: MatResponseProps<'image'>) => {
  73. data.mat = increment ? mat.copy().multiply(new Transform(data.mat)).m : mat.m;
  74. return data;
  75. }