// 悬浮球交互 (W-SNP-04/05/12/13/14): // mouseenter/leave → hover 延时恢复 (Rust 侧计时 150ms) // 单击 (位移 ≤4px) → 立即恢复, 触屏点按等效 // 拖动 → dock_drag_move 增量移动, 结束时按最近边停靠/换边/拖出 const { invoke } = window.__TAURI__.core const ball = document.getElementById('ball') let dragging = false let moved = 0 let lastX = 0 let lastY = 0 ball.addEventListener('mouseenter', () => invoke('dock_hover_start')) ball.addEventListener('mouseleave', () => invoke('dock_hover_end')) ball.addEventListener('contextmenu', (e) => e.preventDefault()) ball.addEventListener('pointerdown', (e) => { dragging = true moved = 0 lastX = e.clientX lastY = e.clientY ball.setPointerCapture(e.pointerId) invoke('dock_drag_start') }) ball.addEventListener('pointermove', (e) => { if (!dragging) return const dx = e.clientX - lastX const dy = e.clientY - lastY if (dx === 0 && dy === 0) return lastX = e.clientX lastY = e.clientY moved += Math.abs(dx) + Math.abs(dy) if (moved > 4) { // clientX 为逻辑像素, 增量按 DPI 缩放换算成物理像素 (Rust 注入 __SCALE) const s = window.__SCALE || 1 invoke('dock_drag_move', { dx: Math.round(dx * s), dy: Math.round(dy * s) }) } }) ball.addEventListener('pointerup', (e) => { if (!dragging) return dragging = false try { ball.releasePointerCapture(e.pointerId) } catch { /* 已释放 */ } if (moved <= 4) { invoke('dock_click') } else { invoke('dock_drag_end') } }) ball.addEventListener('pointercancel', () => { dragging = false invoke('dock_drag_end') }) // Rust 在停靠/换边/主题变化时调用 window.applyDock = (edge, theme) => { document.body.className = 'dock-' + edge + ' theme-' + theme } window.applyTheme = (theme) => { const edge = [...document.body.classList].find((c) => c.startsWith('dock-')) || 'dock-left' document.body.className = edge + ' theme-' + theme } window.__SCALE = 1