From 668de93829714d3daa7dbfb53b80f8e2566cb9fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Gonz=C3=A1lez=20G=C3=B3mez?= Date: Sat, 7 Feb 2026 17:19:05 -0600 Subject: [PATCH] Open settings with shortcut (#1655) * Open settings with shortcut. Also add settings to menubar. --- src/main/menu.ts | 20 ++++++++++++++++++-- src/preload/utils.ts | 5 +++++ src/renderer/app.tsx | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/menu.ts b/src/main/menu.ts index f3f12cf08..4fb486eea 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -21,6 +21,14 @@ export default class MenuBuilder { selector: 'orderFrontStandardAboutPanel:', }, { type: 'separator' }, + { + accelerator: 'Command+,', + click: () => { + this.mainWindow.webContents.send('renderer-open-settings'); + }, + label: 'Settings', + }, + { type: 'separator' }, { label: 'Services', submenu: [] }, { type: 'separator' }, { @@ -151,8 +159,8 @@ export default class MenuBuilder { return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp]; } - buildDefaultTemplate() { - const templateDefault = [ + buildDefaultTemplate(): MenuItemConstructorOptions[] { + const templateDefault: MenuItemConstructorOptions[] = [ { label: '&File', submenu: [ @@ -160,6 +168,14 @@ export default class MenuBuilder { accelerator: 'Ctrl+O', label: '&Open', }, + { + accelerator: 'Ctrl+,', + click: () => { + this.mainWindow.webContents.send('renderer-open-settings'); + }, + label: '&Settings...', + }, + { type: 'separator' }, { accelerator: 'Ctrl+W', click: () => { diff --git a/src/preload/utils.ts b/src/preload/utils.ts index 5d0af57f1..130bc285f 100644 --- a/src/preload/utils.ts +++ b/src/preload/utils.ts @@ -61,6 +61,10 @@ const forceGarbageCollection = (): boolean => { } }; +const rendererOpenSettings = (cb: (event: IpcRendererEvent) => void) => { + ipcRenderer.on('renderer-open-settings', cb); +}; + export const utils = { checkForUpdates, disableAutoUpdates, @@ -74,6 +78,7 @@ export const utils = { openApplicationDirectory, openItem, playerErrorListener, + rendererOpenSettings, }; export type Utils = typeof utils; diff --git a/src/renderer/app.tsx b/src/renderer/app.tsx index 55ded0edd..3bbcdb58a 100644 --- a/src/renderer/app.tsx +++ b/src/renderer/app.tsx @@ -10,6 +10,7 @@ import isElectron from 'is-electron'; import { lazy, Suspense, useEffect, useMemo, useRef, useState } from 'react'; import i18n from '/@/i18n/i18n'; +import { openSettingsModal } from '/@/renderer/features/settings/utils/open-settings-modal'; import { WebAudioContext } from '/@/renderer/features/player/context/webaudio-context'; import { useCheckForUpdates } from '/@/renderer/hooks/use-check-for-updates'; import { useSyncSettingsToMain } from '/@/renderer/hooks/use-sync-settings-to-main'; @@ -79,6 +80,19 @@ export const App = () => { } }, [language]); + useEffect(() => { + if (isElectron()) { + window.api.utils.rendererOpenSettings(() => { + openSettingsModal(); + }); + + return () => { + ipc?.removeAllListeners('renderer-open-settings'); + }; + } + return undefined; + }, []); + const notificationStyles = useMemo( () => ({ root: {