Mercurial > pub > ImplabJs
diff src/djol/DynamicStyle.js @ 10:8705103f074f
Слияние
author | cin |
---|---|
date | Mon, 21 Aug 2017 18:03:00 +0300 |
parents | f0035923ff3e |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/djol/DynamicStyle.js Mon Aug 21 18:03:00 2017 +0300 @@ -0,0 +1,119 @@ +define([ "./declare-style", "dojo/_base/declare", "ol", "implab/safe" ], + +function(declare, dojoDeclare, ol, safe) { + return declare([], { + _cache : null, + _getKey : null, + _getZoom : null, + + defaultStyle : null, + + style : null, + + styleFunction : null, + + filter : null, + + constructor : function(opts) { + if (opts) + dojoDeclare.safeMixin(this, opts); + + this._cache = {}; + + if (this.zoom) { + if (this.zoom instanceof Function) { + this._getZoom = this.zoom; + } else { + var levels = [], max = "max"; + for ( var p in this.zoom) { + if (safe.isNumber(this.zoom[p])) + levels.push({ + name : p, + zoom : Number(this.zoom[p]) + }); + else if (this.zoom[p] == "max") + max = p; + } + + levels.sort(function(x, y) { + return x.zoom - y.zoom; + }); + + this.zoomMax = max; + this.zoomLevels = levels; + + this._getZoom = function(z) { + for (var i = 0; i < levels.length; i++) { + if (z <= levels[i].zoom) + return levels[i].name; + } + return max; + }; + } + } else { + this._getZoom = function(z) { + return "max"; + }; + } + + if (this.key) { + if (this.key instanceof Function) { + this._getKey = this.key; + } else if (typeof this.key === "string") { + this._getKey = function(ft) { + return ft.get(this.key); + }; + } else { + this._getKey = function(ft, z) { + var k = this.key[z]; + if (k instanceof Function) + return k.call(this, ft, z); + else if (typeof k == "string") + return ft.get(k); + else + return this.defaultStyle; + }; + } + } else { + this._getKey = function() { + return this.defaultStyle; + }; + } + + if (this.style) { + if (this.style instanceof Function) { + this._style = this.style; + } else { + this._style = function(ft, res, key, zoom) { + var s = this.style[zoom]; + return s && (s instanceof Function) ? s.apply( + this, + arguments) : s; + }; + } + } + }, + + getFeatureStyle : function(ft, res) { + safe.argumentNotNull(ft, "ft"); + + if (this.filter && this.filter(ft) === false) + return null; + + var z = this._getZoom(res); + var k = this._getKey(ft, z); + + var cid = [ k, z ].join('-'); + + var style = this._cache[cid]; + if (!style) { + style = this._style ? this._style(ft, res, k, z) : null; + this._cache[cid] = style; + } + + + return safe.isNull(style) || style instanceof Array ? style : [ style ]; + } + + }); +}); \ No newline at end of file