Path: blob/main/replay/backend/menus/generateAppMenu.ts
1030 views
import { app, BrowserWindow, ipcMain, Menu, MenuItem, webContents, shell } from 'electron';1import * as Path from 'path';2import * as Os from 'os';3import { saveAs, viewSource } from './CommonActions';4import Window from '../models/Window';56const isMac = process.platform === 'darwin';78export default function generateAppMenu() {9const template: any = [10...(isMac11? [12{13label: app.name,14submenu: [15{ role: 'about' },16{ type: 'separator' },17{ role: 'services' },18{ type: 'separator' },19{ role: 'hide' },20{ role: 'hideothers' },21{ role: 'unhide' },22{ type: 'separator' },23{ role: 'quit' },24],25},26]27: []),28{29label: 'File',30submenu: [31...createMenuItem(32['CmdOrCtrl+N'],33() => {34Window.create();35},36'New Window',37),38{39type: 'separator',40},41...createMenuItem(42['CmdOrCtrl+Shift+O'],43() => {44ipcMain.emit('open-file');45},46'Open SecretAgent Script',47),48{49type: 'separator',50},51...createMenuItem(52['CmdOrCtrl+Shift+W'],53window => {54window.browserWindow.close();55},56'Close Window',57),58{59type: 'separator',60},61...createMenuItem(62['CmdOrCtrl+S'],63() => {64saveAs();65},66'Save Webpage As...',67),68// {69// type: 'separator',70// },71// ...createMenuItem(72// ['CmdOrCtrl+P'],73// () => {74// printPage();75// },76// 'Print',77// ),78],79},80{81label: 'Edit',82submenu: [83{ role: 'undo' },84{ role: 'redo' },85{ type: 'separator' },86{ role: 'cut' },87{ role: 'copy' },88{ role: 'paste' },89...(isMac90? [91{ role: 'pasteAndMatchStyle' },92{ role: 'delete' },93{ role: 'selectAll' },94{ type: 'separator' },95{96label: 'Speech',97submenu: [{ role: 'startspeaking' }, { role: 'stopspeaking' }],98},99]100: [{ role: 'delete' }, { type: 'separator' }, { role: 'selectAll' }]),101// { type: 'separator' },102// ...createMenuItem(103// ['CmdOrCtrl+F'],104// () => {105// Window.current.sendToRenderer('find');106// },107// 'Find in page',108// ),109],110},111{112label: 'View',113submenu: [114...createMenuItem(115['CmdOrCtrl+R', 'F5'],116() => {117Window.current.activeView.webContents.reload();118},119'Reload',120),121...createMenuItem(122['CmdOrCtrl+Shift+R', 'Shift+F5'],123() => {124Window.current.activeView.webContents.reloadIgnoringCache();125},126'Reload ignoring cache',127),128],129},130{131label: 'Replay',132submenu: [133{134label: 'View History',135click: () => {136return Window.current.openAppLocation('History');137},138},139{140label: 'Reveal in Sessions Directory',141click: () => {142const dir = Path.join(143Window.current.replayApi?.saSession?.dataLocation ??144Path.join(Os.tmpdir(), '.secret-agent'),145);146if (Window.current.replayApi?.saSession) {147return shell.showItemInFolder(148`${Path.join(dir, Window.current.replayApi?.saSession.id)}.db`,149);150}151return shell.openPath(dir);152},153},154...createMenuItem(['Left'], () => {155if (!Window.current) return;156return Window.current.replayView?.gotoPreviousTick();157}),158...createMenuItem(['Right'], () => {159if (!Window.current) return;160return Window.current.replayView?.gotoNextTick();161}),162],163},164{165label: 'Tools',166submenu: [167...createMenuItem(168['CmdOrCtrl+U'],169() => {170viewSource();171},172'View Source',173false,174),175...createMenuItem(176['CmdOrCtrl+Shift+I', 'CmdOrCtrl+Shift+J', 'F12'],177() => {178setTimeout(() => {179Window.current.activeView.webContents.toggleDevTools();180}, 0);181},182'Developer Tools',183),184185// Developer tools (current webContents) (dev)186...createMenuItem(['CmdOrCtrl+Shift+F12'], () => {187setTimeout(() => {188webContents.getFocusedWebContents().openDevTools({ mode: 'detach' });189}, 0);190}),191],192},193{194label: 'Window',195submenu: [196{ role: 'minimize' },197{ role: 'zoom' },198...(isMac199? [{ type: 'separator' }, { role: 'front' }, { type: 'separator' }, { role: 'window' }]200: [{ role: 'close', accelerator: '' }]),201{ type: 'separator' },202{203label: 'Always on top',204type: 'checkbox',205checked: false,206click(menuItem: MenuItem, browserWindow: BrowserWindow) {207browserWindow.setAlwaysOnTop(!browserWindow.isAlwaysOnTop());208menuItem.checked = browserWindow.isAlwaysOnTop();209},210},211],212},213];214215return Menu.buildFromTemplate(template);216}217218// HELPER FUNCTIONS //////219220function createMenuItem(221shortcuts: string[],222action: (window: Window, menuItem: MenuItem, shortcutIndex: number) => void,223label: string = null,224enabled = true,225) {226const result: any = shortcuts.map((shortcut, key) => ({227accelerator: shortcut,228visible: label != null && key === 0,229label: label != null && key === 0 ? label : '',230enabled,231click: (menuItem: MenuItem, browserWindow: BrowserWindow) =>232action(233Window.list.find(x => x.browserWindow?.id === browserWindow?.id),234menuItem,235key,236),237}));238239return result;240}241242243