313 lines
7.1 KiB
JavaScript
313 lines
7.1 KiB
JavaScript
|
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;
|