Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CONTEXT_MENU_CHANNEL, CONTEXT_MENU_CLOSE_CHANNEL, IContextMenuEvent, IContextMenuItem, IPopupOptions, ISerializableContextMenuItem } from '../common/contextmenu.js';
7
import { ipcRenderer } from '../../sandbox/electron-browser/globals.js';
8
9
let contextMenuIdPool = 0;
10
11
export function popup(items: IContextMenuItem[], options?: IPopupOptions, onHide?: () => void): void {
12
const processedItems: IContextMenuItem[] = [];
13
14
const contextMenuId = contextMenuIdPool++;
15
const onClickChannel = `vscode:onContextMenu${contextMenuId}`;
16
const onClickChannelHandler = (event: unknown, itemId: number, context: IContextMenuEvent) => {
17
const item = processedItems[itemId];
18
item.click?.(context);
19
};
20
21
ipcRenderer.once(onClickChannel, onClickChannelHandler);
22
ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (event: unknown, closedContextMenuId: number) => {
23
if (closedContextMenuId !== contextMenuId) {
24
return;
25
}
26
27
ipcRenderer.removeListener(onClickChannel, onClickChannelHandler);
28
29
onHide?.();
30
});
31
32
ipcRenderer.send(CONTEXT_MENU_CHANNEL, contextMenuId, items.map(item => createItem(item, processedItems)), onClickChannel, options);
33
}
34
35
function createItem(item: IContextMenuItem, processedItems: IContextMenuItem[]): ISerializableContextMenuItem {
36
const serializableItem: ISerializableContextMenuItem = {
37
id: processedItems.length,
38
label: item.label,
39
type: item.type,
40
accelerator: item.accelerator,
41
checked: item.checked,
42
enabled: typeof item.enabled === 'boolean' ? item.enabled : true,
43
visible: typeof item.visible === 'boolean' ? item.visible : true
44
};
45
46
processedItems.push(item);
47
48
// Submenu
49
if (Array.isArray(item.submenu)) {
50
serializableItem.submenu = item.submenu.map(submenuItem => createItem(submenuItem, processedItems));
51
}
52
53
return serializableItem;
54
}
55
56