vue-kityminder-ggg
Version:
百度脑图
144 lines (130 loc) • 5.01 kB
JavaScript
/**
* @fileOverview
*
* 用于拖拽节点时屏蔽键盘事件
*
* @author: techird
* @copyright: Baidu FEX, 2014
*/
define(function(require, exports, module) {
var Hotbox = require('../hotbox');
var Debug = require('../tool/debug');
var debug = new Debug('drag');
function DragRuntime() {
var fsm = this.fsm;
var minder = this.minder;
var hotbox = this.hotbox;
var receiver = this.receiver;
var receiverElement = receiver.element;
// setup everything to go
setupFsm();
// listen the fsm changes, make action.
function setupFsm() {
// when jumped to drag mode, enter
fsm.when('* -> drag', function() {
// now is drag mode
});
fsm.when('drag -> *', function(exit, enter, reason) {
if (reason == 'drag-finish') {
// now exit drag mode
}
});
}
var downX, downY;
var MOUSE_HAS_DOWN = 0;
var MOUSE_HAS_UP = 1;
var BOUND_CHECK = 20;
var flag = MOUSE_HAS_UP;
var maxX, maxY, osx, osy, containerY;
var freeHorizen = false, freeVirtical = false;
var frame;
function move(direction, speed) {
if (!direction) {
freeHorizen = freeVirtical = false;
frame && kity.releaseFrame(frame);
frame = null;
return;
}
if (!frame) {
frame = kity.requestFrame((function (direction, speed, minder) {
return function (frame) {
switch (direction) {
case 'left':
minder._viewDragger.move({x: -speed, y: 0}, 0);
break;
case 'top':
minder._viewDragger.move({x: 0, y: -speed}, 0);
break;
case 'right':
minder._viewDragger.move({x: speed, y: 0}, 0);
break;
case 'bottom':
minder._viewDragger.move({x: 0, y: speed}, 0);
break;
default:
return;
}
frame.next();
};
})(direction, speed, minder));
}
}
minder.on('mousedown', function(e) {
flag = MOUSE_HAS_DOWN;
var rect = minder.getPaper().container.getBoundingClientRect();
console.log("rect",rect)
downX = e.originEvent.clientX;
downY = e.originEvent.clientY;
containerY = rect.top;
maxX = rect.width;
maxY = rect.height;
console.log("maxX",maxX,maxY)
});
minder.on('mousemove', function(e) {
console.log("fsm.state() === 'drag'",fsm.state())
if (fsm.state() === 'drag' && flag == MOUSE_HAS_DOWN && minder.getSelectedNode()
&& (Math.abs(downX - e.originEvent.clientX) > BOUND_CHECK
|| Math.abs(downY - e.originEvent.clientY) > BOUND_CHECK)) {
osx = e.originEvent.clientX;
osy = e.originEvent.clientY - containerY;
if (osx < BOUND_CHECK) {
move('right', BOUND_CHECK - osx);
} else if (osx > maxX - BOUND_CHECK) {
// move('left', BOUND_CHECK + osx - maxX);
} else {
freeHorizen = true;
}
if (osy < BOUND_CHECK) {
move('bottom', osy);
} else if (osy > maxY - BOUND_CHECK) {
move('top', BOUND_CHECK + osy - maxY);
} else {
freeVirtical = true;
}
if (freeHorizen && freeVirtical) {
move(false);
}
}
if (fsm.state() !== 'drag'
&& flag === MOUSE_HAS_DOWN
&& minder.getSelectedNode()
&& (Math.abs(downX - e.originEvent.clientX) > BOUND_CHECK
|| Math.abs(downY - e.originEvent.clientY) > BOUND_CHECK)) {
console.log("999")
if (fsm.state() === 'hotbox') {
hotbox.active(Hotbox.STATE_IDLE);
}
console.log("1010")
return fsm.jump('drag', 'user-drag');
}
});
window.addEventListener('mouseup', function () {
flag = MOUSE_HAS_UP;
if (fsm.state() === 'drag') {
move(false);
return fsm.jump('normal', 'drag-finish');
}
}, false);
}
return module.exports = DragRuntime;
});