From 4a9134d91d097762679f9ba856b2ebf1524f1b2a Mon Sep 17 00:00:00 2001 From: clawdbot Date: Thu, 29 Jan 2026 13:47:05 +0800 Subject: [PATCH] editor: editable screen size (default 1920x1080) --- packages/editor/src/editor/EditorApp.tsx | 26 ++++++++++++++++++-- packages/editor/src/editor/store.ts | 31 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/packages/editor/src/editor/EditorApp.tsx b/packages/editor/src/editor/EditorApp.tsx index 04efbe7..0b833d7 100644 --- a/packages/editor/src/editor/EditorApp.tsx +++ b/packages/editor/src/editor/EditorApp.tsx @@ -639,10 +639,32 @@ export function EditorApp() {
宽度 - + { + if (typeof v !== 'number') return; + dispatch({ type: 'updateScreenSize', width: v }); + }} + style={{ width: 160 }} + /> 高度 - + { + if (typeof v !== 'number') return; + dispatch({ type: 'updateScreenSize', height: v }); + }} + style={{ width: 160 }} + />
diff --git a/packages/editor/src/editor/store.ts b/packages/editor/src/editor/store.ts index 9fbec03..21899a6 100644 --- a/packages/editor/src/editor/store.ts +++ b/packages/editor/src/editor/store.ts @@ -57,6 +57,7 @@ export type EditorAction = | { type: 'updateResize'; current: { screenX: number; screenY: number }; bounds: { w: number; h: number } } | { type: 'endResize' } | { type: 'addTextAt'; x: number; y: number } + | { type: 'updateScreenSize'; width?: number; height?: number } | { type: 'importJSON'; json: string } | { type: 'deleteSelected' } | { type: 'nudgeSelected'; dx: number; dy: number } @@ -1355,6 +1356,36 @@ export function editorReducer(state: EditorRuntimeState, action: EditorAction): }; } + case 'updateScreenSize': { + const minW = 320; + const minH = 240; + const width = action.width ?? state.doc.screen.width; + const height = action.height ?? state.doc.screen.height; + if (!Number.isFinite(width) || !Number.isFinite(height)) return state; + + const nextW = Math.max(minW, Math.round(width)); + const nextH = Math.max(minH, Math.round(height)); + if (nextW === state.doc.screen.width && nextH === state.doc.screen.height) return state; + + const bounds = { w: nextW, h: nextH }; + const nextNodes = state.doc.screen.nodes.map((n) => ({ + ...n, + rect: clampRectToBounds(n.rect, bounds), + })); + + return { + ...historyPush(state), + doc: { + screen: { + ...state.doc.screen, + width: nextW, + height: nextH, + nodes: nextNodes, + }, + }, + }; + } + case 'importJSON': { const parsed: unknown = JSON.parse(action.json); try {