import { InteractiveMessage } from "../../hook/use-interactive.ts"; import { CircleConfig } from "konva/lib/shapes/Circle"; import { themeMouseColors } from "@/constant/help-style.ts"; import { BaseItem, generateSnapInfos, getBaseItem, getRectSnapPoints, } from "../util.ts"; import { getMouseColors } from "@/utils/colors.ts"; export { default as Component } from "./circle.vue"; export { default as TempComponent } from "./temp-circle.vue"; export const shapeName = "圆形"; export const defaultStyle = { dash: [1, 0], stroke: themeMouseColors.theme, strokeWidth: 1, }; export const addMode = "area"; export const getMouseStyle = (data: CircleData) => { const fillStatus = data.fill && getMouseColors(data.fill); const strokeStatus = getMouseColors(data.stroke || defaultStyle.stroke); const strokeWidth = data.strokeWidth || defaultStyle.strokeWidth; return { default: { fill: fillStatus && fillStatus.pub, stroke: strokeStatus.pub, strokeWidth }, hover: { fill: fillStatus && fillStatus.hover, stroke: strokeStatus.hover }, press: { fill: fillStatus && fillStatus.press, stroke: strokeStatus.press }, }; }; export const getSnapInfos = (data: CircleData) => { const size = data.radius * 2; const points = getRectSnapPoints(size, size).map((v) => ({ x: v.x + data.x, y: v.y + data.y, })); return generateSnapInfos(points, true, false); }; export type CircleData = Partial & BaseItem & { opacity?: number, fill?: string x: number; y: number; radius: number; }; export const dataToConfig = (data: CircleData): CircleConfig => ({ ...defaultStyle, ...data, }); export const interactiveToData = ( info: InteractiveMessage, preset: Partial = {} ): CircleData | undefined => { if (info.area) { const item = { ...getBaseItem(), ...preset, ...info.area[0], } as unknown as CircleData; return interactiveFixData(item, info); } }; export const interactiveFixData = ( data: CircleData, info: InteractiveMessage ) => { const area = info.area!; const xr = Math.abs(area[1].x - area[0].x); const yr = Math.abs(area[1].y - area[0].y); data.radius = Math.max(xr, yr, 0.01); return data; };