addPositionToDetailsForSeriesDatum method

  1. @override
DatumDetails<D> addPositionToDetailsForSeriesDatum(
  1. DatumDetails<D> details,
  2. SeriesDatum<D> seriesDatum
)
override

Adds chart position data to details.

This is a helper function intended to be called from getDetailsForSeriesDatum. Every concrete SeriesRenderer needs to implement custom logic for setting location data.

Implementation

@override
DatumDetails<D> addPositionToDetailsForSeriesDatum(
  DatumDetails<D> details,
  SeriesDatum<D> seriesDatum,
) {
  final series = details.series!;

  final domainAxis = series.getAttr(domainAxisKey)! as ImmutableAxis<D>;
  final measureAxis = series.getAttr(measureAxisKey)! as ImmutableAxis<num>;

  final point = getPoint(
    seriesDatum.datum,
    details.domain,
    details.domainLowerBound,
    details.domainUpperBound,
    series,
    domainAxis,
    details.measure,
    details.measureLowerBound,
    details.measureUpperBound,
    details.measureOffset,
    measureAxis,
  );

  final symbolRendererFn = series.getAttr(pointSymbolRendererFnKey);

  // Get the ID of the [SymbolRenderer] for this point. An ID may be
  // specified on the datum, or on the series. If neither is specified,
  // fall back to the default.
  String? symbolRendererId;
  if (symbolRendererFn != null) {
    symbolRendererId = symbolRendererFn(details.index);
  }
  symbolRendererId ??= series.getAttr(pointSymbolRendererIdKey);
  symbolRendererId ??= defaultSymbolRendererId;

  // Now that we have the ID, get the configured [SymbolRenderer].
  SymbolRenderer? nearestSymbolRenderer;
  if (symbolRendererId == defaultSymbolRendererId) {
    nearestSymbolRenderer = symbolRenderer;
  } else {
    final id = symbolRendererId;
    if (!config.customSymbolRenderers!.containsKey(id)) {
      throw ArgumentError('Invalid custom symbol renderer id "$id"');
    }

    nearestSymbolRenderer = config.customSymbolRenderers![id];
  }

  return DatumDetails.from(
    details,
    chartPosition: NullablePoint(point.x, point.y),
    chartPositionLower: NullablePoint(point.xLower, point.yLower),
    chartPositionUpper: NullablePoint(point.xUpper, point.yUpper),
    symbolRenderer: nearestSymbolRenderer,
  );
}