2012-12-02 04:04:10 +08:00
|
|
|
(function() {
|
|
|
|
Kinetic.DD = {
|
2013-03-24 13:56:22 +08:00
|
|
|
// properties
|
2012-12-02 04:04:10 +08:00
|
|
|
anim: new Kinetic.Animation(),
|
2013-03-24 13:56:22 +08:00
|
|
|
isDragging: false,
|
2012-12-02 04:04:10 +08:00
|
|
|
offset: {
|
|
|
|
x: 0,
|
|
|
|
y: 0
|
2013-03-24 13:56:22 +08:00
|
|
|
},
|
|
|
|
node: null,
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
// methods
|
|
|
|
_drag: function(evt) {
|
2013-07-23 12:41:41 +08:00
|
|
|
var dd = Kinetic.DD,
|
2013-03-24 17:31:39 +08:00
|
|
|
node = dd.node;
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
if(node) {
|
2013-08-12 18:00:08 +08:00
|
|
|
node._setDragPosition(evt);
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
if(!dd.isDragging) {
|
|
|
|
dd.isDragging = true;
|
2013-05-21 22:14:27 +08:00
|
|
|
node.fire('dragstart', evt, true);
|
2013-03-24 13:56:22 +08:00
|
|
|
}
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
// execute ondragmove if defined
|
2013-05-21 22:14:27 +08:00
|
|
|
node.fire('dragmove', evt, true);
|
2013-03-24 11:02:11 +08:00
|
|
|
}
|
2013-03-24 13:56:22 +08:00
|
|
|
},
|
|
|
|
_endDragBefore: function(evt) {
|
2013-07-23 12:41:41 +08:00
|
|
|
var dd = Kinetic.DD,
|
2013-03-24 13:56:22 +08:00
|
|
|
node = dd.node,
|
|
|
|
nodeType, layer;
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
if(node) {
|
2014-02-27 08:49:18 +08:00
|
|
|
nodeType = node.nodeType;
|
2013-03-24 13:56:22 +08:00
|
|
|
layer = node.getLayer();
|
|
|
|
dd.anim.stop();
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
// only fire dragend event if the drag and drop
|
2013-07-23 12:41:41 +08:00
|
|
|
// operation actually started.
|
2013-03-24 13:56:22 +08:00
|
|
|
if(dd.isDragging) {
|
|
|
|
dd.isDragging = false;
|
2013-09-09 13:02:04 +08:00
|
|
|
Kinetic.listenClickTap = false;
|
2013-04-08 01:52:33 +08:00
|
|
|
|
|
|
|
if (evt) {
|
|
|
|
evt.dragEndNode = node;
|
2013-07-23 12:41:41 +08:00
|
|
|
}
|
2013-03-24 13:56:22 +08:00
|
|
|
}
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
delete dd.node;
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-04-08 01:52:33 +08:00
|
|
|
(layer || node).draw();
|
2013-03-24 11:02:11 +08:00
|
|
|
}
|
2013-03-24 13:56:22 +08:00
|
|
|
},
|
|
|
|
_endDragAfter: function(evt) {
|
2013-06-02 07:23:31 +08:00
|
|
|
evt = evt || {};
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-06-02 07:23:31 +08:00
|
|
|
var dragEndNode = evt.dragEndNode;
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 13:56:22 +08:00
|
|
|
if (evt && dragEndNode) {
|
2014-02-27 08:49:18 +08:00
|
|
|
dragEndNode.fire('dragend', evt, true);
|
2012-12-02 04:04:10 +08:00
|
|
|
}
|
2012-10-15 11:22:22 +08:00
|
|
|
}
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
2013-03-24 13:56:22 +08:00
|
|
|
|
|
|
|
// Node extenders
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 17:31:39 +08:00
|
|
|
/**
|
|
|
|
* initiate drag and drop
|
2013-05-16 00:27:22 +08:00
|
|
|
* @method
|
|
|
|
* @memberof Kinetic.Node.prototype
|
2013-03-24 17:31:39 +08:00
|
|
|
*/
|
|
|
|
Kinetic.Node.prototype.startDrag = function() {
|
2013-07-23 12:41:41 +08:00
|
|
|
var dd = Kinetic.DD,
|
2013-03-22 15:46:41 +08:00
|
|
|
stage = this.getStage(),
|
2013-07-23 12:41:41 +08:00
|
|
|
layer = this.getLayer(),
|
2013-03-24 17:31:39 +08:00
|
|
|
pos = stage.getPointerPosition(),
|
2013-05-06 11:57:31 +08:00
|
|
|
ap = this.getAbsolutePosition();
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-25 11:54:59 +08:00
|
|
|
if(pos) {
|
|
|
|
if (dd.node) {
|
2013-07-23 12:41:41 +08:00
|
|
|
dd.node.stopDrag();
|
2013-03-25 11:54:59 +08:00
|
|
|
}
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-01-14 14:32:08 +08:00
|
|
|
dd.node = this;
|
|
|
|
dd.offset.x = pos.x - ap.x;
|
|
|
|
dd.offset.y = pos.y - ap.y;
|
2013-05-06 11:57:31 +08:00
|
|
|
dd.anim.setLayers(layer || this.getLayers());
|
2013-03-24 12:47:15 +08:00
|
|
|
dd.anim.start();
|
2013-08-12 18:00:08 +08:00
|
|
|
|
|
|
|
this._setDragPosition();
|
2013-01-14 14:32:08 +08:00
|
|
|
}
|
|
|
|
};
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-08-12 18:00:08 +08:00
|
|
|
Kinetic.Node.prototype._setDragPosition = function(evt) {
|
2013-08-24 10:31:06 +08:00
|
|
|
var dd = Kinetic.DD,
|
2013-08-12 18:00:08 +08:00
|
|
|
pos = this.getStage().getPointerPosition(),
|
2014-02-28 00:07:29 +08:00
|
|
|
dbf = this.getDragBoundFunc();
|
|
|
|
if (!pos) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var newNodePos = {
|
|
|
|
x: pos.x - dd.offset.x,
|
|
|
|
y: pos.y - dd.offset.y
|
|
|
|
};
|
2013-08-12 18:00:08 +08:00
|
|
|
|
|
|
|
if(dbf !== undefined) {
|
|
|
|
newNodePos = dbf.call(this, newNodePos, evt);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.setAbsolutePosition(newNodePos);
|
|
|
|
};
|
|
|
|
|
2013-03-24 17:31:39 +08:00
|
|
|
/**
|
|
|
|
* stop drag and drop
|
2013-05-16 00:27:22 +08:00
|
|
|
* @method
|
|
|
|
* @memberof Kinetic.Node.prototype
|
2013-03-24 17:31:39 +08:00
|
|
|
*/
|
|
|
|
Kinetic.Node.prototype.stopDrag = function() {
|
2013-04-08 01:52:33 +08:00
|
|
|
var dd = Kinetic.DD,
|
|
|
|
evt = {};
|
|
|
|
dd._endDragBefore(evt);
|
|
|
|
dd._endDragAfter(evt);
|
2013-03-24 17:31:39 +08:00
|
|
|
};
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Node.prototype.setDraggable = function(draggable) {
|
2013-05-15 13:37:33 +08:00
|
|
|
this._setAttr('draggable', draggable);
|
2012-12-02 04:04:10 +08:00
|
|
|
this._dragChange();
|
|
|
|
};
|
2013-03-15 23:33:05 +08:00
|
|
|
|
2013-04-08 01:52:33 +08:00
|
|
|
var origDestroy = Kinetic.Node.prototype.destroy;
|
|
|
|
|
|
|
|
Kinetic.Node.prototype.destroy = function() {
|
|
|
|
var dd = Kinetic.DD;
|
|
|
|
|
|
|
|
// stop DD
|
|
|
|
if(dd.node && dd.node._id === this._id) {
|
|
|
|
|
|
|
|
this.stopDrag();
|
2013-07-23 12:41:41 +08:00
|
|
|
}
|
2013-04-08 01:52:33 +08:00
|
|
|
|
2013-07-23 12:41:41 +08:00
|
|
|
origDestroy.call(this);
|
2013-04-08 01:52:33 +08:00
|
|
|
};
|
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
/**
|
|
|
|
* determine if node is currently in drag and drop mode
|
2013-05-16 00:27:22 +08:00
|
|
|
* @method
|
|
|
|
* @memberof Kinetic.Node.prototype
|
2012-12-02 04:04:10 +08:00
|
|
|
*/
|
|
|
|
Kinetic.Node.prototype.isDragging = function() {
|
2013-01-28 14:25:16 +08:00
|
|
|
var dd = Kinetic.DD;
|
2013-03-24 13:56:22 +08:00
|
|
|
return dd.node && dd.node._id === this._id && dd.isDragging;
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
2012-10-15 11:22:22 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Node.prototype._listenDrag = function() {
|
2013-01-28 13:29:22 +08:00
|
|
|
var that = this;
|
2013-09-27 13:40:23 +08:00
|
|
|
|
|
|
|
this._dragCleanup();
|
|
|
|
|
|
|
|
if (this.getClassName() === 'Stage') {
|
|
|
|
this.on('contentMousedown.kinetic contentTouchstart.kinetic', function(evt) {
|
|
|
|
if(!Kinetic.DD.node) {
|
|
|
|
that.startDrag(evt);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
this.on('mousedown.kinetic touchstart.kinetic', function(evt) {
|
|
|
|
if(!Kinetic.DD.node) {
|
|
|
|
that.startDrag(evt);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2013-12-10 02:07:08 +08:00
|
|
|
|
|
|
|
// listening is required for drag and drop
|
|
|
|
/*
|
|
|
|
this._listeningEnabled = true;
|
|
|
|
this._clearSelfAndAncestorCache('listeningEnabled');
|
|
|
|
*/
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
Kinetic.Node.prototype._dragChange = function() {
|
|
|
|
if(this.attrs.draggable) {
|
|
|
|
this._listenDrag();
|
2012-10-15 09:46:04 +08:00
|
|
|
}
|
|
|
|
else {
|
2012-12-02 04:04:10 +08:00
|
|
|
// remove event listeners
|
|
|
|
this._dragCleanup();
|
|
|
|
|
|
|
|
/*
|
|
|
|
* force drag and drop to end
|
|
|
|
* if this node is currently in
|
|
|
|
* drag and drop mode
|
|
|
|
*/
|
|
|
|
var stage = this.getStage();
|
|
|
|
var dd = Kinetic.DD;
|
|
|
|
if(stage && dd.node && dd.node._id === this._id) {
|
2013-03-24 17:31:39 +08:00
|
|
|
dd.node.stopDrag();
|
2012-12-02 04:04:10 +08:00
|
|
|
}
|
2012-10-15 09:46:04 +08:00
|
|
|
}
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Node.prototype._dragCleanup = function() {
|
2013-11-06 18:29:45 +08:00
|
|
|
if (this.getClassName() === 'Stage') {
|
|
|
|
this.off('contentMousedown.kinetic');
|
|
|
|
this.off('contentTouchstart.kinetic');
|
|
|
|
} else {
|
|
|
|
this.off('mousedown.kinetic');
|
|
|
|
this.off('touchstart.kinetic');
|
|
|
|
}
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
|
|
|
|
2013-08-11 12:11:34 +08:00
|
|
|
Kinetic.Factory.addGetterSetter(Kinetic.Node, 'dragBoundFunc');
|
2012-12-02 04:04:10 +08:00
|
|
|
|
|
|
|
/**
|
2014-01-08 16:07:38 +08:00
|
|
|
* get/set drag bound function. This is used to override the default
|
2012-12-02 04:04:10 +08:00
|
|
|
* drag and drop position
|
2014-01-08 16:07:38 +08:00
|
|
|
* @name dragBoundFunc
|
2013-05-16 15:28:49 +08:00
|
|
|
* @method
|
|
|
|
* @memberof Kinetic.Node.prototype
|
2012-12-02 04:04:10 +08:00
|
|
|
* @param {Function} dragBoundFunc
|
2014-01-08 16:07:38 +08:00
|
|
|
* @returns {Function}
|
|
|
|
* @example
|
|
|
|
* // get drag bound function<br>
|
|
|
|
* var dragBoundFunc = node.dragBoundFunc();<br><br>
|
|
|
|
*
|
|
|
|
* // create vertical drag and drop<br>
|
|
|
|
* node.dragBoundFunc(function(){<br>
|
|
|
|
* return {<br>
|
|
|
|
* x: this.getAbsolutePosition().x,<br>
|
|
|
|
* y: pos.y<br>
|
|
|
|
* };<br>
|
|
|
|
* });
|
2012-12-02 04:04:10 +08:00
|
|
|
*/
|
2013-01-10 15:45:30 +08:00
|
|
|
|
2013-08-11 12:11:34 +08:00
|
|
|
Kinetic.Factory.addGetter(Kinetic.Node, 'draggable', false);
|
2014-01-08 15:56:49 +08:00
|
|
|
Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'draggable');
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-15 23:33:05 +08:00
|
|
|
/**
|
2014-01-08 15:56:49 +08:00
|
|
|
* get/set draggable flag
|
|
|
|
* @name draggable
|
2013-05-16 15:28:49 +08:00
|
|
|
* @method
|
|
|
|
* @memberof Kinetic.Node.prototype
|
2014-01-08 15:56:49 +08:00
|
|
|
* @param {Boolean} draggable
|
|
|
|
* @returns {Boolean}
|
|
|
|
* @example
|
2014-01-08 16:07:38 +08:00
|
|
|
* // get draggable flag<br>
|
|
|
|
* var draggable = node.draggable();<br><br>
|
2014-01-08 15:56:49 +08:00
|
|
|
*
|
2014-01-08 16:07:38 +08:00
|
|
|
* // enable drag and drop<br>
|
|
|
|
* node.draggable(true);<br><br>
|
2014-01-08 15:56:49 +08:00
|
|
|
*
|
2014-01-08 16:07:38 +08:00
|
|
|
* // disable drag and drop<br>
|
2014-01-08 15:56:49 +08:00
|
|
|
* node.draggable(false);
|
2013-03-15 23:33:05 +08:00
|
|
|
*/
|
2013-05-16 00:27:22 +08:00
|
|
|
|
2014-02-27 19:55:39 +08:00
|
|
|
|
|
|
|
if (!Kinetic.Util.isBrowser()) {
|
|
|
|
return;
|
|
|
|
}
|
2013-08-25 17:24:20 +08:00
|
|
|
var html = document.documentElement;
|
2013-03-24 11:02:11 +08:00
|
|
|
html.addEventListener('mouseup', Kinetic.DD._endDragBefore, true);
|
|
|
|
html.addEventListener('touchend', Kinetic.DD._endDragBefore, true);
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2013-03-24 11:02:11 +08:00
|
|
|
html.addEventListener('mouseup', Kinetic.DD._endDragAfter, false);
|
|
|
|
html.addEventListener('touchend', Kinetic.DD._endDragAfter, false);
|
2013-07-23 12:41:41 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
})();
|