feat(menu): add theme list in menu

This commit is contained in:
Su-Yong
2024-05-22 18:06:20 +09:00
parent 4557aff9b6
commit 933b4cc8f0
2 changed files with 91 additions and 65 deletions

View File

@ -162,6 +162,14 @@
"submenu": { "submenu": {
"import-css-file": "Import custom CSS file", "import-css-file": "Import custom CSS file",
"no-theme": "No theme" "no-theme": "No theme"
},
"dialog": {
"remove-theme": "Are you sure you want to remove the custom theme?",
"remove-theme-message": "This will remove the custom theme",
"button": {
"cancel": "Cancel",
"remove": "Remove"
}
} }
} }
} }

View File

@ -1,13 +1,5 @@
import is from 'electron-is'; import is from 'electron-is';
import { import { app, BrowserWindow, clipboard, dialog, Menu, MenuItem, shell, } from 'electron';
app,
BrowserWindow,
clipboard,
dialog,
Menu,
MenuItem,
shell,
} from 'electron';
import prompt from 'custom-electron-prompt'; import prompt from 'custom-electron-prompt';
import { satisfies } from 'semver'; import { satisfies } from 'semver';
@ -235,16 +227,41 @@ export const mainMenuTemplate = async (
'main.menu.options.submenu.visual-tweaks.submenu.theme.label', 'main.menu.options.submenu.visual-tweaks.submenu.theme.label',
), ),
submenu: [ submenu: [
{ ...((config.get('options.themes')?.length ?? 0) === 0
label: t( ? [
'main.menu.options.submenu.visual-tweaks.submenu.theme.submenu.no-theme', {
), label: t(
type: 'radio', 'main.menu.options.submenu.visual-tweaks.submenu.theme.submenu.no-theme',
checked: config.get('options.themes')?.length === 0, // Todo rename "themes" ),
click() { }
config.set('options.themes', []); ]
}, : []),
}, ...config.get('options.themes')?.map((theme: string) => ({
type: 'normal' as const,
label: theme,
async click() {
const { response } = await dialog.showMessageBox(win, {
type: 'question',
defaultId: 1,
title: t(
'main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.remove-theme',
),
message: t(
'main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.remove-theme-message',
{ theme },
),
buttons: [
t('main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.button.cancel'),
t('main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.button.remove'),
],
});
if (response === 1) {
config.set('options.themes', config.get('options.themes')?.filter((t) => t !== theme));
innerRefreshMenu();
}
}
})),
{ type: 'separator' }, { type: 'separator' },
{ {
label: t( label: t(
@ -258,6 +275,7 @@ export const mainMenuTemplate = async (
}); });
if (filePaths) { if (filePaths) {
config.set('options.themes', filePaths); config.set('options.themes', filePaths);
innerRefreshMenu();
} }
}, },
}, },
@ -288,40 +306,40 @@ export const mainMenuTemplate = async (
}, },
...((is.windows() || is.linux() ...((is.windows() || is.linux()
? [ ? [
{ {
label: t('main.menu.options.submenu.hide-menu.label'), label: t('main.menu.options.submenu.hide-menu.label'),
type: 'checkbox', type: 'checkbox',
checked: config.get('options.hideMenu'), checked: config.get('options.hideMenu'),
click(item) { click(item) {
config.setMenuOption('options.hideMenu', item.checked); config.setMenuOption('options.hideMenu', item.checked);
if (item.checked && !config.get('options.hideMenuWarned')) { if (item.checked && !config.get('options.hideMenuWarned')) {
dialog.showMessageBox(win, { dialog.showMessageBox(win, {
type: 'info', type: 'info',
title: t( title: t(
'main.menu.options.submenu.hide-menu.dialog.title', 'main.menu.options.submenu.hide-menu.dialog.title',
), ),
message: t( message: t(
'main.menu.options.submenu.hide-menu.dialog.message', 'main.menu.options.submenu.hide-menu.dialog.message',
), ),
}); });
} }
},
}, },
] },
]
: []) satisfies Electron.MenuItemConstructorOptions[]), : []) satisfies Electron.MenuItemConstructorOptions[]),
...((is.windows() || is.macOS() ...((is.windows() || is.macOS()
? // Only works on Win/Mac ? // Only works on Win/Mac
// https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows // https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows
[ [
{ {
label: t('main.menu.options.submenu.start-at-login'), label: t('main.menu.options.submenu.start-at-login'),
type: 'checkbox', type: 'checkbox',
checked: config.get('options.startAtLogin'), checked: config.get('options.startAtLogin'),
click(item) { click(item) {
config.setMenuOption('options.startAtLogin', item.checked); config.setMenuOption('options.startAtLogin', item.checked);
},
}, },
] },
]
: []) satisfies Electron.MenuItemConstructorOptions[]), : []) satisfies Electron.MenuItemConstructorOptions[]),
{ {
label: t('main.menu.options.submenu.tray.label'), label: t('main.menu.options.submenu.tray.label'),
@ -475,25 +493,25 @@ export const mainMenuTemplate = async (
{ type: 'separator' }, { type: 'separator' },
is.macOS() is.macOS()
? { ? {
label: t( label: t(
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools', 'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
), ),
// Cannot use "toggleDevTools" role in macOS // Cannot use "toggleDevTools" role in macOS
click() { click() {
const { webContents } = win; const { webContents } = win;
if (webContents.isDevToolsOpened()) { if (webContents.isDevToolsOpened()) {
webContents.closeDevTools(); webContents.closeDevTools();
} else { } else {
webContents.openDevTools(); webContents.openDevTools();
} }
},
}
: {
label: t(
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
),
role: 'toggleDevTools',
}, },
}
: {
label: t(
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
),
role: 'toggleDevTools',
},
{ {
label: t( label: t(
'main.menu.options.submenu.advanced-options.submenu.edit-config-json', 'main.menu.options.submenu.advanced-options.submenu.edit-config-json',