127 lines
3.6 KiB
TypeScript
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,
|
|
}
|
|
}
|
|
}
|