From 035f487dc586ffdf1d05828848b95f3a54199deb Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 1 Feb 2013 08:56:55 +0100 Subject: [PATCH 01/33] Add ol.Geolocation --- src/ol/geolocation.js | 100 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/ol/geolocation.js diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js new file mode 100644 index 0000000000..d432e45fbb --- /dev/null +++ b/src/ol/geolocation.js @@ -0,0 +1,100 @@ +// FIXME: handle errors ? + +goog.provide('ol.Geolocation'); +goog.provide('ol.GeolocationProperty'); + +goog.require('ol.Coordinate'); +goog.require('ol.Object'); +goog.require('ol.Projection'); + + +/** + * @enum {string} + */ +ol.GeolocationProperty = { + ACCURACY: 'accuracy', + POSITION: 'position' +}; + + + +/** + * @constructor + * @extends {ol.Object} + * @param {ol.Projection} projection Projection. + * @param {GeolocationPositionOptions=} opt_positionOptions PositionOptions. + */ +ol.Geolocation = function(projection, opt_positionOptions) { + + goog.base(this); + + this.transformCoords_ = ol.Projection.getTransform( + ol.Projection.getFromCode('EPSG:4326'), projection); + + /** + * @private + * @type {number} + */ + this.watchId_ = navigator.geolocation.watchPosition( + goog.bind(this.positionChange_, this), + goog.bind(this.positionError_, this), + opt_positionOptions); +}; +goog.inherits(ol.Geolocation, ol.Object); + + +/** + * @inheritDoc + */ +ol.Geolocation.prototype.disposeInternal = function() { + navigator.geolocation.clearWatch(this.watchId_); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @private + * @param {GeolocationPosition} position position event. + */ +ol.Geolocation.prototype.positionChange_ = function(position) { + var coords = position.coords; + var coord = new ol.Coordinate(coords.longitude, coords.latitude); + this.set(ol.GeolocationProperty.POSITION, this.transformCoords_(coord)); + this.set(ol.GeolocationProperty.ACCURACY, coords.accuracy); +}; + + +/** + * @private + * @param {GeolocationPositionError} error error object. + */ +ol.Geolocation.prototype.positionError_ = function(error) { +}; + + +/** + * The position of the device. + * @return {ol.Coordinate} position. + */ +ol.Geolocation.prototype.getPosition = function() { + return /** @type {ol.Coordinate} */ ( + this.get(ol.GeolocationProperty.POSITION)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getPosition', + ol.Geolocation.prototype.getPosition); + + +/** + * The accuracy of the position in meters. + * @return {number} accuracy. + */ +ol.Geolocation.prototype.getAccuracy = function() { + return /** @type {number} */ ( + this.get(ol.GeolocationProperty.ACCURACY)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getAccuracy', + ol.Geolocation.prototype.getAccuracy); From 37e172f0435bac63faa2e147153cce986351c9da Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 1 Feb 2013 12:01:48 +0100 Subject: [PATCH 02/33] Add missing export file for ol.Geolocation --- src/ol/geolocation.exports | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/ol/geolocation.exports diff --git a/src/ol/geolocation.exports b/src/ol/geolocation.exports new file mode 100644 index 0000000000..adc26edc01 --- /dev/null +++ b/src/ol/geolocation.exports @@ -0,0 +1 @@ +@exportSymbol ol.Geolocation From 38f245c5c8ee25190c080a73370b880a439d4ceb Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 1 Feb 2013 13:53:55 +0100 Subject: [PATCH 03/33] Add projection property to ol.Geolocation --- src/ol/geolocation.js | 44 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js index d432e45fbb..e3cca58e5b 100644 --- a/src/ol/geolocation.js +++ b/src/ol/geolocation.js @@ -13,7 +13,8 @@ goog.require('ol.Projection'); */ ol.GeolocationProperty = { ACCURACY: 'accuracy', - POSITION: 'position' + POSITION: 'position', + PROJECTION: 'projection' }; @@ -21,15 +22,14 @@ ol.GeolocationProperty = { /** * @constructor * @extends {ol.Object} - * @param {ol.Projection} projection Projection. * @param {GeolocationPositionOptions=} opt_positionOptions PositionOptions. */ -ol.Geolocation = function(projection, opt_positionOptions) { +ol.Geolocation = function(opt_positionOptions) { goog.base(this); - this.transformCoords_ = ol.Projection.getTransform( - ol.Projection.getFromCode('EPSG:4326'), projection); + // set the default projection + this.setProjection(ol.Projection.getFromCode('EPSG:4326')); /** * @private @@ -98,3 +98,37 @@ goog.exportProperty( ol.Geolocation.prototype, 'getAccuracy', ol.Geolocation.prototype.getAccuracy); + + +/** + * @return {ol.Projection} projection. + */ +ol.Geolocation.prototype.getProjection = function() { + return /** @type {ol.Projection} */ ( + this.get(ol.GeolocationProperty.PROJECTION)); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'getProjection', + ol.Geolocation.prototype.getProjection); + + +/** + * @param {ol.Projection} projection Projection. + */ +ol.Geolocation.prototype.setProjection = function(projection) { + this.set(ol.GeolocationProperty.PROJECTION, projection); + + this.transformCoords_ = ol.Projection.getTransform( + ol.Projection.getFromCode('EPSG:4326'), projection); +}; +goog.exportProperty( + ol.Geolocation.prototype, + 'setProjection', + ol.Geolocation.prototype.setProjection); + + +/** + * @private + */ +ol.Geolocation.prototype.transformCoords_ = goog.functions.identity; From 6675de437fb89b29ccbf4a6f990b0c44333402aa Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Mon, 4 Feb 2013 09:46:31 +0100 Subject: [PATCH 04/33] Handle projection change in ol.Geolocation --- src/ol/geolocation.js | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js index e3cca58e5b..1816b89849 100644 --- a/src/ol/geolocation.js +++ b/src/ol/geolocation.js @@ -3,6 +3,7 @@ goog.provide('ol.Geolocation'); goog.provide('ol.GeolocationProperty'); +goog.require('goog.functions'); goog.require('ol.Coordinate'); goog.require('ol.Object'); goog.require('ol.Projection'); @@ -28,8 +29,16 @@ ol.Geolocation = function(opt_positionOptions) { goog.base(this); - // set the default projection - this.setProjection(ol.Projection.getFromCode('EPSG:4326')); + /** + * The unprojected (EPSG:4326) device position. + * @private + * @type {ol.Coordinate} + */ + this.position_ = null; + + goog.events.listen( + this, ol.Object.getChangedEventType(ol.GeolocationProperty.PROJECTION), + this.handleProjectionChanged, false, this); /** * @private @@ -52,14 +61,28 @@ ol.Geolocation.prototype.disposeInternal = function() { }; +/** + * @protected + */ +ol.Geolocation.prototype.handleProjectionChanged = function() { + this.transformCoords_ = ol.Projection.getTransform( + ol.Projection.getFromCode('EPSG:4326'), this.getProjection()); + if (!goog.isNull(this.position_)) { + this.set(ol.GeolocationProperty.POSITION, + this.transformCoords_(this.position_)); + } +}; + + /** * @private * @param {GeolocationPosition} position position event. */ ol.Geolocation.prototype.positionChange_ = function(position) { var coords = position.coords; - var coord = new ol.Coordinate(coords.longitude, coords.latitude); - this.set(ol.GeolocationProperty.POSITION, this.transformCoords_(coord)); + this.position_ = new ol.Coordinate(coords.longitude, coords.latitude); + this.set(ol.GeolocationProperty.POSITION, + this.transformCoords_(this.position_)); this.set(ol.GeolocationProperty.ACCURACY, coords.accuracy); }; @@ -118,9 +141,6 @@ goog.exportProperty( */ ol.Geolocation.prototype.setProjection = function(projection) { this.set(ol.GeolocationProperty.PROJECTION, projection); - - this.transformCoords_ = ol.Projection.getTransform( - ol.Projection.getFromCode('EPSG:4326'), projection); }; goog.exportProperty( ol.Geolocation.prototype, @@ -130,5 +150,7 @@ goog.exportProperty( /** * @private + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Coordinate} Coordinate. */ ol.Geolocation.prototype.transformCoords_ = goog.functions.identity; From bde61a0b4b9d6fff42bcfb88137992dc88eb5daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 1 Feb 2013 18:10:37 +0100 Subject: [PATCH 05/33] Simplify control architecture --- examples/side-by-side.js | 15 +++-- src/objectliterals.exports | 3 +- src/ol/control/attribution.exports | 1 + src/ol/control/mouseposition.exports | 1 + src/ol/control/zoom.exports | 2 +- src/ol/map.exports | 1 - src/ol/map.js | 83 ++++++++-------------------- 7 files changed, 37 insertions(+), 69 deletions(-) diff --git a/examples/side-by-side.js b/examples/side-by-side.js index 4c5bb354b7..488793f74e 100644 --- a/examples/side-by-side.js +++ b/examples/side-by-side.js @@ -42,12 +42,13 @@ var domMap = new ol.Map({ view: view }); -domMap.getControls().push(new ol.control.MousePosition({ +var domMousePosition = new ol.control.MousePosition({ coordinateFormat: ol.Coordinate.toStringHDMS, projection: ol.Projection.getFromCode('EPSG:4326'), target: document.getElementById('domMousePosition'), undefinedHTML: ' ' -})); +}); +domMousePosition.setMap(domMap); var webglMap = new ol.Map({ renderer: ol.RendererHint.WEBGL, @@ -58,12 +59,13 @@ if (webglMap !== null) { webglMap.bindTo('view', domMap); } -webglMap.getControls().push(new ol.control.MousePosition({ +var webglMousePosition = new ol.control.MousePosition({ coordinateFormat: ol.Coordinate.toStringHDMS, projection: ol.Projection.getFromCode('EPSG:4326'), target: document.getElementById('webglMousePosition'), undefinedHTML: ' ' -})); +}); +webglMousePosition.setMap(webglMap); var canvasMap = new ol.Map({ renderer: ol.RendererHint.CANVAS, @@ -74,12 +76,13 @@ if (canvasMap !== null) { canvasMap.bindTo('view', domMap); } -canvasMap.getControls().push(new ol.control.MousePosition({ +var canvasMousePosition = new ol.control.MousePosition({ coordinateFormat: ol.Coordinate.toStringHDMS, projection: ol.Projection.getFromCode('EPSG:4326'), target: document.getElementById('canvasMousePosition'), undefinedHtml: ' ' -})); +}); +canvasMousePosition.setMap(canvasMap); var keyboardInteraction = new ol.interaction.Keyboard(); keyboardInteraction.addCallback('0', function() { diff --git a/src/objectliterals.exports b/src/objectliterals.exports index bbd66ec223..aacd8a7b7a 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -1,5 +1,5 @@ @exportObjectLiteral ol.MapOptions -@exportObjectLiteralProperty ol.MapOptions.controls ol.Collection|undefined +@exportObjectLiteralProperty ol.MapOptions.attributionControl boolean|undefined @exportObjectLiteralProperty ol.MapOptions.doubleClickZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.dragPan boolean|undefined @exportObjectLiteralProperty ol.MapOptions.interactions ol.Collection|undefined @@ -13,6 +13,7 @@ @exportObjectLiteralProperty ol.MapOptions.shiftDragZoom boolean|undefined @exportObjectLiteralProperty ol.MapOptions.target Element|string @exportObjectLiteralProperty ol.MapOptions.view ol.IView|undefined +@exportObjectLiteralProperty ol.MapOptions.zoomControl boolean|undefined @exportObjectLiteralProperty ol.MapOptions.zoomDelta number|undefined @exportObjectLiteral ol.View2DOptions diff --git a/src/ol/control/attribution.exports b/src/ol/control/attribution.exports index 961219fc9d..57e5bdb9d8 100644 --- a/src/ol/control/attribution.exports +++ b/src/ol/control/attribution.exports @@ -1,2 +1,3 @@ @exportClass ol.control.Attribution ol.control.AttributionOptions +@exportProperty ol.control.Attribution.prototype.setMap diff --git a/src/ol/control/mouseposition.exports b/src/ol/control/mouseposition.exports index 7a4856fcb5..e29f9caa13 100644 --- a/src/ol/control/mouseposition.exports +++ b/src/ol/control/mouseposition.exports @@ -1,2 +1,3 @@ @exportClass ol.control.MousePosition ol.control.MousePositionOptions +@exportProperty ol.control.MousePosition.prototype.setMap diff --git a/src/ol/control/zoom.exports b/src/ol/control/zoom.exports index 1a1835cffb..91cb9a7fbe 100644 --- a/src/ol/control/zoom.exports +++ b/src/ol/control/zoom.exports @@ -1,2 +1,2 @@ @exportClass ol.control.Zoom ol.control.ZoomOptions - +@exportProperty ol.control.Zoom.prototype.setMap diff --git a/src/ol/map.exports b/src/ol/map.exports index 8c4285f1c3..96ee6e3e29 100644 --- a/src/ol/map.exports +++ b/src/ol/map.exports @@ -1,7 +1,6 @@ @exportClass ol.Map ol.MapOptions @exportProperty ol.Map.prototype.addPreRenderFunction @exportProperty ol.Map.prototype.addPreRenderFunctions -@exportProperty ol.Map.prototype.getControls @exportProperty ol.Map.prototype.getInteractions @exportSymbol ol.RendererHint diff --git a/src/ol/map.js b/src/ol/map.js index 58925d8443..29c6e623dc 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -22,8 +22,6 @@ goog.require('goog.events.MouseWheelHandler'); goog.require('goog.events.MouseWheelHandler.EventType'); goog.require('ol.BrowserFeature'); goog.require('ol.Collection'); -goog.require('ol.CollectionEvent'); -goog.require('ol.CollectionEventType'); goog.require('ol.Color'); goog.require('ol.Coordinate'); goog.require('ol.Extent'); @@ -230,17 +228,6 @@ ol.Map = function(mapOptions) { this.handleBrowserEvent, false, this); this.registerDisposable(mouseWheelHandler); - /** - * @type {ol.Collection} - * @private - */ - this.controls_ = mapOptionsInternal.controls; - - goog.events.listen(this.controls_, ol.CollectionEventType.ADD, - this.handleControlsAdd_, false, this); - goog.events.listen(this.controls_, ol.CollectionEventType.REMOVE, - this.handleControlsRemove_, false, this); - /** * @type {ol.Collection} * @private @@ -299,7 +286,9 @@ ol.Map = function(mapOptions) { // this gives the map an initial size this.handleBrowserWindowResize(); - this.controls_.forEach( + /** @type {Array.} */ + var controls = mapOptionsInternal.controls; + goog.array.forEach(controls, /** * @param {ol.control.Control} control Control. */ @@ -387,14 +376,6 @@ ol.Map.prototype.getTarget = function() { }; -/** - * @return {ol.Collection} Controls. - */ -ol.Map.prototype.getControls = function() { - return this.controls_; -}; - - /** * @param {ol.Pixel} pixel Pixel. * @return {ol.Coordinate} Coordinate. @@ -523,26 +504,6 @@ ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { }; -/** - * @param {ol.CollectionEvent} collectionEvent Collection event. - * @private - */ -ol.Map.prototype.handleControlsAdd_ = function(collectionEvent) { - var control = /** @type {ol.control.Control} */ (collectionEvent.elem); - control.setMap(this); -}; - - -/** - * @param {ol.CollectionEvent} collectionEvent Collection event. - * @private - */ -ol.Map.prototype.handleControlsRemove_ = function(collectionEvent) { - var control = /** @type {ol.control.Control} */ (collectionEvent.elem); - control.setMap(null); -}; - - /** * @param {ol.MapBrowserEvent} mapBrowserEvent The event to handle. */ @@ -849,7 +810,7 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { /** - * @typedef {{controls: ol.Collection, + * @typedef {{controls: Array., * interactions: ol.Collection, * rendererConstructor: * function(new: ol.renderer.Map, Element, ol.Map), @@ -915,14 +876,9 @@ ol.Map.createOptionsInternal = function(mapOptions) { } /** - * @type {ol.Collection} + * @type {Array.} */ - var controls; - if (goog.isDef(mapOptions.controls)) { - controls = mapOptions.controls; - } else { - controls = ol.Map.createControls_(mapOptions); - } + var controls = ol.Map.createControls_(mapOptions); /** * @type {ol.Collection} @@ -953,22 +909,29 @@ ol.Map.createOptionsInternal = function(mapOptions) { /** * @private * @param {ol.MapOptions} mapOptions Map options. - * @return {ol.Collection} Controls. + * @return {Array.} Controls. */ ol.Map.createControls_ = function(mapOptions) { + /** @type {Array.} */ + var controls = []; - var controls = new ol.Collection(); + var attributionControl = goog.isDef(mapOptions.attributionControl) ? + mapOptions.attributionControl : true; + if (attributionControl) { + controls.push(new ol.control.Attribution({})); + } - controls.push(new ol.control.Attribution({})); - - var zoomDelta = goog.isDef(mapOptions.zoomDelta) ? - mapOptions.zoomDelta : 4; - controls.push(new ol.control.Zoom({ - delta: zoomDelta - })); + var zoomControl = goog.isDef(mapOptions.zoomControl) ? + mapOptions.zoomControl : true; + if (zoomControl) { + var zoomDelta = goog.isDef(mapOptions.zoomDelta) ? + mapOptions.zoomDelta : 4; + controls.push(new ol.control.Zoom({ + delta: zoomDelta + })); + } return controls; - }; From 114280e60e1bc2c042bf596bd293b2f9b8932fe3 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Mon, 4 Feb 2013 10:52:29 +0100 Subject: [PATCH 06/33] Add a marker at the device position --- examples/full-screen.html | 7 +++++++ examples/full-screen.js | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/examples/full-screen.html b/examples/full-screen.html index 53db08f8af..11a3d5d560 100644 --- a/examples/full-screen.html +++ b/examples/full-screen.html @@ -21,6 +21,12 @@ padding: 0 0.5em 0.5em 0.5em; border-radius: 4px; } + #geolocation { + background-color: white; + border: 1px solid #222; + border-radius: 10px 10px 10px 0; + padding: 3px; + } @media only screen and (max-width: 600px) { #text { display: none; @@ -31,6 +37,7 @@
+

