electron/lib/browser/api/menu-item.js

85 lines
2.5 KiB
JavaScript
Raw Normal View History

'use strict'
const roles = require('./menu-item-roles')
2016-06-21 00:14:16 +00:00
let nextCommandId = 0
2016-01-12 02:40:23 +00:00
2016-06-21 22:41:37 +00:00
const MenuItem = function (options) {
2016-06-22 21:13:12 +00:00
const {Menu} = require('electron')
2016-06-21 00:16:34 +00:00
// Preserve extra fields specified by user
for (let key in options) {
if (!(key in this)) this[key] = options[key]
}
2017-12-31 18:23:32 +00:00
if (typeof this.role === 'string' || this.role instanceof String) {
2017-12-28 05:22:39 +00:00
this.role = this.role.toLowerCase()
2017-12-31 18:23:32 +00:00
}
this.submenu = this.submenu || roles.getDefaultSubmenu(this.role)
2016-06-21 22:41:37 +00:00
if (this.submenu != null && this.submenu.constructor !== Menu) {
this.submenu = Menu.buildFromTemplate(this.submenu)
}
if (this.type == null && this.submenu != null) {
this.type = 'submenu'
}
if (this.type === 'submenu' && (this.submenu == null || this.submenu.constructor !== Menu)) {
throw new Error('Invalid submenu')
2016-01-12 02:40:23 +00:00
}
2016-06-21 22:41:37 +00:00
this.overrideReadOnlyProperty('type', 'normal')
this.overrideReadOnlyProperty('role')
this.overrideReadOnlyProperty('accelerator')
2016-06-21 22:41:37 +00:00
this.overrideReadOnlyProperty('icon')
this.overrideReadOnlyProperty('submenu')
this.overrideProperty('label', roles.getDefaultLabel(this.role))
2016-06-21 22:41:37 +00:00
this.overrideProperty('sublabel', '')
this.overrideProperty('enabled', true)
this.overrideProperty('visible', true)
this.overrideProperty('checked', false)
if (!MenuItem.types.includes(this.type)) {
2016-06-21 22:59:02 +00:00
throw new Error(`Unknown menu item type: ${this.type}`)
}
2016-01-12 02:40:23 +00:00
2016-06-22 17:07:02 +00:00
this.overrideReadOnlyProperty('commandId', ++nextCommandId)
2016-06-21 22:41:37 +00:00
2016-06-21 23:07:20 +00:00
const click = options.click
this.click = (event, focusedWindow, focusedWebContents) => {
2016-06-21 22:41:37 +00:00
// Manually flip the checked flags when clicked.
if (this.type === 'checkbox' || this.type === 'radio') {
this.checked = !this.checked
2016-01-12 02:40:23 +00:00
}
2016-06-21 22:41:37 +00:00
if (!roles.execute(this.role, focusedWindow, focusedWebContents)) {
2016-06-22 20:48:26 +00:00
if (typeof click === 'function') {
click(this, focusedWindow, event)
} else if (typeof this.selector === 'string' && process.platform === 'darwin') {
Menu.sendActionToFirstResponder(this.selector)
2016-06-21 22:41:37 +00:00
}
2016-01-12 02:40:23 +00:00
}
}
2016-06-21 22:41:37 +00:00
}
MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio']
2016-01-12 02:40:23 +00:00
MenuItem.prototype.getDefaultRoleAccelerator = function () {
return roles.getDefaultAccelerator(this.role)
}
MenuItem.prototype.overrideProperty = function (name, defaultValue = null) {
2016-06-21 22:41:37 +00:00
if (this[name] == null) {
this[name] = defaultValue
}
}
MenuItem.prototype.overrideReadOnlyProperty = function (name, defaultValue) {
this.overrideProperty(name, defaultValue)
Object.defineProperty(this, name, {
enumerable: true,
writable: false,
value: this[name]
})
}
2016-01-12 02:40:23 +00:00
module.exports = MenuItem