drawGroupPrimitives method

  1. @override
List<MarkElement<ElementStyle>> drawGroupPrimitives(
  1. List<Attributes> group,
  2. CoordConv coord,
  3. Offset origin
)
override

Renders primitive elements of all tuples of a group.

The tuples are rendered in groups. the Attributes.shape of the first tuple of a group will be taken as a represent, and it's drawGroupPrimitives method decides the basic way to render the whole group. If different tuples have different shapes, define and call special element rendering methods for each item.

Implementation

@override
List<MarkElement> drawGroupPrimitives(
  List<Attributes> group,
  CoordConv coord,
  Offset origin,
) {
  assert(coord is RectCoordConv);

  final rst = <MarkElement>[];

  // First item.
  Attributes item = group.first;
  List<Offset> position = item.position;
  double bandStart = 0;
  double bandEnd = (group[1].position.first.dx + position.first.dx) / 2;
  // [topLeft, topRight, bottomRight, bottomLeft]
  List<Offset> corners = [
    coord.convert(Offset(bandStart, position[1].dy)),
    coord.convert(Offset(bandEnd, group[1].position[1].dy)),
    coord.convert(Offset(bandEnd, group[1].position[0].dy)),
    coord.convert(Offset(bandStart, position[0].dy)),
  ];
  rst.add(PolygonElement(
      points: corners,
      style: getPaintStyle(item, false, 0, coord.region, null),
      tag: item.tag));
  // Middle items.
  for (var i = 1; i < group.length - 1; i++) {
    item = group[i];
    position = item.position;
    bandStart =
        (group[i].position.first.dx + group[i - 1].position.first.dx) / 2;
    bandEnd =
        (group[i + 1].position.first.dx + group[i].position.first.dx) / 2;
    corners = [
      coord.convert(Offset(bandStart, position[1].dy)),
      coord.convert(Offset(bandEnd, group[i + 1].position[1].dy)),
      coord.convert(Offset(bandEnd, group[i + 1].position[0].dy)),
      coord.convert(Offset(bandStart, position[0].dy)),
    ];
    rst.add(PolygonElement(
        points: corners,
        style: getPaintStyle(item, false, 0, coord.region, null),
        tag: item.tag));
  }
  // Last item.
  item = group.last;
  position = item.position;
  bandStart =
      (position.first.dx + group[group.length - 2].position.first.dx) / 2;
  bandEnd = 1;
  final closeStart = pyramid ? origin.dy : position[0].dy;
  final closeEnd = pyramid ? origin.dy : position[1].dy;
  corners = [
    coord.convert(Offset(bandStart, position[1].dy)),
    coord.convert(Offset(bandEnd, closeEnd)),
    coord.convert(Offset(bandEnd, closeStart)),
    coord.convert(Offset(bandStart, position[0].dy)),
  ];
  rst.add(PolygonElement(
      points: corners,
      style: getPaintStyle(item, false, 0, coord.region, null),
      tag: item.tag));

  return rst;
}