import { useState } from "react"; import { InputNumber } from "antd"; import { AppModal } from "@/components/ui/product/app-modal"; import { MAX_IMAGE_GRID, planImageTiles, type ImageSplitParams } from "@/lib/canvas/image-operation-plan"; import { useImageToolSource } from "./use-image-tool-source"; export type CanvasImageSplitParams = ImageSplitParams; type SplitDialogProps = { dataUrl: string; open: boolean; onClose: () => void; onConfirm: (params: CanvasImageSplitParams) => void }; export function CanvasNodeSplitDialog(props: SplitDialogProps) { return props.open && props.dataUrl ? : null; } function SplitEditor({ dataUrl, onClose, onConfirm }: SplitDialogProps) { const [grid, setGrid] = useState({ rows: 2, columns: 2 }); const { size, error } = useImageToolSource(dataUrl); const valid = size !== null && size.width >= grid.columns && size.height >= grid.rows; const tiles = valid ? planImageTiles(size, grid) : []; const previewSize = tiles[0]; const updateCount = (axis: keyof ImageSplitParams, value: number | null) => { if (value === null || !Number.isFinite(value)) return; setGrid((previous) => ({ ...previous, [axis]: Math.min(MAX_IMAGE_GRID, Math.max(1, Math.round(value))) })); }; return ( valid && onConfirm(grid)} okButtonProps={{ disabled: !valid }}> 按行、列拆分原图,子节点保持网格顺序。 {Array.from({ length: grid.columns - 1 }, (_, i) => )} {Array.from({ length: grid.rows - 1 }, (_, i) => )} {size ? `${size.width} × ${size.height} px` : error || "正在读取图片…"} {(["rows", "columns"] as const).map((axis) => ( {axis === "rows" ? "行数" : "列数"} updateCount(axis, value)} /> ))} {previewSize ? `每块约 ${previewSize.width} × ${previewSize.height} px;边缘像素会完整保留。` : "等待有效图片尺寸"} {error || (size && !valid) ? {error || "行列数超过图片像素尺寸,请减少切分数量"} : null} ); }
按行、列拆分原图,子节点保持网格顺序。
{error || "行列数超过图片像素尺寸,请减少切分数量"}