Full-screen example

Example of a full-screen map.
diff --git a/examples/full-screen.js b/examples/full-screen.js index 3e9cce6f89..eb13bda2f2 100644 --- a/examples/full-screen.js +++ b/examples/full-screen.js @@ -1,8 +1,11 @@ goog.require('goog.debug.Console'); goog.require('goog.debug.Logger'); goog.require('goog.debug.Logger.Level'); +goog.require('goog.style'); +goog.require('ol.AnchoredElement'); goog.require('ol.Collection'); goog.require('ol.Coordinate'); +goog.require('ol.Geolocation'); goog.require('ol.Map'); goog.require('ol.RendererHints'); goog.require('ol.View2D'); @@ -28,3 +31,14 @@ var map = new ol.Map({ zoom: 0 }) }); + +var geolocation = new ol.Geolocation(); +geolocation.bindTo('projection', map.getView()); + +var element = document.getElementById('geolocation'); +var marker = new ol.AnchoredElement({ + map: map, + element: element +}); +marker.bindTo('position', geolocation); +goog.style.showElement(element, true); From a679bb7bef570ceae3e139353edb74b508c8955e Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 6 Feb 2013 10:59:18 +0100 Subject: [PATCH 07/33] Set handleProjectionChanged from protected to private --- src/ol/geolocation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js index 1816b89849..7e4a9ed667 100644 --- a/src/ol/geolocation.js +++ b/src/ol/geolocation.js @@ -38,7 +38,7 @@ ol.Geolocation = function(opt_positionOptions) { goog.events.listen( this, ol.Object.getChangedEventType(ol.GeolocationProperty.PROJECTION), - this.handleProjectionChanged, false, this); + this.handleProjectionChanged_, false, this); /** * @private @@ -62,9 +62,9 @@ ol.Geolocation.prototype.disposeInternal = function() { /** - * @protected + * @private */ -ol.Geolocation.prototype.handleProjectionChanged = function() { +ol.Geolocation.prototype.handleProjectionChanged_ = function() { this.transformCoords_ = ol.Projection.getTransform( ol.Projection.getFromCode('EPSG:4326'), this.getProjection()); if (!goog.isNull(this.position_)) { From 753b37ad479f93b2f42b00d792aeda9b2388b8bc Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 6 Feb 2013 11:00:55 +0100 Subject: [PATCH 08/33] Add 'undefined' return type for all get* functions --- src/ol/geolocation.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js index 7e4a9ed667..de6b291290 100644 --- a/src/ol/geolocation.js +++ b/src/ol/geolocation.js @@ -65,11 +65,14 @@ ol.Geolocation.prototype.disposeInternal = function() { * @private */ ol.Geolocation.prototype.handleProjectionChanged_ = function() { - this.transformCoords_ = ol.Projection.getTransform( - ol.Projection.getFromCode('EPSG:4326'), this.getProjection()); - if (!goog.isNull(this.position_)) { - this.set(ol.GeolocationProperty.POSITION, - this.transformCoords_(this.position_)); + var projection = this.getProjection(); + if (goog.isDefAndNotNull(projection)) { + this.transformCoords_ = ol.Projection.getTransform( + ol.Projection.getFromCode('EPSG:4326'), projection); + if (!goog.isNull(this.position_)) { + this.set(ol.GeolocationProperty.POSITION, + this.transformCoords_(this.position_)); + } } }; @@ -97,7 +100,7 @@ ol.Geolocation.prototype.positionError_ = function(error) { /** * The position of the device. - * @return {ol.Coordinate} position. + * @return {ol.Coordinate|undefined} position. */ ol.Geolocation.prototype.getPosition = function() { return /** @type {ol.Coordinate} */ ( @@ -111,7 +114,7 @@ goog.exportProperty( /** * The accuracy of the position in meters. - * @return {number} accuracy. + * @return {number|undefined} accuracy. */ ol.Geolocation.prototype.getAccuracy = function() { return /** @type {number} */ ( @@ -124,7 +127,7 @@ goog.exportProperty( /** - * @return {ol.Projection} projection. + * @return {ol.Projection|undefined} projection. */ ol.Geolocation.prototype.getProjection = function() { return /** @type {ol.Projection} */ ( From 90730e40a3f63aa9b1638f8079d1bfe0825f4bca Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Feb 2013 11:10:06 +0100 Subject: [PATCH 09/33] Ensure ./build.py -c cleans examples/example-list.xml --- build.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build.py b/build.py index 3349b31c0c..1e5ff4cf19 100755 --- a/build.py +++ b/build.py @@ -152,7 +152,12 @@ def build_src_internal_types_js(t): virtual('build-examples', 'examples', (path.replace('.html', '.combined.js') for path in EXAMPLES)) -virtual('examples', 'examples/example-list.js', (path.replace('.html', '.json') for path in EXAMPLES)) +virtual('examples', 'examples/example-list.xml', (path.replace('.html', '.json') for path in EXAMPLES)) + + +@target('examples/example-list.xml', 'examples/example-list.js') +def examples_examples_list_xml(t): + t.touch() # already generated by bin/exampleparser.py @target('examples/example-list.js', 'bin/exampleparser.py', EXAMPLES) From 91141f5c01ee74998f08f4ef0d6422c4c5eaa147 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Feb 2013 11:25:15 +0100 Subject: [PATCH 10/33] Build precommit target by default so precommit dependencies get cleaned by default --- build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.py b/build.py index 1e5ff4cf19..d6198bb5ee 100755 --- a/build.py +++ b/build.py @@ -76,7 +76,7 @@ def report_sizes(t): t.info(' compressed: %d bytes', len(stringio.getvalue())) -virtual('all', 'build-all', 'build', 'examples') +virtual('all', 'build-all', 'build', 'examples', 'precommit') virtual('precommit', 'lint', 'build-all', 'test', 'build', 'build-examples', 'doc') From 2fea46903792466e73573022b60dfb98e4eb6dc8 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 6 Feb 2013 12:55:15 +0100 Subject: [PATCH 11/33] Change ol.Kinetic.update arguments. Instead of goog.events.BrowserEvent, accept a x,y pair. --- src/ol/interaction/dragpaninteraction.js | 6 ++++-- src/ol/kinetic.js | 16 +++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js index 6cca9a096d..ea82d07b1b 100644 --- a/src/ol/interaction/dragpaninteraction.js +++ b/src/ol/interaction/dragpaninteraction.js @@ -51,7 +51,9 @@ goog.inherits(ol.interaction.DragPan, ol.interaction.Drag); */ ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { if (this.kinetic_) { - this.kinetic_.update(mapBrowserEvent.browserEvent); + this.kinetic_.update( + mapBrowserEvent.browserEvent.clientX, + mapBrowserEvent.browserEvent.clientY); } var map = mapBrowserEvent.map; // FIXME works for View2D only @@ -104,7 +106,7 @@ ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; if (this.condition_(browserEvent)) { if (this.kinetic_) { - this.kinetic_.begin(browserEvent); + this.kinetic_.begin(browserEvent.clientX, browserEvent.clientY); } var map = mapBrowserEvent.map; map.requestRenderFrame(); diff --git a/src/ol/kinetic.js b/src/ol/kinetic.js index 5be0754ead..47a99ea7ee 100644 --- a/src/ol/kinetic.js +++ b/src/ol/kinetic.js @@ -63,23 +63,25 @@ ol.Kinetic = function(decay, minVelocity, delay) { /** - * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @param {number} x X. + * @param {number} y Y. */ -ol.Kinetic.prototype.begin = function(browserEvent) { +ol.Kinetic.prototype.begin = function(x, y) { this.points_.length = 0; this.angle_ = 0; this.initialVelocity_ = 0; - this.update(browserEvent); + this.update(x, y); }; /** - * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @param {number} x X. + * @param {number} y Y. */ -ol.Kinetic.prototype.update = function(browserEvent) { +ol.Kinetic.prototype.update = function(x, y) { this.points_.push({ - x: browserEvent.clientX, - y: browserEvent.clientY, + x: x, + y: y, t: goog.now() }); }; From 3355f9345d6260ccb2f6d5ae1e41fa1567176256 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 6 Feb 2013 17:10:21 +0100 Subject: [PATCH 12/33] Replace ol.animation.createSpin with ol.animation.createRotateFrom --- examples/side-by-side.js | 32 ++++++++++++++++---------------- src/objectliterals.exports | 10 +++++----- src/ol/animation.exports | 2 +- src/ol/animation.js | 12 +++++++----- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/examples/side-by-side.js b/examples/side-by-side.js index 4c5bb354b7..b2bd32b0e8 100644 --- a/examples/side-by-side.js +++ b/examples/side-by-side.js @@ -140,12 +140,12 @@ keyboardInteraction.addCallback('L', function() { start: start, duration: duration }); - var spin = ol.animation.createSpin({ - turns: 2, + var rotateFrom = ol.animation.createRotateFrom({ + rotation: 4 * Math.PI, start: start, duration: duration }); - var preRenderFunctions = [bounce, panFrom, spin]; + var preRenderFunctions = [bounce, panFrom, rotateFrom]; domMap.addPreRenderFunctions(preRenderFunctions); webglMap.addPreRenderFunctions(preRenderFunctions); canvasMap.addPreRenderFunctions(preRenderFunctions); @@ -175,12 +175,12 @@ keyboardInteraction.addCallback('M', function() { start: start, duration: duration }); - var spin = ol.animation.createSpin({ - turns: -2, + var rotateFrom = ol.animation.createRotateFrom({ + rotation: -4 * Math.PI, start: start, duration: duration }); - var preRenderFunctions = [bounce, panFrom, spin]; + var preRenderFunctions = [bounce, panFrom, rotateFrom]; domMap.addPreRenderFunctions(preRenderFunctions); webglMap.addPreRenderFunctions(preRenderFunctions); canvasMap.addPreRenderFunctions(preRenderFunctions); @@ -206,21 +206,21 @@ keyboardInteraction.addCallback('vV', function() { layer.setVisible(!layer.getVisible()); }); keyboardInteraction.addCallback('x', function() { - var spin = ol.animation.createSpin({ - turns: 2, + var rotateFrom = ol.animation.createRotateFrom({ + rotation: 4 * Math.PI, duration: 2000 }); - domMap.addPreRenderFunction(spin); - webglMap.addPreRenderFunction(spin); - canvasMap.addPreRenderFunction(spin); + domMap.addPreRenderFunction(rotateFrom); + webglMap.addPreRenderFunction(rotateFrom); + canvasMap.addPreRenderFunction(rotateFrom); }); keyboardInteraction.addCallback('X', function() { - var spin = ol.animation.createSpin({ - turns: -2, + var rotateFrom = ol.animation.createRotateFrom({ + rotation: -4 * Math.PI, duration: 2000 }); - domMap.addPreRenderFunction(spin); - webglMap.addPreRenderFunction(spin); - canvasMap.addPreRenderFunction(spin); + domMap.addPreRenderFunction(rotateFrom); + webglMap.addPreRenderFunction(rotateFrom); + canvasMap.addPreRenderFunction(rotateFrom); }); domMap.getInteractions().push(keyboardInteraction); diff --git a/src/objectliterals.exports b/src/objectliterals.exports index bbd66ec223..5e91af98ff 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -38,11 +38,11 @@ @exportObjectLiteralProperty ol.animation.PanFromOptions.duration number|undefined @exportObjectLiteralProperty ol.animation.PanFromOptions.easing function(number):number|undefined -@exportObjectLiteral ol.animation.SpinOptions -@exportObjectLiteralProperty ol.animation.SpinOptions.turns number -@exportObjectLiteralProperty ol.animation.SpinOptions.start number|undefined -@exportObjectLiteralProperty ol.animation.SpinOptions.duration number|undefined -@exportObjectLiteralProperty ol.animation.SpinOptions.easing function(number):number|undefined +@exportObjectLiteral ol.animation.RotateFromOptions +@exportObjectLiteralProperty ol.animation.RotateFromOptions.rotation number +@exportObjectLiteralProperty ol.animation.RotateFromOptions.start number|undefined +@exportObjectLiteralProperty ol.animation.RotateFromOptions.duration number|undefined +@exportObjectLiteralProperty ol.animation.RotateFromOptions.easing function(number):number|undefined @exportObjectLiteral ol.animation.ZoomFromOptions @exportObjectLiteralProperty ol.animation.ZoomFromOptions.resolution number diff --git a/src/ol/animation.exports b/src/ol/animation.exports index 7286bf8cc3..e1798d8654 100644 --- a/src/ol/animation.exports +++ b/src/ol/animation.exports @@ -1,4 +1,4 @@ @exportSymbol ol.animation @exportProperty ol.animation.createBounce @exportProperty ol.animation.createPanFrom -@exportProperty ol.animation.createSpin +@exportProperty ol.animation.createRotateFrom diff --git a/src/ol/animation.js b/src/ol/animation.js index feccd87f06..0313069047 100644 --- a/src/ol/animation.js +++ b/src/ol/animation.js @@ -71,15 +71,15 @@ ol.animation.createPanFrom = function(options) { /** - * @param {ol.animation.SpinOptions} options Options. + * @param {ol.animation.RotateFromOptions} options Options. * @return {ol.PreRenderFunction} Pre-render function. */ -ol.animation.createSpin = function(options) { +ol.animation.createRotateFrom = function(options) { + var sourceRotation = options.rotation; var start = goog.isDef(options.start) ? options.start : goog.now(); var duration = goog.isDef(options.duration) ? options.duration : 1000; var easing = goog.isDef(options.easing) ? options.easing : goog.fx.easing.inAndOut; - var deltaTheta = 2 * options.turns * Math.PI; return function(map, frameState) { if (frameState.time < start) { @@ -87,9 +87,11 @@ ol.animation.createSpin = function(options) { frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else if (frameState.time < start + duration) { - var delta = easing((frameState.time - start) / duration); + var delta = 1 - easing((frameState.time - start) / duration); + var deltaRotation = + sourceRotation - frameState.view2DState.rotation; frameState.animate = true; - frameState.view2DState.rotation += delta * deltaTheta; + frameState.view2DState.rotation += delta * deltaRotation; frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else { From 0b6aeb5b05ad184bf3359e8ad399bf383e4292cb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 6 Feb 2013 21:43:21 +0100 Subject: [PATCH 13/33] Remove unused and erroneous function, thanks @tschaub --- src/ol/structs/lrucache.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/ol/structs/lrucache.js b/src/ol/structs/lrucache.js index ecf53521a6..311201ff04 100644 --- a/src/ol/structs/lrucache.js +++ b/src/ol/structs/lrucache.js @@ -155,15 +155,6 @@ ol.structs.LRUCache.prototype.getKeys = function() { }; -/** - * @return {string} Last key. - */ -ol.structs.LRUCache.prototype.getLastKey = function() { - goog.asserts.assert(!goog.isNull(this.newest_)); - return this.newest_.key_; -}; - - /** * @return {Array} Values. */ From a2bbdf7ccc84d45cff79de6957a032e37c5ef563 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 6 Feb 2013 13:43:54 -0700 Subject: [PATCH 14/33] More natural names for animations --- examples/side-by-side.js | 50 ++++++++++++------------ src/objectliterals.exports | 30 +++++++------- src/ol/animation.exports | 6 +-- src/ol/animation.js | 14 +++---- src/ol/interaction/dragpaninteraction.js | 2 +- src/ol/kinetic.js | 4 +- src/ol/view2d.js | 2 +- 7 files changed, 54 insertions(+), 54 deletions(-) diff --git a/examples/side-by-side.js b/examples/side-by-side.js index b2bd32b0e8..edaafe3778 100644 --- a/examples/side-by-side.js +++ b/examples/side-by-side.js @@ -110,7 +110,7 @@ keyboardInteraction.addCallback('H', function() { layer.setHue(layer.getHue() + (Math.PI / 5)); }); keyboardInteraction.addCallback('j', function() { - var bounce = ol.animation.createBounce({ + var bounce = ol.animation.bounce({ resolution: 2 * view.getResolution() }); domMap.addPreRenderFunction(bounce); @@ -118,69 +118,69 @@ keyboardInteraction.addCallback('j', function() { canvasMap.addPreRenderFunction(bounce); }); keyboardInteraction.addCallback('l', function() { - var panFrom = ol.animation.createPanFrom({ + var pan = ol.animation.pan({ source: view.getCenter(), easing: ol.easing.elastic }); - domMap.addPreRenderFunction(panFrom); - webglMap.addPreRenderFunction(panFrom); - canvasMap.addPreRenderFunction(panFrom); + domMap.addPreRenderFunction(pan); + webglMap.addPreRenderFunction(pan); + canvasMap.addPreRenderFunction(pan); view.setCenter(LONDON); }); keyboardInteraction.addCallback('L', function() { var start = goog.now(); var duration = 5000; - var bounce = ol.animation.createBounce({ + var bounce = ol.animation.bounce({ resolution: 2 * view.getResolution(), start: start, duration: duration }); - var panFrom = ol.animation.createPanFrom({ + var pan = ol.animation.pan({ source: view.getCenter(), start: start, duration: duration }); - var rotateFrom = ol.animation.createRotateFrom({ + var rotate = ol.animation.rotate({ rotation: 4 * Math.PI, start: start, duration: duration }); - var preRenderFunctions = [bounce, panFrom, rotateFrom]; + var preRenderFunctions = [bounce, pan, rotate]; domMap.addPreRenderFunctions(preRenderFunctions); webglMap.addPreRenderFunctions(preRenderFunctions); canvasMap.addPreRenderFunctions(preRenderFunctions); view.setCenter(LONDON); }); keyboardInteraction.addCallback('m', function() { - var panFrom = ol.animation.createPanFrom({ + var pan = ol.animation.pan({ source: view.getCenter(), duration: 1000, easing: ol.easing.bounce }); - domMap.addPreRenderFunction(panFrom); - webglMap.addPreRenderFunction(panFrom); - canvasMap.addPreRenderFunction(panFrom); + domMap.addPreRenderFunction(pan); + webglMap.addPreRenderFunction(pan); + canvasMap.addPreRenderFunction(pan); view.setCenter(MOSCOW); }); keyboardInteraction.addCallback('M', function() { var start = goog.now(); var duration = 5000; - var bounce = ol.animation.createBounce({ + var bounce = ol.animation.bounce({ resolution: 2 * view.getResolution(), start: start, duration: duration }); - var panFrom = ol.animation.createPanFrom({ + var pan = ol.animation.pan({ source: view.getCenter(), start: start, duration: duration }); - var rotateFrom = ol.animation.createRotateFrom({ + var rotate = ol.animation.rotate({ rotation: -4 * Math.PI, start: start, duration: duration }); - var preRenderFunctions = [bounce, panFrom, rotateFrom]; + var preRenderFunctions = [bounce, pan, rotate]; domMap.addPreRenderFunctions(preRenderFunctions); webglMap.addPreRenderFunctions(preRenderFunctions); canvasMap.addPreRenderFunctions(preRenderFunctions); @@ -206,21 +206,21 @@ keyboardInteraction.addCallback('vV', function() { layer.setVisible(!layer.getVisible()); }); keyboardInteraction.addCallback('x', function() { - var rotateFrom = ol.animation.createRotateFrom({ + var rotate = ol.animation.rotate({ rotation: 4 * Math.PI, duration: 2000 }); - domMap.addPreRenderFunction(rotateFrom); - webglMap.addPreRenderFunction(rotateFrom); - canvasMap.addPreRenderFunction(rotateFrom); + domMap.addPreRenderFunction(rotate); + webglMap.addPreRenderFunction(rotate); + canvasMap.addPreRenderFunction(rotate); }); keyboardInteraction.addCallback('X', function() { - var rotateFrom = ol.animation.createRotateFrom({ + var rotate = ol.animation.rotate({ rotation: -4 * Math.PI, duration: 2000 }); - domMap.addPreRenderFunction(rotateFrom); - webglMap.addPreRenderFunction(rotateFrom); - canvasMap.addPreRenderFunction(rotateFrom); + domMap.addPreRenderFunction(rotate); + webglMap.addPreRenderFunction(rotate); + canvasMap.addPreRenderFunction(rotate); }); domMap.getInteractions().push(keyboardInteraction); diff --git a/src/objectliterals.exports b/src/objectliterals.exports index 5e91af98ff..6badaae7af 100644 --- a/src/objectliterals.exports +++ b/src/objectliterals.exports @@ -32,23 +32,23 @@ @exportObjectLiteralProperty ol.animation.BounceOptions.duration number|undefined @exportObjectLiteralProperty ol.animation.BounceOptions.easing function(number):number|undefined -@exportObjectLiteral ol.animation.PanFromOptions -@exportObjectLiteralProperty ol.animation.PanFromOptions.source ol.Coordinate -@exportObjectLiteralProperty ol.animation.PanFromOptions.start number|undefined -@exportObjectLiteralProperty ol.animation.PanFromOptions.duration number|undefined -@exportObjectLiteralProperty ol.animation.PanFromOptions.easing function(number):number|undefined +@exportObjectLiteral ol.animation.PanOptions +@exportObjectLiteralProperty ol.animation.PanOptions.source ol.Coordinate +@exportObjectLiteralProperty ol.animation.PanOptions.start number|undefined +@exportObjectLiteralProperty ol.animation.PanOptions.duration number|undefined +@exportObjectLiteralProperty ol.animation.PanOptions.easing function(number):number|undefined -@exportObjectLiteral ol.animation.RotateFromOptions -@exportObjectLiteralProperty ol.animation.RotateFromOptions.rotation number -@exportObjectLiteralProperty ol.animation.RotateFromOptions.start number|undefined -@exportObjectLiteralProperty ol.animation.RotateFromOptions.duration number|undefined -@exportObjectLiteralProperty ol.animation.RotateFromOptions.easing function(number):number|undefined +@exportObjectLiteral ol.animation.RotateOptions +@exportObjectLiteralProperty ol.animation.RotateOptions.rotation number +@exportObjectLiteralProperty ol.animation.RotateOptions.start number|undefined +@exportObjectLiteralProperty ol.animation.RotateOptions.duration number|undefined +@exportObjectLiteralProperty ol.animation.RotateOptions.easing function(number):number|undefined -@exportObjectLiteral ol.animation.ZoomFromOptions -@exportObjectLiteralProperty ol.animation.ZoomFromOptions.resolution number -@exportObjectLiteralProperty ol.animation.ZoomFromOptions.start number|undefined -@exportObjectLiteralProperty ol.animation.ZoomFromOptions.duration number|undefined -@exportObjectLiteralProperty ol.animation.ZoomFromOptions.easing function(number):number|undefined +@exportObjectLiteral ol.animation.ZoomOptions +@exportObjectLiteralProperty ol.animation.ZoomOptions.resolution number +@exportObjectLiteralProperty ol.animation.ZoomOptions.start number|undefined +@exportObjectLiteralProperty ol.animation.ZoomOptions.duration number|undefined +@exportObjectLiteralProperty ol.animation.ZoomOptions.easing function(number):number|undefined @exportObjectLiteral ol.control.AttributionOptions @exportObjectLiteralProperty ol.control.AttributionOptions.map ol.Map|undefined diff --git a/src/ol/animation.exports b/src/ol/animation.exports index e1798d8654..98207b2e1a 100644 --- a/src/ol/animation.exports +++ b/src/ol/animation.exports @@ -1,4 +1,4 @@ @exportSymbol ol.animation -@exportProperty ol.animation.createBounce -@exportProperty ol.animation.createPanFrom -@exportProperty ol.animation.createRotateFrom +@exportProperty ol.animation.bounce +@exportProperty ol.animation.pan +@exportProperty ol.animation.rotate diff --git a/src/ol/animation.js b/src/ol/animation.js index 0313069047..74a7120de2 100644 --- a/src/ol/animation.js +++ b/src/ol/animation.js @@ -12,7 +12,7 @@ goog.require('ol.easing'); * @param {ol.animation.BounceOptions} options Options. * @return {ol.PreRenderFunction} Pre-render function. */ -ol.animation.createBounce = function(options) { +ol.animation.bounce = function(options) { var resolution = options.resolution; var start = goog.isDef(options.start) ? options.start : goog.now(); var duration = goog.isDef(options.duration) ? options.duration : 1000; @@ -38,10 +38,10 @@ ol.animation.createBounce = function(options) { /** - * @param {ol.animation.PanFromOptions} options Options. + * @param {ol.animation.PanOptions} options Options. * @return {ol.PreRenderFunction} Pre-render function. */ -ol.animation.createPanFrom = function(options) { +ol.animation.pan = function(options) { var source = options.source; var start = goog.isDef(options.start) ? options.start : goog.now(); var sourceX = source.x; @@ -71,10 +71,10 @@ ol.animation.createPanFrom = function(options) { /** - * @param {ol.animation.RotateFromOptions} options Options. + * @param {ol.animation.RotateOptions} options Options. * @return {ol.PreRenderFunction} Pre-render function. */ -ol.animation.createRotateFrom = function(options) { +ol.animation.rotate = function(options) { var sourceRotation = options.rotation; var start = goog.isDef(options.start) ? options.start : goog.now(); var duration = goog.isDef(options.duration) ? options.duration : 1000; @@ -102,10 +102,10 @@ ol.animation.createRotateFrom = function(options) { /** - * @param {ol.animation.ZoomFromOptions} options Options. + * @param {ol.animation.ZoomOptions} options Options. * @return {ol.PreRenderFunction} Pre-render function. */ -ol.animation.createZoomFrom = function(options) { +ol.animation.zoom = function(options) { var sourceResolution = options.resolution; var start = goog.isDef(options.start) ? options.start : goog.now(); var duration = goog.isDef(options.duration) ? options.duration : 1000; diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js index 6cca9a096d..40cfc06f76 100644 --- a/src/ol/interaction/dragpaninteraction.js +++ b/src/ol/interaction/dragpaninteraction.js @@ -84,7 +84,7 @@ ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) { var distance = this.kinetic_.getDistance(); var angle = this.kinetic_.getAngle(); var center = view.getCenter(); - this.kineticPreRenderFn_ = this.kinetic_.createPanFrom(center); + this.kineticPreRenderFn_ = this.kinetic_.pan(center); map.addPreRenderFunction(this.kineticPreRenderFn_); var centerpx = map.getPixelFromCoordinate(center); diff --git a/src/ol/kinetic.js b/src/ol/kinetic.js index 5be0754ead..8014cf8390 100644 --- a/src/ol/kinetic.js +++ b/src/ol/kinetic.js @@ -112,7 +112,7 @@ ol.Kinetic.prototype.end = function() { * @param {ol.Coordinate} source Source coordinate for the animation. * @return {ol.PreRenderFunction} Pre-render function for kinetic animation. */ -ol.Kinetic.prototype.createPanFrom = function(source) { +ol.Kinetic.prototype.pan = function(source) { var decay = this.decay_; var initialVelocity = this.initialVelocity_; var minVelocity = this.minVelocity_; @@ -121,7 +121,7 @@ ol.Kinetic.prototype.createPanFrom = function(source) { return initialVelocity * (Math.exp((decay * t) * duration) - 1) / (minVelocity - initialVelocity); }; - return ol.animation.createPanFrom({ + return ol.animation.pan({ source: source, duration: duration, easing: easingFunction diff --git a/src/ol/view2d.js b/src/ol/view2d.js index c1da3c23bc..ca726b99f4 100644 --- a/src/ol/view2d.js +++ b/src/ol/view2d.js @@ -298,7 +298,7 @@ ol.View2D.prototype.zoom = function(map, delta, opt_anchor, opt_duration) { var currentResolution = this.getResolution(); if (goog.isDef(currentResolution) && goog.isDef(opt_duration)) { map.requestRenderFrame(); - map.addPreRenderFunction(ol.animation.createZoomFrom({ + map.addPreRenderFunction(ol.animation.zoom({ resolution: currentResolution, duration: opt_duration })); From e335b7b74aa9cfdb036dd5f87678c064ee916585 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 6 Feb 2013 16:02:26 -0700 Subject: [PATCH 15/33] Make frame state available before rendering frame Without this change, tiles that are enqueued on the first rendering will always get priority `ol.TileQueue.DROP` because `map.frameState_` is not yet defined (meaning a single render call doesn't result in any tiles loading). --- src/ol/map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/map.js b/src/ol/map.js index 58925d8443..50e9347ff8 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -754,8 +754,8 @@ ol.Map.prototype.renderFrame_ = function(time) { frameState.extent = ol.Extent.boundingExtent.apply(null, corners); } - this.renderer_.renderFrame(frameState); this.frameState_ = frameState; + this.renderer_.renderFrame(frameState); this.dirty_ = false; if (!goog.isNull(frameState)) { From 2bd29ff60e1223a84cec0d10a2cdd0f2b3bc2ceb Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 6 Feb 2013 16:08:24 -0700 Subject: [PATCH 16/33] Only track tiles that are actually wanted Instead of keeping track of wanted tile ranges, we can instead track wanted tiles individually. This provides enough for the map to know how to prioritize tiles and should be more efficient (no extra calls to extend tile ranges or check for tile containment within a range). --- src/ol/framestate.js | 2 +- src/ol/map.js | 5 ++--- .../canvas/canvastilelayerrenderer.js | 2 +- src/ol/renderer/dom/domtilelayerrenderer.js | 2 +- src/ol/renderer/layerrenderer.js | 21 +++++++------------ .../renderer/webgl/webgltilelayerrenderer.js | 2 +- 6 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/ol/framestate.js b/src/ol/framestate.js index bbe89d10a0..9e45ce99b6 100644 --- a/src/ol/framestate.js +++ b/src/ol/framestate.js @@ -31,7 +31,7 @@ goog.require('ol.layer.LayerState'); * usedTiles: Object.>, * view2DState: ol.View2DState, * viewHints: Array., - * wantedTiles: Object.>}} + * wantedTiles: Object.>}} */ ol.FrameState; diff --git a/src/ol/map.js b/src/ol/map.js index 50e9347ff8..d134cae46c 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -500,9 +500,8 @@ ol.Map.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter) { if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) { return ol.TileQueue.DROP; } - var zKey = tile.tileCoord.z.toString(); - if (!(zKey in frameState.wantedTiles[tileSourceKey]) || - !frameState.wantedTiles[tileSourceKey][zKey].contains(tile.tileCoord)) { + var coordKey = tile.tileCoord.toString(); + if (!frameState.wantedTiles[tileSourceKey][coordKey]) { return ol.TileQueue.DROP; } var center = frameState.view2DState.center; diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 59b0c6051c..c2987af91b 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -167,6 +167,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); } else if (tileState == ol.TileState.LOADED) { @@ -216,7 +217,6 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = if (!allTilesLoaded) { frameState.animate = true; - this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange); } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index a92d34a0d2..0676d629d6 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -131,6 +131,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); } else if (tileState == ol.TileState.LOADED) { @@ -234,7 +235,6 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = if (!allTilesLoaded) { frameState.animate = true; - this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange); } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index 4ff6f66cab..982a454d72 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -4,6 +4,7 @@ goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('ol.FrameState'); goog.require('ol.Object'); +goog.require('ol.TileCoord'); goog.require('ol.TileRange'); goog.require('ol.layer.Layer'); goog.require('ol.layer.LayerProperty'); @@ -197,24 +198,16 @@ ol.renderer.Layer.prototype.updateUsedTiles = /** * @protected - * @param {Object.>} wantedTiles Wanted - * tile ranges. + * @param {Object.>} wantedTiles Wanted tiles. * @param {ol.source.Source} source Source. - * @param {number} z Z. - * @param {ol.TileRange} tileRange Tile range. + * @param {ol.TileCoord} tileCoord Tile coordinate. */ ol.renderer.Layer.prototype.updateWantedTiles = - function(wantedTiles, source, z, tileRange) { + function(wantedTiles, source, tileCoord) { var sourceKey = goog.getUid(source).toString(); - var zKey = z.toString(); - if (sourceKey in wantedTiles) { - if (zKey in wantedTiles[sourceKey]) { - wantedTiles[sourceKey][zKey].extend(tileRange); - } else { - wantedTiles[sourceKey][zKey] = tileRange; - } - } else { + var coordKey = tileCoord.toString(); + if (!(sourceKey in wantedTiles)) { wantedTiles[sourceKey] = {}; - wantedTiles[sourceKey][zKey] = tileRange; } + wantedTiles[sourceKey][coordKey] = true; }; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 3663948de8..77cf37aa79 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -393,6 +393,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); } else if (tileState == ol.TileState.LOADED) { @@ -457,7 +458,6 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = this.renderedTileRange_ = null; this.renderedFramebufferExtent_ = null; frameState.animate = true; - this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange); } } From e079c1941319aeba5bc14d8750b351d3ba4318d7 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 6 Feb 2013 16:10:46 -0700 Subject: [PATCH 17/33] Don't repeatedly render while waiting for tiles to load Instead of going into an unnecessary animation loop, we can simply wait to be notified when tiles load. The WebGL renderer still sets frameState.animate true, but I think this too should be unnecessary (full page example works without it, side-by-side example shows it cannot yet be removed). --- src/ol/renderer/canvas/canvastilelayerrenderer.js | 6 ++---- src/ol/renderer/dom/domtilelayerrenderer.js | 6 ++---- src/ol/renderer/layerrenderer.js | 15 +++++++++++++++ src/ol/renderer/webgl/webgltilelayerrenderer.js | 2 ++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index c2987af91b..da9ef99a2b 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -167,6 +167,8 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + goog.events.listen(tile, goog.events.EventType.CHANGE, + this.handleTileChange, false, this); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); @@ -215,10 +217,6 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = } } - if (!allTilesLoaded) { - frameState.animate = true; - } - this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.scheduleExpireCache(frameState, tileSource); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 0676d629d6..537ff16e52 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -131,6 +131,8 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + goog.events.listen(tile, goog.events.EventType.CHANGE, + this.handleTileChange, false, this); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); @@ -233,10 +235,6 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = this.renderedVisible_ = true; } - if (!allTilesLoaded) { - frameState.animate = true; - } - this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.scheduleExpireCache(frameState, tileSource); diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index 982a454d72..fab64889fc 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -4,8 +4,10 @@ goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('ol.FrameState'); goog.require('ol.Object'); +goog.require('ol.Tile'); goog.require('ol.TileCoord'); goog.require('ol.TileRange'); +goog.require('ol.TileState'); goog.require('ol.layer.Layer'); goog.require('ol.layer.LayerProperty'); goog.require('ol.layer.LayerState'); @@ -147,6 +149,19 @@ ol.renderer.Layer.prototype.handleLayerVisibleChange = function() { }; +/** + * Handle changes in tile state. + * @param {goog.events.Event} event Tile change event. + * @protected + */ +ol.renderer.Layer.prototype.handleTileChange = function(event) { + var tile = /** @type {ol.Tile} */ (event.target); + if (tile.getState() === ol.TileState.LOADED) { + this.getMap().requestRenderFrame(); + } +}; + + /** * @param {ol.FrameState} frameState Frame state. * @param {ol.layer.LayerState} layerState Layer state. diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 77cf37aa79..068a9687c3 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -393,6 +393,8 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + goog.events.listen(tile, goog.events.EventType.CHANGE, + this.handleTileChange, false, this); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); From 218bf2c78b1d092c45173d88d7282d12ebd407e6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Feb 2013 12:20:53 +0100 Subject: [PATCH 18/33] Improve LRUCache containsKey test, thanks @tschaub --- src/ol/structs/lrucache.js | 2 +- test/spec/ol/lrucache.test.js | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/ol/structs/lrucache.js b/src/ol/structs/lrucache.js index 311201ff04..7792dc2f61 100644 --- a/src/ol/structs/lrucache.js +++ b/src/ol/structs/lrucache.js @@ -91,7 +91,7 @@ ol.structs.LRUCache.prototype.clear = function() { * @return {boolean} Contains key. */ ol.structs.LRUCache.prototype.containsKey = function(key) { - return key in this.entries_; + return this.entries_.hasOwnProperty(key); }; diff --git a/test/spec/ol/lrucache.test.js b/test/spec/ol/lrucache.test.js index 7ceb8a0115..587724e36a 100644 --- a/test/spec/ol/lrucache.test.js +++ b/test/spec/ol/lrucache.test.js @@ -99,11 +99,38 @@ describe('ol.structs.LRUCache', function() { }); }); - describe('setting a disallowed key', function() { - it('raises an exception', function() { + describe('disallowed keys', function() { + it('setting raises an exception', function() { + expect(function() { + lruCache.set('constructor', 0); + }).toThrow(); expect(function() { lruCache.set('hasOwnProperty', 0); }).toThrow(); + expect(function() { + lruCache.set('isPrototypeOf', 0); + }).toThrow(); + expect(function() { + lruCache.set('propertyIsEnumerable', 0); + }).toThrow(); + expect(function() { + lruCache.set('toLocaleString', 0); + }).toThrow(); + expect(function() { + lruCache.set('toString', 0); + }).toThrow(); + expect(function() { + lruCache.set('valueOf', 0); + }).toThrow(); + }); + it('getting returns false', function() { + expect(lruCache.containsKey('constructor')).toBeFalsy(); + expect(lruCache.containsKey('hasOwnProperty')).toBeFalsy(); + expect(lruCache.containsKey('isPrototypeOf')).toBeFalsy(); + expect(lruCache.containsKey('propertyIsEnumerable')).toBeFalsy(); + expect(lruCache.containsKey('toLocaleString')).toBeFalsy(); + expect(lruCache.containsKey('toString')).toBeFalsy(); + expect(lruCache.containsKey('valueOf')).toBeFalsy(); }); }); From 44a5eca4375435943f488e82e9a121668f9095d3 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Thu, 7 Feb 2013 15:59:12 +0100 Subject: [PATCH 19/33] Add ol.Geolocation.isSupported property --- src/ol/geolocation.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js index de6b291290..eab663b2fa 100644 --- a/src/ol/geolocation.js +++ b/src/ol/geolocation.js @@ -77,6 +77,12 @@ ol.Geolocation.prototype.handleProjectionChanged_ = function() { }; +/** + * @type {boolean} Is supported. + */ +ol.Geolocation.isSupported = 'geolocation' in navigator; + + /** * @private * @param {GeolocationPosition} position position event. From a36145fc1ff4544aa867d2928c27fea7d9d2fd7a Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Thu, 7 Feb 2013 16:20:15 +0100 Subject: [PATCH 20/33] Check if the Geolocation API is supported --- src/ol/geolocation.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js index eab663b2fa..b75aaaf38c 100644 --- a/src/ol/geolocation.js +++ b/src/ol/geolocation.js @@ -1,4 +1,5 @@ -// FIXME: handle errors ? +// FIXME handle geolocation not supported +// FIXME handle geolocation errors goog.provide('ol.Geolocation'); goog.provide('ol.GeolocationProperty'); @@ -36,18 +37,20 @@ ol.Geolocation = function(opt_positionOptions) { */ this.position_ = null; - goog.events.listen( - this, ol.Object.getChangedEventType(ol.GeolocationProperty.PROJECTION), - this.handleProjectionChanged_, false, this); + if (ol.Geolocation.isSupported) { + goog.events.listen( + this, ol.Object.getChangedEventType(ol.GeolocationProperty.PROJECTION), + this.handleProjectionChanged_, false, this); - /** - * @private - * @type {number} - */ - this.watchId_ = navigator.geolocation.watchPosition( - goog.bind(this.positionChange_, this), - goog.bind(this.positionError_, this), - opt_positionOptions); + /** + * @private + * @type {number} + */ + this.watchId_ = navigator.geolocation.watchPosition( + goog.bind(this.positionChange_, this), + goog.bind(this.positionError_, this), + opt_positionOptions); + } }; goog.inherits(ol.Geolocation, ol.Object); From 3c4d218ec5372c3f26aaba564580ab25433e5ca3 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 7 Feb 2013 14:06:05 -0700 Subject: [PATCH 21/33] Only listen for first event --- src/ol/renderer/canvas/canvastilelayerrenderer.js | 2 +- src/ol/renderer/dom/domtilelayerrenderer.js | 2 +- src/ol/renderer/webgl/webgltilelayerrenderer.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index da9ef99a2b..02e5e904ff 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -167,7 +167,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { - goog.events.listen(tile, goog.events.EventType.CHANGE, + goog.events.listenOnce(tile, goog.events.EventType.CHANGE, this.handleTileChange, false, this); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 537ff16e52..094d6a3009 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -131,7 +131,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { - goog.events.listen(tile, goog.events.EventType.CHANGE, + goog.events.listenOnce(tile, goog.events.EventType.CHANGE, this.handleTileChange, false, this); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 068a9687c3..27c0cbadab 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -393,7 +393,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { - goog.events.listen(tile, goog.events.EventType.CHANGE, + goog.events.listenOnce(tile, goog.events.EventType.CHANGE, this.handleTileChange, false, this); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); From 6de649f6c67cf4823c4bb880dbec7c7397e773c2 Mon Sep 17 00:00:00 2001 From: Marc Jansen Date: Tue, 5 Feb 2013 12:10:31 +0100 Subject: [PATCH 22/33] (Re)add a reallylean target to the build. Previously we had both a `clean` and `reallyclean` in our Makefile; both got lost when we switched to a python build. A clean 'target' can be invoked by calling the build script with the '-c' flag: ./build.py -c This commit readds the `reallyclean` target and lets it clean up a little more than the Makefiles `clean` or `reallyclean` did. More files are deleted, but only if these are being ignored inside of the repository (e.g. through .gitignore files). --- build.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/build.py b/build.py index 3349b31c0c..b47ebc8b9a 100755 --- a/build.py +++ b/build.py @@ -348,5 +348,16 @@ def find_fixme(t): print print "A total number of", totalcount, "TODO/FIXME was found" +@target('reallyclean') +def reallyclean(t): + """Removes untracked files and folders from previous builds.""" + # -X => only clean up files that are usually ignored e.g. + # through .gitignore + # -d => also consider directories for deletion + # -f => if git configuration variable clean.requireForce != false, + # git clean will refuse to run unless given -f or -n. + t.run('%(GIT)s', 'clean', '-X', '-d', '-f', '.') + + if __name__ == '__main__': main() From d851cac89116dba949cbdd21108ed93c6ab0fe10 Mon Sep 17 00:00:00 2001 From: Marc Jansen Date: Tue, 12 Feb 2013 14:21:44 +0100 Subject: [PATCH 23/33] Fix the serve-precommit target. When the plovr-jar is being invoked in the serve-precommit target, it needs the JSON files in `test/` as well to have all requirements for headless testing. This should also reenable running the testsuite on our continuous integration server. --- build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.py b/build.py index 3349b31c0c..63a346f3b7 100755 --- a/build.py +++ b/build.py @@ -193,7 +193,7 @@ def serve(t): @target('serve-precommit', PLOVR_JAR, INTERNAL_SRC) def serve_precommit(t): - t.run('%(JAVA)s', '-jar', PLOVR_JAR, 'serve', 'build/ol-all.json') + t.run('%(JAVA)s', '-jar', PLOVR_JAR, 'serve', 'build/ol-all.json', glob.glob('test/*.json')) virtual('lint', 'build/lint-src-timestamp', 'build/lint-spec-timestamp', 'build/check-requires-timestamp') From 0c09083eb8df9c6ba0e3f27b5068d3ac52ddf16b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:28:20 +0100 Subject: [PATCH 24/33] Add missing whitespace to satisfy pep8 --- build.py | 1 + 1 file changed, 1 insertion(+) diff --git a/build.py b/build.py index d4cce18bc3..8a9795ee90 100755 --- a/build.py +++ b/build.py @@ -353,6 +353,7 @@ def find_fixme(t): print print "A total number of", totalcount, "TODO/FIXME was found" + @target('reallyclean') def reallyclean(t): """Removes untracked files and folders from previous builds.""" From 4481bb011f536fa7eb106123e3c553765cfa67cb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:30:08 +0100 Subject: [PATCH 25/33] Update to latest version of pake --- pake.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pake.py b/pake.py index dec8b71a7a..27b3648580 100644 --- a/pake.py +++ b/pake.py @@ -288,7 +288,10 @@ def ifind(*paths): for path in paths: for dirpath, dirnames, names in os.walk(path): for name in names: - yield os.path.join(dirpath, name) + if sys.platform == 'win32': + yield '/'.join(dirpath.split('\\') + [name]) + else: + yield os.path.join(dirpath, name) def main(argv=sys.argv): From a3e7528841186841110777ed6c716a3c5ff40a8a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:30:36 +0100 Subject: [PATCH 26/33] Guess paths to Windows binaries using environment variables --- build.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.py b/build.py index 8a9795ee90..2cf4a2ee5d 100755 --- a/build.py +++ b/build.py @@ -13,12 +13,14 @@ from pake import Target, ifind, main, output, rule, target, variables, virtual if sys.platform == 'win32': - variables.GIT = 'C:/Program Files/Git/bin/git.exe' + ProgramFiles = os.environ.get('ProgramFiles', 'C:\\Program Files') + ProgramFiles_X86 = os.environ.get('ProgramFiles(X86)', 'C:\\Program Files') + variables.GIT = os.path.join(ProgramFiles_X86, 'Git', 'bin', 'git.exe') variables.GJSLINT = 'gjslint' # FIXME - variables.JAVA = 'C:/Program Files/Java/jre7/bin/java.exe' + variables.JAVA = os.path.join(ProgramFiles, 'Java', 'jre7', 'bin', 'java.exe') variables.JSDOC = 'jsdoc' # FIXME variables.PHANTOMJS = 'phantomjs' # FIXME - variables.PYTHON = 'C:/Python27/python.exe' + variables.PYTHON = os.path.join(os.environ['SystemDrive'] + '\\', 'Python27', 'python.exe') else: variables.GIT = 'git' variables.GJSLINT = 'gjslint' From 169555f2be20edf392e873e60b80caae5fc38115 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:31:30 +0100 Subject: [PATCH 27/33] Use ifind rather than glob to work around Windows path separator nonsense --- build.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/build.py b/build.py index 2cf4a2ee5d..a416c6c117 100755 --- a/build.py +++ b/build.py @@ -1,10 +1,10 @@ #!/usr/bin/env python from cStringIO import StringIO -import glob import gzip import json import os +import os.path import re import shutil import sys @@ -42,9 +42,14 @@ EXTERNAL_SRC = [ 'build/src/external/src/types.js'] EXAMPLES = [path - for path in glob.glob('examples/*.html') + for path in ifind('examples') + if not path.startswith('examples/standalone/') + if path.endswith('.html') if path != 'examples/example-list.html'] +EXAMPLES_JSON = [example.replace('.html', '.json') + for example in EXAMPLES] + EXAMPLES_SRC = [path for path in ifind('examples') if path.endswith('.js') @@ -195,7 +200,7 @@ def examples_star_combined_js(name, match): @target('serve', PLOVR_JAR, INTERNAL_SRC, 'test/requireall.js', 'examples') def serve(t): - t.run('%(JAVA)s', '-jar', PLOVR_JAR, 'serve', glob.glob('build/*.json'), glob.glob('examples/*.json'), glob.glob('test/*.json')) + t.run('%(JAVA)s', '-jar', PLOVR_JAR, 'serve', 'build/ol.json', 'build/ol-all.json', EXAMPLES_JSON, 'test/test.json') @target('serve-precommit', PLOVR_JAR, INTERNAL_SRC) From f4e9dd5c374990e3e7f58a74892e9d4b93d24e5e Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Tue, 12 Feb 2013 15:37:08 +0100 Subject: [PATCH 28/33] view.getRotation default value already set to 0. --- src/ol/interaction/dragrotateandzoominteraction.js | 2 +- src/ol/interaction/dragrotateinteraction.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/dragrotateandzoominteraction.js b/src/ol/interaction/dragrotateandzoominteraction.js index 95df6f5320..9cc3ab89ca 100644 --- a/src/ol/interaction/dragrotateandzoominteraction.js +++ b/src/ol/interaction/dragrotateandzoominteraction.js @@ -79,7 +79,7 @@ ol.interaction.DragRotateAndZoom.prototype.handleDragStart = browserEvent.offsetX - size.width / 2, size.height / 2 - browserEvent.offsetY); var theta = Math.atan2(delta.y, delta.x); - this.startRotation_ = (view.getRotation() || 0) + theta; + this.startRotation_ = view.getRotation() + theta; this.startRatio_ = resolution / delta.magnitude(); map.requestRenderFrame(); return true; diff --git a/src/ol/interaction/dragrotateinteraction.js b/src/ol/interaction/dragrotateinteraction.js index f951f6fd2c..048a847957 100644 --- a/src/ol/interaction/dragrotateinteraction.js +++ b/src/ol/interaction/dragrotateinteraction.js @@ -67,7 +67,7 @@ ol.interaction.DragRotate.prototype.handleDragStart = var theta = Math.atan2( size.height / 2 - offset.y, offset.x - size.width / 2); - this.startRotation_ = (view.getRotation() || 0) + theta; + this.startRotation_ = view.getRotation() + theta; return true; } else { return false; From d828fee582cc5c58fd13e894eb7191eb39611fc8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:47:24 +0100 Subject: [PATCH 29/33] Set path to gjslint on Windows --- build.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.py b/build.py index a416c6c117..660e8b599e 100755 --- a/build.py +++ b/build.py @@ -15,12 +15,13 @@ from pake import Target, ifind, main, output, rule, target, variables, virtual if sys.platform == 'win32': ProgramFiles = os.environ.get('ProgramFiles', 'C:\\Program Files') ProgramFiles_X86 = os.environ.get('ProgramFiles(X86)', 'C:\\Program Files') + Python27 = os.environ.get('SystemDrive', 'C:') + '\\Python27' variables.GIT = os.path.join(ProgramFiles_X86, 'Git', 'bin', 'git.exe') - variables.GJSLINT = 'gjslint' # FIXME + variables.GJSLINT = os.path.join(Python27, 'Scripts', 'gjslint.exe') variables.JAVA = os.path.join(ProgramFiles, 'Java', 'jre7', 'bin', 'java.exe') variables.JSDOC = 'jsdoc' # FIXME variables.PHANTOMJS = 'phantomjs' # FIXME - variables.PYTHON = os.path.join(os.environ['SystemDrive'] + '\\', 'Python27', 'python.exe') + variables.PYTHON = os.path.join(Python27, 'python.exe') else: variables.GIT = 'git' variables.GJSLINT = 'gjslint' From 3d3436007059c5af68b98597d7941cdfbff9c3ad Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:31:56 +0100 Subject: [PATCH 30/33] Add build.cmd for Windows developers --- build.cmd | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 build.cmd diff --git a/build.cmd b/build.cmd new file mode 100755 index 0000000000..75c1454306 --- /dev/null +++ b/build.cmd @@ -0,0 +1,2 @@ +@echo off +%SystemDrive%\Python27\python.exe build.py %* From 357ca379db14e7ee9d592db9ae1339d2d12a2817 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 15:47:08 +0100 Subject: [PATCH 31/33] Update build instructions for Windows --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 62b9f9ed5e..723a41881d 100644 --- a/readme.md +++ b/readme.md @@ -13,12 +13,16 @@ Run build.py: $ ./build.py +Windows users should run `build` instead. + ## Run examples locally Run the [Plovr](http://plovr.com/) web server with: $ ./build.py serve +Windows users should run `build serve` instead. + Then, either open one of the example html files from the `examples` directory directly in your browser, or start a simple webserver, for example: $ python -mSimpleHTTPServer From 9a3e090c2b5db68827cb2bdb299409645bcca1b4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 16:07:34 +0100 Subject: [PATCH 32/33] Run tests on Windows --- .gitignore | 2 ++ build.py | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a691d821e3..24c0e4318d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ /build/ol.js /build/ol-all.js /build/src +/build/phantomjs-*-windows +/build/phantomjs-*-windows.zip /examples/*.json /examples/*.combined.js /examples/example-list.js diff --git a/build.py b/build.py index 660e8b599e..f8ffbb7eb5 100755 --- a/build.py +++ b/build.py @@ -20,15 +20,16 @@ if sys.platform == 'win32': variables.GJSLINT = os.path.join(Python27, 'Scripts', 'gjslint.exe') variables.JAVA = os.path.join(ProgramFiles, 'Java', 'jre7', 'bin', 'java.exe') variables.JSDOC = 'jsdoc' # FIXME - variables.PHANTOMJS = 'phantomjs' # FIXME variables.PYTHON = os.path.join(Python27, 'python.exe') + PHANTOMJS_WINDOWS_ZIP = 'build/phantomjs-1.8.1-windows.zip' + PHANTOMJS = 'build/phantomjs-1.8.1-windows/phantomjs.exe' else: variables.GIT = 'git' variables.GJSLINT = 'gjslint' variables.JAVA = 'java' variables.JSDOC = 'jsdoc' - variables.PHANTOMJS = 'phantomjs' variables.PYTHON = 'python' + PHANTOMJS = 'phantomjs' variables.BRANCH = output('%(GIT)s', 'rev-parse', '--abbrev-ref', 'HEAD').strip() @@ -334,9 +335,23 @@ def hostexamples(t): t.cp('examples/example-list.js', 'examples/example-list.xml', 'examples/Jugl.js', 'build/gh-pages/%(BRANCH)s/examples/') -@target('test', INTERNAL_SRC, 'test/requireall.js', phony=True) +@target('test', PHANTOMJS, INTERNAL_SRC, 'test/requireall.js', phony=True) def test(t): - t.run('%(PHANTOMJS)s', 'test/phantom-jasmine/run_jasmine_test.coffee', 'test/ol.html') + t.run(PHANTOMJS, 'test/phantom-jasmine/run_jasmine_test.coffee', 'test/ol.html') + + +if sys.platform == 'win32': + @target(PHANTOMJS, PHANTOMJS_WINDOWS_ZIP, clean=False) + def phantom_js(t): + from zipfile import ZipFile + ZipFile(PHANTOMJS_WINDOWS_ZIP).extractall('build') + + @target(PHANTOMJS_WINDOWS_ZIP, clean=False) + def phantomjs_windows_zip(t): + t.download('http://phantomjs.googlecode.com/files/' + os.path.basename(t.name)) + +else: + virtual(PHANTOMJS) @target('fixme', phony=True) From 83a00c13fa82d9ee8a5d6bca07b5289a42d9b99f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 12 Feb 2013 17:05:59 +0100 Subject: [PATCH 33/33] Don't use problematic glob function --- build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.py b/build.py index f8ffbb7eb5..eb1dd3d6ba 100755 --- a/build.py +++ b/build.py @@ -207,7 +207,7 @@ def serve(t): @target('serve-precommit', PLOVR_JAR, INTERNAL_SRC) def serve_precommit(t): - t.run('%(JAVA)s', '-jar', PLOVR_JAR, 'serve', 'build/ol-all.json', glob.glob('test/*.json')) + t.run('%(JAVA)s', '-jar', PLOVR_JAR, 'serve', 'build/ol-all.json', 'test/test.json') virtual('lint', 'build/lint-src-timestamp', 'build/lint-spec-timestamp', 'build/check-requires-timestamp')