@ -0,0 +1,462 @@ | |||||
/** | |||||
* Created by Alex on 2/27/2015. | |||||
* | |||||
*/ | |||||
var util = require('../../util'); | |||||
class InteractionHandler { | |||||
constructor(body, canvas, selectionHandler) { | |||||
this.body = body; | |||||
this.canvas = canvas; | |||||
this.selectionHandler = selectionHandler; | |||||
// bind the events from hammer to functions in this object | |||||
this.body.eventListeners.onTap = this.onTap.bind(this); | |||||
this.body.eventListeners.onTouch = this.onTouch.bind(this); | |||||
this.body.eventListeners.onDoubleTap = this.onDoubleTap.bind(this); | |||||
this.body.eventListeners.onHold = this.onHold.bind(this); | |||||
this.body.eventListeners.onDragStart = this.onDragStart.bind(this); | |||||
this.body.eventListeners.onDrag = this.onDrag.bind(this); | |||||
this.body.eventListeners.onDragEnd = this.onDragEnd.bind(this); | |||||
this.body.eventListeners.onMouseWheel = this.onMouseWheel.bind(this); | |||||
this.body.eventListeners.onPinch = this.onPinch.bind(this); | |||||
this.body.eventListeners.onMouseMove = this.onMouseMove.bind(this); | |||||
this.body.eventListeners.onRelease = this.onRelease.bind(this); | |||||
this.touchTime = 0; | |||||
this.drag = {}; | |||||
this.pinch = {}; | |||||
this.pointerPosition = {x:0,y:0}; | |||||
this.hoverObj = {nodes:{},edges:{}}; | |||||
this.options = {}; | |||||
this.defaultOptions = { | |||||
dragNodes:true, | |||||
dragView: true, | |||||
zoomView: true, | |||||
selectEnabled: true, | |||||
hoverEnabled: false | |||||
} | |||||
util.extend(this.options,this.defaultOptions); | |||||
} | |||||
setOptions(options) { | |||||
if (options !== undefined) { | |||||
util.deepExtend(this.options, options); | |||||
} | |||||
} | |||||
/** | |||||
* Get the pointer location from a touch location | |||||
* @param {{x: Number, y: Number}} touch | |||||
* @return {{x: Number, y: Number}} pointer | |||||
* @private | |||||
*/ | |||||
getPointer(touch) { | |||||
return { | |||||
x: touch.x - util.getAbsoluteLeft(this.canvas.frame.canvas), | |||||
y: touch.y - util.getAbsoluteTop(this.canvas.frame.canvas) | |||||
}; | |||||
} | |||||
/** | |||||
* On start of a touch gesture, store the pointer | |||||
* @param event | |||||
* @private | |||||
*/ | |||||
onTouch(event) { | |||||
if (new Date().valueOf() - this.touchTime > 100) { | |||||
this.drag.pointer = this.getPointer(event.center); | |||||
this.drag.pinched = false; | |||||
this.pinch.scale = this.body.view.scale; | |||||
// to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame) | |||||
this.touchTime = new Date().valueOf(); | |||||
} | |||||
} | |||||
/** | |||||
* handle tap/click event: select/unselect a node | |||||
* @private | |||||
*/ | |||||
onTap(event) { | |||||
var pointer = this.getPointer(event.center); | |||||
var previouslySelected = this.selectionHandler._getSelectedObjectCount() > 0; | |||||
var selected = this.selectionHandler.selectOnPoint(pointer); | |||||
if (selected === true || (previouslySelected == true && selected === false)) { // select or unselect | |||||
this.body.emitter.emit('selected', this.selectionHandler.getSelection()); | |||||
} | |||||
this.selectionHandler._generateClickEvent("click",pointer); | |||||
} | |||||
/** | |||||
* handle doubletap event | |||||
* @private | |||||
*/ | |||||
onDoubleTap(event) { | |||||
var pointer = this.getPointer(event.center); | |||||
this.selectionHandler._generateClickEvent("doubleClick",pointer); | |||||
} | |||||
/** | |||||
* handle long tap event: multi select nodes | |||||
* @private | |||||
*/ | |||||
onHold(event) { | |||||
var pointer = this.getPointer(event.center); | |||||
var selectionChanged = this.selectionHandler.selectAdditionalOnPoint(pointer); | |||||
if (selectionChanged === true) { // select or longpress | |||||
this.body.emitter.emit('selected', this.selectionHandler.getSelection()); | |||||
} | |||||
this.selectionHandler._generateClickEvent("click",pointer); | |||||
} | |||||
/** | |||||
* handle the release of the screen | |||||
* | |||||
* @private | |||||
*/ | |||||
onRelease() {} | |||||
/** | |||||
* This function is called by onDragStart. | |||||
* It is separated out because we can then overload it for the datamanipulation system. | |||||
* | |||||
* @private | |||||
*/ | |||||
onDragStart(event) { | |||||
//in case the touch event was triggered on an external div, do the initial touch now. | |||||
if (this.drag.pointer === undefined) { | |||||
this.onTouch(event); | |||||
} | |||||
var node = this.selectionHandler.getNodeAt(this.drag.pointer); | |||||
// note: drag.pointer is set in onTouch to get the initial touch location | |||||
this.drag.dragging = true; | |||||
this.drag.selection = []; | |||||
this.drag.translation = util.extend({},this.body.view.translation); // copy the object | |||||
this.drag.nodeId = null; | |||||
this.draggingNodes = false; | |||||
this.body.emitter.emit("dragStart", {nodeIds: this.selectionHandler.getSelection().nodes}); | |||||
if (node != null && this.options.dragNodes === true) { | |||||
this.drag.nodeId = node.id; | |||||
// select the clicked node if not yet selected | |||||
if (node.isSelected() === false) { | |||||
this.selectionHandler.selectObject(node); | |||||
} | |||||
var selection = this.selectionHandler.selectionObj.nodes; | |||||
// create an array with the selected nodes and their original location and status | |||||
for (let nodeId in selection) { | |||||
if (selection.hasOwnProperty(nodeId)) { | |||||
var object = selection[nodeId]; | |||||
var s = { | |||||
id: object.id, | |||||
node: object, | |||||
// store original x, y, xFixed and yFixed, make the node temporarily Fixed | |||||
x: object.x, | |||||
y: object.y, | |||||
xFixed: object.xFixed, | |||||
yFixed: object.yFixed | |||||
}; | |||||
object.xFixed = true; | |||||
object.yFixed = true; | |||||
this.drag.selection.push(s); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* handle drag event | |||||
* @private | |||||
*/ | |||||
onDrag(event) { | |||||
if (this.drag.pinched === true) { | |||||
return; | |||||
} | |||||
// remove the focus on node if it is focussed on by the focusOnNode | |||||
this.body.emitter.emit("unlockNode"); | |||||
var pointer = this.getPointer(event.center); | |||||
var selection = this.drag.selection; | |||||
if (selection && selection.length && this.options.dragNodes === true) { | |||||
// calculate delta's and new location | |||||
var deltaX = pointer.x - this.drag.pointer.x; | |||||
var deltaY = pointer.y - this.drag.pointer.y; | |||||
// update position of all selected nodes | |||||
selection.forEach((selection) => { | |||||
var node = selection.node; | |||||
if (!selection.xFixed) { | |||||
node.x = this.canvas._XconvertDOMtoCanvas(this.canvas._XconvertCanvasToDOM(selection.x) + deltaX); | |||||
} | |||||
if (!selection.yFixed) { | |||||
node.y = this.canvas._YconvertDOMtoCanvas(this.canvas._YconvertCanvasToDOM(selection.y) + deltaY); | |||||
} | |||||
}); | |||||
// start the simulation of the physics | |||||
this.body.emitter.emit("startSimulation"); | |||||
} | |||||
else { | |||||
// move the network | |||||
if (this.options.dragView === true) { | |||||
// if the drag was not started properly because the click started outside the network div, start it now. | |||||
if (this.drag.pointer === undefined) { | |||||
this._handleDragStart(event); | |||||
return; | |||||
} | |||||
var diffX = pointer.x - this.drag.pointer.x; | |||||
var diffY = pointer.y - this.drag.pointer.y; | |||||
this.body.view.translation = {x:this.drag.translation.x + diffX, y:this.drag.translation.y + diffY}; | |||||
this.body.emitter.emit("_redraw"); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* handle drag start event | |||||
* @private | |||||
*/ | |||||
onDragEnd(event) { | |||||
this.drag.dragging = false; | |||||
var selection = this.drag.selection; | |||||
if (selection && selection.length) { | |||||
selection.forEach(function (s) { | |||||
// restore original xFixed and yFixed | |||||
s.node.xFixed = s.xFixed; | |||||
s.node.yFixed = s.yFixed; | |||||
}); | |||||
this.body.emitter.emit("startSimulation"); | |||||
} | |||||
else { | |||||
this.body.emitter.emit("_requestRedraw"); | |||||
} | |||||
this.body.emitter.emit("dragEnd", {nodeIds: this.selectionHandler.getSelection().nodes}); | |||||
} | |||||
/** | |||||
* Handle pinch event | |||||
* @param event | |||||
* @private | |||||
*/ | |||||
onPinch(event) { | |||||
var pointer = this.getPointer(event.center); | |||||
this.drag.pinched = true; | |||||
if (this.pinch[scale] === undefined) { | |||||
this.pinch.scale = 1; | |||||
} | |||||
// TODO: enabled moving while pinching? | |||||
var scale = this.pinch.scale * event.gesture.scale; | |||||
this.zoom(scale, pointer) | |||||
} | |||||
/** | |||||
* Zoom the network in or out | |||||
* @param {Number} scale a number around 1, and between 0.01 and 10 | |||||
* @param {{x: Number, y: Number}} pointer Position on screen | |||||
* @return {Number} appliedScale scale is limited within the boundaries | |||||
* @private | |||||
*/ | |||||
zoom(scale, pointer) { | |||||
if (this.options.zoomView === true) { | |||||
var scaleOld = this.body.view.scale; | |||||
if (scale < 0.00001) { | |||||
scale = 0.00001; | |||||
} | |||||
if (scale > 10) { | |||||
scale = 10; | |||||
} | |||||
var preScaleDragPointer = null; | |||||
if (this.drag !== undefined) { | |||||
if (this.drag.dragging === true) { | |||||
preScaleDragPointer = this.canvas.DOMtoCanvas(this.drag.pointer); | |||||
} | |||||
} | |||||
// + this.canvas.frame.canvas.clientHeight / 2 | |||||
var translation = this.body.view.translation; | |||||
var scaleFrac = scale / scaleOld; | |||||
var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; | |||||
var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; | |||||
this.body.view.scale = scale; | |||||
this.body.view.translation = {x:tx, y:ty}; | |||||
if (preScaleDragPointer != null) { | |||||
var postScaleDragPointer = this.canvas.canvasToDOM(preScaleDragPointer); | |||||
this.drag.pointer.x = postScaleDragPointer.x; | |||||
this.drag.pointer.y = postScaleDragPointer.y; | |||||
} | |||||
this.body.emitter.emit("_requestRedraw"); | |||||
if (scaleOld < scale) { | |||||
this.body.emitter.emit("zoom", {direction: "+"}); | |||||
} | |||||
else { | |||||
this.body.emitter.emit("zoom", {direction: "-"}); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Event handler for mouse wheel event, used to zoom the timeline | |||||
* See http://adomas.org/javascript-mouse-wheel/ | |||||
* https://github.com/EightMedia/hammer.js/issues/256 | |||||
* @param {MouseEvent} event | |||||
* @private | |||||
*/ | |||||
onMouseWheel(event) { | |||||
// retrieve delta | |||||
var delta = 0; | |||||
if (event.wheelDelta) { /* IE/Opera. */ | |||||
delta = event.wheelDelta / 120; | |||||
} else if (event.detail) { /* Mozilla case. */ | |||||
// In Mozilla, sign of delta is different than in IE. | |||||
// Also, delta is multiple of 3. | |||||
delta = -event.detail / 3; | |||||
} | |||||
// If delta is nonzero, handle it. | |||||
// Basically, delta is now positive if wheel was scrolled up, | |||||
// and negative, if wheel was scrolled down. | |||||
if (delta) { | |||||
// calculate the new scale | |||||
var scale = this.body.view.scale; | |||||
var zoom = delta / 10; | |||||
if (delta < 0) { | |||||
zoom = zoom / (1 - zoom); | |||||
} | |||||
scale *= (1 + zoom); | |||||
// calculate the pointer location | |||||
var pointer = {x:event.pageX, y:event.pageY}; | |||||
// apply the new scale | |||||
this.zoom(scale, pointer); | |||||
} | |||||
// Prevent default actions caused by mouse wheel. | |||||
event.preventDefault(); | |||||
} | |||||
/** | |||||
* Mouse move handler for checking whether the title moves over a node with a title. | |||||
* @param {Event} event | |||||
* @private | |||||
*/ | |||||
onMouseMove(event) { | |||||
var pointer = {x:event.pageX, y:event.pageY}; | |||||
var popupVisible = false; | |||||
// check if the previously selected node is still selected | |||||
if (this.popup !== undefined) { | |||||
if (this.popup.hidden === false) { | |||||
this._checkHidePopup(pointer); | |||||
} | |||||
// if the popup was not hidden above | |||||
if (this.popup.hidden === false) { | |||||
popupVisible = true; | |||||
this.popup.setPosition(pointer.x + 3, pointer.y - 5) | |||||
this.popup.show(); | |||||
} | |||||
} | |||||
// if we bind the keyboard to the div, we have to highlight it to use it. This highlights it on mouse over | |||||
if (this.options.keyboard.bindToWindow == false && this.options.keyboard.enabled === true) { | |||||
this.canvas.frame.focus(); | |||||
} | |||||
// start a timeout that will check if the mouse is positioned above an element | |||||
if (popupVisible === false) { | |||||
var me = this; | |||||
var checkShow = function() { | |||||
me._checkShowPopup(pointer); | |||||
}; | |||||
if (this.popupTimer) { | |||||
clearInterval(this.popupTimer); // stop any running calculationTimer | |||||
} | |||||
if (!this.drag.dragging) { | |||||
this.popupTimer = setTimeout(checkShow, this.options.tooltip.delay); | |||||
} | |||||
} | |||||
/** | |||||
* Adding hover highlights | |||||
*/ | |||||
if (this.options.hoverEnabled === true) { | |||||
// removing all hover highlights | |||||
for (var edgeId in this.hoverObj.edges) { | |||||
if (this.hoverObj.edges.hasOwnProperty(edgeId)) { | |||||
this.hoverObj.edges[edgeId].hover = false; | |||||
delete this.hoverObj.edges[edgeId]; | |||||
} | |||||
} | |||||
// adding hover highlights | |||||
var obj = this.selectionHandler.getNodeAt(pointer); | |||||
if (obj == null) { | |||||
obj = this.selectionHandler.getEdgeAt(pointer); | |||||
} | |||||
if (obj != null) { | |||||
this._hoverObject(obj); | |||||
} | |||||
// removing all node hover highlights except for the selected one. | |||||
for (var nodeId in this.hoverObj.nodes) { | |||||
if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { | |||||
if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { | |||||
this._blurObject(this.hoverObj.nodes[nodeId]); | |||||
delete this.hoverObj.nodes[nodeId]; | |||||
} | |||||
} | |||||
} | |||||
this.body.emitter.emit("_requestRedraw"); | |||||
} | |||||
} | |||||
} | |||||
export {TouchEventHandler}; |
@ -1,460 +0,0 @@ | |||||
/** | |||||
* Created by Alex on 2/27/2015. | |||||
* | |||||
*/ | |||||
import {SelectionHandler} from "./components/SelectionHandler" | |||||
var util = require('../../util'); | |||||
class TouchEventHandler { | |||||
constructor(body) { | |||||
this.body = body; | |||||
this.body.eventListeners.onTap = this.onTap.bind(this); | |||||
this.body.eventListeners.onTouch = this.onTouch.bind(this); | |||||
this.body.eventListeners.onDoubleTap = this.onDoubleTap.bind(this); | |||||
this.body.eventListeners.onHold = this.onHold.bind(this); | |||||
this.body.eventListeners.onDragStart = this.onDragStart.bind(this); | |||||
this.body.eventListeners.onDrag = this.onDrag.bind(this); | |||||
this.body.eventListeners.onDragEnd = this.onDragEnd.bind(this); | |||||
this.body.eventListeners.onMouseWheel = this.onMouseWheel.bind(this); | |||||
this.body.eventListeners.onPinch = this.onPinch.bind(this); | |||||
this.body.eventListeners.onMouseMove = this.onMouseMove.bind(this); | |||||
this.body.eventListeners.onRelease = this.onRelease.bind(this); | |||||
this.touchTime = 0; | |||||
this.drag = {}; | |||||
this.pinch = {}; | |||||
this.pointerPosition = {x:0,y:0}; | |||||
this.scale = 1.0; | |||||
this.body.emitter.on("_setScale", (scale) => this.scale = scale); | |||||
this.selectionHandler = new SelectionHandler(body); | |||||
} | |||||
setCanvas(canvas) { | |||||
this.canvas = canvas; | |||||
this.selectionHandler.setCanvas(canvas); | |||||
} | |||||
/** | |||||
* Get the pointer location from a touch location | |||||
* @param {{x: Number, y: Number}} touch | |||||
* @return {{x: Number, y: Number}} pointer | |||||
* @private | |||||
*/ | |||||
getPointer(touch) { | |||||
return { | |||||
x: touch.x - util.getAbsoluteLeft(this.canvas.frame.canvas), | |||||
y: touch.y - util.getAbsoluteTop(this.canvas.frame.canvas) | |||||
}; | |||||
} | |||||
/** | |||||
* On start of a touch gesture, store the pointer | |||||
* @param event | |||||
* @private | |||||
*/ | |||||
onTouch(event) { | |||||
console.log('touch!') | |||||
if (new Date().valueOf() - this.touchTime > 100) { | |||||
this.drag.pointer = this.getPointer(event.center); | |||||
this.drag.pinched = false; | |||||
this.pinch.scale = this.scale; | |||||
// to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame) | |||||
this.touchTime = new Date().valueOf(); | |||||
} | |||||
} | |||||
/** | |||||
* handle tap/click event: select/unselect a node | |||||
* @private | |||||
*/ | |||||
onTap(event) { | |||||
var pointer = this.getPointer(event.center); | |||||
this.pointerPosition = pointer; | |||||
this.selectionHandler.selectOnPoint(pointer); | |||||
} | |||||
/** | |||||
* handle drag start event | |||||
* @private | |||||
*/ | |||||
/** | |||||
* This function is called by onDragStart. | |||||
* It is separated out because we can then overload it for the datamanipulation system. | |||||
* | |||||
* @private | |||||
*/ | |||||
onDragStart(event) { | |||||
// in case the touch event was triggered on an external div, do the initial touch now. | |||||
//if (this.drag.pointer === undefined) { | |||||
// this.onTouch(event); | |||||
//} | |||||
// | |||||
//var node = this._getNodeAt(this.drag.pointer); | |||||
//// note: drag.pointer is set in onTouch to get the initial touch location | |||||
// | |||||
//this.drag.dragging = true; | |||||
//this.drag.selection = []; | |||||
//this.drag.translation = this._getTranslation(); | |||||
//this.drag.nodeId = null; | |||||
//this.draggingNodes = false; | |||||
// | |||||
//if (node != null && this.constants.dragNodes == true) { | |||||
// this.draggingNodes = true; | |||||
// this.drag.nodeId = node.id; | |||||
// // select the clicked node if not yet selected | |||||
// if (!node.isSelected()) { | |||||
// this._selectObject(node, false); | |||||
// } | |||||
// | |||||
// this.emit("dragStart", {nodeIds: this.getSelection().nodes}); | |||||
// | |||||
// // create an array with the selected nodes and their original location and status | |||||
// for (var objectId in this.selectionObj.nodes) { | |||||
// if (this.selectionObj.nodes.hasOwnProperty(objectId)) { | |||||
// var object = this.selectionObj.nodes[objectId]; | |||||
// var s = { | |||||
// id: object.id, | |||||
// node: object, | |||||
// | |||||
// // store original x, y, xFixed and yFixed, make the node temporarily Fixed | |||||
// x: object.x, | |||||
// y: object.y, | |||||
// xFixed: object.xFixed, | |||||
// yFixed: object.yFixed | |||||
// }; | |||||
// | |||||
// object.xFixed = true; | |||||
// object.yFixed = true; | |||||
// | |||||
// this.drag.selection.push(s); | |||||
// } | |||||
// } | |||||
//} | |||||
} | |||||
/** | |||||
* handle drag event | |||||
* @private | |||||
*/ | |||||
onDrag(event) { | |||||
//if (this.drag.pinched) { | |||||
// return; | |||||
//} | |||||
// | |||||
//// remove the focus on node if it is focussed on by the focusOnNode | |||||
//this.releaseNode(); | |||||
// | |||||
//var pointer = this.getPointer(event.gesture.center); | |||||
//var me = this; | |||||
//var drag = this.drag; | |||||
//var selection = drag.selection; | |||||
//if (selection && selection.length && this.constants.dragNodes == true) { | |||||
// // calculate delta's and new location | |||||
// var deltaX = pointer.x - drag.pointer.x; | |||||
// var deltaY = pointer.y - drag.pointer.y; | |||||
// | |||||
// // update position of all selected nodes | |||||
// selection.forEach(function (s) { | |||||
// var node = s.node; | |||||
// | |||||
// if (!s.xFixed) { | |||||
// node.x = me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x) + deltaX); | |||||
// } | |||||
// | |||||
// if (!s.yFixed) { | |||||
// node.y = me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y) + deltaY); | |||||
// } | |||||
// }); | |||||
// | |||||
// | |||||
// // start _animationStep if not yet running | |||||
// if (!this.moving) { | |||||
// this.moving = true; | |||||
// this.start(); | |||||
// } | |||||
//} | |||||
//else { | |||||
// // move the network | |||||
// if (this.constants.dragNetwork == true) { | |||||
// // if the drag was not started properly because the click started outside the network div, start it now. | |||||
// if (this.drag.pointer === undefined) { | |||||
// this._handleDragStart(event); | |||||
// return; | |||||
// } | |||||
// var diffX = pointer.x - this.drag.pointer.x; | |||||
// var diffY = pointer.y - this.drag.pointer.y; | |||||
// | |||||
// this._setTranslation( | |||||
// this.drag.translation.x + diffX, | |||||
// this.drag.translation.y + diffY | |||||
// ); | |||||
// this._redraw(); | |||||
// } | |||||
//} | |||||
} | |||||
/** | |||||
* handle drag start event | |||||
* @private | |||||
*/ | |||||
onDragEnd(event) { | |||||
//this.drag.dragging = false; | |||||
//var selection = this.drag.selection; | |||||
//if (selection && selection.length) { | |||||
// selection.forEach(function (s) { | |||||
// // restore original xFixed and yFixed | |||||
// s.node.xFixed = s.xFixed; | |||||
// s.node.yFixed = s.yFixed; | |||||
// }); | |||||
// this.moving = true; | |||||
// this.start(); | |||||
//} | |||||
//else { | |||||
// this._redraw(); | |||||
//} | |||||
//if (this.draggingNodes == false) { | |||||
// this.emit("dragEnd", {nodeIds: []}); | |||||
//} | |||||
//else { | |||||
// this.emit("dragEnd", {nodeIds: this.getSelection().nodes}); | |||||
//} | |||||
} | |||||
/** | |||||
* handle doubletap event | |||||
* @private | |||||
*/ | |||||
onDoubleTap(event) { | |||||
//var pointer = this.getPointer(event.gesture.center); | |||||
//this._handleDoubleTap(pointer); | |||||
} | |||||
/** | |||||
* handle long tap event: multi select nodes | |||||
* @private | |||||
*/ | |||||
onHold(event) { | |||||
//var pointer = this.getPointer(event.gesture.center); | |||||
//this.pointerPosition = pointer; | |||||
//this._handleOnHold(pointer); | |||||
} | |||||
/** | |||||
* handle the release of the screen | |||||
* | |||||
* @private | |||||
*/ | |||||
onRelease(event) { | |||||
//var pointer = this.getPointer(event.gesture.center); | |||||
//this._handleOnRelease(pointer); | |||||
} | |||||
/** | |||||
* Handle pinch event | |||||
* @param event | |||||
* @private | |||||
*/ | |||||
onPinch(event) { | |||||
//var pointer = this.getPointer(event.gesture.center); | |||||
// | |||||
//this.drag.pinched = true; | |||||
//if (!('scale' in this.pinch)) { | |||||
// this.pinch.scale = 1; | |||||
//} | |||||
// | |||||
//// TODO: enabled moving while pinching? | |||||
//var scale = this.pinch.scale * event.gesture.scale; | |||||
//this._zoom(scale, pointer) | |||||
} | |||||
/** | |||||
* Zoom the network in or out | |||||
* @param {Number} scale a number around 1, and between 0.01 and 10 | |||||
* @param {{x: Number, y: Number}} pointer Position on screen | |||||
* @return {Number} appliedScale scale is limited within the boundaries | |||||
* @private | |||||
*/ | |||||
_zoom(scale, pointer) { | |||||
//if (this.constants.zoomable == true) { | |||||
// var scaleOld = this._getScale(); | |||||
// if (scale < 0.00001) { | |||||
// scale = 0.00001; | |||||
// } | |||||
// if (scale > 10) { | |||||
// scale = 10; | |||||
// } | |||||
// | |||||
// var preScaleDragPointer = null; | |||||
// if (this.drag !== undefined) { | |||||
// if (this.drag.dragging == true) { | |||||
// preScaleDragPointer = this.canvas.DOMtoCanvas(this.drag.pointer); | |||||
// } | |||||
// } | |||||
// // + this.canvas.frame.canvas.clientHeight / 2 | |||||
// var translation = this._getTranslation(); | |||||
// | |||||
// var scaleFrac = scale / scaleOld; | |||||
// var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; | |||||
// var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; | |||||
// | |||||
// this._setScale(scale); | |||||
// this._setTranslation(tx, ty); | |||||
// | |||||
// if (preScaleDragPointer != null) { | |||||
// var postScaleDragPointer = this.canvas.canvasToDOM(preScaleDragPointer); | |||||
// this.drag.pointer.x = postScaleDragPointer.x; | |||||
// this.drag.pointer.y = postScaleDragPointer.y; | |||||
// } | |||||
// | |||||
// this._redraw(); | |||||
// | |||||
// if (scaleOld < scale) { | |||||
// this.emit("zoom", {direction: "+"}); | |||||
// } | |||||
// else { | |||||
// this.emit("zoom", {direction: "-"}); | |||||
// } | |||||
// | |||||
// return scale; | |||||
//} | |||||
} | |||||
/** | |||||
* Event handler for mouse wheel event, used to zoom the timeline | |||||
* See http://adomas.org/javascript-mouse-wheel/ | |||||
* https://github.com/EightMedia/hammer.js/issues/256 | |||||
* @param {MouseEvent} event | |||||
* @private | |||||
*/ | |||||
onMouseWheel(event) { | |||||
//// retrieve delta | |||||
//var delta = 0; | |||||
//if (event.wheelDelta) { /* IE/Opera. */ | |||||
// delta = event.wheelDelta / 120; | |||||
//} else if (event.detail) { /* Mozilla case. */ | |||||
// // In Mozilla, sign of delta is different than in IE. | |||||
// // Also, delta is multiple of 3. | |||||
// delta = -event.detail / 3; | |||||
//} | |||||
// | |||||
//// If delta is nonzero, handle it. | |||||
//// Basically, delta is now positive if wheel was scrolled up, | |||||
//// and negative, if wheel was scrolled down. | |||||
//if (delta) { | |||||
// | |||||
// // calculate the new scale | |||||
// var scale = this._getScale(); | |||||
// var zoom = delta / 10; | |||||
// if (delta < 0) { | |||||
// zoom = zoom / (1 - zoom); | |||||
// } | |||||
// scale *= (1 + zoom); | |||||
// | |||||
// // calculate the pointer location | |||||
// var gesture = hammerUtil.fakeGesture(this, event); | |||||
// var pointer = this.getPointer(gesture.center); | |||||
// | |||||
// // apply the new scale | |||||
// this._zoom(scale, pointer); | |||||
//} | |||||
// | |||||
//// Prevent default actions caused by mouse wheel. | |||||
//event.preventDefault(); | |||||
} | |||||
/** | |||||
* Mouse move handler for checking whether the title moves over a node with a title. | |||||
* @param {Event} event | |||||
* @private | |||||
*/ | |||||
onMouseMove(event) { | |||||
//var gesture = hammerUtil.fakeGesture(this, event); | |||||
//var pointer = this.getPointer(gesture.center); | |||||
//var popupVisible = false; | |||||
// | |||||
//// check if the previously selected node is still selected | |||||
//if (this.popup !== undefined) { | |||||
// if (this.popup.hidden === false) { | |||||
// this._checkHidePopup(pointer); | |||||
// } | |||||
// | |||||
// // if the popup was not hidden above | |||||
// if (this.popup.hidden === false) { | |||||
// popupVisible = true; | |||||
// this.popup.setPosition(pointer.x + 3, pointer.y - 5) | |||||
// this.popup.show(); | |||||
// } | |||||
//} | |||||
// | |||||
//// if we bind the keyboard to the div, we have to highlight it to use it. This highlights it on mouse over | |||||
//if (this.constants.keyboard.bindToWindow == false && this.constants.keyboard.enabled == true) { | |||||
// this.canvas.frame.focus(); | |||||
//} | |||||
// | |||||
//// start a timeout that will check if the mouse is positioned above an element | |||||
//if (popupVisible === false) { | |||||
// var me = this; | |||||
// var checkShow = function() { | |||||
// me._checkShowPopup(pointer); | |||||
// }; | |||||
// | |||||
// if (this.popupTimer) { | |||||
// clearInterval(this.popupTimer); // stop any running calculationTimer | |||||
// } | |||||
// if (!this.drag.dragging) { | |||||
// this.popupTimer = setTimeout(checkShow, this.constants.tooltip.delay); | |||||
// } | |||||
//} | |||||
// | |||||
///** | |||||
// * Adding hover highlights | |||||
// */ | |||||
//if (this.constants.hover == true) { | |||||
// // removing all hover highlights | |||||
// for (var edgeId in this.hoverObj.edges) { | |||||
// if (this.hoverObj.edges.hasOwnProperty(edgeId)) { | |||||
// this.hoverObj.edges[edgeId].hover = false; | |||||
// delete this.hoverObj.edges[edgeId]; | |||||
// } | |||||
// } | |||||
// | |||||
// // adding hover highlights | |||||
// var obj = this._getNodeAt(pointer); | |||||
// if (obj == null) { | |||||
// obj = this._getEdgeAt(pointer); | |||||
// } | |||||
// if (obj != null) { | |||||
// this._hoverObject(obj); | |||||
// } | |||||
// | |||||
// // removing all node hover highlights except for the selected one. | |||||
// for (var nodeId in this.hoverObj.nodes) { | |||||
// if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { | |||||
// if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { | |||||
// this._blurObject(this.hoverObj.nodes[nodeId]); | |||||
// delete this.hoverObj.nodes[nodeId]; | |||||
// } | |||||
// } | |||||
// } | |||||
// this.redraw(); | |||||
//} | |||||
} | |||||
} | |||||
export {TouchEventHandler}; |