thedesk/src/main/ApplicationMenu.ts
2019-04-22 18:39:16 +09:00

127 lines
3.6 KiB
TypeScript

import {
app,
shell,
Menu,
MenuItemConstructorOptions
} from 'electron'
import Window from './Window'
import { bugs } from '../../package.json'
import { documentURL } from '../../info.json'
const isMac = process.platform === 'darwin'
export default class ApplicationMenu {
// Mac only menu. prefix `macOnly`. First Item always separator
private static macOnlyAppMenu: MenuItemConstructorOptions[] = [
{ type: 'separator' },
{ role: 'services' },
{ type: 'separator' },
{ role: 'hide' },
{ role: 'hideOthers' },
{ role: 'unhide' },
]
private static macOnlyEditMenu: MenuItemConstructorOptions[] = [
{ type: 'separator' },
{
label: 'Speech',
submenu: [
{ role: 'startspeaking' },
{ role: 'stopspeaking' },
]
}
]
private static aboutMenuItem: MenuItemConstructorOptions = {
label: !isMac ? 'About' : `About ${app.getName()}`,
click: () => Window.About(),
}
public static get menuConstruct(): MenuItemConstructorOptions[] {
return [
this.AppMenu(),
this.EditMenu(),
this.ViewMenu(),
this.WindowMenu(),
this.HelpMenu(),
]
}
public static buildTemplate(): Menu {
return Menu.buildFromTemplate(this.menuConstruct)
}
private static AppMenu(): MenuItemConstructorOptions {
let appMenu: MenuItemConstructorOptions[] = [
this.aboutMenuItem,
...(isMac ? this.macOnlyAppMenu : []),
{ type: 'separator' },
{ role: 'quit' },
]
return {
label: app.getName(),
submenu: appMenu,
}
}
private static EditMenu(): MenuItemConstructorOptions {
let editMenu: MenuItemConstructorOptions[] = [
{ role: 'undo' },
{ role: 'redo' },
{ type: 'separator' },
{ role: 'cut' },
{ role: 'copy' },
{ role: 'paste' },
{ role: 'pasteandmatchstyle' },
{ role: 'delete' },
{ role: 'selectall' },
...(isMac ? this.macOnlyEditMenu : []),
]
return {
label: 'Edit',
submenu: editMenu,
}
}
private static ViewMenu(): MenuItemConstructorOptions {
let viewMenu: MenuItemConstructorOptions[] = [
{ role: 'reload' },
{ role: 'forcereload' },
{ role: 'toggledevtools' },
{ type: 'separator' },
{ role: 'togglefullscreen' },
]
return {
label: 'View',
submenu: viewMenu
}
}
private static WindowMenu(): MenuItemConstructorOptions {
let windowMenu: MenuItemConstructorOptions[] = isMac ? [
{ role: 'close' },
{ role: 'minimize' },
{ role: 'zoom' },
{ type: 'separator' },
{ role: 'front' },
] : [
{ role: 'minimize' },
{ role: 'close' },
]
return {
label: 'Window',
submenu: windowMenu,
}
}
private static HelpMenu(): MenuItemConstructorOptions {
let helpMenu: MenuItemConstructorOptions[] = [
{
label: 'Report an issue',
click: () => shell.openExternal(`${bugs.url}/new`),
},
{
label: 'Learn More',
click: () => shell.openExternal(documentURL),
}
]
return {
label: 'Help',
submenu: helpMenu,
}
}
}