Ticket #1373: styleContext.patch
| File styleContext.patch, 5.6 kB (added by ahocevar, 11 months ago) |
|---|
-
lib/OpenLayers/Rule.js
old new 22 22 23 23 /** 24 24 * Property: context 25 * {Object} An optional object with properties that the rule and its26 * symbolizers' property values should be evaluatad against. If no27 * context is specified, feature.attributes will be used25 * {Object} An optional object with properties that the rule should be 26 * evaluatad against. If no context is specified, feature.attributes will 27 * be used. 28 28 */ 29 29 context: null, 30 30 -
lib/OpenLayers/Style.js
old new 41 41 rules: null, 42 42 43 43 /** 44 * Property: context 45 * {Object} An optional object with properties that symbolizers' property 46 * values should be evaluatad against. If no context is specified, 47 * feature.attributes will be used 48 */ 49 context: null, 50 51 /** 44 52 * Property: defaultStyle 45 53 * {Object} hash of style properties to use as default for merging 46 54 * rule-based style symbolizers onto. If no rules are defined, … … 116 124 var appliedRules = false; 117 125 for(var i=0; i<rules.length; i++) { 118 126 rule = rules[i]; 119 context = rule.context;120 if (!context) {121 context = feature.attributes || feature.data;122 }123 127 // does the rule apply? 124 128 var applies = rule.evaluate(feature); 125 129 … … 128 132 elseRules.push(rule); 129 133 } else { 130 134 appliedRules = true; 131 this.applySymbolizer(rule, style, feature , context);135 this.applySymbolizer(rule, style, feature); 132 136 } 133 137 } 134 138 } … … 137 141 if(appliedRules == false && elseRules.length > 0) { 138 142 appliedRules = true; 139 143 for(var i=0; i<elseRules.length; i++) { 140 this.applySymbolizer(elseRules[i], style, feature , context);144 this.applySymbolizer(elseRules[i], style, feature); 141 145 } 142 146 } 143 147 … … 158 162 * rule - {OpenLayers.Rule} 159 163 * style - {Object} 160 164 * feature - {<OpenLayer.Feature.Vector>} 161 * context - {Object}162 165 * 163 166 * Returns: 164 167 * {Object} A style with new symbolizer applied. … … 163 166 * Returns: 164 167 * {Object} A style with new symbolizer applied. 165 168 */ 166 applySymbolizer: function(rule, style, feature , context) {169 applySymbolizer: function(rule, style, feature) { 167 170 var symbolizerPrefix = feature.geometry ? 168 171 this.getSymbolizerPrefix(feature.geometry) : 169 172 OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; … … 170 173 171 174 var symbolizer = rule.symbolizer[symbolizerPrefix]; 172 175 176 var context = this.context || feature.attributes || feature.data; 177 173 178 // merge the style with the current style 174 179 return this.createLiterals( 175 180 OpenLayers.Util.extend(style, symbolizer), context); … … 251 256 * APIMethod: setDefaultStyle 252 257 * Sets the default style for this style object. 253 258 * 254 * Parameters: 259 * Parameters:the rule and its 255 260 * style - {Object} Hash of style properties 256 261 */ 257 262 setDefaultStyle: function(style) { -
tests/Rule/test_Comparison.html
old new 38 38 } 39 39 40 40 function test_Comparison_evaluate(t) { 41 t.plan( 3);41 t.plan(4); 42 42 43 43 var rule = new OpenLayers.Rule.Comparison({ 44 44 property: "area", … … 62 62 t.eq(result, ruleResults[i], "feature "+i+ 63 63 " evaluates to "+result.toString()+" correctly."); 64 64 } 65 rule.context = { 66 area: 4998 67 } 68 var result = rule.evaluate(); 69 t.eq(result, true, "evaluation against custom rule context works."); 65 70 } 66 71 </script> 67 72 </head> -
tests/test_Style.html
old new 116 116 117 117 function test_Style_context(t) { 118 118 t.plan(1); 119 var context = {120 foo: "bar",121 size: 10};122 119 var rule = new OpenLayers.Rule.Comparison({ 123 120 type: OpenLayers.Rule.Comparison.LESS_THAN, 124 context: context,125 121 property: "size", 126 122 value: 11, 127 symbolizer: {"Point": {externalGraphic: "${ foo}.png"}}});123 symbolizer: {"Point": {externalGraphic: "${img1}"}}}); 128 124 var style = new OpenLayers.Style(); 125 style.context = { 126 "img1": "myImage.png" 127 }; 129 128 style.addRules([rule]); 130 var styleHash = style.createSymbolizer(new OpenLayers.Feature.Vector()); 131 t.eq(styleHash.externalGraphic, "bar.png", "correctly evaluated rule against a custom context"); 129 var feature = new OpenLayers.Feature.Vector(); 130 feature.attributes = {size: 10}; 131 var styleHash = style.createSymbolizer(feature); 132 t.eq(styleHash.externalGraphic, "myImage.png", "correctly evaluated rule and calculated property styles from a custom context"); 132 133 } 133 134 134 135 function test_Style_destroy(t) {
