From d96ea1cb979c5ffad7165951f530386293030f33 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 15:29:20 +0200 Subject: [PATCH 1/9] Don't invoke interactions if view is not defined --- src/ol/map.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ol/map.js b/src/ol/map.js index eb8632d0f6..75f8519ccd 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -659,6 +659,11 @@ ol.Map.prototype.handleLayersRemove_ = function(collectionEvent) { * @param {ol.MapBrowserEvent} mapBrowserEvent The event to handle. */ ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + if (goog.isNull(this.frameState_)) { + // With no view defined, we cannot translate pixels into geographical + // coordinates so interactions cannot be used. + return; + } mapBrowserEvent.frameState = this.frameState_; var interactions = this.getInteractions(); var interactionsArray = /** @type {Array.} */ From a4e8e529c47e6ba0feaf918e47af43a051e08c59 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:10:45 +0200 Subject: [PATCH 2/9] Make View2D-only comments more consistent --- src/ol/interaction/dragrotateandzoominteraction.js | 1 + src/ol/interaction/dragrotateinteraction.js | 4 ++-- src/ol/interaction/touchrotateinteraction.js | 2 ++ src/ol/interaction/touchzoominteraction.js | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/dragrotateandzoominteraction.js b/src/ol/interaction/dragrotateandzoominteraction.js index 99b02e5b9d..cccf420b3a 100644 --- a/src/ol/interaction/dragrotateandzoominteraction.js +++ b/src/ol/interaction/dragrotateandzoominteraction.js @@ -96,6 +96,7 @@ ol.interaction.DragRotateAndZoom.prototype.handleDrag = ol.interaction.DragRotateAndZoom.prototype.handleDragEnd = function(mapBrowserEvent) { var map = mapBrowserEvent.map; + // FIXME works for View2D only var view = map.getView().getView2D(); var direction = this.lastScaleDelta_ - 1; map.withFrozenRendering(function() { diff --git a/src/ol/interaction/dragrotateinteraction.js b/src/ol/interaction/dragrotateinteraction.js index 534ddd1618..c0a1915224 100644 --- a/src/ol/interaction/dragrotateinteraction.js +++ b/src/ol/interaction/dragrotateinteraction.js @@ -55,7 +55,7 @@ ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) { if (goog.isDef(this.lastAngle_)) { var delta = theta - this.lastAngle_; var view = map.getView(); - // FIXME supports View2D only + // FIXME works for View2D only goog.asserts.assertInstanceof(view, ol.View2D); map.requestRenderFrame(); ol.interaction.Interaction.rotateWithoutConstraints( @@ -70,7 +70,7 @@ ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) { */ ol.interaction.DragRotate.prototype.handleDragEnd = function(mapBrowserEvent) { var map = mapBrowserEvent.map; - // FIXME supports View2D only + // FIXME works for View2D only var view = map.getView(); goog.asserts.assertInstanceof(view, ol.View2D); ol.interaction.Interaction.rotate(map, view, view.getRotation(), undefined, diff --git a/src/ol/interaction/touchrotateinteraction.js b/src/ol/interaction/touchrotateinteraction.js index 4421695742..5cf8efd3e9 100644 --- a/src/ol/interaction/touchrotateinteraction.js +++ b/src/ol/interaction/touchrotateinteraction.js @@ -101,6 +101,7 @@ ol.interaction.TouchRotate.prototype.handleTouchMove = // rotate if (this.rotating_) { + // FIXME works for View2D only var view = map.getView().getView2D(); map.requestRenderFrame(); ol.interaction.Interaction.rotateWithoutConstraints(map, view, @@ -116,6 +117,7 @@ ol.interaction.TouchRotate.prototype.handleTouchEnd = function(mapBrowserEvent) { if (this.targetTouches.length < 2) { var map = mapBrowserEvent.map; + // FIXME works for View2D only var view = map.getView().getView2D(); if (this.rotating_) { ol.interaction.Interaction.rotate( diff --git a/src/ol/interaction/touchzoominteraction.js b/src/ol/interaction/touchzoominteraction.js index 2a95e6d842..58be7bd4bf 100644 --- a/src/ol/interaction/touchzoominteraction.js +++ b/src/ol/interaction/touchzoominteraction.js @@ -71,6 +71,7 @@ ol.interaction.TouchZoom.prototype.handleTouchMove = } var map = mapBrowserEvent.map; + // FIXME works for View2D only var view = map.getView().getView2D(); // scale anchor point. @@ -95,6 +96,7 @@ ol.interaction.TouchZoom.prototype.handleTouchEnd = function(mapBrowserEvent) { if (this.targetTouches.length < 2) { var map = mapBrowserEvent.map; + // FIXME works for View2D only var view = map.getView().getView2D(); // Zoom to final resolution, with an animation, and provide a // direction not to zoom out/in if user was pinching in/out. From b555c52013da17c9dea64029004c68c603a2fad7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:11:03 +0200 Subject: [PATCH 3/9] Use view2DState in ol.interaction.Drag --- src/ol/interaction/draginteraction.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/interaction/draginteraction.js b/src/ol/interaction/draginteraction.js index 395cf69c17..a4ed459161 100644 --- a/src/ol/interaction/draginteraction.js +++ b/src/ol/interaction/draginteraction.js @@ -119,11 +119,12 @@ ol.interaction.Drag.prototype.handleMapBrowserEvent = } } else if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DRAGSTART) { goog.asserts.assertInstanceof(browserEvent, goog.events.BrowserEvent); + var view2DState = view.getView2D().getView2DState(); this.startX = browserEvent.clientX; this.startY = browserEvent.clientY; this.deltaX = 0; this.deltaY = 0; - this.startCenter = /** @type {!ol.Coordinate} */ (view.getCenter()); + this.startCenter = view2DState.center; this.startCoordinate = /** @type {ol.Coordinate} */ (mapBrowserEvent.getCoordinate()); var handled = this.handleDragStart(mapBrowserEvent); From 8565201c742eed026a4d755b480ba022fa62d6bf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:11:17 +0200 Subject: [PATCH 4/9] Use view2DState in ol.interaction.DragPan --- src/ol/interaction/dragpaninteraction.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js index 4d61daffd5..2c2a8b52f2 100644 --- a/src/ol/interaction/dragpaninteraction.js +++ b/src/ol/interaction/dragpaninteraction.js @@ -80,16 +80,16 @@ ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) { // FIXME works for View2D only var map = mapBrowserEvent.map; - var view = map.getView(); + var view = map.getView().getView2D(); if (this.kinetic_ && this.kinetic_.end()) { + var view2DState = view.getView2DState(); var distance = this.kinetic_.getDistance(); var angle = this.kinetic_.getAngle(); - var center = view.getCenter(); - this.kineticPreRenderFn_ = this.kinetic_.pan(center); + this.kineticPreRenderFn_ = this.kinetic_.pan(view2DState.center); map.addPreRenderFunction(this.kineticPreRenderFn_); - var centerpx = map.getPixelFromCoordinate(center); + var centerpx = map.getPixelFromCoordinate(view2DState.center); var dest = map.getCoordinateFromPixel([ centerpx[0] - distance * Math.cos(angle), centerpx[1] - distance * Math.sin(angle) From ec4110ee545a3740bce5d6e520641a82693c59e3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:11:33 +0200 Subject: [PATCH 5/9] Use view2DState in ol.interaction.DragRotateAndZoom --- src/ol/interaction/dragrotateandzoominteraction.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ol/interaction/dragrotateandzoominteraction.js b/src/ol/interaction/dragrotateandzoominteraction.js index cccf420b3a..de64f30d46 100644 --- a/src/ol/interaction/dragrotateandzoominteraction.js +++ b/src/ol/interaction/dragrotateandzoominteraction.js @@ -72,15 +72,16 @@ ol.interaction.DragRotateAndZoom.prototype.handleDrag = var magnitude = delta.magnitude(); // FIXME works for View2D only var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); map.requestRenderFrame(); if (goog.isDef(this.lastAngle_)) { var angleDelta = theta - this.lastAngle_; ol.interaction.Interaction.rotateWithoutConstraints( - map, view, view.getRotation() - angleDelta); + map, view, view2DState.rotation - angleDelta); } this.lastAngle_ = theta; if (goog.isDef(this.lastMagnitude_)) { - var resolution = this.lastMagnitude_ * (view.getResolution() / magnitude); + var resolution = this.lastMagnitude_ * (view2DState.resolution / magnitude); ol.interaction.Interaction.zoomWithoutConstraints(map, view, resolution); } if (goog.isDef(this.lastMagnitude_)) { @@ -98,11 +99,13 @@ ol.interaction.DragRotateAndZoom.prototype.handleDragEnd = var map = mapBrowserEvent.map; // FIXME works for View2D only var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); var direction = this.lastScaleDelta_ - 1; map.withFrozenRendering(function() { - ol.interaction.Interaction.rotate(map, view, view.getRotation()); - ol.interaction.Interaction.zoom(map, view, view.getResolution(), undefined, - ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION, direction); + ol.interaction.Interaction.rotate(map, view, view2DState.rotation); + ol.interaction.Interaction.zoom(map, view, view2DState.resolution, + undefined, ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION, + direction); }); this.lastScaleDelta_ = 0; return true; From 79e0c81301577e95859dd26caa88ea75ae3e6732 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:11:53 +0200 Subject: [PATCH 6/9] Use view2DState in ol.interaction.DragRotate --- src/ol/interaction/dragrotateinteraction.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/ol/interaction/dragrotateinteraction.js b/src/ol/interaction/dragrotateinteraction.js index c0a1915224..8d8c061657 100644 --- a/src/ol/interaction/dragrotateinteraction.js +++ b/src/ol/interaction/dragrotateinteraction.js @@ -1,7 +1,6 @@ goog.provide('ol.interaction.DragRotate'); goog.require('goog.asserts'); -goog.require('ol.View2D'); goog.require('ol.interaction.ConditionType'); goog.require('ol.interaction.Drag'); goog.require('ol.interaction.Interaction'); @@ -54,12 +53,12 @@ ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) { Math.atan2(size[1] / 2 - offset[1], offset[0] - size[0] / 2); if (goog.isDef(this.lastAngle_)) { var delta = theta - this.lastAngle_; - var view = map.getView(); // FIXME works for View2D only - goog.asserts.assertInstanceof(view, ol.View2D); + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); map.requestRenderFrame(); ol.interaction.Interaction.rotateWithoutConstraints( - map, view, view.getRotation() - delta); + map, view, view2DState.rotation - delta); } this.lastAngle_ = theta; }; @@ -71,9 +70,9 @@ ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) { ol.interaction.DragRotate.prototype.handleDragEnd = function(mapBrowserEvent) { var map = mapBrowserEvent.map; // FIXME works for View2D only - var view = map.getView(); - goog.asserts.assertInstanceof(view, ol.View2D); - ol.interaction.Interaction.rotate(map, view, view.getRotation(), undefined, + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); + ol.interaction.Interaction.rotate(map, view, view2DState.rotation, undefined, ol.interaction.DRAGROTATE_ANIMATION_DURATION); }; @@ -86,9 +85,6 @@ ol.interaction.DragRotate.prototype.handleDragStart = var browserEvent = mapBrowserEvent.browserEvent; if (browserEvent.isMouseActionButton() && this.condition_(browserEvent)) { var map = mapBrowserEvent.map; - // FIXME supports View2D only - var view = map.getView(); - goog.asserts.assertInstanceof(view, ol.View2D); map.requestRenderFrame(); this.lastAngle_ = undefined; return true; From e84c484677098e26dc7e4ec347ac2f799c865c19 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:12:03 +0200 Subject: [PATCH 7/9] Use view2DState in ol.interaction.TouchPan --- src/ol/interaction/touchpaninteraction.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ol/interaction/touchpaninteraction.js b/src/ol/interaction/touchpaninteraction.js index b9ef2678ca..223b751ac5 100644 --- a/src/ol/interaction/touchpaninteraction.js +++ b/src/ol/interaction/touchpaninteraction.js @@ -61,11 +61,12 @@ ol.interaction.TouchPan.prototype.handleTouchMove = function(mapBrowserEvent) { var deltaX = this.lastCentroid[0] - centroid[0]; var deltaY = centroid[1] - this.lastCentroid[1]; var map = mapBrowserEvent.map; - var view = map.getView(); + var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); var center = [deltaX, deltaY]; - ol.coordinate.scale(center, view.getResolution()); - ol.coordinate.rotate(center, view.getRotation()); - ol.coordinate.add(center, view.getCenter()); + ol.coordinate.scale(center, view2DState.resolution); + ol.coordinate.rotate(center, view2DState.rotation); + ol.coordinate.add(center, view2DState.center); map.requestRenderFrame(); view.setCenter(center); } From dc9d7e857a0a054af2b108884b76df68c2483ce9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:12:13 +0200 Subject: [PATCH 8/9] Use view2DState in ol.interaction.TouchRotate --- src/ol/interaction/touchrotateinteraction.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/touchrotateinteraction.js b/src/ol/interaction/touchrotateinteraction.js index 5cf8efd3e9..4eb71177f8 100644 --- a/src/ol/interaction/touchrotateinteraction.js +++ b/src/ol/interaction/touchrotateinteraction.js @@ -103,9 +103,10 @@ ol.interaction.TouchRotate.prototype.handleTouchMove = if (this.rotating_) { // FIXME works for View2D only var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); map.requestRenderFrame(); ol.interaction.Interaction.rotateWithoutConstraints(map, view, - view.getRotation() + rotationDelta, this.anchor_); + view2DState.rotation + rotationDelta, this.anchor_); } }; @@ -119,9 +120,10 @@ ol.interaction.TouchRotate.prototype.handleTouchEnd = var map = mapBrowserEvent.map; // FIXME works for View2D only var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); if (this.rotating_) { ol.interaction.Interaction.rotate( - map, view, view.getRotation(), this.anchor_, + map, view, view2DState.rotation, this.anchor_, ol.interaction.TOUCHROTATE_ANIMATION_DURATION); } return false; From f360dd86a0ad01bf5c7694f7d8ae59eacef4cf74 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 25 Jun 2013 17:12:29 +0200 Subject: [PATCH 9/9] Use view2DState in ol.interaction.TouchZoom --- src/ol/interaction/touchzoominteraction.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/touchzoominteraction.js b/src/ol/interaction/touchzoominteraction.js index 58be7bd4bf..5d9053aa26 100644 --- a/src/ol/interaction/touchzoominteraction.js +++ b/src/ol/interaction/touchzoominteraction.js @@ -73,6 +73,7 @@ ol.interaction.TouchZoom.prototype.handleTouchMove = var map = mapBrowserEvent.map; // FIXME works for View2D only var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); // scale anchor point. var viewportPosition = goog.style.getClientPosition(map.getViewport()); @@ -84,7 +85,7 @@ ol.interaction.TouchZoom.prototype.handleTouchMove = // scale, bypass the resolution constraint map.requestRenderFrame(); ol.interaction.Interaction.zoomWithoutConstraints( - map, view, view.getResolution() * scaleDelta, this.anchor_); + map, view, view2DState.resolution * scaleDelta, this.anchor_); }; @@ -98,11 +99,12 @@ ol.interaction.TouchZoom.prototype.handleTouchEnd = var map = mapBrowserEvent.map; // FIXME works for View2D only var view = map.getView().getView2D(); + var view2DState = view.getView2DState(); // Zoom to final resolution, with an animation, and provide a // direction not to zoom out/in if user was pinching in/out. // Direction is > 0 if pinching out, and < 0 if pinching in. var direction = this.lastScaleDelta_ - 1; - ol.interaction.Interaction.zoom(map, view, view.getResolution(), + ol.interaction.Interaction.zoom(map, view, view2DState.resolution, this.anchor_, ol.interaction.TOUCHZOOM_ANIMATION_DURATION, direction); return false; } else {