define( function ( require, exports, module ) {
|
|
var Paper = require( 'graphic/paper' );
|
|
|
|
var touchable = window.ontouchstart !== undefined;
|
|
var DRAG_START_EVENT = touchable ? 'touchstart' : 'mousedown',
|
|
DRAG_MOVE_EVENT = touchable ? 'touchmove' : 'mousemove',
|
|
DRAG_END_EVENT = touchable ? 'touchend' : 'mouseup';
|
|
|
|
return require( 'core/class' ).createClass( {
|
|
drag: function ( opt ) {
|
|
|
|
if ( this.dragEnabled ) {
|
|
return;
|
|
}
|
|
|
|
var dragStart = opt && opt.start || this.dragStart,
|
|
dragMove = opt && opt.move || this.dragMove,
|
|
dragEnd = opt && opt.end || this.dragEnd,
|
|
dragTarget = opt && opt.target || this.dragTarget || this,
|
|
me = this;
|
|
|
|
this.dragEnabled = true;
|
|
this.dragTarget = dragTarget;
|
|
|
|
function bindEvents( paper ) {
|
|
|
|
var startPosition, lastPosition, dragging = false;
|
|
|
|
var dragFn = function ( e ) {
|
|
if ( !dragging ) {
|
|
paper.off( DRAG_MOVE_EVENT, dragFn );
|
|
}
|
|
|
|
var currentPosition = e.getPosition();
|
|
var movement = {
|
|
x: currentPosition.x - startPosition.x,
|
|
y: currentPosition.y - startPosition.y
|
|
};
|
|
var delta = {
|
|
x: currentPosition.x - lastPosition.x,
|
|
y: currentPosition.y - lastPosition.y
|
|
};
|
|
var dragInfo = {
|
|
position: currentPosition,
|
|
movement: movement,
|
|
delta: delta
|
|
};
|
|
lastPosition = currentPosition;
|
|
|
|
if ( dragMove ) {
|
|
dragMove.call( me, dragInfo );
|
|
} else if ( me instanceof Paper ) {
|
|
// treate paper drag different
|
|
var view = me.getViewPort();
|
|
view.center.x -= movement.x;
|
|
view.center.y -= movement.y;
|
|
me.setViewPort( view );
|
|
} else {
|
|
me.translate( delta.x, delta.y );
|
|
}
|
|
|
|
dragTarget.trigger( 'dragmove', dragInfo );
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
};
|
|
|
|
dragTarget.on( DRAG_START_EVENT, dragTarget._dragStartHandler = function ( e ) {
|
|
if ( e.originEvent.button ) {
|
|
return;
|
|
}
|
|
dragging = true;
|
|
|
|
var dragInfo = {
|
|
position: lastPosition = startPosition = e.getPosition()
|
|
};
|
|
|
|
if ( dragStart ) {
|
|
var cancel = dragStart.call( me, dragInfo ) === false;
|
|
if ( cancel ) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
paper.on( DRAG_MOVE_EVENT, dragFn );
|
|
|
|
dragTarget.trigger( 'dragstart', dragInfo );
|
|
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
} );
|
|
|
|
paper.on( DRAG_END_EVENT, dragTarget._dragEndHandler = function ( e ) {
|
|
if ( dragging ) {
|
|
dragging = false;
|
|
var dragInfo = {
|
|
position: e.getPosition()
|
|
};
|
|
if ( dragEnd ) {
|
|
dragEnd.call( me, dragInfo );
|
|
}
|
|
|
|
paper.off( DRAG_MOVE_EVENT, dragFn );
|
|
dragTarget.trigger( 'dragend', dragInfo );
|
|
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
}
|
|
} );
|
|
}
|
|
|
|
if ( me instanceof Paper ) {
|
|
bindEvents( me );
|
|
} else if ( me.getPaper() ) {
|
|
bindEvents( me.getPaper() );
|
|
} else {
|
|
var listener = function ( e ) {
|
|
if ( e.target.getPaper() ) {
|
|
bindEvents( e.target.getPaper() );
|
|
me.off( 'add', listener );
|
|
me.off( 'treeadd', listener );
|
|
}
|
|
}
|
|
me.on( 'add treeadd', listener );
|
|
}
|
|
return this;
|
|
}, // end of drag
|
|
|
|
|
|
undrag: function () {
|
|
var target = this.dragTarget;
|
|
target.off( DRAG_START_EVENT, target._dragStartHandler );
|
|
target.getPaper().off( DRAG_END_EVENT, target._dragEndHandler );
|
|
delete target._dragStartHandler;
|
|
delete target._dragEndHandler;
|
|
this.dragEnabled = false;
|
|
return this;
|
|
}
|
|
} );
|
|
} );
|