(state, callbacks, model)
| 212 | } |
| 213 | |
| 214 | function viewModel(state, callbacks, model) { |
| 215 | var width = model.width; |
| 216 | var height = model.height; |
| 217 | var dimensions = model.dimensions; |
| 218 | var canvasPixelRatio = model.canvasPixelRatio; |
| 219 | |
| 220 | var xScale = function(d) {return width * d / Math.max(1, model.colCount - 1);}; |
| 221 | |
| 222 | var unitPad = c.verticalPadding / height; |
| 223 | var _unitToPaddedPx = unitToPaddedPx(height, c.verticalPadding); |
| 224 | |
| 225 | var vm = { |
| 226 | key: model.key, |
| 227 | xScale: xScale, |
| 228 | model: model, |
| 229 | inBrushDrag: false // consider factoring it out and putting it in a centralized global-ish gesture state object |
| 230 | }; |
| 231 | |
| 232 | var uniqueKeys = {}; |
| 233 | |
| 234 | vm.dimensions = dimensions.filter(helpers.isVisible).map(function(dimension, i) { |
| 235 | var domainToPaddedUnit = domainToPaddedUnitScale(dimension, unitPad); |
| 236 | var foundKey = uniqueKeys[dimension.label]; |
| 237 | uniqueKeys[dimension.label] = (foundKey || 0) + 1; |
| 238 | var key = dimension.label + (foundKey ? '__' + foundKey : ''); |
| 239 | var specifiedConstraint = dimension.constraintrange; |
| 240 | var filterRangeSpecified = specifiedConstraint && specifiedConstraint.length; |
| 241 | if(filterRangeSpecified && !isArrayOrTypedArray(specifiedConstraint[0])) { |
| 242 | specifiedConstraint = [specifiedConstraint]; |
| 243 | } |
| 244 | var filterRange = filterRangeSpecified ? |
| 245 | specifiedConstraint.map(function(d) { return d.map(domainToPaddedUnit); }) : |
| 246 | [[-Infinity, Infinity]]; |
| 247 | var brushMove = function() { |
| 248 | var p = vm; |
| 249 | p.focusLayer && p.focusLayer.render(p.panels, true); |
| 250 | var filtersActive = someFiltersActive(p); |
| 251 | if(!state.contextShown() && filtersActive) { |
| 252 | p.contextLayer && p.contextLayer.render(p.panels, true); |
| 253 | state.contextShown(true); |
| 254 | } else if(state.contextShown() && !filtersActive) { |
| 255 | p.contextLayer && p.contextLayer.render(p.panels, true, true); |
| 256 | state.contextShown(false); |
| 257 | } |
| 258 | }; |
| 259 | |
| 260 | var truncatedValues = dimension.values; |
| 261 | if(truncatedValues.length > dimension._length) { |
| 262 | truncatedValues = truncatedValues.slice(0, dimension._length); |
| 263 | } |
| 264 | |
| 265 | var tickvals = dimension.tickvals; |
| 266 | var ticktext; |
| 267 | function makeTickItem(v, i) { return {val: v, text: ticktext[i]}; } |
| 268 | function sortTickItem(a, b) { return a.val - b.val; } |
| 269 | if(isArrayOrTypedArray(tickvals) && tickvals.length) { |
| 270 | if(Lib.isTypedArray(tickvals)) tickvals = Array.from(tickvals); |
| 271 |
nothing calls this directly
no test coverage detected
searching dependent graphs…