diff --git a/src/traces/indicator/plot.js b/src/traces/indicator/plot.js index e4d2c7055f7..05d4b108d51 100644 --- a/src/traces/indicator/plot.js +++ b/src/traces/indicator/plot.js @@ -36,15 +36,17 @@ var position = { var SI_PREFIX = /[yzafpnµmkMGTPEZY]/; +function hasTransition(transitionOpts) { + // If transition config is provided, then it is only a partial replot and traces not + // updated are removed. + return transitionOpts && transitionOpts.duration > 0; +} + module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallback) { var fullLayout = gd._fullLayout; var onComplete; - // If transition config is provided, then it is only a partial replot and traces not - // updated are removed. - var hasTransition = transitionOpts && transitionOpts.duration > 0; - - if(hasTransition) { + if(hasTransition(transitionOpts)) { if(makeOnCompleteCallback) { // If it was passed a callback to register completion, make a callback. If // this is created, then it must be executed on completion, otherwise the @@ -56,6 +58,7 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb Lib.makeTraceGroups(fullLayout._indicatorlayer, cdModule, 'trace').each(function(cd) { var cd0 = cd[0]; var trace = cd0.trace; + var plotGroup = d3.select(this); // Elements in trace @@ -109,15 +112,13 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb } // Draw numbers - var numbersOpts = { + drawNumbers(gd, plotGroup, cd, { numbersX: numbersX, numbersY: numbersY, numbersScaler: numbersScaler, - hasTransition: hasTransition, transitionOpts: transitionOpts, onComplete: onComplete - }; - drawNumbers(gd, plotGroup, cd, numbersOpts); + }); // Reexpress our gauge background attributes for drawing var gaugeBg, gaugeOutline; @@ -149,19 +150,20 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb var angularaxisLayer = plotGroup.selectAll('g.angularaxis').data(isAngular ? cd : []); angularaxisLayer.exit().remove(); - var gaugeOpts = { - size: size, - radius: radius, - innerRadius: innerRadius, - gaugeBg: gaugeBg, - gaugeOutline: gaugeOutline, - angularaxisLayer: angularaxisLayer, - angularGauge: angularGauge, - hasTransition: hasTransition, - transitionOpts: transitionOpts, - onComplete: onComplete - }; - if(isAngular) drawAngularGauge(gd, plotGroup, cd, gaugeOpts); + if(isAngular) { + drawAngularGauge(gd, plotGroup, cd, { + radius: radius, + innerRadius: innerRadius, + + gauge: angularGauge, + layer: angularaxisLayer, + size: size, + gaugeBg: gaugeBg, + gaugeOutline: gaugeOutline, + transitionOpts: transitionOpts, + onComplete: onComplete + }); + } // Prepare bullet layers var bulletGauge = plotGroup.selectAll('g.bullet').data(isBullet ? cd : []); @@ -169,17 +171,17 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb var bulletaxisLayer = plotGroup.selectAll('g.bulletaxis').data(isBullet ? cd : []); bulletaxisLayer.exit().remove(); - gaugeOpts = { - size: size, - gaugeBg: gaugeBg, - gaugeOutline: gaugeOutline, - bulletGauge: bulletGauge, - bulletaxisLayer: bulletaxisLayer, - hasTransition: hasTransition, - transitionOpts: transitionOpts, - onComplete: onComplete - }; - if(isBullet) drawBulletGauge(gd, plotGroup, cd, gaugeOpts); + if(isBullet) { + drawBulletGauge(gd, plotGroup, cd, { + gauge: bulletGauge, + layer: bulletaxisLayer, + size: size, + gaugeBg: gaugeBg, + gaugeOutline: gaugeOutline, + transitionOpts: transitionOpts, + onComplete: onComplete + }); + } // title var title = plotGroup.selectAll('text.title').data(cd); @@ -223,32 +225,30 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb }); }; -function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) { +function drawBulletGauge(gd, plotGroup, cd, opts) { var trace = cd[0].trace; - var bullet = gaugeOpts.bulletGauge; - var bulletaxis = gaugeOpts.bulletaxisLayer; - var gaugeBg = gaugeOpts.gaugeBg; - var gaugeOutline = gaugeOpts.gaugeOutline; - var size = gaugeOpts.size; + var bullet = opts.gauge; + var axisLayer = opts.layer; + var gaugeBg = opts.gaugeBg; + var gaugeOutline = opts.gaugeOutline; + var size = opts.size; var domain = trace.domain; - var hasTransition = gaugeOpts.hasTransition; - var transitionOpts = gaugeOpts.transitionOpts; - var onComplete = gaugeOpts.onComplete; + var transitionOpts = opts.transitionOpts; + var onComplete = opts.onComplete; // preparing axis var ax, vals, transFn, tickSign, shift; - var opts = trace.gauge.axis; // Enter bullet, axis bullet.enter().append('g').classed('bullet', true); bullet.attr('transform', 'translate(' + size.l + ', ' + size.t + ')'); - bulletaxis.enter().append('g') + axisLayer.enter().append('g') .classed('bulletaxis', true) .classed('crisp', true); - bulletaxis.selectAll('g.' + 'xbulletaxis' + 'tick,path,text').remove(); + axisLayer.selectAll('g.' + 'xbulletaxis' + 'tick,path,text').remove(); // Draw bullet var bulletHeight = size.h; // use all vertical domain @@ -256,7 +256,7 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) { var bulletLeft = domain.x[0]; var bulletRight = domain.x[0] + (domain.x[1] - domain.x[0]) * ((trace._hasNumber || trace._hasDelta) ? (1 - cn.bulletNumberDomainSize) : 1); - ax = mockAxis(gd, opts, trace.gauge.axis.range); + ax = mockAxis(gd, trace.gauge.axis, trace.gauge.axis.range); ax._id = 'xbulletaxis'; ax.domain = [bulletLeft, bulletRight]; ax.setScale(); @@ -269,14 +269,14 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) { if(ax.visible) { Axes.drawTicks(gd, ax, { vals: ax.ticks === 'inside' ? Axes.clipEnds(ax, vals) : vals, - layer: bulletaxis, + layer: axisLayer, path: Axes.makeTickPath(ax, shift, tickSign), transFn: transFn }); Axes.drawLabels(gd, ax, { vals: vals, - layer: bulletaxis, + layer: axisLayer, transFn: transFn, labelFns: Axes.makeLabelFns(ax, shift) }); @@ -306,7 +306,7 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) { .attr('height', innerBulletHeight) .attr('y', (bulletHeight - innerBulletHeight) / 2) .call(styleShape); - if(hasTransition) { + if(hasTransition(transitionOpts)) { fgBullet.select('rect') .transition() .duration(transitionOpts.duration) @@ -340,21 +340,20 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) { bulletOutline.exit().remove(); } -function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) { +function drawAngularGauge(gd, plotGroup, cd, opts) { var trace = cd[0].trace; - var size = gaugeOpts.size; - var radius = gaugeOpts.radius; - var innerRadius = gaugeOpts.innerRadius; - var gaugeBg = gaugeOpts.gaugeBg; - var gaugeOutline = gaugeOpts.gaugeOutline; + var size = opts.size; + var radius = opts.radius; + var innerRadius = opts.innerRadius; + var gaugeBg = opts.gaugeBg; + var gaugeOutline = opts.gaugeOutline; var gaugePosition = [size.l + size.w / 2, size.t + size.h / 2 + radius / 2]; - var angularGauge = gaugeOpts.angularGauge; - var angularaxisLayer = gaugeOpts.angularaxisLayer; + var gauge = opts.gauge; + var axisLayer = opts.layer; - var hasTransition = gaugeOpts.hasTransition; - var transitionOpts = gaugeOpts.transitionOpts; - var onComplete = gaugeOpts.onComplete; + var transitionOpts = opts.transitionOpts; + var onComplete = opts.onComplete; // circular gauge var theta = Math.PI / 2; @@ -385,18 +384,17 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) { // preparing axis var ax, vals, transFn, tickSign; - var opts = trace.gauge.axis; // Enter gauge and axis - angularGauge.enter().append('g').classed('angular', true); - angularGauge.attr('transform', strTranslate(gaugePosition[0], gaugePosition[1])); + gauge.enter().append('g').classed('angular', true); + gauge.attr('transform', strTranslate(gaugePosition[0], gaugePosition[1])); - angularaxisLayer.enter().append('g') + axisLayer.enter().append('g') .classed('angularaxis', true) .classed('crisp', true); - angularaxisLayer.selectAll('g.' + 'xangularaxis' + 'tick,path,text').remove(); + axisLayer.selectAll('g.' + 'xangularaxis' + 'tick,path,text').remove(); - ax = mockAxis(gd, opts); + ax = mockAxis(gd, trace.gauge.axis); ax.type = 'linear'; ax.range = trace.gauge.axis.range; ax._id = 'xangularaxis'; // or 'y', but I don't think this makes a difference here @@ -451,13 +449,13 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) { var pad = (ax.linewidth || 1) / 2; Axes.drawTicks(gd, ax, { vals: vals, - layer: angularaxisLayer, + layer: axisLayer, path: 'M' + (tickSign * pad) + ',0h' + (tickSign * ax.ticklen), transFn: transFn2 }); Axes.drawLabels(gd, ax, { vals: vals, - layer: angularaxisLayer, + layer: axisLayer, transFn: transFn, labelFns: labelFns }); @@ -465,17 +463,17 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) { // Draw background + steps var arcs = [gaugeBg].concat(trace.gauge.steps); - var bgArc = angularGauge.selectAll('g.bg-arc').data(arcs); + var bgArc = gauge.selectAll('g.bg-arc').data(arcs); bgArc.enter().append('g').classed('bg-arc', true).append('path'); bgArc.select('path').call(drawArc).call(styleShape); bgArc.exit().remove(); // Draw foreground with transition var valueArcPathGenerator = arcPathGenerator(trace.gauge.bar.thickness); - var valueArc = angularGauge.selectAll('g.value-arc').data([trace.gauge.bar]); + var valueArc = gauge.selectAll('g.value-arc').data([trace.gauge.bar]); valueArc.enter().append('g').classed('value-arc', true).append('path'); var valueArcPath = valueArc.select('path'); - if(hasTransition) { + if(hasTransition(transitionOpts)) { valueArcPath .transition() .duration(transitionOpts.duration) @@ -505,13 +503,13 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) { thickness: trace.gauge.threshold.thickness }); } - var thresholdArc = angularGauge.selectAll('g.threshold-arc').data(arcs); + var thresholdArc = gauge.selectAll('g.threshold-arc').data(arcs); thresholdArc.enter().append('g').classed('threshold-arc', true).append('path'); thresholdArc.select('path').call(drawArc).call(styleShape); thresholdArc.exit().remove(); // Draw border last - var gaugeBorder = angularGauge.selectAll('g.gauge-outline').data([gaugeOutline]); + var gaugeBorder = gauge.selectAll('g.gauge-outline').data([gaugeOutline]); gaugeBorder.enter().append('g').classed('gauge-outline', true).append('path'); gaugeBorder.select('path').call(drawArc).call(styleShape); gaugeBorder.exit().remove(); @@ -519,12 +517,12 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) { function drawNumbers(gd, plotGroup, cd, opts) { var trace = cd[0].trace; + var numbersX = opts.numbersX; var numbersY = opts.numbersY; var numbersAlign = trace.align || 'center'; var numbersAnchor = anchor[numbersAlign]; - var hasTransition = opts.hasTransition; var transitionOpts = opts.transitionOpts; var onComplete = opts.onComplete; @@ -582,7 +580,8 @@ function drawNumbers(gd, plotGroup, cd, opts) { function writeNumber() { number.text(bignumberPrefix + fmt(cd[0].y) + bignumberSuffix); } - if(hasTransition) { + + if(hasTransition(transitionOpts)) { number .transition() .duration(transitionOpts.duration) @@ -635,7 +634,7 @@ function drawNumbers(gd, plotGroup, cd, opts) { .call(Color.fill, deltaFill(cd[0])); } - if(hasTransition) { + if(hasTransition(transitionOpts)) { delta .transition() .duration(transitionOpts.duration)