getNearestDatumDetailPerSeries method

  1. @override
List<DatumDetails<D>> getNearestDatumDetailPerSeries(
  1. Point<double> chartPoint,
  2. bool byDomain,
  3. Rectangle<int>? boundsOverride, {
  4. bool selectOverlappingPoints = false,
  5. bool selectExactEventLocation = false,
})
inherited

Datum details of nearest rectangles in the treemap.

Implementation

@override
List<DatumDetails<D>> getNearestDatumDetailPerSeries(
  Point<double> chartPoint,
  bool byDomain,
  Rectangle<int>? boundsOverride, {
  bool selectOverlappingPoints = false,
  bool selectExactEventLocation = false,
}) {
  final nearest = <DatumDetails<D>>[];

  // Checks if the [chartPoint] is within bounds.
  if (!isPointWithinBounds(chartPoint, boundsOverride)) return nearest;

  final root = _treeNodeToRendererElement.entries.first.key;
  final queue = Queue<TreeNode<Object>>()..add(root);

  while (queue.isNotEmpty) {
    final node = queue.removeFirst();
    final element = _getRendererElement(node);

    if (element.boundingRect.containsPoint(chartPoint)) {
      nearest.add(
        DatumDetails<D>(
          index: element.index,
          series: element.series,
          datum: node,
          domain: element.domain,
          measure: element.measure,
          domainDistance: 0,
          measureDistance: 0,
        ),
      );
      // No need to verify remaining siblings.
      queue
        ..clear()

        // Only processes nodes whose parents contain the [chartPoint].
        // This reduces the number of nodes to verify.
        ..addAll(node.children);
    }
  }

  // Prioritizes nodes with larger depth;
  nearest.sort((a, b) {
    final nodeA = a.datum as TreeNode<Object>;
    final nodeB = b.datum as TreeNode<Object>;
    return nodeB.depth.compareTo(nodeA.depth);
  });
  return nearest;
}