/*
|
菜单集合
|
*/
|
import { objForEach } from '../util/util.js'
|
import MenuConstructors from './menu-list.js'
|
|
// 构造函数
|
function Menus(editor) {
|
this.editor = editor
|
this.menus = {}
|
}
|
|
// 修改原型
|
Menus.prototype = {
|
constructor: Menus,
|
|
// 初始化菜单
|
init: function () {
|
const editor = this.editor
|
const config = editor.config || {}
|
const configMenus = config.menus || [] // 获取配置中的菜单
|
|
// 根据配置信息,创建菜单
|
configMenus.forEach(menuKey => {
|
const MenuConstructor = MenuConstructors[menuKey]
|
if (MenuConstructor && typeof MenuConstructor === 'function') {
|
// 创建单个菜单
|
this.menus[menuKey] = new MenuConstructor(editor)
|
}
|
})
|
|
// 添加到菜单栏
|
this._addToToolbar()
|
|
// 绑定事件
|
this._bindEvent()
|
},
|
|
// 添加到菜单栏
|
_addToToolbar: function () {
|
const editor = this.editor
|
const $toolbarElem = editor.$toolbarElem
|
const menus = this.menus
|
const config = editor.config
|
// config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1
|
const zIndex = config.zIndex + 1
|
objForEach(menus, (key, menu) => {
|
const $elem = menu.$elem
|
if ($elem) {
|
// 设置 z-index
|
$elem.css('z-index', zIndex)
|
$toolbarElem.append($elem)
|
}
|
})
|
},
|
|
// 绑定菜单 click mouseenter 事件
|
_bindEvent: function () {
|
const menus = this.menus
|
const editor = this.editor
|
objForEach(menus, (key, menu) => {
|
const type = menu.type
|
if (!type) {
|
return
|
}
|
const $elem = menu.$elem
|
const droplist = menu.droplist
|
const panel = menu.panel
|
|
// 点击类型,例如 bold
|
if (type === 'click' && menu.onClick) {
|
$elem.on('click', e => {
|
if (editor.selection.getRange() == null) {
|
return
|
}
|
menu.onClick(e)
|
})
|
}
|
|
// 下拉框,例如 head
|
if (type === 'droplist' && droplist) {
|
$elem.on('mouseenter', e => {
|
if (editor.selection.getRange() == null) {
|
return
|
}
|
// 显示
|
droplist.showTimeoutId = setTimeout(() => {
|
droplist.show()
|
}, 200)
|
}).on('mouseleave', e => {
|
// 隐藏
|
droplist.hideTimeoutId = setTimeout(() => {
|
droplist.hide()
|
}, 0)
|
})
|
}
|
|
// 弹框类型,例如 link
|
if (type === 'panel' && menu.onClick) {
|
$elem.on('click', e => {
|
e.stopPropagation()
|
if (editor.selection.getRange() == null) {
|
return
|
}
|
// 在自定义事件中显示 panel
|
menu.onClick(e)
|
})
|
}
|
})
|
},
|
|
// 尝试修改菜单状态
|
changeActive: function () {
|
const menus = this.menus
|
objForEach(menus, (key, menu) => {
|
if (menu.tryChangeActive) {
|
setTimeout(() => {
|
menu.tryChangeActive()
|
}, 100)
|
}
|
})
|
}
|
}
|
|
export default Menus
|