From c46f1425a085244b3887af53b1171bef1fdd5930 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Mar 2013 19:24:00 +0100 Subject: [PATCH 1/7] Make keyboard zoom delta configurable --- src/objectliterals.exports | 3 +++ src/ol/interaction/keyboardzoominteraction.js | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/objectliterals.exports b/src/objectliterals.exports index dd1ae0d5f8..6d62578b1d 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -81,6 +81,9 @@ @exportObjectLiteralProperty ol.interaction.DefaultOptions.touchRotate boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.touchZoom boolean|undefined +@exportObjectLiteral ol.interaction.KeyboardZoomOptions +@exportObjectLiteralProperty ol.interaction.KeyboardZoomOptions.delta number|undefined + @exportObjectLiteral ol.layer.LayerOptions @exportObjectLiteralProperty ol.layer.LayerOptions.brightness number|undefined @exportObjectLiteralProperty ol.layer.LayerOptions.contrast number|undefined diff --git a/src/ol/interaction/keyboardzoominteraction.js b/src/ol/interaction/keyboardzoominteraction.js index cbfe06c51e..5cdaa334e1 100644 --- a/src/ol/interaction/keyboardzoominteraction.js +++ b/src/ol/interaction/keyboardzoominteraction.js @@ -16,10 +16,21 @@ ol.interaction.KEYBOARD_ZOOM_DURATION = 100; /** * @constructor + * @param {ol.interaction.KeyboardZoomOptions=} opt_options Options. * @extends {ol.interaction.Interaction} */ -ol.interaction.KeyboardZoom = function() { +ol.interaction.KeyboardZoom = function(opt_options) { + goog.base(this); + + var options = goog.isDef(opt_options) ? opt_options : {}; + + /** + * @private + * @type {number} + */ + this.delta_ = goog.isDef(options.delta) ? options.delta : 1; + }; goog.inherits(ol.interaction.KeyboardZoom, ol.interaction.Interaction); @@ -35,7 +46,7 @@ ol.interaction.KeyboardZoom.prototype.handleMapBrowserEvent = var charCode = keyEvent.charCode; if (charCode == '+'.charCodeAt(0) || charCode == '-'.charCodeAt(0)) { var map = mapBrowserEvent.map; - var delta = (charCode == '+'.charCodeAt(0)) ? 4 : -4; + var delta = (charCode == '+'.charCodeAt(0)) ? this.delta_ : -this.delta_; map.requestRenderFrame(); // FIXME works for View2D only var view = map.getView(); From af0bf21e8d560e5663ed9d98ff55de48611832c7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Mar 2013 19:32:51 +0100 Subject: [PATCH 2/7] Configure keyboard pan with an options object --- src/objectliterals.exports | 4 +++- src/ol/interaction/defaults.js | 4 +--- src/ol/interaction/keyboardpaninteraction.js | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/objectliterals.exports b/src/objectliterals.exports index 6d62578b1d..22ccfac852 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -74,13 +74,15 @@ @exportObjectLiteralProperty ol.interaction.DefaultOptions.doubleClickZoom boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.dragPan boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.keyboard boolean|undefined -@exportObjectLiteralProperty ol.interaction.DefaultOptions.keyboardPanOffset number|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.mouseWheelZoom boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.shiftDragZoom boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.touchPan boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.touchRotate boolean|undefined @exportObjectLiteralProperty ol.interaction.DefaultOptions.touchZoom boolean|undefined +@exportObjectLiteral ol.interaction.KeyboardPanOptions +@exportObjectLiteralProperty ol.interaction.KeyboardPanOptions.pixelDelta number|undefined + @exportObjectLiteral ol.interaction.KeyboardZoomOptions @exportObjectLiteralProperty ol.interaction.KeyboardZoomOptions.delta number|undefined diff --git a/src/ol/interaction/defaults.js b/src/ol/interaction/defaults.js index e776f9e1d0..c016b690bf 100644 --- a/src/ol/interaction/defaults.js +++ b/src/ol/interaction/defaults.js @@ -72,10 +72,8 @@ ol.interaction.defaults = function(opt_options, opt_interactions) { var keyboard = goog.isDef(options.keyboard) ? options.keyboard : true; - var keyboardPanOffset = goog.isDef(options.keyboardPanOffset) ? - options.keyboardPanOffset : 80; if (keyboard) { - interactions.push(new ol.interaction.KeyboardPan(keyboardPanOffset)); + interactions.push(new ol.interaction.KeyboardPan()); interactions.push(new ol.interaction.KeyboardZoom()); } diff --git a/src/ol/interaction/keyboardpaninteraction.js b/src/ol/interaction/keyboardpaninteraction.js index f45a139e4e..fee94fcfbf 100644 --- a/src/ol/interaction/keyboardpaninteraction.js +++ b/src/ol/interaction/keyboardpaninteraction.js @@ -13,17 +13,19 @@ goog.require('ol.interaction.Interaction'); /** * @constructor * @extends {ol.interaction.Interaction} - * @param {number} pixelDelta Pixel delta. + * @param {ol.interaction.KeyboardPanOptions=} opt_options Options. */ -ol.interaction.KeyboardPan = function(pixelDelta) { +ol.interaction.KeyboardPan = function(opt_options) { goog.base(this); + var options = goog.isDef(opt_options) ? opt_options : {}; + /** * @private * @type {number} */ - this.pixelDelta_ = pixelDelta; + this.delta_ = goog.isDef(options.delta) ? options.delta : 128; }; goog.inherits(ol.interaction.KeyboardPan, ol.interaction.Interaction); @@ -48,7 +50,7 @@ ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = goog.asserts.assert(view instanceof ol.View2D); var resolution = view.getResolution(); var delta; - var mapUnitsDelta = resolution * this.pixelDelta_; + var mapUnitsDelta = resolution * this.delta_; if (keyCode == goog.events.KeyCodes.DOWN) { delta = new ol.Coordinate(0, -mapUnitsDelta); } else if (keyCode == goog.events.KeyCodes.LEFT) { From d4a5bfa015c213c31825ae70862d772a23bf3d24 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Mar 2013 19:39:24 +0100 Subject: [PATCH 3/7] Avoid creating an unecessary object --- src/ol/interaction/keyboardpaninteraction.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/ol/interaction/keyboardpaninteraction.js b/src/ol/interaction/keyboardpaninteraction.js index fee94fcfbf..c10b2ddae8 100644 --- a/src/ol/interaction/keyboardpaninteraction.js +++ b/src/ol/interaction/keyboardpaninteraction.js @@ -49,21 +49,20 @@ ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = var view = map.getView(); goog.asserts.assert(view instanceof ol.View2D); var resolution = view.getResolution(); - var delta; var mapUnitsDelta = resolution * this.delta_; + var deltaX = 0, deltaY = 0; if (keyCode == goog.events.KeyCodes.DOWN) { - delta = new ol.Coordinate(0, -mapUnitsDelta); + deltaY = -mapUnitsDelta; } else if (keyCode == goog.events.KeyCodes.LEFT) { - delta = new ol.Coordinate(-mapUnitsDelta, 0); + deltaX = -mapUnitsDelta; } else if (keyCode == goog.events.KeyCodes.RIGHT) { - delta = new ol.Coordinate(mapUnitsDelta, 0); + deltaX = mapUnitsDelta; } else { - goog.asserts.assert(keyCode == goog.events.KeyCodes.UP); - delta = new ol.Coordinate(0, mapUnitsDelta); + deltaY = mapUnitsDelta; } var oldCenter = view.getCenter(); var newCenter = new ol.Coordinate( - oldCenter.x + delta.x, oldCenter.y + delta.y); + oldCenter.x + deltaX, oldCenter.y + deltaY); view.setCenter(newCenter); keyEvent.preventDefault(); mapBrowserEvent.preventDefault(); From 3d37ba7666b6005c35e87dabbdbd1a4c59518443 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Mar 2013 19:56:55 +0100 Subject: [PATCH 4/7] Add ol.View2D.pan --- src/ol/view2d.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ol/view2d.js b/src/ol/view2d.js index f472014250..39e83ee3f1 100644 --- a/src/ol/view2d.js +++ b/src/ol/view2d.js @@ -16,6 +16,7 @@ goog.require('ol.RotationConstraint'); goog.require('ol.Size'); goog.require('ol.View'); goog.require('ol.animation'); +goog.require('ol.easing'); goog.require('ol.projection'); @@ -255,6 +256,26 @@ goog.exportProperty( ol.View2D.prototype.setRotation); +/** + * @param {ol.Map} map Map. + * @param {ol.Coordinate} delta Delta. + * @param {number=} opt_duration Duration. + */ +ol.View2D.prototype.pan = function(map, delta, opt_duration) { + var currentCenter = this.getCenter(); + if (goog.isDef(currentCenter) && goog.isDef(opt_duration)) { + map.requestRenderFrame(); + map.addPreRenderFunction(ol.animation.pan({ + source: currentCenter, + duration: opt_duration, + easing: ol.easing.linear + })); + this.setCenter(new ol.Coordinate( + currentCenter.x + delta.x, currentCenter.y + delta.y)); + } +}; + + /** * @param {ol.Map} map Map. * @param {number|undefined} rotation Rotation. From cd370314569f80bde1f2f1de2c532ff8050d99f3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Mar 2013 19:57:07 +0100 Subject: [PATCH 5/7] Animate keyboard pan --- src/ol/interaction/keyboardpaninteraction.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ol/interaction/keyboardpaninteraction.js b/src/ol/interaction/keyboardpaninteraction.js index c10b2ddae8..84ed83defb 100644 --- a/src/ol/interaction/keyboardpaninteraction.js +++ b/src/ol/interaction/keyboardpaninteraction.js @@ -9,6 +9,12 @@ goog.require('ol.View2D'); goog.require('ol.interaction.Interaction'); +/** + * @define {number} Pan duration. + */ +ol.interaction.KEYBOARD_PAN_DURATION = 100; + + /** * @constructor @@ -60,10 +66,8 @@ ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = } else { deltaY = mapUnitsDelta; } - var oldCenter = view.getCenter(); - var newCenter = new ol.Coordinate( - oldCenter.x + deltaX, oldCenter.y + deltaY); - view.setCenter(newCenter); + view.pan(map, new ol.Coordinate(deltaX, deltaY), + ol.interaction.KEYBOARD_PAN_DURATION); keyEvent.preventDefault(); mapBrowserEvent.preventDefault(); } From 47f1b8cb0ab70adcd4d3e4ad8a37f926df4d82a1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Mar 2013 20:13:38 +0100 Subject: [PATCH 6/7] Cope with rotation in keyboard pan --- src/ol/interaction/keyboardpaninteraction.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/keyboardpaninteraction.js b/src/ol/interaction/keyboardpaninteraction.js index 84ed83defb..cb1ff8b11e 100644 --- a/src/ol/interaction/keyboardpaninteraction.js +++ b/src/ol/interaction/keyboardpaninteraction.js @@ -55,6 +55,7 @@ ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = var view = map.getView(); goog.asserts.assert(view instanceof ol.View2D); var resolution = view.getResolution(); + var rotation = view.getRotation(); var mapUnitsDelta = resolution * this.delta_; var deltaX = 0, deltaY = 0; if (keyCode == goog.events.KeyCodes.DOWN) { @@ -66,8 +67,9 @@ ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = } else { deltaY = mapUnitsDelta; } - view.pan(map, new ol.Coordinate(deltaX, deltaY), - ol.interaction.KEYBOARD_PAN_DURATION); + var delta = new ol.Coordinate(deltaX, deltaY); + delta.rotate(rotation); + view.pan(map, delta, ol.interaction.KEYBOARD_PAN_DURATION); keyEvent.preventDefault(); mapBrowserEvent.preventDefault(); } From fe3b8d862d6a8115d58dfcc91246a4c5f3d5855c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 9 Mar 2013 01:31:14 +0100 Subject: [PATCH 7/7] Correct center setting, thanks @elemoine --- src/ol/view2d.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ol/view2d.js b/src/ol/view2d.js index 39e83ee3f1..0f8bd61df6 100644 --- a/src/ol/view2d.js +++ b/src/ol/view2d.js @@ -263,13 +263,15 @@ goog.exportProperty( */ ol.View2D.prototype.pan = function(map, delta, opt_duration) { var currentCenter = this.getCenter(); - if (goog.isDef(currentCenter) && goog.isDef(opt_duration)) { - map.requestRenderFrame(); - map.addPreRenderFunction(ol.animation.pan({ - source: currentCenter, - duration: opt_duration, - easing: ol.easing.linear - })); + if (goog.isDef(currentCenter)) { + if (goog.isDef(opt_duration)) { + map.requestRenderFrame(); + map.addPreRenderFunction(ol.animation.pan({ + source: currentCenter, + duration: opt_duration, + easing: ol.easing.linear + })); + } this.setCenter(new ol.Coordinate( currentCenter.x + delta.x, currentCenter.y + delta.y)); }