// namespaces var dwv = dwv || {}; dwv.tool = dwv.tool || {}; /** * ZoomAndPan class. * @constructor * @param {Object} app The associated application. */ dwv.tool.ZoomAndPan = function(app) { /** * Closure to self: to be used by event handlers. * @private * @type Object */ var self = this; /** * ZoomAndPan GUI. * @type Object */ var gui = null; /** * Interaction start flag. * @type Boolean */ this.started = false; /** * Handle mouse down event. * @param {Object} event The mouse down event. */ this.mousedown = function(event){ self.started = true; // first position self.x0 = event._xs; self.y0 = event._ys; }; /** * Handle two touch down event. * @param {Object} event The touch down event. */ this.twotouchdown = function(event){ self.started = true; // store first point self.x0 = event._x; self.y0 = event._y; // first line var point0 = new dwv.math.Point2D(event._x, event._y); var point1 = new dwv.math.Point2D(event._x1, event._y1); self.line0 = new dwv.math.Line(point0, point1); self.midPoint = self.line0.getMidpoint(); }; /** * Handle mouse move event. * @param {Object} event The mouse move event. */ this.mousemove = function(event){ if (!self.started) { return; } // calculate translation var tx = event._xs - self.x0; var ty = event._ys - self.y0; // apply translation //app.translate(tx, ty); app.stepTranslate(tx, ty); // reset origin point self.x0 = event._xs; self.y0 = event._ys; }; /** * Handle two touch move event. * @param {Object} event The touch move event. */ this.twotouchmove = function(event){ if (!self.started) { return; } var point0 = new dwv.math.Point2D(event._x, event._y); var point1 = new dwv.math.Point2D(event._x1, event._y1); var newLine = new dwv.math.Line(point0, point1); var lineRatio = newLine.getLength() / self.line0.getLength(); if( lineRatio === 1 ) { // scroll mode // difference to last position var diffY = event._y - self.y0; // do not trigger for small moves if( Math.abs(diffY) < 15 ) { return; } // update GUI if( diffY > 0 ) { app.getViewController().incrementSliceNb(); } else { app.getViewController().decrementSliceNb(); } } else { // zoom mode var zoom = (lineRatio - 1) / 2; if( Math.abs(zoom) % 0.1 <= 0.05 ) { app.stepZoom(zoom, event._xs, event._ys); } } }; /** * Handle mouse up event. * @param {Object} event The mouse up event. */ this.mouseup = function(/*event*/){ if (self.started) { // stop recording self.started = false; } }; /** * Handle mouse out event. * @param {Object} event The mouse out event. */ this.mouseout = function(event){ self.mouseup(event); }; /** * Handle touch start event. * @param {Object} event The touch start event. */ this.touchstart = function(event){ var touches = event.targetTouches; if( touches.length === 1 ){ self.mousedown(event); } else if( touches.length === 2 ){ self.twotouchdown(event); } }; /** * Handle touch move event. * @param {Object} event The touch move event. */ this.touchmove = function(event){ var touches = event.targetTouches; if( touches.length === 1 ){ self.mousemove(event); } else if( touches.length === 2 ){ self.twotouchmove(event); } }; /** * Handle touch end event. * @param {Object} event The touch end event. */ this.touchend = function(event){ self.mouseup(event); }; /** * Handle mouse scroll event (fired by Firefox). * @param {Object} event The mouse scroll event. */ this.DOMMouseScroll = function(event){ // ev.detail on firefox is 3 var step = - event.detail / 30; app.stepZoom(step, event._xs, event._ys); }; /** * Handle mouse wheel event. * @param {Object} event The mouse wheel event. */ this.mousewheel = function(event){ // ev.wheelDelta on chrome is 120 var step = event.wheelDelta / 1200; app.stepZoom(step, event._xs, event._ys); }; /** * Handle key down event. * @param {Object} event The key down event. */ this.keydown = function(event){ app.onKeydown(event); }; /** * Setup the tool GUI. */ this.setup = function () { gui = new dwv.gui.ZoomAndPan(app); gui.setup(); }; /** * Enable the tool. * @param {Boolean} bool The flag to enable or not. */ this.display = function(bool){ if ( gui ) { gui.display(bool); } }; }; // ZoomAndPan class /** * Help for this tool. * @return {Object} The help content. */ dwv.tool.ZoomAndPan.prototype.getHelp = function() { return { "title": dwv.i18n("tool.ZoomAndPan.name"), "brief": dwv.i18n("tool.ZoomAndPan.brief"), "mouse": { "mouse_wheel": dwv.i18n("tool.ZoomAndPan.mouse_wheel"), "mouse_drag": dwv.i18n("tool.ZoomAndPan.mouse_drag") }, "touch": { 'twotouch_pinch': dwv.i18n("tool.ZoomAndPan.twotouch_pinch"), 'touch_drag': dwv.i18n("tool.ZoomAndPan.touch_drag") } }; }; /** * Initialise the tool. */ dwv.tool.ZoomAndPan.prototype.init = function() { return true; };