generate method

List<PieArc<T>> generate(
  1. List<T> data
)

Generates pie arcs from the given data.

Implementation

List<PieArc<T>> generate(List<T> data) {
  if (data.isEmpty) return [];

  // Sort data if needed
  final sortedData = List<T>.from(data);
  if (sort != null) {
    sortedData.sort(sort);
  } else if (sortByValueDescending) {
    sortedData.sort((a, b) => value(b).compareTo(value(a)));
  }

  // Calculate total value
  double total = 0;
  for (final item in sortedData) {
    final v = value(item);
    if (v > 0) total += v;
  }

  if (total <= 0) return [];

  // Calculate angles
  final angleRange = endAngle - startAngle;
  final totalPadding = padAngle * sortedData.length;
  final availableAngle = angleRange - totalPadding;

  final arcs = <PieArc<T>>[];
  double currentAngle = startAngle;

  for (int i = 0; i < sortedData.length; i++) {
    final item = sortedData[i];
    final v = value(item);

    if (v <= 0) continue;

    final arcAngle = (v / total) * availableAngle;
    final arcStartAngle = currentAngle;
    final arcEndAngle = currentAngle + arcAngle;

    arcs.add(PieArc<T>(
      data: item,
      value: v,
      index: i,
      startAngle: arcStartAngle,
      endAngle: arcEndAngle,
      padAngle: padAngle,
    ));

    currentAngle = arcEndAngle + padAngle;
  }

  return arcs;
}