53 lines
1.3 KiB
TypeScript
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,
|
|
});
|
|
});
|
|
}
|