Files
makelore/electron/main/context-menu.ts

53 lines
1.3 KiB
TypeScript

import { Menu } from 'electron';
import type { BrowserWindow } from 'electron';
export type TextContextMenuContext = Pick<
Electron.ContextMenuParams,
'isEditable' | 'selectionText' | 'editFlags'
>;
export function createTextContextMenuTemplate(
context: TextContextMenuContext,
): Electron.MenuItemConstructorOptions[] | null {
if (!context.isEditable && context.selectionText.length === 0) {
return null;
}
return [
{
label: '剪切',
role: 'cut',
enabled: context.isEditable && context.editFlags.canCut,
},
{
label: '复制',
role: 'copy',
enabled: context.editFlags.canCopy,
},
{
label: '粘贴',
role: 'paste',
enabled: context.isEditable && context.editFlags.canPaste,
},
{ type: 'separator' },
{
label: '全选',
role: 'selectAll',
enabled: context.editFlags.canSelectAll,
},
];
}
export function registerTextContextMenu(win: BrowserWindow): void {
win.webContents.on('context-menu', (_event, params) => {
const template = createTextContextMenuTemplate(params);
if (!template) return;
Menu.buildFromTemplate(template).popup({
window: win,
frame: params.frame ?? undefined,
sourceType: params.menuSourceType,
});
});
}