From 22261986d508498016c4728e46a1d0410fde0d63 Mon Sep 17 00:00:00 2001 From: kang Date: Wed, 13 May 2026 18:18:55 +0800 Subject: [PATCH] auto-save 2026-05-13 18:18 (~5) --- .memory/worklog.json | 7 +++++++ web/app/page.tsx | 11 +++++++++-- web/components/nodes/index.tsx | 7 +++++-- web/components/storyboard-bar.tsx | 10 ++++++---- web/components/storyboard-workbench.tsx | 11 ++++++++++- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index 3913f11..c690a9c 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -2069,6 +2069,13 @@ "type": "session-heartbeat", "message": "Codex 会话活跃 · 最近命令:codex · 1 项未提交变更 · 最近提交:auto-save 2026-05-13 18:07 (~1)", "files_changed": 1 + }, + { + "ts": "2026-05-13T18:13:22+08:00", + "type": "commit", + "message": "auto-save 2026-05-13 18:13 (~1)", + "hash": "40cf8b0", + "files_changed": 1 } ] } diff --git a/web/app/page.tsx b/web/app/page.tsx index c148b7e..447e948 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -287,7 +287,10 @@ export default function Home() { onDeleteFrame: handleDeleteFrame, onDeleteGenerated: handleDeleteGenerated, onOpenStoryboard: (idx: number) => setStoryboardFrame(idx), - onOpenWorkbench: () => setWorkbenchOpen(true), + onOpenWorkbench: (idx?: number) => { + if (typeof idx === "number") setStoryboardFrame(idx) + setWorkbenchOpen(true) + }, onCopyImage: handleCopyImage, }), [job, jobs, activeJobId, submitting, analyzing, selectedFrames, expandedFrame, handleSubmit, handleUpload, handleAnalyze, handleToggleFrame, handleAddManualFrame, handleSwitchJob, setJob, handleDeleteFrame, handleDeleteGenerated, handleCopyImage]) @@ -347,7 +350,10 @@ export default function Home() { focusedFrame={storyboardFrame} onFocusFrame={setStoryboardFrame} onJobUpdate={setJob as any} - onOpenWorkbench={() => setWorkbenchOpen(true)} + onOpenWorkbench={(idx?: number) => { + if (typeof idx === "number") setStoryboardFrame(idx) + setWorkbenchOpen(true) + }} />
setWorkbenchOpen(false)} onJobUpdate={setJob as any} clipboard={clipboard} + focusedFrame={storyboardFrame} /> diff --git a/web/components/nodes/index.tsx b/web/components/nodes/index.tsx index 71e7657..222252c 100644 --- a/web/components/nodes/index.tsx +++ b/web/components/nodes/index.tsx @@ -31,7 +31,7 @@ export interface NodeData { onDeleteFrame?: (idx: number) => void // 删整张关键帧 onDeleteGenerated?: (frameIdx: number, genId: string) => void // 删单张生成图 onOpenStoryboard?: (frameIdx: number) => void // 打开分镜头编排专属面板 - onOpenWorkbench?: () => void // 打开全屏分镜编排工作台 + onOpenWorkbench?: (frameIdx?: number) => void // 打开全屏分镜编排工作台 onCopyImage?: (ref: ImageRef) => void // 复制图片到全局剪贴板(粘贴到分镜头编排工作台插槽) } @@ -641,8 +641,11 @@ export function StoryboardNode({ data, selected }: any) {
) } - diff --git a/web/components/storyboard-workbench.tsx b/web/components/storyboard-workbench.tsx index 5a690e0..6394be2 100644 --- a/web/components/storyboard-workbench.tsx +++ b/web/components/storyboard-workbench.tsx @@ -15,13 +15,14 @@ interface Props { onClose: () => void onJobUpdate?: (j: Job) => void clipboard: ImageRef | null // 全局剪贴板(page.tsx 提供) + focusedFrame: number | null } const emptyScene = (): StoryboardScene => ({ subject: "", product: "", scene: "", action: "", duration: 0, reference_ids: [], }) -export function StoryboardWorkbench({ job, selectedFrames, open, onClose, onJobUpdate, clipboard }: Props) { +export function StoryboardWorkbench({ job, selectedFrames, open, onClose, onJobUpdate, clipboard, focusedFrame }: Props) { const [mounted, setMounted] = useState(false) useEffect(() => setMounted(true), []) @@ -39,6 +40,14 @@ export function StoryboardWorkbench({ job, selectedFrames, open, onClose, onJobU return () => window.removeEventListener("keydown", onKey) }, [open, onClose]) + // 外部点击某个分镜 / 元素时,直接定位到那一帧。 + useEffect(() => { + if (!open || !job || focusedFrame === null) return + if (!selectedFrames.has(focusedFrame)) return + if (!job.frames.some((f) => f.index === focusedFrame)) return + setFocusedIdx(focusedFrame) + }, [open, job?.id, job?.frames, selectedFrames, focusedFrame]) + // 默认选第一个分镜 useEffect(() => { if (!open || !job) return