drawDataPoints method

  1. @override
void drawDataPoints()
override

Implementation

@override
void drawDataPoints() {
  var minY = getLabelMinY();
  var maxY = getLabelMaxY();
  var totalBarWidth = getBarWidth();

  var barMinPxX = gridMinPxX;
  var barMaxPxX = gridMaxPxX;
  if (maxLabelWidthX > getBarWidth()) {
    barMinPxX = gridMinPxX + max(0, (maxLabelWidthX - getBarWidth())/2);
    barMaxPxX = gridMaxPxX - max(0, (maxLabelWidthX - getBarWidth())/2);
  }

  var barSetIndex = 0;
  var spaceX = (barMaxPxX - totalBarWidth - barMinPxX) / (_dataPoints.length - 1);
  var alignmentOffsetX = 0.0;
  if (_dataPoints.length == 1) { // Start to draw from the center
    alignmentOffsetX = (barMaxPxX - barMinPxX - totalBarWidth)/2 - barMinPxX - totalBarWidth/2;
    spaceX = 0;
  }

  _hoverPaths.clear();

  for (var x in keys) {
    var mapPoints = _dataPoints[x];
    var barIndex = 0;
    for (var graphName in _graphKeys) {
      var y = mapPoints![graphName];
      if (y == null) {
        barIndex++;
        continue;
      }

      var offset = barIndex * singleBarWidth + barIndex * barMargin + spaceX * barSetIndex + alignmentOffsetX;

      // Clamp the value so it does not get drawn outside the graph.
      var clampedQ3Y = min(y.q3, maxY);
      var clampedQ1Y = max(y.q1, minY);
      var centerBarPxYStart = lerp(clampedQ3Y, minY, maxY, gridMaxPxY, gridMinPxY);
      var centerBarPxYEnd = lerp(clampedQ1Y, minY, maxY, gridMaxPxY, gridMinPxY);
      ctx.fillStyle = (barFillStyle[graphName] ?? barFillStyle[keyAllGraph])!.toJS;
      ctx.fillRect(barMinPxX + offset, centerBarPxYStart, singleBarWidth, max(centerBarPxYEnd - centerBarPxYStart, 1));

      var minLinePxY = centerBarPxYStart;
      var maxLinePxY = centerBarPxYEnd;

      // Draw the max point line
      if (y.max <= maxY) {
        ctx.strokeStyle = (barFillStyle[graphName] ?? barFillStyle[keyAllGraph])!.toJS;
        ctx.beginPath();
        maxLinePxY = lerp(y.max, minY, maxY, gridMaxPxY, gridMinPxY);
        ctx.moveTo(barMinPxX + offset, maxLinePxY);
        ctx.lineTo(barMinPxX + offset + singleBarWidth, maxLinePxY);
        ctx.stroke();
      }

      // Draw the min point line
      if (y.min >= minY) {
        ctx.strokeStyle = (barFillStyle[graphName] ?? barFillStyle[keyAllGraph])!.toJS;
        ctx.beginPath();
        minLinePxY = lerp(y.min, minY, maxY, gridMaxPxY, gridMinPxY);
        ctx.moveTo(barMinPxX + offset, minLinePxY);
        ctx.lineTo(barMinPxX + offset + singleBarWidth, minLinePxY);
        ctx.stroke();
      }

      // Draw the center line
      ctx.beginPath();
      ctx.moveTo(barMinPxX + offset + singleBarWidth/2, minLinePxY);
      ctx.lineTo(barMinPxX + offset + singleBarWidth/2, maxLinePxY);
      ctx.stroke();

      var hoverBar = Path2D();
      hoverBar.rect(barMinPxX + offset, maxLinePxY, singleBarWidth, max(minLinePxY - maxLinePxY, 1));
      var hoverPath = _BarHoverPath(hoverBar, barMinPxX + offset, maxLinePxY, max(minLinePxY - maxLinePxY, 1));
      if (_hoverPaths[x] == null) {
        _hoverPaths[x] = {graphName: hoverPath};
      } else {
        _hoverPaths[x]![graphName] = hoverPath;
      }

      barIndex++;
    }
    barSetIndex++;
  }
}