drawDataPoints method

  1. @override
void drawDataPoints()
override

Implementation

@override
void drawDataPoints() {
  clearPoints();

  var minY = getLabelMinY();
  var maxY = getLabelMaxY();
  var totalBarWidth = barWidth;

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

  var barIndex = 0;
  var spaceX = (barMaxPxX - (barWidth * _dataPoints.length) - 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;
  }

  List<String> rects = [];
  for (var x in keys) {
    if (_dataPoints[x] == null) continue;
    var mapPoints = Map<String, double?>.from(_dataPoints[x]!);

    // Clamp all values to avoid charts going overly high
    double total = minY;
    for (var graphName in barLabels) {
      if (_activeGraphs.isNotEmpty && !_activeGraphs.contains(graphName)) {
        mapPoints.remove(graphName);
        continue;
      }

      var y = mapPoints[graphName];
      if (y == null) continue;

      if (y < minY) mapPoints[graphName] = minY;
      if (y > maxY) mapPoints[graphName] = maxY;

      // chart is overflowing
      if (total + y > maxY) {
        if (total < maxY) {
          mapPoints[graphName] = maxY - total;
        } else {
          mapPoints.remove(graphName);
        }
      }

      total = total + y;
    }

    double? startY;
    for (var graphName in mapPoints.keys) {
      var y = mapPoints[graphName];
      if (y == null) {
        continue;
      }

      var offset = barWidth * barIndex + spaceX * barIndex + alignmentOffsetX;
      var pxY = lerp(y, minY, maxY, gridMaxPxY, gridMinPxY);
      var heightY = gridMaxPxY - pxY;
      if (startY == null) {
        startY = pxY;
        heightY = gridMaxPxY - pxY;
      } else {
        heightY = gridMaxPxY - pxY;
        startY = startY - heightY;
      }

      var fill = chartFillStyle[graphName] ?? chartFillStyle[keyAllGraph]!;
      var rect = '<rect x="${barMinPxX + offset}" y="$startY" width="$barWidth" height="$heightY" fill="$fill" />';
      rects.add(rect);
    }
    barIndex++;
  }

  _pointsElem.insertAdjacentHTML('beforeend', rects.join().toJS);
}