From 8e0a61ac5f990032549a4559bef769ca13ce0a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ziela=C5=84ski?= Date: Wed, 26 Aug 2020 15:11:11 +0200 Subject: [PATCH 1/2] Adding original properties to cloned geometry --- src/ol/geom/Circle.js | 8 +++++++- src/ol/geom/Geometry.js | 11 +++++++++++ src/ol/geom/GeometryCollection.js | 1 + src/ol/geom/LineString.js | 7 ++++++- src/ol/geom/MultiLineString.js | 4 +++- src/ol/geom/MultiPoint.js | 1 + src/ol/geom/MultiPolygon.js | 5 ++++- src/ol/geom/Point.js | 1 + src/ol/geom/Polygon.js | 4 +++- test/spec/ol/geom/circle.test.js | 3 +++ test/spec/ol/geom/geometrycollection.test.js | 2 ++ test/spec/ol/geom/multipolygon.test.js | 3 +++ 12 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/ol/geom/Circle.js b/src/ol/geom/Circle.js index 6e4a669976..644a89cf1e 100644 --- a/src/ol/geom/Circle.js +++ b/src/ol/geom/Circle.js @@ -37,7 +37,13 @@ class Circle extends SimpleGeometry { * @api */ clone() { - return new Circle(this.flatCoordinates.slice(), undefined, this.layout); + const circle = new Circle( + this.flatCoordinates.slice(), + undefined, + this.layout + ); + circle.importPropertiesFrom(this); + return circle; } /** diff --git a/src/ol/geom/Geometry.js b/src/ol/geom/Geometry.js index e7d7cd26f0..be648f7a11 100644 --- a/src/ol/geom/Geometry.js +++ b/src/ol/geom/Geometry.js @@ -109,6 +109,17 @@ class Geometry extends BaseObject { return abstract(); } + /** + * Import properties from another geometry. + * @param {Geometry} geometry Source geometry. + * @protected + */ + importPropertiesFrom(geometry) { + if (geometry.hasProperties()) { + this.setProperties(geometry.getProperties(), true); + } + } + /** * @abstract * @param {number} x X. diff --git a/src/ol/geom/GeometryCollection.js b/src/ol/geom/GeometryCollection.js index 2f08c25cea..f4b17ac001 100644 --- a/src/ol/geom/GeometryCollection.js +++ b/src/ol/geom/GeometryCollection.js @@ -69,6 +69,7 @@ class GeometryCollection extends Geometry { clone() { const geometryCollection = new GeometryCollection(null); geometryCollection.setGeometries(this.geometries_); + geometryCollection.importPropertiesFrom(this); return geometryCollection; } diff --git a/src/ol/geom/LineString.js b/src/ol/geom/LineString.js index c791e0ebdd..1bb5a75c1f 100644 --- a/src/ol/geom/LineString.js +++ b/src/ol/geom/LineString.js @@ -87,7 +87,12 @@ class LineString extends SimpleGeometry { * @api */ clone() { - return new LineString(this.flatCoordinates.slice(), this.layout); + const lineString = new LineString( + this.flatCoordinates.slice(), + this.layout + ); + lineString.importPropertiesFrom(this); + return lineString; } /** diff --git a/src/ol/geom/MultiLineString.js b/src/ol/geom/MultiLineString.js index d604195899..8ab28379ef 100644 --- a/src/ol/geom/MultiLineString.js +++ b/src/ol/geom/MultiLineString.js @@ -102,11 +102,13 @@ class MultiLineString extends SimpleGeometry { * @api */ clone() { - return new MultiLineString( + const multiLineString = new MultiLineString( this.flatCoordinates.slice(), this.layout, this.ends_.slice() ); + multiLineString.importPropertiesFrom(this); + return multiLineString; } /** diff --git a/src/ol/geom/MultiPoint.js b/src/ol/geom/MultiPoint.js index 92033cff8b..0829353739 100644 --- a/src/ol/geom/MultiPoint.js +++ b/src/ol/geom/MultiPoint.js @@ -61,6 +61,7 @@ class MultiPoint extends SimpleGeometry { this.flatCoordinates.slice(), this.layout ); + multiPoint.importPropertiesFrom(this); return multiPoint; } diff --git a/src/ol/geom/MultiPolygon.js b/src/ol/geom/MultiPolygon.js index 3925cd69b5..1a3084b2c0 100644 --- a/src/ol/geom/MultiPolygon.js +++ b/src/ol/geom/MultiPolygon.js @@ -155,11 +155,14 @@ class MultiPolygon extends SimpleGeometry { newEndss[i] = this.endss_[i].slice(); } - return new MultiPolygon( + const multiPolygon = new MultiPolygon( this.flatCoordinates.slice(), this.layout, newEndss ); + multiPolygon.importPropertiesFrom(this); + + return multiPolygon; } /** diff --git a/src/ol/geom/Point.js b/src/ol/geom/Point.js index 08cae660e9..a9ef7e641b 100644 --- a/src/ol/geom/Point.js +++ b/src/ol/geom/Point.js @@ -30,6 +30,7 @@ class Point extends SimpleGeometry { */ clone() { const point = new Point(this.flatCoordinates.slice(), this.layout); + point.importPropertiesFrom(this); return point; } diff --git a/src/ol/geom/Polygon.js b/src/ol/geom/Polygon.js index 974340a6e0..009337d253 100644 --- a/src/ol/geom/Polygon.js +++ b/src/ol/geom/Polygon.js @@ -118,11 +118,13 @@ class Polygon extends SimpleGeometry { * @api */ clone() { - return new Polygon( + const polygon = new Polygon( this.flatCoordinates.slice(), this.layout, this.ends_.slice() ); + polygon.importPropertiesFrom(this); + return polygon; } /** diff --git a/test/spec/ol/geom/circle.test.js b/test/spec/ol/geom/circle.test.js index 6459cb1f90..f4bfc62212 100644 --- a/test/spec/ol/geom/circle.test.js +++ b/test/spec/ol/geom/circle.test.js @@ -9,11 +9,14 @@ describe('ol.geom.Circle', function () { describe('#clone', function () { it('returns a clone', function () { + circle.setProperties({foo: 'bar', baz: null}); + const clone = circle.clone(); expect(clone).to.be.an(Circle); expect(clone.getCenter()).to.eql(circle.getCenter()); expect(clone.getCenter()).not.to.be(circle.getCenter()); expect(clone.getRadius()).to.be(circle.getRadius()); + expect(clone.getProperties()).to.eql({foo: 'bar', baz: null}); }); }); diff --git a/test/spec/ol/geom/geometrycollection.test.js b/test/spec/ol/geom/geometrycollection.test.js index 5585f0fb33..f66cf9e25a 100644 --- a/test/spec/ol/geom/geometrycollection.test.js +++ b/test/spec/ol/geom/geometrycollection.test.js @@ -97,6 +97,7 @@ describe('ol.geom.GeometryCollection', function () { ]); const poly = new Polygon([outer, inner1, inner2]); const multi = new GeometryCollection([point, line, poly]); + multi.setProperties({foo: 'bar', baz: null}); const clone = multi.clone(); expect(clone).to.not.be(multi); const geometries = clone.getGeometries(); @@ -106,6 +107,7 @@ describe('ol.geom.GeometryCollection', function () { [30, 40], ]); expect(geometries[2].getCoordinates()).to.eql([outer, inner1, inner2]); + expect(clone.getProperties()).to.eql({foo: 'bar', baz: null}); }); it('does a deep clone', function () { diff --git a/test/spec/ol/geom/multipolygon.test.js b/test/spec/ol/geom/multipolygon.test.js index 32895cccb6..bb97567dee 100644 --- a/test/spec/ol/geom/multipolygon.test.js +++ b/test/spec/ol/geom/multipolygon.test.js @@ -276,8 +276,11 @@ describe('ol.geom.MultiPolygon', function () { describe('#clone()', function () { it('has the expected endss_', function () { + multiPolygon.setProperties({foo: 'bar', baz: null}); + const clone = multiPolygon.clone(); expect(multiPolygon.endss_).to.eql(clone.endss_); + expect(clone.getProperties()).to.eql({foo: 'bar', baz: null}); }); }); From 0001292a62960c4ffbb971b34465094d35bc4960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ziela=C5=84ski?= Date: Thu, 27 Aug 2020 09:18:08 +0200 Subject: [PATCH 2/2] Method that copies properties from another object moved to the BaseObject class. Not using getProperties() to avoid creating an intermediate object that is not used later --- src/ol/Object.js | 12 ++++++++++++ src/ol/geom/Circle.js | 2 +- src/ol/geom/Geometry.js | 11 ----------- src/ol/geom/GeometryCollection.js | 2 +- src/ol/geom/LineString.js | 2 +- src/ol/geom/MultiLineString.js | 2 +- src/ol/geom/MultiPoint.js | 2 +- src/ol/geom/MultiPolygon.js | 2 +- src/ol/geom/Point.js | 2 +- src/ol/geom/Polygon.js | 2 +- 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/ol/Object.js b/src/ol/Object.js index 59fb349811..d15567aaf8 100644 --- a/src/ol/Object.js +++ b/src/ol/Object.js @@ -188,6 +188,18 @@ class BaseObject extends Observable { } } + /** + * Apply any properties from another object without triggering events. + * @param {BaseObject} source The source object. + * @protected + */ + applyProperties(source) { + if (!source.values_) { + return; + } + assign(this.values_ || (this.values_ = {}), source.values_); + } + /** * Unsets a property. * @param {string} key Key name. diff --git a/src/ol/geom/Circle.js b/src/ol/geom/Circle.js index 644a89cf1e..ddd87ca1cb 100644 --- a/src/ol/geom/Circle.js +++ b/src/ol/geom/Circle.js @@ -42,7 +42,7 @@ class Circle extends SimpleGeometry { undefined, this.layout ); - circle.importPropertiesFrom(this); + circle.applyProperties(this); return circle; } diff --git a/src/ol/geom/Geometry.js b/src/ol/geom/Geometry.js index be648f7a11..e7d7cd26f0 100644 --- a/src/ol/geom/Geometry.js +++ b/src/ol/geom/Geometry.js @@ -109,17 +109,6 @@ class Geometry extends BaseObject { return abstract(); } - /** - * Import properties from another geometry. - * @param {Geometry} geometry Source geometry. - * @protected - */ - importPropertiesFrom(geometry) { - if (geometry.hasProperties()) { - this.setProperties(geometry.getProperties(), true); - } - } - /** * @abstract * @param {number} x X. diff --git a/src/ol/geom/GeometryCollection.js b/src/ol/geom/GeometryCollection.js index f4b17ac001..f18a6500fe 100644 --- a/src/ol/geom/GeometryCollection.js +++ b/src/ol/geom/GeometryCollection.js @@ -69,7 +69,7 @@ class GeometryCollection extends Geometry { clone() { const geometryCollection = new GeometryCollection(null); geometryCollection.setGeometries(this.geometries_); - geometryCollection.importPropertiesFrom(this); + geometryCollection.applyProperties(this); return geometryCollection; } diff --git a/src/ol/geom/LineString.js b/src/ol/geom/LineString.js index 1bb5a75c1f..4bbee3069c 100644 --- a/src/ol/geom/LineString.js +++ b/src/ol/geom/LineString.js @@ -91,7 +91,7 @@ class LineString extends SimpleGeometry { this.flatCoordinates.slice(), this.layout ); - lineString.importPropertiesFrom(this); + lineString.applyProperties(this); return lineString; } diff --git a/src/ol/geom/MultiLineString.js b/src/ol/geom/MultiLineString.js index 8ab28379ef..61901868b0 100644 --- a/src/ol/geom/MultiLineString.js +++ b/src/ol/geom/MultiLineString.js @@ -107,7 +107,7 @@ class MultiLineString extends SimpleGeometry { this.layout, this.ends_.slice() ); - multiLineString.importPropertiesFrom(this); + multiLineString.applyProperties(this); return multiLineString; } diff --git a/src/ol/geom/MultiPoint.js b/src/ol/geom/MultiPoint.js index 0829353739..2f152e66e7 100644 --- a/src/ol/geom/MultiPoint.js +++ b/src/ol/geom/MultiPoint.js @@ -61,7 +61,7 @@ class MultiPoint extends SimpleGeometry { this.flatCoordinates.slice(), this.layout ); - multiPoint.importPropertiesFrom(this); + multiPoint.applyProperties(this); return multiPoint; } diff --git a/src/ol/geom/MultiPolygon.js b/src/ol/geom/MultiPolygon.js index 1a3084b2c0..0e36511b4b 100644 --- a/src/ol/geom/MultiPolygon.js +++ b/src/ol/geom/MultiPolygon.js @@ -160,7 +160,7 @@ class MultiPolygon extends SimpleGeometry { this.layout, newEndss ); - multiPolygon.importPropertiesFrom(this); + multiPolygon.applyProperties(this); return multiPolygon; } diff --git a/src/ol/geom/Point.js b/src/ol/geom/Point.js index a9ef7e641b..3f5801600c 100644 --- a/src/ol/geom/Point.js +++ b/src/ol/geom/Point.js @@ -30,7 +30,7 @@ class Point extends SimpleGeometry { */ clone() { const point = new Point(this.flatCoordinates.slice(), this.layout); - point.importPropertiesFrom(this); + point.applyProperties(this); return point; } diff --git a/src/ol/geom/Polygon.js b/src/ol/geom/Polygon.js index 009337d253..e0c169025b 100644 --- a/src/ol/geom/Polygon.js +++ b/src/ol/geom/Polygon.js @@ -123,7 +123,7 @@ class Polygon extends SimpleGeometry { this.layout, this.ends_.slice() ); - polygon.importPropertiesFrom(this); + polygon.applyProperties(this); return polygon; }