托盘
This commit is contained in:
@@ -13,7 +13,7 @@ import { VueDraggable } from 'vue-draggable-plus'
|
||||
import { appDataDir } from '@tauri-apps/api/path'
|
||||
import { revealItemInDir } from '@tauri-apps/plugin-opener'
|
||||
import { WebviewWindow } from '@tauri-apps/api/webviewWindow'
|
||||
import { emit, type UnlistenFn } from '@tauri-apps/api/event'
|
||||
import { emit, listen, type UnlistenFn } from '@tauri-apps/api/event'
|
||||
import { currentMonitor, LogicalPosition, LogicalSize } from '@tauri-apps/api/window'
|
||||
import { useMonitorStore, type SensorEntry, type SensorGroup, type ConnectionState } from '@/stores/monitorStore'
|
||||
import { useModuleTabs } from '@/lib/useModuleTabs'
|
||||
@@ -1493,20 +1493,12 @@ async function resetOverlayPosition() {
|
||||
} catch { /* 忽略 */ }
|
||||
}
|
||||
|
||||
/** 关闭所有 OSD 窗口(组件卸载时调用) */
|
||||
async function closeAllOsdWindows() {
|
||||
try {
|
||||
const w = await WebviewWindow.getByLabel(OSD_OVERLAY_LABEL)
|
||||
if (w) await w.close()
|
||||
} catch {
|
||||
/* 忽略 */
|
||||
}
|
||||
}
|
||||
|
||||
// ===== OSD 窗口事件监听 =====
|
||||
let osdEventUnlisteners: UnlistenFn[] = []
|
||||
|
||||
async function setupOsdEventListeners() {
|
||||
// 守卫:避免重复注册(MonitorModule 可能因预渲染多次挂载)
|
||||
if (osdEventUnlisteners.length) return
|
||||
const { listen: tauriListen } = await import('@tauri-apps/api/event')
|
||||
// 监听悬浮窗上报的实际内容尺寸,按内容调整窗口大小(替代不准确的估算)
|
||||
// 仅当尺寸变化超过 1px 时才 setSize,避免无意义的频繁调用
|
||||
@@ -1611,15 +1603,36 @@ onMounted(async () => {
|
||||
if (osdConfig.value.overlayEnabled) {
|
||||
ensureOverlayWindow().catch(e => console.error('[OSD] 初始化悬浮窗失败:', e))
|
||||
}
|
||||
|
||||
// 监听托盘菜单"切换 OSD"事件
|
||||
try {
|
||||
osdEventUnlisteners.push(
|
||||
await listen('tray:toggle-osd', () => {
|
||||
osdConfig.value.overlayEnabled = !osdConfig.value.overlayEnabled
|
||||
saveOsdConfig(osdConfig.value)
|
||||
if (osdConfig.value.overlayEnabled) {
|
||||
if (osdConfig.value.overlayItems.length === 0) {
|
||||
toast.warning('OSD 显示项为空,已开启但未创建窗口')
|
||||
} else {
|
||||
ensureOverlayWindow().catch(e => console.error('[OSD] 托盘开启悬浮窗失败:', e))
|
||||
}
|
||||
} else {
|
||||
hideOverlayWindow().catch(e => console.error('[OSD] 托盘关闭悬浮窗失败:', e))
|
||||
}
|
||||
})
|
||||
)
|
||||
} catch (e) {
|
||||
console.error('[OSD] 注册 tray:toggle-osd 监听失败:', e)
|
||||
}
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
store.dispose()
|
||||
// 清理 OSD 事件监听
|
||||
// 不 dispose store:SSE 订阅保持,确保切走监控模块后 OSD 仍有数据
|
||||
// store.subscribe() 内部有守卫(if unlistenFns.length return),重复 init 不会重复订阅
|
||||
// 不关闭 OSD 窗口:切走监控模块时保持 OSD 显示,由模块禁用或应用退出时统一清理
|
||||
// 仅清理组件级 OSD 事件监听(下次挂载会重新注册,setupOsdEventListeners 有守卫)
|
||||
osdEventUnlisteners.forEach(fn => fn())
|
||||
osdEventUnlisteners = []
|
||||
// 关闭悬浮窗(切走监控模块时释放 OSD 窗口)
|
||||
closeAllOsdWindows().catch(e => console.error('[OSD] 关闭窗口失败:', e))
|
||||
})
|
||||
|
||||
// 当 Kernel 从未就绪变成就绪时,主动拉一次快照填充 UI
|
||||
|
||||
Reference in New Issue
Block a user