dataLabelPosition method

Offset dataLabelPosition(
  1. CircularDataLabelBoxParentData current,
  2. Size size
)

Implementation

Offset dataLabelPosition(CircularDataLabelBoxParentData current, Size size) {
  final num angle = dataLabelSettings.angle;
  final int pointIndex = current.dataPointIndex;
  Offset labelLocation;
  const int labelPadding = 2;
  TextStyle dataLabelStyle =
      parent!.themeData!.textTheme.bodySmall!
        ..merge(chartThemeData!.dataLabelTextStyle)
        ..merge(dataLabelSettings.textStyle);
  final CircularChartPoint point = current.point!;
  if (point.isExplode) {
    point.center = calculateExplodingCenter(
      point.midAngle!,
      point.outerRadius!.toDouble(),
      point.center!,
      point.explodeOffset,
    );
  }
  if (point.isVisible && (point.y != 0 || dataLabelSettings.showZeroValue)) {
    dataLabelStyle = dataLabelStyle.copyWith(
      color:
          dataLabelStyle.color ??
          saturatedTextColor(findThemeColor(this, point, dataLabelSettings)),
    );

    if (dataLabelSettings.labelPosition == ChartDataLabelPosition.inside) {
      labelLocation = calculateOffset(
        point.midAngle!,
        (point.innerRadius! + point.outerRadius!) / 2,
        point.center!,
      );
      labelLocation = Offset(
        labelLocation.dx -
            (size.width / 2) +
            (angle == 0 ? 0 : size.width / 2),
        labelLocation.dy -
            (size.height / 2) +
            (angle == 0 ? 0 : size.height / 2),
      );
      point.labelRect = Rect.fromLTWH(
        labelLocation.dx - labelPadding,
        labelLocation.dy - labelPadding,
        size.width + (2 * labelPadding),
        size.height + (2 * labelPadding),
      );
      bool isDataLabelCollide = findingCollision(
        point.labelRect,
        renderDataLabelRegions,
      );
      if (dataLabelSettings.labelIntersectAction ==
              LabelIntersectAction.hide ||
          dataLabelSettings.overflowMode == OverflowMode.hide) {
        point.isVisible = !isDataLabelCollide;
      }

      if (dataLabelSettings.builder == null) {
        // TODO(Lavanya): Get text from DataLabelBoxParentData;
        String label = point.text!;
        point.overflowTrimmedText = point.overflowTrimmedText ?? label;

        if (dataLabelSettings.overflowMode == OverflowMode.shift) {
          final String labelText = segmentOverflowTrimmedText(
            this,
            point.text!,
            size,
            point,
            point.labelRect,
            center,
            labelLocation,
            dataLabelSettings.overflowMode,
            dataLabelStyle,
          );
          if (labelText.contains('...') || labelText.isEmpty) {
            isDataLabelCollide = true;
            point.renderPosition = ChartDataLabelPosition.outside;
          }
          point.text = isDataLabelCollide ? point.text : labelText;
        } else if (dataLabelSettings.overflowMode == OverflowMode.trim &&
            !point.text!.contains('...')) {
          if (!isDataLabelCollide) {
            point.text = segmentOverflowTrimmedText(
              this,
              point.text!,
              size,
              point,
              point.labelRect,
              center,
              labelLocation,
              dataLabelSettings.overflowMode,
              dataLabelStyle,
            );
            label = point.text!;
            final Size trimmedTextSize = measureText(label, dataLabelStyle);
            labelLocation = calculateOffset(
              point.midAngle!,
              (point.innerRadius! + point.outerRadius!) / 2,
              point.center!,
            );
            labelLocation = Offset(
              labelLocation.dx -
                  (trimmedTextSize.width / 2) +
                  (angle == 0 ? 0 : trimmedTextSize.width / 2),
              labelLocation.dy -
                  (trimmedTextSize.height / 2) +
                  (angle == 0 ? 0 : trimmedTextSize.height / 2),
            );
            point.labelLocation = labelLocation;
            point.labelRect = Rect.fromLTWH(
              labelLocation.dx - labelPadding,
              labelLocation.dy - labelPadding,
              trimmedTextSize.width + (2 * labelPadding),
              trimmedTextSize.height + (2 * labelPadding),
            );
          } else {
            point.isVisible = false;
          }
        }
      }

      if (dataLabelSettings.labelIntersectAction ==
              LabelIntersectAction.shift &&
          isDataLabelCollide &&
          dataLabelSettings.overflowMode != OverflowMode.trim) {
        point.saturationRegionOutside = true;
        point.renderPosition = ChartDataLabelPosition.outside;
        renderOutsideDataLabel(
          point,
          size,
          pointIndex,
          this,
          index,
          dataLabelStyle,
          renderDataLabelRegions,
        );
      } else if (((dataLabelSettings.labelIntersectAction ==
                      LabelIntersectAction.shift &&
                  dataLabelSettings.overflowMode == OverflowMode.none) &&
              isDataLabelCollide &&
              dataLabelSettings.overflowMode != OverflowMode.trim) ||
          (isDataLabelCollide &&
              dataLabelSettings.overflowMode == OverflowMode.shift)) {
        point.saturationRegionOutside = true;
        point.renderPosition = ChartDataLabelPosition.outside;
        renderOutsideDataLabel(
          point,
          size,
          pointIndex,
          this,
          index,
          dataLabelStyle,
          renderDataLabelRegions,
        );
      } else if (!isDataLabelCollide ||
          (dataLabelSettings.labelIntersectAction ==
                  LabelIntersectAction.none &&
              dataLabelSettings.overflowMode == OverflowMode.none)) {
        point.renderPosition = ChartDataLabelPosition.inside;
        // TODO(Lavanya): Apply saturation color with
        //DataLabelRender callback.

        if (!isDataLabelCollide &&
            (dataLabelSettings.labelIntersectAction ==
                    LabelIntersectAction.shift &&
                dataLabelSettings.overflowMode != OverflowMode.hide)) {
          renderDataLabelRegions.add(point.labelRect);
          point.labelLocation = labelLocation;
        } else if (!isDataLabelCollide &&
            (dataLabelSettings.labelIntersectAction ==
                    LabelIntersectAction.hide ||
                dataLabelSettings.overflowMode == OverflowMode.hide)) {
          if (point.renderPosition == ChartDataLabelPosition.inside &&
              (dataLabelSettings.overflowMode == OverflowMode.hide)) {
            point.text = segmentOverflowTrimmedText(
              this,
              point.text!,
              size,
              point,
              point.labelRect,
              center,
              labelLocation,
              dataLabelSettings.overflowMode,
              dataLabelStyle,
            );
            // label = point.text!;
          }

          point.labelLocation = labelLocation;
          // TODO(Lavanya): drawLabel method add renderDataLabelRegions.
          if (dataLabelSettings.labelIntersectAction !=
              LabelIntersectAction.shift) {
            renderDataLabelRegions.add(point.labelRect);
          }
        } else {
          point.labelLocation = labelLocation;
          // TODO(Lavanya): drawLabel method add renderDataLabelRegions.
          if (dataLabelSettings.labelIntersectAction !=
              LabelIntersectAction.shift) {
            renderDataLabelRegions.add(point.labelRect);
          }
        }
      }
    } else {
      point.renderPosition = ChartDataLabelPosition.outside;
      dataLabelStyle = dataLabelStyle.copyWith(
        color:
            dataLabelStyle.color ??
            saturatedTextColor(
              findThemeColor(this, point, dataLabelSettings),
            ),
      );
      renderOutsideDataLabel(
        point,
        size,
        pointIndex,
        this,
        index,
        dataLabelStyle,
        renderDataLabelRegions,
      );
    }
  } else {
    point.labelRect = Rect.zero;
    point.isVisible = false;
  }

  return point.labelLocation;
}