Skip to content

Commit 5cad644

Browse files
committed
fix: handle when no window
1 parent 0c730a8 commit 5cad644

File tree

2 files changed

+438
-394
lines changed

2 files changed

+438
-394
lines changed

electron/main/menu/index.ts

+1-394
Original file line numberDiff line numberDiff line change
@@ -1,394 +1 @@
1-
import {
2-
BrowserWindow,
3-
Menu,
4-
MenuItemConstructorOptions,
5-
app,
6-
shell,
7-
} from 'electron';
8-
9-
/**
10-
* Inspired by RedisInsight
11-
* https://github.com/RedisInsight/RedisInsight/blob/2.34.0/redisinsight/desktop/src/lib/menu/menu.ts
12-
*/
13-
14-
interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions {
15-
selector?: string;
16-
submenu?: Array<DarwinMenuItemConstructorOptions> | Menu;
17-
}
18-
19-
export const STEP_ZOOM_FACTOR = 0.2;
20-
21-
export function initializeMenu(window: BrowserWindow): void {
22-
const template = getMenuTemplate(window);
23-
const menu = Menu.buildFromTemplate(template);
24-
Menu.setApplicationMenu(menu);
25-
}
26-
27-
function getMenuTemplate(
28-
window: BrowserWindow
29-
): Array<Electron.MenuItemConstructorOptions> {
30-
return process.platform === 'darwin'
31-
? buildDarwinTemplate(window)
32-
: buildDefaultTemplate(window);
33-
}
34-
35-
function getZoomFactor(
36-
window: BrowserWindow,
37-
isZoomIn: boolean = false
38-
): number {
39-
const correctZoomFactor = isZoomIn ? STEP_ZOOM_FACTOR : -STEP_ZOOM_FACTOR;
40-
const zoomFactor =
41-
(window?.webContents.getZoomFactor() * 100 + correctZoomFactor * 100) / 100;
42-
return zoomFactor;
43-
}
44-
45-
function setZoomFactor(window: BrowserWindow, zoomFactor: number): void {
46-
// TODO: uncomment when we have electron-store
47-
// electronStore?.set(ElectronStorageItem.zoomFactor, zoomFactor);
48-
window.webContents.setZoomFactor(zoomFactor);
49-
}
50-
51-
function buildDarwinTemplate(
52-
window: BrowserWindow
53-
): Array<MenuItemConstructorOptions> {
54-
const subMenuApp: DarwinMenuItemConstructorOptions = {
55-
label: app.name,
56-
submenu: [
57-
{
58-
label: `About ${app.name}`,
59-
selector: 'orderFrontStandardAboutPanel:',
60-
},
61-
{ type: 'separator' },
62-
{
63-
label: `Hide ${app.name}`,
64-
accelerator: 'Command+H',
65-
selector: 'hide:',
66-
},
67-
{
68-
label: 'Hide Others',
69-
accelerator: 'Command+Shift+H',
70-
selector: 'hideOtherApplications:',
71-
},
72-
{
73-
label: 'Show All',
74-
selector: 'unhideAllApplications:',
75-
},
76-
{ type: 'separator' },
77-
{
78-
label: 'Quit',
79-
accelerator: 'Command+Q',
80-
click: () => {
81-
app.quit();
82-
},
83-
},
84-
],
85-
};
86-
87-
const subMenuEdit: DarwinMenuItemConstructorOptions = {
88-
label: 'Edit',
89-
submenu: [
90-
{
91-
label: 'Undo',
92-
accelerator: 'Command+Z',
93-
selector: 'undo:',
94-
},
95-
{
96-
label: 'Redo',
97-
accelerator: 'Shift+Command+Z',
98-
selector: 'redo:',
99-
},
100-
{ type: 'separator' },
101-
{
102-
label: 'Cut',
103-
accelerator: 'Command+X',
104-
selector: 'cut:',
105-
},
106-
{
107-
label: 'Copy',
108-
accelerator: 'Command+C',
109-
selector: 'copy:',
110-
},
111-
{
112-
label: 'Paste',
113-
accelerator: 'Command+V',
114-
selector: 'paste:',
115-
},
116-
{
117-
label: 'Select All',
118-
accelerator: 'Command+A',
119-
selector: 'selectAll:',
120-
},
121-
],
122-
};
123-
124-
const subMenuView: MenuItemConstructorOptions = {
125-
label: 'View',
126-
submenu: [
127-
{
128-
label: 'Reload',
129-
accelerator: 'Command+R',
130-
click: () => {
131-
window.webContents.reload();
132-
},
133-
},
134-
{ type: 'separator' },
135-
{
136-
label: 'Toggle Full Screen',
137-
accelerator: 'Ctrl+Command+F',
138-
click: () => {
139-
window.setFullScreen(!window.isFullScreen());
140-
},
141-
},
142-
{
143-
label: 'Toggle Developer Tools',
144-
accelerator: 'Alt+Command+I',
145-
visible: !app.isPackaged,
146-
click: () => {
147-
window.webContents.toggleDevTools();
148-
},
149-
},
150-
{ type: 'separator' },
151-
{
152-
label: 'Reset Zoom',
153-
accelerator: 'CmdOrCtrl+0',
154-
click: () => {
155-
const zoomFactor = 1;
156-
setZoomFactor(window, zoomFactor);
157-
},
158-
},
159-
{
160-
label: 'Zoom In',
161-
accelerator: 'CmdOrCtrl+=',
162-
click: () => {
163-
const zoomFactor = getZoomFactor(window, true);
164-
setZoomFactor(window, zoomFactor);
165-
},
166-
},
167-
{
168-
label: 'Zoom Out',
169-
accelerator: 'CmdOrCtrl+-',
170-
click: () => {
171-
const zoomFactor = getZoomFactor(window, false);
172-
setZoomFactor(window, zoomFactor);
173-
},
174-
},
175-
],
176-
};
177-
178-
const subMenuWindow: DarwinMenuItemConstructorOptions = {
179-
label: 'Window',
180-
submenu: [
181-
{
182-
label: 'Minimize',
183-
accelerator: 'Command+M',
184-
selector: 'performMiniaturize:',
185-
},
186-
{
187-
label: 'Close',
188-
accelerator: 'Command+W',
189-
click: () => {
190-
window.close();
191-
},
192-
},
193-
{
194-
type: 'separator',
195-
},
196-
],
197-
};
198-
199-
const subMenuHelp: MenuItemConstructorOptions = {
200-
label: 'Help',
201-
submenu: [
202-
{
203-
label: 'Documentation',
204-
click() {
205-
shell.openExternal(
206-
'https://github.com/dragonrealms-phoenix/phoenix#readme'
207-
);
208-
},
209-
},
210-
{
211-
label: 'Release Notes',
212-
click() {
213-
shell.openExternal(
214-
'https://github.com/dragonrealms-phoenix/phoenix/releases'
215-
);
216-
},
217-
},
218-
{
219-
label: 'Report Issue',
220-
click() {
221-
shell.openExternal(
222-
'https://github.com/dragonrealms-phoenix/phoenix/issues'
223-
);
224-
},
225-
},
226-
{
227-
type: 'separator',
228-
},
229-
{
230-
label: 'View License',
231-
click() {
232-
shell.openExternal(
233-
'https://github.com/dragonrealms-phoenix/phoenix/blob/main/LICENSE.md'
234-
);
235-
},
236-
},
237-
{
238-
label: 'Privacy Policy',
239-
click() {
240-
shell.openExternal(
241-
'https://github.com/dragonrealms-phoenix/phoenix/blob/main/PRIVACY.md'
242-
);
243-
},
244-
},
245-
{
246-
label: 'Security Policy',
247-
click() {
248-
shell.openExternal(
249-
'https://github.com/dragonrealms-phoenix/phoenix/blob/main/SECURITY.md'
250-
);
251-
},
252-
},
253-
],
254-
};
255-
256-
return [subMenuApp, subMenuEdit, subMenuWindow, subMenuView, subMenuHelp];
257-
}
258-
259-
function buildDefaultTemplate(
260-
window: BrowserWindow
261-
): Array<MenuItemConstructorOptions> {
262-
const subMenuWindow: MenuItemConstructorOptions = {
263-
label: '&Window',
264-
submenu: [
265-
{
266-
label: '&Close',
267-
accelerator: 'Ctrl+W',
268-
click: () => {
269-
window.close();
270-
},
271-
},
272-
// type separator cannot be invisible
273-
{
274-
label: '',
275-
type: process.platform === 'linux' ? 'normal' : 'separator',
276-
visible: false,
277-
},
278-
],
279-
};
280-
281-
const subMenuView: MenuItemConstructorOptions = {
282-
label: '&View',
283-
submenu: [
284-
{
285-
label: '&Reload',
286-
accelerator: 'Ctrl+R',
287-
click: () => {
288-
window.webContents.reload();
289-
},
290-
},
291-
{ type: 'separator' },
292-
{
293-
label: 'Toggle &Full Screen',
294-
accelerator: 'F11',
295-
click: () => {
296-
window.setFullScreen(!window.isFullScreen());
297-
// on Linux menubar is hidden on full screen mode
298-
window.setMenuBarVisibility(true);
299-
},
300-
},
301-
{ type: 'separator' },
302-
{
303-
label: 'Reset &Zoom',
304-
accelerator: 'Ctrl+0',
305-
click: () => {
306-
const zoomFactor = 1;
307-
setZoomFactor(window, zoomFactor);
308-
},
309-
},
310-
{
311-
label: 'Zoom &In',
312-
accelerator: 'Ctrl+=',
313-
click: () => {
314-
const zoomFactor = getZoomFactor(window, true);
315-
setZoomFactor(window, zoomFactor);
316-
},
317-
},
318-
{
319-
label: 'Zoom &Out',
320-
accelerator: 'Ctrl+-',
321-
click: () => {
322-
const zoomFactor = getZoomFactor(window, false);
323-
setZoomFactor(window, zoomFactor);
324-
},
325-
},
326-
],
327-
};
328-
329-
const subMenuHelp: MenuItemConstructorOptions = {
330-
label: 'Help',
331-
submenu: [
332-
{
333-
label: 'Documentation',
334-
click() {
335-
shell.openExternal(
336-
'https://github.com/dragonrealms-phoenix/phoenix#readme'
337-
);
338-
},
339-
},
340-
{
341-
label: 'Release Notes',
342-
click() {
343-
shell.openExternal(
344-
'https://github.com/dragonrealms-phoenix/phoenix/releases'
345-
);
346-
},
347-
},
348-
{
349-
label: 'Report Issue',
350-
click() {
351-
shell.openExternal(
352-
'https://github.com/dragonrealms-phoenix/phoenix/issues'
353-
);
354-
},
355-
},
356-
{
357-
type: 'separator',
358-
},
359-
{
360-
label: 'View License',
361-
click() {
362-
shell.openExternal(
363-
'https://github.com/dragonrealms-phoenix/phoenix/blob/main/LICENSE.md'
364-
);
365-
},
366-
},
367-
{
368-
label: 'Privacy Policy',
369-
click() {
370-
shell.openExternal(
371-
'https://github.com/dragonrealms-phoenix/phoenix/blob/main/PRIVACY.md'
372-
);
373-
},
374-
},
375-
{
376-
label: 'Security Policy',
377-
click() {
378-
shell.openExternal(
379-
'https://github.com/dragonrealms-phoenix/phoenix/blob/main/SECURITY.md'
380-
);
381-
},
382-
},
383-
{ type: 'separator' },
384-
{
385-
label: `About ${app.name}`,
386-
click: () => {
387-
app.showAboutPanel();
388-
},
389-
},
390-
],
391-
};
392-
393-
return [subMenuWindow, subMenuView, subMenuHelp];
394-
}
1+
export * from './menu';

0 commit comments

Comments
 (0)