import { fabric } from 'fabric';
import { Rect } from './rect';
/**
* 按钮
*/
export class ContextMenu {
// 测试调用方法
copy = 'copy';
isMenuShow = false;
isMenuEleShow = false;
constructor(canvas) {
// 设置启用右键,禁止默认右键菜单
canvas.set({
fireRightClick: true, // 启用右键,button 为 3
stopContextMenu: true, // 禁止默认右键菜单
});
// 添加矩形
canvas.add(new fabric.Rect(Rect.defaultRect()));
// 添加菜单
this.addContextMenu();
// 绑定鼠标右键
this.bindMouseClick(canvas);
}
/**
* 添加右键菜单
*/
addContextMenu(canvas) {
let self = this;
let ele = `
<div id="contextMenuEle" class="contextMenu">
<div class="contextMenu-copy">复制</div>
<div class="contextMenu-cut">剪切</div>
<div class="contextMenu-delete">删除</div>
<div class="contextMenu-moveUp">上移</div>
<div class="contextMenu-moveDown">下移</div>
<div class="contextMenu-toTop">置顶</div>
<div class="contextMenu-toBottom">置底</div>
<div class="contextMenu-export">导出选中</div>
<div class="contextMenu-exportAll">导出全部</div>
</div>
<div id="contextMenu" class="contextMenu">
<div class="contextMenu-paste">粘贴</div>
<div class="contextMenu-revoke">撤销</div>
<div class="contextMenu-reDo">重做</div>
<div class="contextMenu-enlarge">放大</div>
<div class="contextMenu-reduce">缩小</div>
<div class="contextMenu-import">导入</div>
<div class="contextMenu-exportAll">导出全部</div>
</div>`
$('body').append(ele);
// 绑定对应事件
$('.contextMenu-copy').on('click', (e) => {
self.doCopy(self);
});
}
/**
* 模拟调用事件
* @param self
*/
doCopy(self) {
console.log(self.copy);
}
/**
* 绑定鼠标点击事件
* @param canvas
*/
bindMouseClick(canvas) {
canvas.on('mouse:down', (e) => {
let menuId = 'contextMenu';
let menuEleId = 'contextMenuEle';
if (e.button === 3) {
if (e.target) {
let activeEle = e.target;
this.isMenuEleShow = true;
this.showMenu(e, menuEleId);
this.isMenuShow && (this.hideMenu(menuId), this.isMenuShow = false);
} else {
this.isMenuShow = true;
this.showMenu(e, menuId);
this.isMenuEleShow && (this.hideMenu(menuEleId), this.isMenuEleShow = false);
}
} else {
this.isMenuShow && (this.hideMenu(menuId), this.isMenuShow = false);
this.isMenuEleShow && (this.hideMenu(menuEleId), this.isMenuEleShow = false);
}
});
}
/**
* 显示菜单
* @param e
* @param showId
*/
showMenu(e, showId) {
// 默认 canvas 右键
let menu = $(`#${ showId }`);
let menuWidth = menu.width();
let menuHeight = menu.height();
let canvas = $('.upper-canvas');
let canvasWidth = canvas.width();
let canvasHeight = canvas.height();
let pointX = e.pointer.x;
let pointY = e.pointer.y;
if (canvasWidth - pointX <= menuWidth) {
pointX -= menuWidth - 10;
} else {
pointX += 10;
}
if (canvasHeight - pointY <= menuHeight) {
pointY -= menuHeight - 8;
} else {
pointY += 12;
}
menu.css({
top: pointY, // 鼠标指针稍下方
left: pointX,
visibility: 'visible',
});
}
/**
* 隐藏菜单
*/
hideMenu(showId) {
if (showId) {
$(`#${ showId }`).css('visibility', 'hidden');
} else {
$('#contextMenuEle').css('visibility', 'hidden');
$('#contextMenu').css('visibility', 'hidden');
}
}
}