Files
youtube-music/src/plugins/synced-lyrics/menu.ts
2025-09-07 13:35:29 +09:00

182 lines
5.3 KiB
TypeScript

import { t } from '@/i18n';
import { providerNames } from './providers';
import type { MenuItemConstructorOptions } from 'electron';
import type { MenuContext } from '@/types/contexts';
import type { SyncedLyricsPluginConfig } from './types';
export const menu = async (
ctx: MenuContext<SyncedLyricsPluginConfig>,
): Promise<MenuItemConstructorOptions[]> => {
const config = await ctx.getConfig();
return [
{
label: t('plugins.synced-lyrics.menu.preferred-provider.label'),
toolTip: t('plugins.synced-lyrics.menu.preferred-provider.tooltip'),
type: 'submenu',
submenu: [
{
label: t('plugins.synced-lyrics.menu.preferred-provider.none.label'),
toolTip: t(
'plugins.synced-lyrics.menu.preferred-provider.none.tooltip',
),
type: 'radio',
checked: config.preferredProvider === undefined,
click() {
ctx.setConfig({ preferredProvider: undefined });
},
},
...providerNames.map(
(provider) =>
({
label: provider,
type: 'radio',
checked: config.preferredProvider === provider,
click() {
ctx.setConfig({ preferredProvider: provider });
},
}) as const,
),
],
},
{
label: t('plugins.synced-lyrics.menu.precise-timing.label'),
toolTip: t('plugins.synced-lyrics.menu.precise-timing.tooltip'),
type: 'checkbox',
checked: config.preciseTiming,
click(item) {
ctx.setConfig({
preciseTiming: item.checked,
});
},
},
{
label: t('plugins.synced-lyrics.menu.line-effect.label'),
toolTip: t('plugins.synced-lyrics.menu.line-effect.tooltip'),
type: 'submenu',
submenu: [
{
label: t(
'plugins.synced-lyrics.menu.line-effect.submenu.fancy.label',
),
toolTip: t(
'plugins.synced-lyrics.menu.line-effect.submenu.fancy.tooltip',
),
type: 'radio',
checked: config.lineEffect === 'fancy',
click() {
ctx.setConfig({
lineEffect: 'fancy',
});
},
},
{
label: t(
'plugins.synced-lyrics.menu.line-effect.submenu.scale.label',
),
toolTip: t(
'plugins.synced-lyrics.menu.line-effect.submenu.scale.tooltip',
),
type: 'radio',
checked: config.lineEffect === 'scale',
click() {
ctx.setConfig({
lineEffect: 'scale',
});
},
},
{
label: t(
'plugins.synced-lyrics.menu.line-effect.submenu.offset.label',
),
toolTip: t(
'plugins.synced-lyrics.menu.line-effect.submenu.offset.tooltip',
),
type: 'radio',
checked: config.lineEffect === 'offset',
click() {
ctx.setConfig({
lineEffect: 'offset',
});
},
},
{
label: t(
'plugins.synced-lyrics.menu.line-effect.submenu.focus.label',
),
toolTip: t(
'plugins.synced-lyrics.menu.line-effect.submenu.focus.tooltip',
),
type: 'radio',
checked: config.lineEffect === 'focus',
click() {
ctx.setConfig({
lineEffect: 'focus',
});
},
},
],
},
{
label: t('plugins.synced-lyrics.menu.default-text-string.label'),
toolTip: t('plugins.synced-lyrics.menu.default-text-string.tooltip'),
type: 'submenu',
submenu: [
{ label: '♪', value: '♪' },
{ label: '" "', value: ' ' },
{ label: '...', value: ['.', '..', '...'] },
{ label: '•••', value: ['•', '••', '•••'] },
{ label: '———', value: '———' },
].map(({ label, value }) => ({
label,
type: 'radio',
checked:
typeof value === 'string'
? config.defaultTextString === value
: JSON.stringify(config.defaultTextString) ===
JSON.stringify(value),
click() {
ctx.setConfig({ defaultTextString: value });
},
})),
},
{
label: t('plugins.synced-lyrics.menu.romanization.label'),
toolTip: t('plugins.synced-lyrics.menu.romanization.tooltip'),
type: 'checkbox',
checked: config.romanization,
click(item) {
ctx.setConfig({
romanization: item.checked,
});
},
},
{
label: t('plugins.synced-lyrics.menu.show-time-codes.label'),
toolTip: t('plugins.synced-lyrics.menu.show-time-codes.tooltip'),
type: 'checkbox',
checked: config.showTimeCodes,
click(item) {
ctx.setConfig({
showTimeCodes: item.checked,
});
},
},
{
label: t('plugins.synced-lyrics.menu.show-lyrics-even-if-inexact.label'),
toolTip: t(
'plugins.synced-lyrics.menu.show-lyrics-even-if-inexact.tooltip',
),
type: 'checkbox',
checked: config.showLyricsEvenIfInexact,
click(item) {
ctx.setConfig({
showLyricsEvenIfInexact: item.checked,
});
},
},
];
};