cherry-studio/src/main/services/ShortcutService.ts
2024-12-02 18:03:38 +08:00

104 lines
2.6 KiB
TypeScript

import { Shortcut } from '@types'
import { BrowserWindow, globalShortcut } from 'electron'
import Logger from 'electron-log'
import { configManager } from './ConfigManager'
let showAppAccelerator: string | null = null
function getShortcutHandler(shortcut: Shortcut) {
switch (shortcut.key) {
case 'zoom_in':
return () => handleZoom(0.1)
case 'zoom_out':
return () => handleZoom(-0.1)
case 'zoom_reset':
return (window: BrowserWindow) => {
window.webContents.setZoomFactor(1)
configManager.setZoomFactor(1)
}
case 'show_app':
return (window: BrowserWindow) => {
if (window.isVisible()) {
window.hide()
} else {
window.show()
window.focus()
}
}
default:
return null
}
}
function formatShortcutKey(shortcut: string[]): string {
return shortcut.join('+')
}
function handleZoom(delta: number) {
return (window: BrowserWindow) => {
const currentZoom = window.webContents.getZoomFactor()
const newZoom = currentZoom + delta
if (newZoom >= 0.1 && newZoom <= 5.0) {
window.webContents.setZoomFactor(newZoom)
configManager.setZoomFactor(newZoom)
}
}
}
function registerWindowShortcuts(window: BrowserWindow) {
window.webContents.setZoomFactor(configManager.getZoomFactor())
const register = () => {
if (window.isDestroyed()) return
const shortcuts = configManager.getShortcuts()
if (!shortcuts) return
shortcuts.forEach((shortcut) => {
if (!shortcut.enabled || shortcut.shortcut.length === 0) return
const handler = getShortcutHandler(shortcut)
if (!handler) return
const accelerator = formatShortcutKey(shortcut.shortcut)
if (shortcut.key === 'show_app') {
showAppAccelerator = accelerator
}
Logger.info(`Register shortcut: ${accelerator}`)
globalShortcut.register(accelerator, () => handler(window))
})
}
const unregister = () => {
if (window.isDestroyed()) return
globalShortcut.unregisterAll()
if (showAppAccelerator) {
const handler = getShortcutHandler({ key: 'show_app' } as Shortcut)
if (handler) {
globalShortcut.register(showAppAccelerator, () => handler(window))
}
}
}
window.on('focus', () => register())
window.on('blur', () => unregister())
if (!window.isDestroyed() && window.isFocused()) {
register()
}
}
export function registerShortcuts(mainWindow: BrowserWindow) {
registerWindowShortcuts(mainWindow)
}
export function unregisterAllShortcuts() {
showAppAccelerator = null
globalShortcut.unregisterAll()
}