var electron = require('electron'); var app = electron.app; var win, menu; function getMenuItem (label) { var menuItem; menu.items.some(function (topLvl) { menuItem = topLvl.submenu.items.find(function (item) { return item.label === label; }); return menuItem; }); return menuItem || {}; } function updateFullScreenCheckbox() { getMenuItem('Full Screen').checked = win.isFullScreen(); win.setMenuBarVisibility(!win.isFullScreen()); } function toggleFullScreen(flag) { if (!win || !win.isVisible()) { return; } if (typeof flag !== 'boolean') { flag = !win.isFullScreen(); } if (flag) { // Fullscreen and aspect ratio do not play well together. (Mac) win.setAspectRatio(0); } win.setFullScreen(flag); } // Sets whether the window should always show on top of other windows function toggleAlwaysOnTop(flag) { if (!win) { return; } if (typeof flag !== 'boolean') { flag = !win.isAlwaysOnTop(); } win.setAlwaysOnTop(flag); getMenuItem('Float on Top').checked = flag; } function toggleDevTools() { if (!win) { return; } if (win.webContents.isDevToolsOpened()) { win.webContents.closeDevTools(); } else { win.webContents.openDevTools(); } } function init(window) { if (win) { console.error("can't initialize the tray mulitple times"); return; } win = window; var template = [ { label: 'File', submenu: [ { role: 'close' } ] }, { label: 'Edit', submenu: [ { role: 'undo' }, { role: 'redo' }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, { role: 'paste' }, { role: 'delete' }, { role: 'selectall' } ] }, { label: 'View', submenu: [ { label: 'Full Screen', type: 'checkbox', accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', click: toggleFullScreen, }, { label: 'Float on Top', type: 'checkbox', click: toggleAlwaysOnTop, }, { type: 'separator' }, { type: 'separator' }, { label: 'Developer', submenu: [ { label: 'Developer Tools', accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', click: toggleDevTools, }, ] } ] }, ]; if (process.platform === 'darwin') { // WebTorrent menu (Mac) template.unshift({ label: 'Electron Demo', submenu: [ { role: 'about' }, { type: 'separator' }, { label: 'Preferences', accelerator: 'Cmd+,', click: function () { console.log('TODO: implement preferences'); } }, { type: 'separator' }, { role: 'services', submenu: [] }, { type: 'separator' }, { role: 'hide' }, { role: 'hideothers' }, { role: 'unhide' }, { type: 'separator' }, { role: 'quit' } ] }); // Edit menu (Mac) template[2].submenu.push( { type: 'separator' }, { label: 'Speech', submenu: [ { role: 'startspeaking' }, { role: 'stopspeaking' } ] } ); // Window menu (Mac) template.push({ role: 'window', submenu: [ { role: 'minimize' }, { type: 'separator' }, { role: 'front' } ] }); } // On Windows and Linux, open dialogs do not support selecting both files and // folders and files, so add an extra menu item so there is one for each type. if (process.platform === 'linux' || process.platform === 'win32') { // Edit menu (Windows, Linux) template[1].submenu.push( { type: 'separator' }, { label: 'Preferences', accelerator: 'CmdOrCtrl+,', click: function () { console.log('TODO: implement preferences'); } } ); // Add an help.about option template.push({ label: 'Help', submenu: [ { label: 'About', click: function () { console.log('TODO: implement about'); }, } ], }); } // Add "File > Quit" menu item so Linux distros where the system tray icon is // missing will have a way to quit the app. if (process.platform === 'linux') { // File menu (Linux) template[0].submenu.push({ label: 'Quit', accelerator: 'CmdOrCtrl+Q', click: function () { return app.quit(); } }); } menu = electron.Menu.buildFromTemplate(template); electron.Menu.setApplicationMenu(menu); win.webContents.on('dom-ready', updateFullScreenCheckbox); win.on('enter-full-screen', updateFullScreenCheckbox); win.on('leave-full-screen', updateFullScreenCheckbox); } module.exports.init = init;