[Pkg-javascript-commits] [leaflet-markercluster] 389/479: More tests and more making them work

Jonas Smedegaard dr at jones.dk
Thu Oct 16 16:01:00 UTC 2014


This is an automated email from the git hooks/post-receive script.

js pushed a commit to branch master
in repository leaflet-markercluster.

commit 10b91f8ad4419437aec9d8158e30e7990240dd3e
Author: danzel <danzel at localhost.geek.nz>
Date:   Sat Jun 22 10:47:10 2013 +1200

    More tests and more making them work
---
 spec/suites/NonPointSpec.js  | 61 +++++++++++++++++++++--------
 spec/suites/getBoundsSpec.js | 91 ++++++++++++++++++++++++++++++++++++++++++++
 src/MarkerClusterGroup.js    | 64 ++++++++++++++++++++++---------
 3 files changed, 181 insertions(+), 35 deletions(-)

diff --git a/spec/suites/NonPointSpec.js b/spec/suites/NonPointSpec.js
index 4e41a36..561167e 100644
--- a/spec/suites/NonPointSpec.js
+++ b/spec/suites/NonPointSpec.js
@@ -43,6 +43,18 @@
 		expect(polygon._container.parentNode).to.be(map._pathRoot);
 	});
 
+	it('Removes polygons from map when removed', function () {
+
+		var group = new L.MarkerClusterGroup();
+		var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
+
+		group.addLayer(polygon);
+		map.addLayer(group);
+		map.removeLayer(group);
+
+		expect(polygon._container.parentNode).to.be(null);
+	});
+
 	describe('hasLayer', function () {
 		it('returns false when not added', function () {
 			var group = new L.MarkerClusterGroup();
@@ -89,38 +101,55 @@
 		});
 	});
 
