| @ -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}; | |||