feat: add APIs to enable/disable spell checker (#26276)
* feat: add APIs to enable/disable bulitin spell checker * feat: add togglespellchecker menu item role
This commit is contained in:
parent
f77b56e926
commit
bb3fb548d8
9 changed files with 97 additions and 5 deletions
|
@ -1,4 +1,4 @@
|
|||
import { app, BrowserWindow, WebContents, MenuItemConstructorOptions } from 'electron/main';
|
||||
import { app, BrowserWindow, session, webContents, WebContents, MenuItemConstructorOptions } from 'electron/main';
|
||||
|
||||
const isMac = process.platform === 'darwin';
|
||||
const isWindows = process.platform === 'win32';
|
||||
|
@ -6,10 +6,12 @@ const isLinux = process.platform === 'linux';
|
|||
|
||||
type RoleId = 'about' | 'close' | 'copy' | 'cut' | 'delete' | 'forcereload' | 'front' | 'help' | 'hide' | 'hideothers' | 'minimize' |
|
||||
'paste' | 'pasteandmatchstyle' | 'quit' | 'redo' | 'reload' | 'resetzoom' | 'selectall' | 'services' | 'recentdocuments' | 'clearrecentdocuments' | 'startspeaking' | 'stopspeaking' |
|
||||
'toggledevtools' | 'togglefullscreen' | 'undo' | 'unhide' | 'window' | 'zoom' | 'zoomin' | 'zoomout' | 'appmenu' | 'filemenu' | 'editmenu' | 'viewmenu' | 'windowmenu' | 'sharemenu'
|
||||
'toggledevtools' | 'togglefullscreen' | 'undo' | 'unhide' | 'window' | 'zoom' | 'zoomin' | 'zoomout' | 'togglespellchecker' |
|
||||
'appmenu' | 'filemenu' | 'editmenu' | 'viewmenu' | 'windowmenu' | 'sharemenu'
|
||||
interface Role {
|
||||
label: string;
|
||||
accelerator?: string;
|
||||
checked?: boolean;
|
||||
windowMethod?: ((window: BrowserWindow) => void);
|
||||
webContentsMethod?: ((webContents: WebContents) => void);
|
||||
appMethod?: () => void;
|
||||
|
@ -180,6 +182,19 @@ export const roleList: Record<RoleId, Role> = {
|
|||
webContents.zoomLevel -= 0.5;
|
||||
}
|
||||
},
|
||||
togglespellchecker: {
|
||||
label: 'Check Spelling While Typing',
|
||||
get checked () {
|
||||
const wc = webContents.getFocusedWebContents();
|
||||
const ses = wc ? wc.session : session.defaultSession;
|
||||
return ses.spellCheckerEnabled;
|
||||
},
|
||||
nonNativeMacOSRole: true,
|
||||
webContentsMethod: (wc: WebContents) => {
|
||||
const ses = wc ? wc.session : session.defaultSession;
|
||||
ses.spellCheckerEnabled = !ses.spellCheckerEnabled;
|
||||
}
|
||||
},
|
||||
// App submenu should be used for Mac only
|
||||
appmenu: {
|
||||
get label () {
|
||||
|
@ -281,10 +296,23 @@ const canExecuteRole = (role: keyof typeof roleList) => {
|
|||
return roleList[role].nonNativeMacOSRole;
|
||||
};
|
||||
|
||||
export function getDefaultType (role: RoleId) {
|
||||
if (shouldOverrideCheckStatus(role)) return 'checkbox';
|
||||
return 'normal';
|
||||
}
|
||||
|
||||
export function getDefaultLabel (role: RoleId) {
|
||||
return hasRole(role) ? roleList[role].label : '';
|
||||
}
|
||||
|
||||
export function getCheckStatus (role: RoleId) {
|
||||
if (hasRole(role)) return roleList[role].checked;
|
||||
}
|
||||
|
||||
export function shouldOverrideCheckStatus (role: RoleId) {
|
||||
return hasRole(role) && Object.prototype.hasOwnProperty.call(roleList[role], 'checked');
|
||||
}
|
||||
|
||||
export function getDefaultAccelerator (role: RoleId) {
|
||||
if (hasRole(role)) return roleList[role].accelerator;
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ const MenuItem = function (this: any, options: any) {
|
|||
throw new Error('Invalid submenu');
|
||||
}
|
||||
|
||||
this.overrideReadOnlyProperty('type', 'normal');
|
||||
this.overrideReadOnlyProperty('type', roles.getDefaultType(this.role));
|
||||
this.overrideReadOnlyProperty('role');
|
||||
this.overrideReadOnlyProperty('accelerator');
|
||||
this.overrideReadOnlyProperty('icon');
|
||||
|
@ -46,7 +46,8 @@ const MenuItem = function (this: any, options: any) {
|
|||
const click = options.click;
|
||||
this.click = (event: Event, focusedWindow: BrowserWindow, focusedWebContents: WebContents) => {
|
||||
// Manually flip the checked flags when clicked.
|
||||
if (this.type === 'checkbox' || this.type === 'radio') {
|
||||
if (!roles.shouldOverrideCheckStatus(this.role) &&
|
||||
(this.type === 'checkbox' || this.type === 'radio')) {
|
||||
this.checked = !this.checked;
|
||||
}
|
||||
|
||||
|
@ -66,6 +67,11 @@ MenuItem.prototype.getDefaultRoleAccelerator = function () {
|
|||
return roles.getDefaultAccelerator(this.role);
|
||||
};
|
||||
|
||||
MenuItem.prototype.getCheckStatus = function () {
|
||||
if (!roles.shouldOverrideCheckStatus(this.role)) return this.checked;
|
||||
return roles.getCheckStatus(this.role);
|
||||
};
|
||||
|
||||
MenuItem.prototype.overrideProperty = function (name: string, defaultValue: any = null) {
|
||||
if (this[name] == null) {
|
||||
this[name] = defaultValue;
|
||||
|
|
|
@ -17,7 +17,9 @@ Menu.prototype._init = function () {
|
|||
};
|
||||
|
||||
Menu.prototype._isCommandIdChecked = function (id) {
|
||||
return this.commandsMap[id] ? this.commandsMap[id].checked : false;
|
||||
const item = this.commandsMap[id];
|
||||
if (!item) return false;
|
||||
return item.getCheckStatus();
|
||||
};
|
||||
|
||||
Menu.prototype._isCommandIdEnabled = function (id) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue