116 lines
2.4 KiB
TypeScript
116 lines
2.4 KiB
TypeScript
|
|
import { Tray, Menu, nativeImage, BrowserWindow, app, NativeImage } from 'electron'
|
||
|
|
import * as path from 'path'
|
||
|
|
import type { StoreType } from './storeTypes'
|
||
|
|
|
||
|
|
let tray: Tray | null = null
|
||
|
|
|
||
|
|
export function setupTray(
|
||
|
|
mainWindow: BrowserWindow | null,
|
||
|
|
store: StoreType
|
||
|
|
) {
|
||
|
|
const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged
|
||
|
|
|
||
|
|
// In dev: __dirname is dist/main/main/, in prod: same
|
||
|
|
const iconPath = isDev
|
||
|
|
? path.join(__dirname, '../../../resources/icon.ico')
|
||
|
|
: path.join(__dirname, '../../../resources/icon.ico')
|
||
|
|
|
||
|
|
// Create tray icon
|
||
|
|
let trayIcon: NativeImage
|
||
|
|
try {
|
||
|
|
trayIcon = nativeImage.createFromPath(iconPath)
|
||
|
|
if (trayIcon.isEmpty()) {
|
||
|
|
trayIcon = nativeImage.createEmpty()
|
||
|
|
}
|
||
|
|
} catch {
|
||
|
|
trayIcon = nativeImage.createEmpty()
|
||
|
|
}
|
||
|
|
|
||
|
|
// Resize for tray (16x16 on Windows)
|
||
|
|
if (!trayIcon.isEmpty()) {
|
||
|
|
trayIcon = trayIcon.resize({ width: 16, height: 16 })
|
||
|
|
}
|
||
|
|
|
||
|
|
tray = new Tray(trayIcon)
|
||
|
|
tray.setToolTip('Game Marathon Tracker')
|
||
|
|
|
||
|
|
const contextMenu = Menu.buildFromTemplate([
|
||
|
|
{
|
||
|
|
label: 'Открыть',
|
||
|
|
click: () => {
|
||
|
|
mainWindow?.show()
|
||
|
|
mainWindow?.focus()
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{ type: 'separator' },
|
||
|
|
{
|
||
|
|
label: 'Статус: Отслеживание',
|
||
|
|
enabled: false,
|
||
|
|
},
|
||
|
|
{ type: 'separator' },
|
||
|
|
{
|
||
|
|
label: 'Выход',
|
||
|
|
click: () => {
|
||
|
|
app.isQuitting = true
|
||
|
|
app.quit()
|
||
|
|
},
|
||
|
|
},
|
||
|
|
])
|
||
|
|
|
||
|
|
tray.setContextMenu(contextMenu)
|
||
|
|
|
||
|
|
// Double-click to show window
|
||
|
|
tray.on('double-click', () => {
|
||
|
|
mainWindow?.show()
|
||
|
|
mainWindow?.focus()
|
||
|
|
})
|
||
|
|
|
||
|
|
return tray
|
||
|
|
}
|
||
|
|
|
||
|
|
export function updateTrayMenu(
|
||
|
|
mainWindow: BrowserWindow | null,
|
||
|
|
isTracking: boolean,
|
||
|
|
currentGame?: string
|
||
|
|
) {
|
||
|
|
if (!tray) return
|
||
|
|
|
||
|
|
const statusLabel = isTracking
|
||
|
|
? `Отслеживание: ${currentGame || 'Активно'}`
|
||
|
|
: 'Отслеживание: Неактивно'
|
||
|
|
|
||
|
|
const contextMenu = Menu.buildFromTemplate([
|
||
|
|
{
|
||
|
|
label: 'Открыть',
|
||
|
|
click: () => {
|
||
|
|
mainWindow?.show()
|
||
|
|
mainWindow?.focus()
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{ type: 'separator' },
|
||
|
|
{
|
||
|
|
label: statusLabel,
|
||
|
|
enabled: false,
|
||
|
|
},
|
||
|
|
{ type: 'separator' },
|
||
|
|
{
|
||
|
|
label: 'Выход',
|
||
|
|
click: () => {
|
||
|
|
app.isQuitting = true
|
||
|
|
app.quit()
|
||
|
|
},
|
||
|
|
},
|
||
|
|
])
|
||
|
|
|
||
|
|
tray.setContextMenu(contextMenu)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function destroyTray() {
|
||
|
|
if (tray) {
|
||
|
|
tray.destroy()
|
||
|
|
tray = null
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export { tray }
|