1 // Math.sign is used a lot here and outdated brownser don't have it.
2 if (typeof Math.sign !== 'function') {
3 Math.sign = function(value) {
4 return value ? value < 0 ? -1 : 1 : 0;
8 module.exports = function(stage, graph) {
9 // constant TODO: change to use settings
15 var POINTER_DEFAULT = 'auto';
16 var POINTER_DRAG = 'all-scroll';
18 var event = require('events');
19 var emitter = new event.EventEmitter();
20 var mouseDown = false;
21 var draggedNode = null;
23 var camera = stage.camera;
24 var oldPos = new PIXI.Point(0, 0);
26 // Start dragging the node
27 stage.interactionManager.onMouseDown = function(e) {
31 draggedNode = graph.getNodeAt(e.layerX, e.layerY);
34 emitter.emit('nodeDown', draggedNode);
38 // If the node is dragged, update the position
39 // otherwise emit a callable event
40 stage.interactionManager.onMouseMove = function(e) {
41 if (draggedNode) { // drag node
42 setPointerStyle(POINTER_DRAG);
43 var realPos = camera.transform.inverse().transformPoint(e.layerX, e.layerY);
44 draggedNode.pos.x = realPos[0];
45 draggedNode.pos.y = realPos[1];
47 else if (mouseDown) { // do a pan
48 setPointerStyle(POINTER_DRAG);
49 if (oldPos.x == -1 && oldPos.y == -1) {
50 oldPos.set(e.layerX, e.layerY);
53 var pos = new PIXI.Point(0,0);
54 var deltaX = e.layerX - oldPos.x;
55 var deltaY = e.layerY - oldPos.y;
58 Math.sign(deltaX) * Math.abs(deltaX),
59 Math.sign(deltaY) * Math.abs(deltaY)
62 oldPos.set(e.layerX, e.layerY);
63 camera.transform.translate(pos.x, pos.y);
66 var node = graph.getNodeAt(e.layerX, e.layerY);
69 emitter.emit('nodeOver', node);
73 emitter.emit('mouseMove', e);
77 // Stop dragging the node
78 stage.interactionManager.onMouseUp = function(e) {
80 setPointerStyle(POINTER_DEFAULT);
83 emitter.emit('nodeUp', draggedNode);
88 // Release drag or pan if out of the canvas
89 stage.interactionManager.onMouseOut = function(e) {
92 setPointerStyle(POINTER_DEFAULT);
95 function setPointerStyle(style) {
96 if (document.body.style.cursor != style) {
97 document.body.style.cursor = style;
103 // stop scrolling while zooming
106 /* Each brownser on each platform
107 * set the wheel distance a different value. That's why the arbitrary value
110 var sign = Math.sign(e.detail || e.wheelDelta);
112 var currentScale = camera.scaleFactor;
113 var scale = currentScale + (sign * factor);
115 if (scale > MAX_SCALE) {
118 else if (scale < MIN_SCALE) {
121 camera.scaleFactor = scale;
124 // Mouse wheel to Zoom
125 document.getElementById(stage.containerId).addEventListener('mousewheel', zoom, false); // chrome, safari
126 document.getElementById(stage.containerId).addEventListener('DOMMouseScroll', zoom, false); // firefox