From d7eee0d2eafdce04729f837ca3c4073aa8341215 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Fri, 13 Dec 2024 22:45:01 +0000 Subject: [PATCH] feat: add canvas border setting --- src/components/Canvas.tsx | 25 ++++++++++++++++++++++- src/components/CanvasBorder.tsx | 19 ++++++++++++++++++ src/components/information/Canvas.tsx | 29 +++++---------------------- src/components/menubar/ViewMenu.tsx | 3 +++ src/types.d.ts | 8 ++++++++ 5 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 src/components/CanvasBorder.tsx diff --git a/src/components/Canvas.tsx b/src/components/Canvas.tsx index c3ad2c2..14a39c0 100644 --- a/src/components/Canvas.tsx +++ b/src/components/Canvas.tsx @@ -11,6 +11,7 @@ import Grid from "./Grid"; import Cursor from "./Cursor"; import CursorInformation from "./information/Cursor"; import CanvasInformation from "./information/Canvas"; +import CanvasBorder from "./CanvasBorder"; // Set scale mode to NEAREST PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; @@ -36,6 +37,27 @@ function Canvas() { return blocks.filter((b) => !(b.x === mouseCoords.x && b.y === mouseCoords.y)); }, [blocks, mouseCoords]); + const canvasSize = useMemo(() => { + let minX = Infinity, + maxX = -Infinity; + let minY = Infinity, + maxY = -Infinity; + + blocks.forEach((coord) => { + if (coord.x < minX) minX = coord.x; + if (coord.x > maxX) maxX = coord.x; + if (coord.y < minY) minY = coord.y; + if (coord.y > maxY) maxY = coord.y; + }); + + return { + minX, + minY, + maxX: maxX + 1, + maxY: maxY + 1, + }; + }, [blocks]); + const onToolUse = useCallback(() => { switch (tool) { case "pencil": { @@ -137,6 +159,7 @@ function Canvas() { > + {settings.canvasBorder && } @@ -148,7 +171,7 @@ function Canvas() { - + ); } diff --git a/src/components/CanvasBorder.tsx b/src/components/CanvasBorder.tsx new file mode 100644 index 0000000..d9f619b --- /dev/null +++ b/src/components/CanvasBorder.tsx @@ -0,0 +1,19 @@ +import { Graphics } from "@pixi/react"; + +interface Props { + canvasSize: CanvasSize; +} + +function CanvasBorder({ canvasSize }: Props) { + return ( + { + g.clear(); + g.lineStyle(2, 0xffffff, 0.25, 1); + g.drawRect(canvasSize.minX * 16, canvasSize.minY * 16, (canvasSize.maxX - canvasSize.minX) * 16, (canvasSize.maxY - canvasSize.minY) * 16); + }} + /> + ); +} + +export default CanvasBorder; diff --git a/src/components/information/Canvas.tsx b/src/components/information/Canvas.tsx index ae7d8d0..6aac299 100644 --- a/src/components/information/Canvas.tsx +++ b/src/components/information/Canvas.tsx @@ -1,32 +1,13 @@ -import React, { useMemo } from "react"; +import React from "react"; import { Slider } from "@/components/ui/slider"; interface Props { scale: number; setScale: React.Dispatch>; - blocks: Block[]; + canvasSize: CanvasSize; } -function CanvasInformation({ scale, setScale, blocks }: Props) { - const canvasSize = useMemo(() => { - let minX = Infinity, - maxX = -Infinity; - let minY = Infinity, - maxY = -Infinity; - - blocks.forEach((coord) => { - if (coord.x < minX) minX = coord.x; - if (coord.x > maxX) maxX = coord.x; - if (coord.y < minY) minY = coord.y; - if (coord.y > maxY) maxY = coord.y; - }); - - return { - width: maxX - minX, - height: maxY - minY, - }; - }, [blocks]); - +function CanvasInformation({ scale, setScale, canvasSize }: Props) { const onValueChange = (value: number[]) => { setScale(value[0]); }; @@ -36,8 +17,8 @@ function CanvasInformation({ scale, setScale, blocks }: Props) {
{Math.floor(scale * 100)}%
- W: {canvasSize.width} - H: {canvasSize.height} + W: {canvasSize.maxX - canvasSize.minX} + H: {canvasSize.maxY - canvasSize.minY}
diff --git a/src/components/menubar/ViewMenu.tsx b/src/components/menubar/ViewMenu.tsx index 9ad90e5..3e686f0 100644 --- a/src/components/menubar/ViewMenu.tsx +++ b/src/components/menubar/ViewMenu.tsx @@ -16,6 +16,9 @@ function ViewMenu() { Grid + + Canvas Border + ); diff --git a/src/types.d.ts b/src/types.d.ts index d9d5b8e..1af5325 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -10,6 +10,13 @@ interface Dimension { height: number; } +interface CanvasSize { + minX: number; + minY: number; + maxX: number; + maxY: number; +} + interface Block extends Position { name: string; } @@ -18,4 +25,5 @@ type Tool = "hand" | "pencil" | "eraser"; interface Settings { grid: boolean; + canvasBorder: boolean; }