render method

  1. @override
void render()
override

Implementation

@override
void render() {
  CanvasRenderingContext2D ctx = canvas.getContext('2d') as CanvasRenderingContext2D;

  minTime = null;
  maxTime = null;
  num? minValue;
  num? maxValue;
  for (var key in items.keys) {
    var time = key;
    var value = items[key]!;
    minTime = (minTime == null ? time : min(minTime!, time));
    maxTime = (maxTime == null ? time : max(maxTime!, time));
    minValue = (minValue == null ? value : min(minValue, value));
    maxValue = (maxValue == null ? value : max(maxValue, value));
  }

  if (maxTime == null) {
    renderText('no data');
    return;
  }

  if (maxTime == minTime) {
    minTime = minTime! - 100;
    maxTime = maxTime! + 100;
  }

  if (minValue! > 0) {
    //TODO configurable start at 0
    minValue = 0;
  }
  if (minValue == maxValue) {
    maxValue = maxValue! + 1;
  }

  magnitude = getMagnitude(maxValue!);
  maxValue = ((maxValue / magnitude) * magnitude).ceilToDouble();
  minValue = ((minValue / magnitude) * magnitude).floorToDouble();

  valueLabels = getValueLabels(minValue, maxValue);

  valueMargin = 0;
  for (var i = 0; i < valueLabels.length; i++) {
    valueMargin = max(valueMargin, measureText(ctx, formatValue(valueLabels[i])) + (2 * textMargin));
  }

  timeMargin = 0;
  timeLabels = getTimeLabels(minTime!, maxTime!);
  for (var i in timeLabels.keys) {
    timeMargin = max(timeMargin, measureText(ctx, timeLabels[i]!) + (2 * textMargin));
  }

  points.clear();
  for (var key in items.keys) {
    var time = key;
    var value = items[key]!;
    var date = DateTime.fromMillisecondsSinceEpoch(time).toUtc();
    points.add(TimeChartPoint(
        key,
        (((time - minTime!) / (maxTime! - minTime!)) * (width - valueMargin - smallMargin) + valueMargin).round(),
        (height - (((value - minValue) / (maxValue - minValue)) * (height - timeMargin - smallMargin)) - timeMargin).round(),
        formatTime(date),
        'value: ${formatValue(items[key]!)}'));
  }
  //RENDER POINTS
  renderPoints();
}