electron-demo.js/menu.js

264 lines
5.3 KiB
JavaScript
Raw Normal View History

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;