import React, { useState, useEffect } from 'react'; import { ArrowLeft, Droplets, Upload, Settings } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { invoke } from '@tauri-apps/api/core'; import { Material } from '../../types/material'; import { WatermarkToolDialog } from '../../components/WatermarkToolDialog'; import { LoadingSpinner } from '../../components/LoadingSpinner'; /** * 水印工具页面 * 提供水印检测、移除和添加功能 */ const WatermarkTool: React.FC = () => { const navigate = useNavigate(); // 状态管理 const [materials, setMaterials] = useState([]); const [loading, setLoading] = useState(true); const [selectedMaterials, setSelectedMaterials] = useState([]); const [showWatermarkDialog, setShowWatermarkDialog] = useState(false); // 加载素材列表 useEffect(() => { loadMaterials(); }, []); const loadMaterials = async () => { try { setLoading(true); const result = await invoke('get_all_materials'); setMaterials(result); } catch (error) { console.error('加载素材失败:', error); } finally { setLoading(false); } }; // 处理素材选择 const handleMaterialSelect = (materialId: string) => { setSelectedMaterials(prev => { if (prev.includes(materialId)) { return prev.filter(id => id !== materialId); } else { return [...prev, materialId]; } }); }; // 全选/取消全选 const handleSelectAll = () => { if (selectedMaterials.length === materials.length) { setSelectedMaterials([]); } else { setSelectedMaterials(materials.map(m => m.id)); } }; // 打开水印工具对话框 const handleOpenWatermarkTool = () => { if (selectedMaterials.length === 0) { alert('请先选择要处理的素材'); return; } setShowWatermarkDialog(true); }; // 格式化文件大小 const formatFileSize = (bytes: number) => { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; // 格式化时长 const formatDuration = (seconds: number) => { if (!seconds) return '--'; const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return `${mins}:${secs.toString().padStart(2, '0')}`; }; // 获取素材的时长信息 const getMaterialDuration = (material: Material): number | null => { if (material.metadata === 'None') return null; if ('Video' in material.metadata) return material.metadata.Video.duration; if ('Audio' in material.metadata) return material.metadata.Audio.duration; return null; }; // 获取素材的尺寸信息 const getMaterialDimensions = (material: Material): { width: number; height: number } | null => { if (material.metadata === 'None') return null; if ('Video' in material.metadata) { return { width: material.metadata.Video.width, height: material.metadata.Video.height }; } if ('Image' in material.metadata) { return { width: material.metadata.Image.width, height: material.metadata.Image.height }; } return null; }; return (
{/* 页面头部 */}

水印处理工具

检测、移除和添加视频水印

{/* 操作栏 */}
共 {materials.length} 个素材
{/* 素材列表 */}
{loading ? (
) : materials.length === 0 ? (

暂无素材

请先导入一些素材文件

) : (
{materials.map((material) => (
handleMaterialSelect(material.id)} className="rounded border-gray-300 text-blue-600 focus:ring-blue-500" />

{material.name}

类型: {material.material_type} {material.file_size && ( 大小: {formatFileSize(material.file_size)} )} {(() => { const duration = getMaterialDuration(material); return duration && ( 时长: {formatDuration(duration)} ); })()} {(() => { const dimensions = getMaterialDimensions(material); return dimensions && ( 分辨率: {dimensions.width}×{dimensions.height} ); })()}
{material.original_path}
))}
)}
{/* 水印工具对话框 */} {showWatermarkDialog && ( setShowWatermarkDialog(false)} selectedMaterials={selectedMaterials.map(id => materials.find(m => m.id === id)!).filter(Boolean)} /> )}
); }; export default WatermarkTool;