feat: add a startup switch for quick assistant

This commit is contained in:
kangfenmao
2025-01-19 19:22:10 +08:00
parent aecc5fefcf
commit 9c55b4516c
15 changed files with 137 additions and 33 deletions
+9
View File
@@ -14,6 +14,7 @@ import FileStorage from './services/FileStorage'
import { GeminiService } from './services/GeminiService'
import KnowledgeService from './services/KnowledgeService'
import { registerShortcuts, unregisterAllShortcuts } from './services/ShortcutService'
import { TrayService } from './services/TrayService'
import { windowService } from './services/WindowService'
import { compress, decompress } from './utils/zip'
@@ -52,6 +53,8 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
configManager.setTray(isActive)
})
ipcMain.handle('app:restart-tray', () => TrayService.getInstance().restartTray())
ipcMain.handle('config:set', (_, key: string, value: any) => {
configManager.set(key, value)
})
@@ -184,4 +187,10 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
ipcMain.handle('gemini:retrieve-file', GeminiService.retrieveFile)
ipcMain.handle('gemini:list-files', GeminiService.listFiles)
ipcMain.handle('gemini:delete-file', GeminiService.deleteFile)
// mini window
ipcMain.handle('miniwindow:show', () => windowService.showMiniWindow())
ipcMain.handle('miniwindow:hide', () => windowService.hideMiniWindow())
ipcMain.handle('miniwindow:close', () => windowService.closeMiniWindow())
ipcMain.handle('miniwindow:toggle', () => windowService.toggleMiniWindow())
}
+8
View File
@@ -92,6 +92,14 @@ export class ConfigManager {
this.store.set('clickTrayToShowQuickAssistant', value)
}
getEnableQuickAssistant(): boolean {
return this.store.get('enableQuickAssistant', false) as boolean
}
setEnableQuickAssistant(value: boolean) {
this.store.set('enableQuickAssistant', value)
}
set(key: string, value: any) {
this.store.set(key, value)
}
+22 -5
View File
@@ -1,6 +1,6 @@
import { isMac } from '@main/constant'
import { locales } from '@main/utils/locales'
import { app, Menu, nativeImage, nativeTheme, Tray } from 'electron'
import { app, Menu, MenuItemConstructorOptions, nativeImage, nativeTheme, Tray } from 'electron'
import icon from '../../../build/tray_icon.png?asset'
import iconDark from '../../../build/tray_icon_dark.png?asset'
@@ -9,11 +9,17 @@ import { configManager } from './ConfigManager'
import { windowService } from './WindowService'
export class TrayService {
private static instance: TrayService
private tray: Tray | null = null
constructor() {
this.updateTray()
this.watchTrayChanges()
TrayService.instance = this
}
public static getInstance() {
return TrayService.instance
}
private createTray() {
@@ -40,12 +46,14 @@ export class TrayService {
const locale = locales[configManager.getLanguage()]
const { tray: trayLocale } = locale.translation
const contextMenu = Menu.buildFromTemplate([
const enableQuickAssistant = configManager.getEnableQuickAssistant()
const template = [
{
label: trayLocale.show_window,
click: () => windowService.showMainWindow()
},
{
enableQuickAssistant && {
label: trayLocale.show_mini_window,
click: () => windowService.showMiniWindow()
},
@@ -54,7 +62,9 @@ export class TrayService {
label: trayLocale.quit,
click: () => this.quit()
}
])
].filter(Boolean) as MenuItemConstructorOptions[]
const contextMenu = Menu.buildFromTemplate(template)
if (process.platform === 'linux') {
this.tray.setContextMenu(contextMenu)
@@ -67,7 +77,7 @@ export class TrayService {
})
this.tray.on('click', () => {
if (configManager.getClickTrayToShowQuickAssistant()) {
if (enableQuickAssistant && configManager.getClickTrayToShowQuickAssistant()) {
windowService.showMiniWindow()
} else {
windowService.showMainWindow()
@@ -84,6 +94,13 @@ export class TrayService {
}
}
public restartTray() {
if (configManager.getTray()) {
this.destroyTray()
this.createTray()
}
}
private destroyTray() {
if (this.tray) {
this.tray.destroy()
+17 -11
View File
@@ -67,8 +67,6 @@ export class WindowService {
this.setupMainWindow(this.mainWindow, mainWindowState)
setTimeout(() => this.showMiniWindow(), 5000)
return this.mainWindow
}
@@ -241,6 +239,12 @@ export class WindowService {
}
public showMiniWindow() {
const enableQuickAssistant = configManager.getEnableQuickAssistant()
if (!enableQuickAssistant) {
return
}
if (this.selectionMenuWindow) {
this.selectionMenuWindow.hide()
}
@@ -260,7 +264,7 @@ export class WindowService {
this.miniWindow = new BrowserWindow({
width: 500,
height: 520,
show: false,
show: true,
autoHideMenuBar: true,
transparent: isMac,
vibrancy: 'under-window',
@@ -282,14 +286,6 @@ export class WindowService {
this.miniWindow?.hide()
})
this.miniWindow.on('close', (event) => {
if (this.isQuitting) {
return
}
event.preventDefault()
this.miniWindow?.hide()
})
this.miniWindow.on('closed', () => {
this.miniWindow = null
})
@@ -313,9 +309,19 @@ export class WindowService {
}
}
public hideMiniWindow() {
this.miniWindow?.hide()
}
public closeMiniWindow() {
this.miniWindow?.close()
}
public toggleMiniWindow() {
if (this.miniWindow) {
this.miniWindow.isVisible() ? this.miniWindow.hide() : this.miniWindow.show()
} else {
this.showMiniWindow()
}
}