diff --git a/src/app/page.tsx b/src/app/page.tsx index a94c3e2..bdfb055 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -172,6 +172,9 @@ export default function Home() { endCol: number; } | null>(null); + // 新增:活跃工具层级管理 + const [activeFloatingTool, setActiveFloatingTool] = useState<'palette' | 'magnifier' | null>(null); + // 放大镜切换处理函数 const handleToggleMagnifier = () => { const newActiveState = !isMagnifierActive; @@ -183,6 +186,15 @@ export default function Home() { } }; + // 激活工具处理函数 + const handleActivatePalette = () => { + setActiveFloatingTool('palette'); + }; + + const handleActivateMagnifier = () => { + setActiveFloatingTool('magnifier'); + }; + // 放大镜像素编辑处理函数 const handleMagnifierPixelEdit = (row: number, col: number, colorData: { key: string; color: string }) => { if (!mappedPixelData) return; @@ -2171,6 +2183,8 @@ export default function Home() { onHighlightColor={handleHighlightColor} isOpen={isFloatingPaletteOpen} onToggleOpen={() => setIsFloatingPaletteOpen(!isFloatingPaletteOpen)} + isActive={activeFloatingTool === 'palette'} + onActivate={handleActivatePalette} /> )} @@ -2188,6 +2202,8 @@ export default function Home() { cellSize={gridDimensions ? Math.min(6, Math.max(4, 500 / Math.max(gridDimensions.N, gridDimensions.M))) : 6} selectionArea={magnifierSelectionArea} onClearSelection={() => setMagnifierSelectionArea(null)} + isFloatingActive={activeFloatingTool === 'magnifier'} + onActivateFloating={handleActivateMagnifier} /> {/* 放大镜选择覆盖层 */} diff --git a/src/components/FloatingColorPalette.tsx b/src/components/FloatingColorPalette.tsx index f2bc8c6..db5f5a6 100644 --- a/src/components/FloatingColorPalette.tsx +++ b/src/components/FloatingColorPalette.tsx @@ -22,6 +22,8 @@ interface FloatingColorPaletteProps { onHighlightColor: (colorHex: string) => void; isOpen: boolean; onToggleOpen: () => void; + isActive: boolean; + onActivate: () => void; } const FloatingColorPalette: React.FC = ({ @@ -39,7 +41,9 @@ const FloatingColorPalette: React.FC = ({ onColorReplace, onHighlightColor, isOpen, - onToggleOpen + onToggleOpen, + isActive, + onActivate }) => { const [position, setPosition] = useState({ x: 20, y: 100 }); const [isDragging, setIsDragging] = useState(false); @@ -50,6 +54,7 @@ const FloatingColorPalette: React.FC = ({ const handleMouseDown = useCallback((e: React.MouseEvent) => { if (!paletteRef.current) return; + onActivate(); // 激活调色板,置于最上层 const rect = paletteRef.current.getBoundingClientRect(); setIsDragging(true); setDragOffset({ @@ -57,12 +62,13 @@ const FloatingColorPalette: React.FC = ({ y: e.clientY - rect.top }); e.preventDefault(); - }, []); + }, [onActivate]); // 处理触摸开始 const handleTouchStart = useCallback((e: React.TouchEvent) => { if (!paletteRef.current) return; + onActivate(); // 激活调色板,置于最上层 const rect = paletteRef.current.getBoundingClientRect(); const touch = e.touches[0]; setIsDragging(true); @@ -71,7 +77,7 @@ const FloatingColorPalette: React.FC = ({ y: touch.clientY - rect.top }); e.preventDefault(); - }, []); + }, [onActivate]); // 处理移动 useEffect(() => { @@ -160,13 +166,16 @@ const FloatingColorPalette: React.FC = ({ return (
{/* 标题栏和控制按钮 */}
= ({ if (!isManualColoringMode) return null; return ( -
+
{/* 调色盘开关按钮 */}