'use client'; import React, { useRef, useEffect, useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Trash2, RefreshCw, Sun, Moon, Cloud, CloudRain, CloudSnow, CloudLightning, Sparkles, Clock, MapPin, Palette, Check, Plus } from 'lucide-react'; import { cn } from '@/public/lib/utils'; import SceneEditor from './scene-editor'; interface SceneEnvironment { time: { period: '清晨' | '上午' | '中午' | '下午' | '傍晚' | '夜晚' | '深夜'; specific?: string; }; location: { main: string; detail?: string; }; weather: { type: '晴天' | '多云' | '雨天' | '雪天' | '雷暴' | '阴天'; description?: string; }; atmosphere: { lighting: string; mood: string; }; } interface SceneTabContentProps { taskSketch: any[]; currentSketchIndex: number; onSketchSelect: (index: number) => void; } interface SceneSketch { id: string; script: string; environment: SceneEnvironment; } // Mock 数据 const mockSketch: SceneSketch = { id: '1', script: '教室里洒满了温暖的阳光,透过窗户的光线在地板上画出了长长的影子。黑板上还留着上节课的板书,几个学生正在整理自己的书包。教室后排的绿植在微风中轻轻摇曳,为这个平静的午后增添了一丝生机。', environment: { time: { period: '下午', specific: '午后2点左右' }, location: { main: '教室', detail: '高中教室,靠窗的位置' }, weather: { type: '晴天', description: '阳光明媚,微风轻拂' }, atmosphere: { lighting: '自然光线充足,温暖的阳光从窗户斜射入室内', mood: '安静祥和,充满生机与活力' } } }; export function SceneTabContent({ taskSketch = [], currentSketchIndex = 0, onSketchSelect }: SceneTabContentProps) { const thumbnailsRef = useRef(null); const scriptsRef = useRef(null); // 确保 taskSketch 是数组 const sketches = Array.isArray(taskSketch) ? taskSketch : []; const [localSketch, setLocalSketch] = useState(mockSketch); const textareaRef = useRef(null); // 天气图标映射 const weatherIcons = { '晴天': Sun, '多云': Cloud, '雨天': CloudRain, '雪天': CloudSnow, '雷暴': CloudLightning, '阴天': Cloud }; // 时间选项 const timeOptions = ['清晨', '上午', '中午', '下午', '傍晚', '夜晚', '深夜']; // 处理脚本更新 const handleScriptChange = (e: React.ChangeEvent) => { setLocalSketch({ ...localSketch, script: e.target.value }); // 自动调整文本框高度 if (textareaRef.current) { textareaRef.current.style.height = 'auto'; textareaRef.current.style.height = textareaRef.current.scrollHeight + 'px'; } }; // 处理智能优化 const handleSmartOptimize = () => { console.log('Optimizing scene description...'); // TODO: 调用 AI 优化接口 }; // 自动滚动到选中项 useEffect(() => { if (thumbnailsRef.current && scriptsRef.current) { const thumbnailContainer = thumbnailsRef.current; const scriptContainer = scriptsRef.current; // 计算缩略图滚动位置 const thumbnailWidth = thumbnailContainer.children[0]?.clientWidth ?? 0; const thumbnailGap = 16; // gap-4 = 16px const thumbnailScrollPosition = (thumbnailWidth + thumbnailGap) * currentSketchIndex; // 计算脚本文字滚动位置 const scriptElement = scriptContainer.children[currentSketchIndex] as HTMLElement; const scriptScrollPosition = scriptElement?.offsetLeft ?? 0; // 平滑滚动到目标位置 thumbnailContainer.scrollTo({ left: thumbnailScrollPosition - thumbnailContainer.clientWidth / 2 + thumbnailWidth / 2, behavior: 'smooth' }); scriptContainer.scrollTo({ left: scriptScrollPosition - scriptContainer.clientWidth / 2 + scriptElement?.clientWidth / 2, behavior: 'smooth' }); } }, [currentSketchIndex]); // 如果没有数据,显示空状态 if (sketches.length === 0) { return (

No scene data

); } return (
{/* 上部分 */} {/* 分镜缩略图行 */}
{sketches.map((sketch, index) => ( onSketchSelect(index)} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} > {`Sketch
Scene {index + 1}
{/* 鼠标悬浮/移出 显示/隐藏 删除图标 */}
))}
{/* 新增占位符 */} console.log('Add new sketch')} >
添加场景
{/* 脚本预览行 - 单行滚动 */}
{sketches.map((script, index) => { const isActive = currentSketchIndex === index; return ( onSketchSelect(index)} initial={false} animate={{ scale: isActive ? 1.02 : 1, }} >
{script.script} {index < sketches.length - 1 && ( | )}
); })}
{/* 渐变遮罩 */}
{/* 下部分 */} {/* 左列:脚本编辑器 */}
{/* 选中的分镜预览 */} {`Sketch {/* 操作按钮 */}
{/* 右列:环境设置 */}
{/* 使用新的场景编辑器组件 */} { setLocalSketch({ ...localSketch, script: description }); }} className="min-h-[200px]" />
); }