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;
}