dataLabelPosition method
Offset
dataLabelPosition(
- CircularDataLabelBoxParentData current,
- 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;
}