211 lines
6.6 KiB
JavaScript
211 lines
6.6 KiB
JavaScript
/**
|
|
* 菜单栏模块
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
class Menubar {
|
|
|
|
constructor(electron, app, mainWindow) {
|
|
|
|
const Menu = electron.Menu;
|
|
const Tray = electron.Tray;
|
|
const nativeImage = electron.nativeImage;
|
|
const path = require('path');
|
|
|
|
// 清空菜单栏
|
|
Menu.setApplicationMenu(Menu.buildFromTemplate([]));
|
|
// 监听重载菜单事件
|
|
electron.ipcMain
|
|
.on('quit', app.quit.bind(app))
|
|
.on('menubar', this.reload.bind(this));
|
|
|
|
this.electron = electron;
|
|
this.app = app;
|
|
this.Menu = Menu;
|
|
this.Tray = Tray;
|
|
this.nativeImage = nativeImage;
|
|
this.path = path;
|
|
this.trayIcon = null;
|
|
this.mainWindow = mainWindow;
|
|
}
|
|
|
|
/**
|
|
* 重新载入菜单
|
|
* @param {Object} event ipcMain对象
|
|
* @param {Object} LANG 语言模板
|
|
* @return {[type]} [description]
|
|
*/
|
|
reload(event, LANG) {
|
|
// 菜单模板
|
|
const template = [
|
|
{
|
|
// 主菜单
|
|
label: LANG['main']['title'],
|
|
submenu: [
|
|
{
|
|
label: LANG['main']['about'],
|
|
accelerator: 'Shift+CmdOrCtrl+I',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings-about')
|
|
}, {
|
|
label: LANG['main']['language'],
|
|
accelerator: 'Shift+CmdOrCtrl+L',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings-language')
|
|
}, {
|
|
label: LANG['main']['aproxy'],
|
|
accelerator: 'Shift+CmdOrCtrl+A',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings-aproxy')
|
|
}, {
|
|
label: LANG['main']['display'],
|
|
accelerator: 'Shift+CmdOrCtrl+D',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings-display')
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['main']['encoders'],
|
|
accelerator: 'Shift+CmdOrCtrl+E',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings-encoders')
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['main']['settings'],
|
|
accelerator: 'Shift+CmdOrCtrl+S',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings')
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['main']['pluginStore'],
|
|
accelerator: 'Shift+CmdOrCtrl+P',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'plugin-store')
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['main']['quit'],
|
|
accelerator: 'Command+Q',
|
|
click: this.app.quit.bind(this.app)
|
|
},
|
|
]
|
|
}, {
|
|
// 编辑
|
|
label: LANG['edit']['title'],
|
|
submenu: [
|
|
{
|
|
label: LANG['edit']['undo'], accelerator: 'CmdOrCtrl+Z', role: 'undo'
|
|
}, {
|
|
label: LANG['edit']['redo'], accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo'
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['edit']['cut'], accelerator: 'CmdOrCtrl+X', role: 'cut'
|
|
}, {
|
|
label: LANG['edit']['copy'], accelerator: 'CmdOrCtrl+C', role: 'copy'
|
|
}, {
|
|
label: LANG['edit']['paste'], accelerator: 'CmdOrCtrl+V', role: 'paste'
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['edit']['selectall'], accelerator: 'CmdOrCtrl+A', role: 'selectall'
|
|
}
|
|
]
|
|
}, {
|
|
// 窗口
|
|
label: LANG['window']['title'],
|
|
submenu: [
|
|
{
|
|
label: LANG['window']['next'], accelerator: 'Shift+CmdOrCtrl+Right',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'tabbar-next')
|
|
}, {
|
|
label: LANG['window']['prev'], accelerator: 'Shift+CmdOrCtrl+Left',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'tabbar-prev')
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['window']['close'], accelerator: 'Shift+CmdOrCtrl+W',
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'tabbar-close')
|
|
}
|
|
]
|
|
}, {
|
|
// 调试
|
|
label: LANG['debug']['title'],
|
|
submenu: [
|
|
{
|
|
label: LANG['debug']['restart'],
|
|
accelerator: 'Shift+CmdOrCtrl+R',
|
|
click: () => {
|
|
// 在有多个窗口的时候,不刷新
|
|
if (this.electron.BrowserWindow.getAllWindows().length > 1) {
|
|
return;
|
|
}
|
|
this.mainWindow.webContents.reload();//.bind(this.mainWindow.webContents)
|
|
}
|
|
}, {
|
|
label: LANG['debug']['devtools'],
|
|
accelerator: 'Alt+CmdOrCtrl+J',
|
|
click: this.mainWindow.webContents.toggleDevTools.bind(this.mainWindow.webContents)
|
|
}
|
|
]
|
|
}
|
|
];
|
|
// 更新菜单栏
|
|
this.Menu.setApplicationMenu(this.Menu.buildFromTemplate(template));
|
|
if (this.trayIcon) {
|
|
this.trayIcon.setContextMenu(this.Menu.buildFromTemplate([]));
|
|
}else{
|
|
let image;
|
|
if (process.platform === 'darwin' || process.platform === 'linux') {
|
|
image = this.nativeImage.createFromPath(this.path.join(__dirname, '../static/imgs/tray-icon-mac-2.png'));
|
|
}else{
|
|
// windows下的Tray图标
|
|
image = this.nativeImage.createFromPath(this.path.join(__dirname, '../static/imgs/tray-icon-win-colorful.ico'));
|
|
}
|
|
image.setTemplateImage(true);
|
|
this.trayIcon = new this.Tray(image);
|
|
}
|
|
var trayMenuTemplate = [
|
|
{
|
|
label: LANG['tray']['show'],
|
|
click: () => {
|
|
this.mainWindow.show();
|
|
}
|
|
}, {
|
|
label: LANG['tray']['hide'],
|
|
click: () => {
|
|
if (process.platform == 'darwin') {
|
|
this.app.hide();
|
|
}else{
|
|
this.mainWindow.hide();
|
|
}
|
|
}
|
|
}, {
|
|
label: LANG['tray']['settings'],
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings')
|
|
}, {
|
|
label: LANG['tray']['about'],
|
|
click: event.sender.send.bind(event.sender, 'menubar', 'settings-about')
|
|
}, {
|
|
type: 'separator'
|
|
}, {
|
|
label: LANG['tray']['quit'],
|
|
click: this.app.quit.bind(this.app)
|
|
}
|
|
];
|
|
|
|
this.trayIcon.on('click', () => {
|
|
if (process.platform == 'darwin') return;
|
|
if (this.mainWindow.isVisible()) {
|
|
this.mainWindow.hide();
|
|
}else{
|
|
this.mainWindow.show();
|
|
}
|
|
});
|
|
|
|
this.trayIcon.setToolTip(LANG['tray']['tip']);
|
|
|
|
this.trayIcon.setContextMenu(this.Menu.buildFromTemplate(trayMenuTemplate));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = Menubar;
|