import { listen } from '@tauri-apps/api/event'; import { Component, createEffect, onCleanup, createSignal } from 'solid-js'; import { ColorCalibration, LedStripConfigContainer } from '../../models/led-strip-config'; import { ledStripStore, setLedStripStore } from '../../stores/led-strip.store'; import { ColorSlider } from './color-slider'; import { TestColorsBg } from './test-colors-bg'; import { invoke } from '@tauri-apps/api/core'; import { VsClose } from 'solid-icons/vs'; import { BiRegularReset } from 'solid-icons/bi'; import { BsFullscreen, BsFullscreenExit } from 'solid-icons/bs'; import { getCurrentWindow } from '@tauri-apps/api/window'; import transparentBg from '../../assets/transparent-grid-background.svg?url'; import { useLanguage } from '../../i18n/index'; const Value: Component<{ value: number }> = (props) => { return (
{(props.value * 100).toFixed(0)}%
); }; export const WhiteBalance = () => { const { t } = useLanguage(); const [isFullscreen, setIsFullscreen] = createSignal(false); const [panelPosition, setPanelPosition] = createSignal({ x: 0, y: 0 }); const [isDragging, setIsDragging] = createSignal(false); const [dragOffset, setDragOffset] = createSignal({ x: 0, y: 0 }); // 自动进入全屏模式 createEffect(() => { const autoEnterFullscreen = async () => { try { const window = getCurrentWindow(); const currentFullscreen = await window.isFullscreen(); if (!currentFullscreen) { await window.setFullscreen(true); setIsFullscreen(true); } else { setIsFullscreen(true); } } catch (error) { // Silently handle fullscreen error } }; autoEnterFullscreen(); }); // 初始化面板位置到屏幕中央 createEffect(() => { if (isFullscreen()) { const centerX = window.innerWidth / 2 - 160; // 160是面板宽度的一半 const centerY = window.innerHeight / 2 - 200; // 200是面板高度的一半 setPanelPosition({ x: centerX, y: centerY }); } }); // 拖拽处理函数 const handleMouseDown = (e: MouseEvent) => { // 确保只有在标题栏区域点击时才触发拖拽 setIsDragging(true); const panelRect = (e.currentTarget as HTMLElement).closest('.fixed')?.getBoundingClientRect(); if (panelRect) { setDragOffset({ x: e.clientX - panelRect.left, y: e.clientY - panelRect.top }); } e.preventDefault(); e.stopPropagation(); }; const handleMouseMove = (e: MouseEvent) => { if (isDragging()) { const newX = e.clientX - dragOffset().x; const newY = e.clientY - dragOffset().y; // 限制面板在屏幕范围内 const maxX = window.innerWidth - 320; // 320是面板宽度 const maxY = window.innerHeight - 400; // 400是面板高度 setPanelPosition({ x: Math.max(0, Math.min(newX, maxX)), y: Math.max(0, Math.min(newY, maxY)) }); } }; const handleMouseUp = () => { setIsDragging(false); }; // 添加全局鼠标事件监听 createEffect(() => { if (isDragging()) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } else { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); } }); // listen to config_changed event createEffect(() => { const unlisten = listen('config_changed', (event) => { const { strips, mappers, color_calibration } = event.payload as LedStripConfigContainer; setLedStripStore({ strips, mappers, colorCalibration: color_calibration, }); }); onCleanup(async () => { (await unlisten)(); }); }); const updateColorCalibration = ( key: keyof ColorCalibration, value: number, ) => { const calibration = { ...ledStripStore.colorCalibration }; calibration[key] = value; setLedStripStore('colorCalibration', calibration); invoke('set_color_calibration', { calibration }).catch(() => { // Silently handle error }); }; const toggleFullscreen = async () => { try { const window = getCurrentWindow(); const currentFullscreen = await window.isFullscreen(); await window.setFullscreen(!currentFullscreen); setIsFullscreen(!currentFullscreen); // 退出全屏时重置面板位置 if (currentFullscreen) { setPanelPosition({ x: 0, y: 0 }); } } catch (error) { // Silently handle fullscreen error } }; const exit = () => { // 退出时确保退出全屏模式 if (isFullscreen()) { toggleFullscreen().then(() => { window.history.back(); }); } else { window.history.back(); } }; const reset = () => { invoke('set_color_calibration', { calibration: new ColorCalibration(), }).catch(() => { // Silently handle error }); }; return ( <> {/* 普通模式 */} {!isFullscreen() && (

{t('whiteBalance.title')}

{/* 颜色测试区域 */}
{t('whiteBalance.colorTest')}
{t('whiteBalance.clickToTest')}
💡 {t('whiteBalance.colorTestTip')}
{/* 白平衡控制面板 */}
{t('whiteBalance.rgbAdjustment')}
{t('whiteBalance.realtimeAdjustment')}
updateColorCalibration( 'r', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
updateColorCalibration( 'g', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
updateColorCalibration( 'b', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
updateColorCalibration( 'w', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
{/* 使用说明 - 可展开 */}
💡 {t('whiteBalance.usageInstructions')}

{t('whiteBalance.recommendedMethod')}

  1. {t('whiteBalance.fullscreenTip')}
  2. {t('whiteBalance.dragTip')}
  3. {t('whiteBalance.dragPanelTip')}
  4. {t('whiteBalance.compareColorsTip')}

{t('whiteBalance.adjustmentTips')}

  • {t('whiteBalance.redStrong')}
  • {t('whiteBalance.greenStrong')}
  • {t('whiteBalance.blueStrong')}
  • {t('whiteBalance.whiteYellow')}
  • {t('whiteBalance.whiteBlue')}

{t('whiteBalance.comparisonMethod')}

  • {t('whiteBalance.whiteComparison')}
  • {t('whiteBalance.colorComparison')}
  • {t('whiteBalance.environmentTest')}
  • {t('whiteBalance.resetNote')}
)} {/* 全屏模式 */} {isFullscreen() && (
{/* 全屏颜色测试区域 - 紧贴边缘 */}
{/* 可拖拽的RGB控制面板 */}
⋮⋮ {t('whiteBalance.rgbAdjustment')}
{t('whiteBalance.draggable')}
updateColorCalibration( 'r', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
updateColorCalibration( 'g', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
updateColorCalibration( 'b', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
updateColorCalibration( 'w', (ev.target as HTMLInputElement).valueAsNumber ?? 1, ) } />
💡 {t('whiteBalance.fullscreenComparisonTip')}
)} ); };