diff --git a/commands/document.test.ts b/commands/document.test.ts index 2da946d..b41c6e7 100644 --- a/commands/document.test.ts +++ b/commands/document.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; import { createInitialAppState } from "@editor/initial-state"; -import { documentAddArtboardCommand } from "./document"; +import { documentAddArtboardCommand, documentSetArtboardBoundsCommand } from "./document"; describe("document commands", () => { test("adds transparent artboard", () => { @@ -19,4 +19,15 @@ describe("document commands", () => { }, ]); }); + + test("sets artboard bounds", () => { + const state = documentAddArtboardCommand.execute( + { state: createInitialAppState("Test") }, + { id: "a1", name: "Artboard 1", bounds: { x: 0, y: 0, w: 320, h: 240 } }, + ); + + const next = documentSetArtboardBoundsCommand.execute({ state }, { id: "a1", bounds: { x: 10, y: 20, w: 640, h: 480 } }); + + expect(next.document.artboards[0]?.bounds).toEqual({ x: 10, y: 20, w: 640, h: 480 }); + }); }); diff --git a/commands/document.ts b/commands/document.ts index 488665d..5fcee16 100644 --- a/commands/document.ts +++ b/commands/document.ts @@ -9,6 +9,11 @@ export type DocumentAddArtboardPayload = { bounds: Rect; }; +export type DocumentSetArtboardBoundsPayload = { + id: ArtboardId; + bounds: Rect; +}; + export const documentAddArtboardCommand: Command = { id: commandIds.documentAddArtboard, name: "Add artboard", @@ -32,4 +37,20 @@ export const documentAddArtboardCommand: Command = { }, }; -export const documentCommands = [documentAddArtboardCommand] satisfies Command[]; +export const documentSetArtboardBoundsCommand: Command = { + id: commandIds.documentSetArtboardBounds, + name: "Set artboard bounds", + execute({ state }, payload) { + return { + ...state, + document: { + ...state.document, + artboards: state.document.artboards.map((artboard) => + artboard.id === payload.id ? { ...artboard, bounds: { ...payload.bounds } } : artboard, + ), + }, + }; + }, +}; + +export const documentCommands = [documentAddArtboardCommand, documentSetArtboardBoundsCommand] satisfies Command[]; diff --git a/commands/ids.ts b/commands/ids.ts index de09d74..3c84355 100644 --- a/commands/ids.ts +++ b/commands/ids.ts @@ -1,5 +1,6 @@ export const commandIds = { documentAddArtboard: "document.addArtboard", + documentSetArtboardBounds: "document.setArtboardBounds", selectionSet: "selection.set", selectionClear: "selection.clear", selectionAddLayer: "selection.addLayer", diff --git a/commands/payloads.ts b/commands/payloads.ts index 39036ef..4e0bead 100644 --- a/commands/payloads.ts +++ b/commands/payloads.ts @@ -1,5 +1,5 @@ import { commandIds } from "./ids"; -import type { DocumentAddArtboardPayload } from "./document"; +import type { DocumentAddArtboardPayload, DocumentSetArtboardBoundsPayload } from "./document"; import type { SelectionAddLayerPayload, SelectionSetPayload } from "./selection"; import type { ToolSetActivePayload } from "./tool"; import type { @@ -12,6 +12,7 @@ import type { export type CommandPayloads = { [commandIds.documentAddArtboard]: DocumentAddArtboardPayload; + [commandIds.documentSetArtboardBounds]: DocumentSetArtboardBoundsPayload; [commandIds.selectionSet]: SelectionSetPayload; [commandIds.selectionClear]: void; [commandIds.selectionAddLayer]: SelectionAddLayerPayload;