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