-	describe('getBounds', function() {
-		it('returns the correct bounds before adding to the map', function() {
+	describe('removeLayer', function() {
+		it('removes before adding to map', function () {
 			var group = new L.MarkerClusterGroup();
 			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
 
 			group.addLayer(polygon);
+			expect(group.hasLayer(polygon)).to.be(true);
+
+			group.removeLayer(polygon);
+			expect(group.hasLayer(polygon)).to.be(false);
+		});
+
+		it('removes before adding to map', function () {
+			var group = new L.MarkerClusterGroup();
+			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
+
+			group.addLayers([polygon]);
+			expect(group.hasLayer(polygon)).to.be(true);
 
-			expect(group.getBounds()).to.be(polygon.getBounds());
+			group.removeLayer(polygon);
+			expect(group.hasLayer(polygon)).to.be(false);
 		});
 
-		it('returns the correct bounds after adding to the map after adding polygon', function () {
+		it('removes after adding to map after adding polygon', function () {
 			var group = new L.MarkerClusterGroup();
 			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
 
 			group.addLayer(polygon);
 			map.addLayer(group);
+			expect(group.hasLayer(polygon)).to.be(true);
 
-			expect(group.getBounds()).to.be(polygon.getBounds());
+			group.removeLayer(polygon);
+			expect(group.hasLayer(polygon)).to.be(false);
 		});
 
-		it('returns the correct bounds after adding to the map before adding polygon', function () {
+		it('removes after adding to map before adding polygon', function () {
 			var group = new L.MarkerClusterGroup();
 			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
 
 			map.addLayer(group);
 			group.addLayer(polygon);
+			expect(group.hasLayer(polygon)).to.be(true);
 
-			expect(group.getBounds()).to.be(polygon.getBounds());
+			group.removeLayer(polygon);
+			expect(group.hasLayer(polygon)).to.be(false);
 		});
 	});
 
-	describe('removeLayer', function() {
+	describe('removeLayers', function () {
 		it('removes before adding to map', function () {
 			var group = new L.MarkerClusterGroup();
 			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
@@ -128,7 +157,7 @@
 			group.addLayer(polygon);
 			expect(group.hasLayer(polygon)).to.be(true);
 
-			group.removeLayer(polygon);
+			group.removeLayers([polygon]);
 			expect(group.hasLayer(polygon)).to.be(false);
 		});
 
@@ -139,7 +168,7 @@
 			group.addLayers([polygon]);
 			expect(group.hasLayer(polygon)).to.be(true);
 
-			group.removeLayer(polygon);
+			group.removeLayers([polygon]);
 			expect(group.hasLayer(polygon)).to.be(false);
 		});
 
@@ -147,11 +176,11 @@
 			var group = new L.MarkerClusterGroup();
 			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
 
-			group.addLayers(polygon);
-			map.addLayers(group);
+			group.addLayer(polygon);
+			map.addLayer(group);
 			expect(group.hasLayer(polygon)).to.be(true);
 
-			group.removeLayer(polygon);
+			group.removeLayers([polygon]);
 			expect(group.hasLayer(polygon)).to.be(false);
 		});
 
@@ -159,11 +188,11 @@
 			var group = new L.MarkerClusterGroup();
 			var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
 
-			map.addLayers(group);
-			group.addLayers(polygon);
+			map.addLayer(group);
+			group.addLayer(polygon);
 			expect(group.hasLayer(polygon)).to.be(true);
 
-			group.removeLayer(polygon);
+			group.removeLayers([polygon]);
 			expect(group.hasLayer(polygon)).to.be(false);
 		});
 	});
diff --git a/spec/suites/getBoundsSpec.js b/spec/suites/getBoundsSpec.js
new file mode 100644
index 0000000..72b28c7
--- /dev/null
+++ b/spec/suites/getBoundsSpec.js
@@ -0,0 +1,91 @@
+describe('adding non point data works', function() {
+	var map, div;
+	beforeEach(function() {
+		div = document.createElement('div');
+		div.style.width = '200px';
+		div.style.height = '200px';
+		document.body.appendChild(div);
+
+		map = L.map(div, { maxZoom: 18 });
+
+		map.fitBounds(new L.LatLngBounds([
+			[1, 1],
+			[2, 2]
+		]));
+	});
+	afterEach(function() {
+		document.body.removeChild(div);
+	});
+
+	describe('polygon layer', function() {
+		describe('getBounds', function() {
+			it('returns the correct bounds before adding to the map', function() {
+				var group = new L.MarkerClusterGroup();
+				var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
+
+				group.addLayer(polygon);
+
+				expect(group.getBounds().equals(polygon.getBounds())).to.be(true);
+			});
+
+			it('returns the correct bounds after adding to the map after adding polygon', function() {
+				var group = new L.MarkerClusterGroup();
+				var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
+
+				group.addLayer(polygon);
+				map.addLayer(group);
+
+				expect(group.getBounds().equals(polygon.getBounds())).to.be(true);
+			});
+
+			it('returns the correct bounds after adding to the map before adding polygon', function() {
+				var group = new L.MarkerClusterGroup();
+				var polygon = new L.Polygon([[1.5, 1.5], [2.0, 1.5], [2.0, 2.0], [1.5, 2.0]]);
+
+				map.addLayer(group);
+				group.addLayer(polygon);
+
+				expect(group.getBounds().equals(polygon.getBounds())).to.be(true);
+			});
+		});
+	});
+
+	describe('marker layers', function () {
+		describe('getBounds', function () {
+			it('returns the correct bounds before adding to the map', function () {
+				var group = new L.MarkerClusterGroup();
+				var marker = new L.Marker([1.5, 1.5]);
+				var marker2 = new L.Marker([1.0, 5.0]);
+				var marker3 = new L.Marker([6.0, 2.0]);
+
+				group.addLayers([marker, marker2, marker3]);
+
+				expect(group.getBounds().equals(L.latLngBounds([1.0, 5.0], [6.0, 1.5]))).to.be(true);
+			});
+
+			it('returns the correct bounds after adding to the map after adding markers', function () {
+				var group = new L.MarkerClusterGroup();
+				var marker = new L.Marker([1.5, 1.5]);
+				var marker2 = new L.Marker([1.0, 5.0]);
+				var marker3 = new L.Marker([6.0, 2.0]);
+
+				group.addLayers([marker, marker2, marker3]);
+				map.addLayer(group);
+
+				expect(group.getBounds().equals(L.latLngBounds([1.0, 5.0], [6.0, 1.5]))).to.be(true);
+			});
+
+			it('returns the correct bounds after adding to the map before adding markers', function () {
+				var group = new L.MarkerClusterGroup();
+				var marker = new L.Marker([1.5, 1.5]);
+				var marker2 = new L.Marker([1.0, 5.0]);
+				var marker3 = new L.Marker([6.0, 2.0]);
+
+				map.addLayer(group);
+				group.addLayers([marker, marker2, marker3]);
+
+				expect(group.getBounds().equals(L.latLngBounds([1.0, 5.0], [6.0, 1.5]))).to.be(true);
+			});
+		});
+	});
+});
\ No newline at end of file
diff --git a/src/MarkerClusterGroup.js b/src/MarkerClusterGroup.js
index 58c51b9..904bcc9 100644
--- a/src/MarkerClusterGroup.js
+++ b/src/MarkerClusterGroup.js
@@ -40,6 +40,9 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 		this._featureGroup = L.featureGroup();
 		this._featureGroup.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);
 
+		this._nonPointGroup = L.featureGroup();
+		this._nonPointGroup.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);
+
 		this._inZoomAnimation = 0;
 		this._needsClustering = [];
 		this._needsRemoving = []; //Markers removed while we aren't on the map need to be kept track of
@@ -57,6 +60,12 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 			return this.addLayers(array);
 		}
 
+		//Don't cluster non point data
+		if (!layer.getLatLng) {
+			this._nonPointGroup.addLayer(layer);
+			return this;
+		}
+
 		if (!this._map) {
 			this._needsClustering.push(layer);
 			return this;
@@ -66,6 +75,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 			return this;
 		}
 
+
 		//If we have already clustered we'll need to add this one to a cluster
 
 		if (this._unspiderfy) {
@@ -95,9 +105,9 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 
 	removeLayer: function (layer) {
 
-		//If the layer doesn't have a getLatLng then we can't cluster it, so add it to our child featureGroup
+		//Non point layers
 		if (!layer.getLatLng) {
-			this._featureGroup.removeLayer(layer);
+			this._nonPointGroup.removeLayer(layer);
 			return this;
 		}
 
@@ -133,19 +143,16 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 	//Takes an array of markers and adds them in bulk
 	addLayers: function (layersArray) {
 		var i, l, m,
-			fg = this._featureGroup;
-
-		if (!this._map) {
-			this._needsClustering = this._needsClustering.concat(layersArray);
-			return this;
-		}
+			onMap = this._map,
+			fg = this._featureGroup,
+			npg = this._nonPointGroup;
 
 		for (i = 0, l = layersArray.length; i < l; i++) {
 			m = layersArray[i];
 
 			//Not point data, can't be clustered
 			if (!m.getLatLng) {
-				fg.addLayer(m);
+				npg.addLayer(m);
 				continue;
 			}
 
@@ -153,6 +160,11 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 				continue;
 			}
 
+			if (!onMap) {
+				this._needsClustering.push(m);
+				continue;
+			}
+
 			this._addLayer(m, this._maxZoom);
 
 			//If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will
@@ -165,14 +177,16 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 			}
 		}
 
-		//Update the icons of all those visible clusters that were affected
-		fg.eachLayer(function (c) {
-			if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
-				c._updateIcon();
-			}
-		});
+		if (onMap) {
+			//Update the icons of all those visible clusters that were affected
+			fg.eachLayer(function (c) {
+				if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
+					c._updateIcon();
+				}
+			});
 
-		this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
+			this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
+		}
 
 		return this;
 	},
