diff --git a/src/main/ipc.ts b/src/main/ipc.ts index e0bf131..46afde5 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -121,6 +121,20 @@ handle(IpcEvents.SELECT_VENCORD_DIR, async () => { return dir; }); +handle(IpcEvents.SELECT_TRAY_ICON, async () => { + const res = await dialog.showOpenDialog(mainWin!, { + properties: ["openFile"], + filters: [{name: "Image", extensions: ["png", "jpg"]}] + }); + if (!res.filePaths.length) return "cancelled"; + + const dir = res.filePaths[0]; + const image = nativeImage.createFromPath(dir); + if(image.isEmpty()) return "invalid"; + + return dir; +}); + handle(IpcEvents.SET_BADGE_COUNT, (_, count: number) => setBadgeCount(count)); handle(IpcEvents.CLIPBOARD_COPY_IMAGE, async (_, buf: ArrayBuffer, src: string) => { diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 7e0afde..16c5d77 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -12,6 +12,7 @@ import { Menu, MenuItemConstructorOptions, nativeTheme, + nativeImage, Tray } from "electron"; import { rm } from "fs/promises"; @@ -20,7 +21,7 @@ import { IpcEvents } from "shared/IpcEvents"; import { isTruthy } from "shared/utils/guards"; import { once } from "shared/utils/once"; import type { SettingsStore } from "shared/utils/SettingsStore"; - +import { existsSync } from "fs"; import { ICON_PATH } from "../shared/paths"; import { createAboutWindow } from "./about"; import { initArRPC } from "./arrpc"; @@ -120,8 +121,15 @@ function initTray(win: BrowserWindow) { } } ]); - - tray = new Tray(ICON_PATH); + if (Settings.store.trayIconPath) { + const trayImage = nativeImage.createFromPath(Settings.store.trayIconPath); + if (!trayImage.isEmpty()) tray = new Tray(trayImage.resize({width: 32, height: 32})); + else tray = new Tray(ICON_PATH); + } + else { + tray = new Tray(ICON_PATH); + } + tray.setToolTip("Vesktop"); tray.setContextMenu(trayMenu); tray.on("click", onTrayClick); @@ -273,7 +281,7 @@ function getWindowBoundsOptions(): BrowserWindowConstructorOptions { options.x = x; options.y = y; } - + if (!Settings.store.disableMinSize) { options.minWidth = MIN_WIDTH; options.minHeight = MIN_HEIGHT; @@ -328,6 +336,10 @@ function initSettingsListeners(win: BrowserWindow) { if (enable) initTray(win); else tray?.destroy(); }); + addSettingsListener("trayIconPath", _ => { + tray?.destroy(); + initTray(win); + }); addSettingsListener("disableMinSize", disable => { if (disable) { // 0 no work diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index 184b095..467bfb6 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -33,7 +33,8 @@ export const VesktopNative = { }, fileManager: { showItemInFolder: (path: string) => invoke(IpcEvents.SHOW_ITEM_IN_FOLDER, path), - selectVencordDir: () => invoke>(IpcEvents.SELECT_VENCORD_DIR) + selectVencordDir: () => invoke>(IpcEvents.SELECT_VENCORD_DIR), + selectTrayIcon: () => invoke>(IpcEvents.SELECT_TRAY_ICON) }, settings: { get: () => sendSync(IpcEvents.GET_SETTINGS), diff --git a/src/renderer/components/settings/Settings.tsx b/src/renderer/components/settings/Settings.tsx index d6de13c..3127308 100644 --- a/src/renderer/components/settings/Settings.tsx +++ b/src/renderer/components/settings/Settings.tsx @@ -15,6 +15,7 @@ import { AutoStartToggle } from "./AutoStartToggle"; import { DiscordBranchPicker } from "./DiscordBranchPicker"; import { NotificationBadgeToggle } from "./NotificationBadgeToggle"; import { VencordLocationPicker } from "./VencordLocationPicker"; +import { TrayIconImagePicker } from "./TrayIconImagePicker"; import { WindowsTransparencyControls } from "./WindowsTransparencyControls"; interface BooleanSetting { @@ -126,7 +127,8 @@ const SettingsOptions: Record> defaultValue: false } ], - "Vencord Location": [VencordLocationPicker] + "Tray Icon Image": [TrayIconImagePicker], + "Vencord Location": [VencordLocationPicker], }; function SettingsSections() { diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index df64403..407403b 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -24,6 +24,7 @@ export const enum IpcEvents { SET_SETTINGS = "VCD_SET_SETTINGS", SELECT_VENCORD_DIR = "VCD_SELECT_VENCORD_DIR", + SELECT_TRAY_ICON = "VCD_SELECT_TRAY_ICON", UPDATER_GET_DATA = "VCD_UPDATER_GET_DATA", UPDATER_DOWNLOAD = "VCD_UPDATER_DOWNLOAD", diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index 7f6e74a..c9d00ee 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -24,6 +24,7 @@ export interface Settings { /** @deprecated use customTitleBar */ discordWindowsTitleBar?: boolean; customTitleBar?: boolean; + trayIconPath?: string checkUpdates?: boolean;