'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, ReplaceAll } from 'lucide-react'; import { cn } from '@/public/lib/utils'; import SceneEditor from './scene-editor'; import FloatingGlassPanel from './FloatingGlassPanel'; import { ReplaceScenePanel, mockShots } from './replace-scene-panel'; import HorizontalScroller from './HorizontalScroller'; interface SceneEnvironment { time: { period: '清晨' | '上午' | '中午' | '下午' | '傍晚' | '夜晚' | '深夜'; specific?: string; }; location: { main: string; detail?: string; }; weather: { type: '晴天' | '多云' | '雨天' | '雪天' | '雷暴' | '阴天'; description?: string; }; atmosphere: { lighting: string; mood: string; }; } interface SceneTabContentProps { currentSketchIndex: number; } 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({ currentSketchIndex = 0 }: SceneTabContentProps) { const thumbnailsRef = useRef(null); const scriptsRef = useRef(null); // 确保 taskSketch 是数组 const sketches: any[] = []; const [localSketch, setLocalSketch] = useState(mockSketch); const textareaRef = useRef(null); const [isReplacePanelOpen, setIsReplacePanelOpen] = useState(false); const [replacePanelKey, setReplacePanelKey] = useState(0); const [ignoreReplace, setIgnoreReplace] = useState(false); const [currentScene, setCurrentScene] = useState({ url: '', script: '' }); // 天气图标映射 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]); const handleReplaceScene = (url: string) => { // setCurrentScene({ // ...currentScene, // url: url // }); // setIsReplacePanelOpen(true); }; const handleConfirmReplace = (selectedShots: string[], addToLibrary: boolean) => { // 处理替换确认逻辑 console.log('Selected shots:', selectedShots); console.log('Add to library:', addToLibrary); setIsReplacePanelOpen(false); }; const handleCloseReplacePanel = () => { setIsReplacePanelOpen(false); setIgnoreReplace(true); }; const handleChangeScene = (index: number) => { // if (currentScene?.url !== sketches[currentSketchIndex]?.url && !ignoreReplace) { // // 提示 场景已修改,弹出替换场景面板 // if (isReplacePanelOpen) { // setReplacePanelKey(replacePanelKey + 1); // } else { // setIsReplacePanelOpen(true); // } // return; // } // setCurrentScene(sketches[index]); }; // 如果没有数据,显示空状态 if (sketches.length === 0) { return (

No scene data

); } return (
{/* 上部分 */} {/* 分镜缩略图行 */}
handleChangeScene(i)} > {sketches.map((sketch, index) => ( {`Sketch
Scene {index + 1}
{/* 鼠标悬浮/移出 显示/隐藏 删除图标 */} {/*
*/}
))} {/* 新增占位符 */} {/* console.log('Add new sketch')} >
添加场景
*/}
{/* 脚本预览行 - 单行滚动 */}
handleChangeScene(i)} > {sketches.map((script, index) => { const isActive = currentSketchIndex === index; return (
{script.script} {index < sketches.length - 1 && ( | )}
); })}
{/* 渐变遮罩 */}
{/* 下部分 */} {/* 左列:场景预览 */}
{`Scene
{/* 右列:脚本编辑器 */}
{ setLocalSketch({ ...localSketch, script: description }); }} onReplaceScene={handleReplaceScene} className="min-h-[200px]" /> {/* 重新生成按钮、替换形象按钮 */}
handleReplaceScene('https://c.huiying.video/images/5740cb7c-6e08-478f-9e7c-bca7f78a2bf6.jpg')} className="flex items-center justify-center gap-2 px-4 py-3 bg-pink-500/10 hover:bg-pink-500/20 text-pink-500 rounded-lg transition-colors" whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} > Replace console.log('Regenerate')} className="flex items-center justify-center gap-2 px-4 py-3 bg-blue-500/10 hover:bg-blue-500/20 text-blue-500 rounded-lg transition-colors" whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} > Regenerate
{/* 替换场景面板 */}
); }