import { app , Menu , shell , BrowserWindow , MenuItemConstructorOptions , } from 'electron' ; interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { selector ? : string ; submenu ? : DarwinMenuItemConstructorOptions [ ] | Menu ; } export default class MenuBuilder { mainWindow : BrowserWindow ; constructor ( mainWindow ) { this . mainWindow = mainWindow ; } buildMenu ( ) { if ( process . env . NODE_ENV === 'development' || process . env . DEBUG_PROD === 'true' ) { this . setupDevelopmentEnvironment ( ) ; } const template = process . platform === 'darwin' ? this . buildDarwinTemplate ( ) : this . buildDefaultTemplate ( ) ; const menu = Menu . buildFromTemplate ( template ) ; Menu . setApplicationMenu ( menu ) ; return menu ; } setupDevelopmentEnvironment ( ) { this . mainWindow . webContents . on ( 'context-menu' , ( _ , props ) => { const { x , y } = props ; Menu . buildFromTemplate ( [ { label : 'Inspect element' , click : ( ) => { this . mainWindow . webContents . inspectElement ( x , y ) ; } , } , ] ) . popup ( { window : this . mainWindow } ) ; } ) ; } buildDarwinTemplate ( ) { const subMenuAbout = { label : 'My Personal Kanban' , submenu : [ { label : 'About My Personal Kanban' , selector : 'orderFrontStandardAboutPanel:' , } , { type : 'separator' } , { label : 'Hide My Personal Kanban' , accelerator : 'Command+H' , selector : 'hide:' , } , { label : 'Hide Others' , accelerator : 'Command+Shift+H' , selector : 'hideOtherApplications:' , } , { label : 'Show All' , selector : 'unhideAllApplications:' } , { type : 'separator' } , { label : 'Quit' , accelerator : 'Command+Q' , click : ( ) => { app . quit ( ) ; } , } , ] , } ; const subMenuEdit = { label : 'Edit' , submenu : [ { label : 'Copy' , accelerator : 'Command+C' , selector : 'copy:' } , { label : 'Paste' , accelerator : 'Command+V' , selector : 'paste:' } , ] , } ; const subMenuViewDev = { label : 'View' , submenu : [ { label : 'Reload' , accelerator : 'Command+R' , click : ( ) => { this . mainWindow . webContents . reload ( ) ; } , } , { label : 'Toggle Full Screen' , accelerator : 'Ctrl+Command+F' , click : ( ) => { this . mainWindow . setFullScreen ( ! this . mainWindow . isFullScreen ( ) ) ; } , } , { label : 'Toggle Developer Tools' , accelerator : 'Alt+Command+I' , click : ( ) => { this . mainWindow . webContents . toggleDevTools ( ) ; } , } , ] , } ; const subMenuViewProd = { label : 'View' , submenu : [ { label : 'Toggle Full Screen' , accelerator : 'Ctrl+Command+F' , click : ( ) => { this . mainWindow . setFullScreen ( ! this . mainWindow . isFullScreen ( ) ) ; } , } , ] , } ; const subMenuWindow = { label : 'Window' , submenu : [ { label : 'Minimize' , accelerator : 'Command+M' , selector : 'performMiniaturize:' , } , ] , } ; const subMenuHelp = { label : 'Help' , submenu : [ { label : 'Learn More' , click ( ) { shell . openExternal ( 'https://greggigon.com/my-personal-kanban' ) ; } , } , ] , } ; const subMenuView = process . env . NODE_ENV === 'development' || process . env . DEBUG_PROD === 'true' ? subMenuViewDev : subMenuViewProd ; return [ subMenuAbout , subMenuEdit , subMenuView , subMenuWindow , subMenuHelp ] ; } buildDefaultTemplate ( ) { const templateDefault = [ { label : '&File' , submenu : [ { label : '&Close' , accelerator : 'Ctrl+W' , click : ( ) => { this . mainWindow . close ( ) ; } , } , ] , } , { label : '&View' , submenu : process . env . NODE_ENV === 'development' || process . env . DEBUG_PROD === 'true' ? [ { label : '&Reload' , accelerator : 'Ctrl+R' , click : ( ) => { this . mainWindow . webContents . reload ( ) ; } , } , { label : 'Toggle &Full Screen' , accelerator : 'F11' , click : ( ) => { this . mainWindow . setFullScreen ( ! this . mainWindow . isFullScreen ( ) ) ; } , } , { label : 'Toggle &Developer Tools' , accelerator : 'Alt+Ctrl+I' , click : ( ) => { this . mainWindow . webContents . toggleDevTools ( ) ; } , } , ] : [ { label : 'Toggle &Full Screen' , accelerator : 'F11' , click : ( ) => { this . mainWindow . setFullScreen ( ! this . mainWindow . isFullScreen ( ) ) ; } , } , ] , } , { label : 'Help' , submenu : [ { label : 'Learn More' , click ( ) { shell . openExternal ( 'https://greggigon.com/my-personal-kanban' ) ; } , } , ] , } , ] ; return templateDefault ; } }