const { Menu, ipcMain, app, shell } = require('electron'); function getMenu(isDev, createWindow) { const template = [ { label: 'File', submenu: [ // { // label: 'Start Tutorial', // enabled: false, // click(item, focusedWindow) { // if ( // focusedWindow && // focusedWindow.webContents.getTitle() === 'Actual' // ) { // focusedWindow.webContents.executeJavaScript( // '__actionsForMenu.startTutorial()' // ); // } // } // }, { label: 'Manage Payees...', enabled: false, click(item, focusedWindow) { if ( focusedWindow && focusedWindow.webContents.getTitle() === 'Actual' ) { focusedWindow.webContents.executeJavaScript( '__actionsForMenu.pushModal("manage-payees")' ); } } }, { label: 'Manage Rules...', enabled: false, click(item, focusedWindow) { if ( focusedWindow && focusedWindow.webContents.getTitle() === 'Actual' ) { focusedWindow.webContents.executeJavaScript( '__actionsForMenu.pushModal("manage-rules")' ); } } }, { label: 'Load Backup...', enabled: false, click(item, focusedWindow) { if (focusedWindow) { if (focusedWindow.webContents.getTitle() === 'Actual') { focusedWindow.webContents.executeJavaScript( "__actionsForMenu.replaceModal('load-backup')" ); } } } }, { type: 'separator' }, { label: 'Manage files...', accelerator: 'CmdOrCtrl+O', click(item, focusedWindow) { if (focusedWindow) { if (focusedWindow.webContents.getTitle() === 'Actual') { focusedWindow.webContents.executeJavaScript( '__actionsForMenu.closeBudget()' ); } else { focusedWindow.close(); } } else { // The default page is the budget list createWindow(); } } } ] }, { label: 'Edit', submenu: [ { label: 'Undo', enabled: false, accelerator: 'CmdOrCtrl+Z', click: function(menuItem, focusedWin) { // Undo focusedWin.webContents.executeJavaScript('__actionsForMenu.undo()'); } }, { label: 'Redo', enabled: false, accelerator: 'Shift+CmdOrCtrl+Z', click: function(menuItem, focusedWin) { // Redo focusedWin.webContents.executeJavaScript('__actionsForMenu.redo()'); } }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, { role: 'paste' }, { role: 'pasteandmatchstyle' }, { role: 'delete' }, { role: 'selectall' } ] }, { label: 'View', submenu: [ isDev && { label: 'Reload', accelerator: 'CmdOrCtrl+R', click(item, focusedWindow) { if (focusedWindow) focusedWindow.reload(); } }, { label: 'Toggle Developer Tools', accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', click(item, focusedWindow) { if (focusedWindow) focusedWindow.webContents.toggleDevTools(); } }, isDev && { type: 'separator' }, { role: 'resetzoom' }, { role: 'zoomin' }, { role: 'zoomout' }, { type: 'separator' }, { role: 'togglefullscreen' } ].filter(x => x) }, { label: 'Tools', submenu: [ { label: 'Find schedules', enabled: false, click: function(menuItem, focusedWin) { focusedWin.webContents.executeJavaScript( '__history && __history.push("/schedule/discover", { locationPtr: __history.location })' ); } }, { label: 'Repair split transactions', enabled: false, click: function(menuItem, focusedWin) { focusedWin.webContents.executeJavaScript( '__history && __history.push("/tools/fix-splits", { locationPtr: __history.location })' ); } } ] }, { role: 'window', submenu: [ { role: 'minimize' } ] }, { role: 'help', submenu: [ { label: 'Learn More', click() { shell.openExternal('https://actualbudget.com'); } } ] } ]; if (process.platform === 'win32') { // Add about to help menu on Windows template[template.length - 1].submenu.unshift({ label: 'About Actual', click() { ipcMain.emit('show-about'); } }); } else if (process.platform === 'darwin') { const name = app.getName(); template.unshift({ label: name, submenu: [ { label: 'About Actual', click() { ipcMain.emit('show-about'); } }, isDev && { label: 'Screenshot', click() { ipcMain.emit('screenshot'); } }, { type: 'separator' }, { role: 'services', submenu: [] }, { type: 'separator' }, { role: 'hide' }, { role: 'hideothers' }, { role: 'unhide' }, { type: 'separator' }, { role: 'quit' } ].filter(x => x) }); // Edit menu. let editIdx = template.findIndex(t => t.label === 'Edit'); template[editIdx].submenu.push( { type: 'separator' }, { label: 'Speech', submenu: [ { role: 'startspeaking' }, { role: 'stopspeaking' } ] } ); // Window menu. let windowIdx = template.findIndex(t => t.role === 'window'); template[windowIdx].submenu = [ { label: 'Close', accelerator: 'CmdOrCtrl+W', role: 'close' }, { label: 'Minimize', accelerator: 'CmdOrCtrl+M', role: 'minimize' }, { label: 'Zoom', role: 'zoom' }, { type: 'separator' }, { label: 'Bring All to Front', role: 'front' } ]; } return Menu.buildFromTemplate(template); } module.exports = getMenu;