/** * @author: clay * @data: 2019/07/16 * @description: edit mode: 键盘事件的交互,主要是删除节点和连线(记录删除前后的数据,用于【撤销】和【重做】) */ // 用来获取调用此js的vue组件实例(this) let vm = null; const sendThis = (_this) => { vm = _this; }; export default { sendThis, // 暴露函数 name: "keyup-event-edit", options: { getEvents() { return { "keyup": "onKeyup", "keydown": "onKeydown", }; }, onKeyup(event) { let graph = vm.getGraph(); let selectedNodes = graph.findAllByState("node", "selected"); let selectedEdges = graph.findAllByState("edge", "selected"); //按住键盘delete-46删除功能 if (event.keyCode === 46 && (selectedNodes.length > 0 || selectedEdges.length > 0)) { // ************** 记录【删除】前的数据状态 start ************** let historyData = JSON.stringify(graph.save()); let key = `graph_history_${vm.getHistoryIndex()}`; vm.addHistoryData(key, historyData); // ************** 记录【删除】前的数据状态 end ************** // 开始删除 selectedNodes.forEach(item=>graph.removeItem(item)) selectedEdges.forEach(item=>graph.removeItem(item)) // ************** 记录【删除】后的数据状态 start ************** // 如果当前点过【撤销】了,拖拽节点后将取消【重做】功能 // 重置undoCount,【删除】后的数据状态给(当前所在historyIndex + 1),且清空这个时间点之后的记录 if (vm.getUndoCount() > 0) { vm.editHistoryIndex( vm.getHistoryIndex() - vm.getUndoCount()); // 此时的historyIndex应当更新为【撤销】后所在的索引位置 for (let i = 1; i <= vm.getUndoCount(); i++) { let key = `graph_history_${vm.getHistoryIndex() + i}`; vm.removeHistoryData(key); } vm.editUndoCount(0); } // 记录【删除】后的数据状态 const index=vm.getHistoryIndex()+ 1; vm.editHistoryIndex(index); key = `graph_history_${index}`; let currentData = JSON.stringify(graph.save()); vm.addHistoryData(key, currentData); // ************** 记录【删除】后的数据状态 end ************** } else if (event.keyCode == 17) {//ctrl键,将状态传给父组件,在clickErNode里面编写功能(按住ctrl,滚动后放大缩小ER图) vm.editClickCtrl(false)//松开则为false } }, onKeydown(event) { if (event.keyCode == 17) {//ctrl键 vm.editClickCtrl(true)//为true时:一直按着ctrl,以实现滚轮放大缩小功能 } } } };