@@ -180,11 +194,14 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 	//Takes an array of markers and removes them in bulk
 	removeLayers: function (layersArray) {
 		var i, l, m,
-			fg = this._featureGroup;
+			fg = this._featureGroup,
+			npg = this._nonPointGroup;
 
 		if (!this._map) {
 			for (i = 0, l = layersArray.length; i < l; i++) {
-				this._arraySplice(this._needsClustering, layersArray[i]);
+				m = layersArray[i];
+				this._arraySplice(this._needsClustering, m);
+				npg.removeLayer(m);
 			}
 			return this;
 		}
@@ -193,6 +210,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 			m = layersArray[i];
 
 			if (!m.__parent) {
+				npg.removeLayer(m);
 				continue;
 			}
 
@@ -235,6 +253,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 
 		//Remove all the visible layers
 		this._featureGroup.clearLayers();
+		this._nonPointGroup.clearLayers();
 
 		this.eachLayer(function (marker) {
 			delete marker.__parent;
@@ -258,6 +277,9 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 				bounds.extend(this._needsClustering[i].getLatLng());
 			}
 		}
+
+		bounds.extend(this._nonPointGroup.getBounds());
+
 		return bounds;
 	},
 
@@ -273,6 +295,8 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 		for (i = markers.length - 1; i >= 0; i--) {
 			method.call(context, markers[i]);
 		}
+
+		this._nonPointGroup.eachLayer(method, context);
 	},
 
 	//Returns true if the given layer is in this MarkerClusterGroup
@@ -296,7 +320,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 			}
 		}
 
-		return !!(layer.__parent && layer.__parent._group === this);
+		return !!(layer.__parent && layer.__parent._group === this) || this._nonPointGroup.hasLayer(layer);
 	},
 
 	//Zoom down to show the given layer (spiderfying if necessary) then calls the callback
@@ -343,6 +367,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 		var i, l, layer;
 
 		this._featureGroup.onAdd(map);
+		this._nonPointGroup.onAdd(map);
 
 		if (!this._gridClusters) {
 			this._generateInitialClusters();
@@ -408,6 +433,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
 
 		//Clean up all the layers we added to the map
 		this._featureGroup.onRemove(map);
+		this._nonPointGroup.onRemove(map);
 
 		this._map = null;
 	},

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/leaflet-markercluster.git



More information about the Pkg-javascript-commits mailing list