From 4754ed1cc2c2e1d92d4cdbdad1fe1497f9a19985 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 14:07:59 +0200 Subject: [PATCH] Add ol.control.MouseWheelZoom --- src/ol/control/mousewheelzoom.js | 39 ++++++++++++++++++++++++++++++++ src/ol/createmap.js | 2 ++ src/ol/map.js | 9 ++++++++ src/ol/ol.js | 1 + 4 files changed, 51 insertions(+) create mode 100644 src/ol/control/mousewheelzoom.js diff --git a/src/ol/control/mousewheelzoom.js b/src/ol/control/mousewheelzoom.js new file mode 100644 index 0000000000..8b94a52b7a --- /dev/null +++ b/src/ol/control/mousewheelzoom.js @@ -0,0 +1,39 @@ +goog.provide('ol.control.MouseWheelZoom'); + +goog.require('goog.events.MouseWheelEvent'); +goog.require('goog.events.MouseWheelHandler.EventType'); +goog.require('ol.MapBrowserEvent'); + + + +/** + * @constructor + * @extends {ol.Control} + */ +ol.control.MouseWheelZoom = function() { + goog.base(this); +}; +goog.inherits(ol.control.MouseWheelZoom, ol.Control); + + +/** + * @inheritDoc + */ +ol.control.MouseWheelZoom.prototype.handleMapBrowserEvent = function(event) { + if (event.type == goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { + var map = event.map; + var mouseWheelEvent = /** @type {goog.events.MouseWheelEvent} */ + event.getBrowserEventObject(); + goog.asserts.assert(mouseWheelEvent instanceof goog.events.MouseWheelEvent); + if (mouseWheelEvent.deltaY !== 0) { + map.whileFrozen(function() { + // FIXME compute correct center for zoom + map.setCenter(event.getCoordinate()); + var scale = mouseWheelEvent.deltaY < 0 ? 0.5 : 2; + map.setResolution(scale * map.getResolution()); + }); + event.preventDefault(); + mouseWheelEvent.preventDefault(); + } + } +}; diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 4f2eb82926..3a9e9089d9 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -7,6 +7,7 @@ goog.require('ol.Map'); goog.require('ol.MapProperty'); goog.require('ol.Projection'); goog.require('ol.control.DblClickZoom'); +goog.require('ol.control.MouseWheelZoom'); goog.require('ol.dom'); goog.require('ol.dom.Map'); goog.require('ol.webgl'); @@ -66,6 +67,7 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { var controls = new ol.Array(); controls.push(new ol.control.DblClickZoom()); + controls.push(new ol.control.MouseWheelZoom()); values[ol.MapProperty.CONTROLS] = controls; } diff --git a/src/ol/map.js b/src/ol/map.js index 3e408daa93..3ffcd317dd 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -7,6 +7,9 @@ goog.require('goog.events'); goog.require('goog.events.BrowserEvent'); goog.require('goog.events.Event'); goog.require('goog.events.EventType'); +goog.require('goog.events.MouseWheelEvent'); +goog.require('goog.events.MouseWheelHandler'); +goog.require('goog.events.MouseWheelHandler.EventType'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.math.Coordinate'); @@ -73,6 +76,12 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.events.EventType.CLICK ], this.handleBrowserEvent, false, this); + var mouseWheelHandler = new goog.events.MouseWheelHandler(this.eventsPane_); + goog.events.listen(mouseWheelHandler, + goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, + this.handleBrowserEvent, false, this); + this.registerDisposable(mouseWheelHandler); + /** * @private * @type {goog.fx.anim.Animated} diff --git a/src/ol/ol.js b/src/ol/ol.js index 33e09481ce..fe31aa9114 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -25,6 +25,7 @@ goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); goog.require('ol.control.DblClickZoom'); +goog.require('ol.control.MouseWheelZoom'); goog.require('ol.createMap'); goog.require('ol.dom'); goog.require('ol.dom.LayerRenderer');