mirror of
https://github.com/actualbudget/actual.git
synced 2026-05-07 12:28:57 -05:00
262 lines
5.7 KiB
JavaScript
262 lines
5.7 KiB
JavaScript
const { Menu, ipcMain, app, shell } = require('electron');
|
|
|
|
function getMenu(isDev, createWindow) {
|
|
const template = [
|
|
{
|
|
label: 'File',
|
|
submenu: [
|
|
{
|
|
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(
|
|
'window.__actionsForMenu && window.__actionsForMenu.pushModal("schedules-discover")',
|
|
);
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
role: 'window',
|
|
submenu: [
|
|
{
|
|
role: 'minimize',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
role: 'help',
|
|
submenu: [
|
|
{
|
|
label: 'Learn More',
|
|
click() {
|
|
shell.openExternal('https://actualbudget.org/docs/');
|
|
},
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
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.
|
|
const editIdx = template.findIndex(t => t.label === 'Edit');
|
|
template[editIdx].submenu.push(
|
|
{
|
|
type: 'separator',
|
|
},
|
|
{
|
|
label: 'Speech',
|
|
submenu: [
|
|
{
|
|
role: 'startspeaking',
|
|
},
|
|
{
|
|
role: 'stopspeaking',
|
|
},
|
|
],
|
|
},
|
|
);
|
|
// Window menu.
|
|
const 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;
|