render method
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();
}