diff --git a/src/components/timeline/TrackTimeline.tsx b/src/components/timeline/TrackTimeline.tsx index 9dffe41..500f450 100644 --- a/src/components/timeline/TrackTimeline.tsx +++ b/src/components/timeline/TrackTimeline.tsx @@ -2,7 +2,7 @@ import React from 'react' import { SegmentContextMenu } from './SegmentContextMenu' import { SegmentTooltip } from './SegmentTooltip' import { CategorySelector } from './CategorySelector' -import { useCategoryActions } from '../../stores/useCategoryStore' +import { useCategoryActions, useActiveCategoriesOnly } from '../../stores/useCategoryStore' export interface TrackSegment { id: string @@ -58,14 +58,63 @@ export const TrackTimeline: React.FC = ({ // 使用 Zustand store 管理分类数据 const { loadCategories } = useCategoryActions() + const activeCategories = useActiveCategoriesOnly() // 组件挂载时加载分类(如果还没有加载) React.useEffect(() => { loadCategories() // store 内部会处理缓存和重复加载 }, []) - const getSegmentColor = (type: string) => { - switch (type) { + // 根据片段名称查找对应的分类颜色 + const getCategoryByName = (segmentName: string) => { + return activeCategories.find(category => category.title === segmentName) + } + + + + // 获取片段的内联样式 + const getSegmentStyle = (segment: TrackSegment, isHover: boolean = false) => { + const category = getCategoryByName(segment.name) + + if (category && category.color) { + // 使用分类颜色 + const baseColor = category.color + const hoverColor = adjustColorBrightness(baseColor, -20) // 悬停时稍微变暗 + + return { + backgroundColor: isHover ? hoverColor : baseColor, + transition: 'background-color 0.2s ease' + } + } + + // 如果没有找到分类,使用默认的类型颜色 + return {} + } + + // 调整颜色亮度的辅助函数 + const adjustColorBrightness = (hex: string, percent: number) => { + // 移除 # 符号 + const num = parseInt(hex.replace('#', ''), 16) + const amt = Math.round(2.55 * percent) + const R = (num >> 16) + amt + const G = (num >> 8 & 0x00FF) + amt + const B = (num & 0x0000FF) + amt + + return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1) + } + + const getSegmentColor = (segment: TrackSegment) => { + const category = getCategoryByName(segment.name) + + if (category && category.color) { + // 如果找到对应分类,返回空字符串,因为我们会使用内联样式 + return '' + } + + // 如果没有找到分类,使用默认的类型颜色 + switch (segment.type) { case 'video': return 'bg-blue-500 hover:bg-blue-600' case 'audio': return 'bg-green-500 hover:bg-green-600' case 'image': return 'bg-yellow-500 hover:bg-yellow-600' @@ -75,8 +124,17 @@ export const TrackTimeline: React.FC = ({ } } - const getSegmentTextColor = (type: string) => { - switch (type) { + const getSegmentTextColor = (segment: TrackSegment) => { + const category = getCategoryByName(segment.name) + + if (category && category.color) { + // 如果使用分类颜色,根据背景颜色亮度决定文本颜色 + const brightness = getColorBrightness(category.color) + return brightness > 128 ? 'text-gray-900' : 'text-white' + } + + // 如果没有找到分类,使用默认的类型颜色 + switch (segment.type) { case 'video': return 'text-blue-100' case 'audio': return 'text-green-100' case 'image': return 'text-yellow-100' @@ -86,6 +144,15 @@ export const TrackTimeline: React.FC = ({ } } + // 计算颜色亮度的辅助函数 + const getColorBrightness = (hex: string) => { + const num = parseInt(hex.replace('#', ''), 16) + const r = (num >> 16) & 255 + const g = (num >> 8) & 255 + const b = num & 255 + return (r * 299 + g * 587 + b * 114) / 1000 + } + const getTrackTypeColor = (type: string) => { switch (type) { case 'video': return 'bg-blue-100 text-blue-800 border-blue-200' @@ -213,13 +280,14 @@ export const TrackTimeline: React.FC = ({ return (
onSegmentClick?.(segment)} onDoubleClick={(e) => handleSegmentDoubleClick(e, segment)}