Skip to content

Commit c54a990

Browse files
Added a chart branch with new source.
1 parent dcc360e commit c54a990

16 files changed

+166
-120
lines changed

packages/syncfusion_flutter_charts/lib/src/charts/axis/axis.dart

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2128,7 +2128,9 @@ abstract class RenderChartAxis extends RenderBox with ChartAreaUpdateMixin {
21282128
maximum += interval;
21292129
}
21302130
if (maximum % interval > 0) {
2131-
maximum = (maximum + interval) - (maximum % interval);
2131+
maximum = range.maximum > 0
2132+
? (maximum + interval) - (maximum % interval)
2133+
: (maximum + interval) + (maximum % interval);
21322134
}
21332135
range.minimum = minimum;
21342136
range.maximum = maximum;
@@ -3042,6 +3044,8 @@ abstract class RenderChartAxis extends RenderBox with ChartAreaUpdateMixin {
30423044

30433045
void handleTapUp(TapUpDetails details) {
30443046
if (parent != null &&
3047+
parent!.parentData != null &&
3048+
parent!.behaviorArea != null &&
30453049
(parent!.onAxisLabelTapped != null || hasTrimmedAxisLabel)) {
30463050
final Offset localPosition = globalToLocal(details.globalPosition);
30473051
for (final AxisLabel label in visibleLabels) {
@@ -3053,10 +3057,17 @@ abstract class RenderChartAxis extends RenderBox with ChartAreaUpdateMixin {
30533057
parent!.onAxisLabelTapped!(args);
30543058
}
30553059
if (hasTrimmedAxisLabel && label.trimmedText != null) {
3060+
final BoxParentData parentData =
3061+
parent!.parentData! as BoxParentData;
3062+
final Rect parentBounds = parentData.offset & parent!.size;
30563063
parent!.behaviorArea!.showTooltip(TooltipInfo(
3057-
primaryPosition: label.region!.topCenter,
3058-
secondaryPosition: label.region!.bottomCenter,
3059-
text: label.renderText,
3064+
primaryPosition: localToGlobal(label.region!.topCenter),
3065+
secondaryPosition: localToGlobal(label.region!.bottomCenter),
3066+
text: label.text,
3067+
surfaceBounds: Rect.fromPoints(
3068+
parent!.localToGlobal(parentBounds.topLeft),
3069+
parent!.localToGlobal(parentBounds.bottomRight),
3070+
),
30603071
));
30613072
}
30623073
break;

packages/syncfusion_flutter_charts/lib/src/charts/common/circular_data_label.dart

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../utils/typedef.dart';
1212
import 'callbacks.dart';
1313
import 'chart_point.dart';
1414
import 'circular_data_label_helper.dart';
15+
import 'core_tooltip.dart';
1516
import 'data_label.dart';
1617
import 'element_widget.dart';
1718

@@ -377,14 +378,10 @@ class RenderCircularDataLabelStack<T, D> extends RenderChartElementStack {
377378

378379
@override
379380
bool hitTestSelf(Offset position) {
380-
return series?.parent?.onDataLabelTapped != null;
381+
return true;
381382
}
382383

383384
int _findSelectedDataLabelIndex(Offset localPosition) {
384-
if (series?.parent?.onDataLabelTapped == null) {
385-
return -1;
386-
}
387-
388385
if (childCount > 0) {
389386
RenderBox? child = lastChild;
390387
while (child != null) {
@@ -430,9 +427,46 @@ class RenderCircularDataLabelStack<T, D> extends RenderChartElementStack {
430427
settings,
431428
selectedIndex,
432429
));
430+
} else {
431+
final int selectedIndex = _findSelectedDataLabelIndex(localPosition);
432+
if (selectedIndex == -1) {
433+
return;
434+
}
435+
final CircularChartPoint point = labels!.elementAt(selectedIndex).point!;
436+
if (point.trimmedText != null && point.text != point.trimmedText) {
437+
_showTooltipForTrimmedDataLabel(point, selectedIndex);
438+
}
433439
}
434440
}
435441

442+
@override
443+
void handlePointerHover(Offset localPosition) {
444+
final int selectedIndex = _findSelectedDataLabelIndex(localPosition);
445+
if (selectedIndex == -1) {
446+
return;
447+
}
448+
final CircularChartPoint point = labels!.elementAt(selectedIndex).point!;
449+
if (point.trimmedText != null && point.text != point.trimmedText) {
450+
_showTooltipForTrimmedDataLabel(point, selectedIndex);
451+
}
452+
}
453+
454+
void _showTooltipForTrimmedDataLabel(
455+
CircularChartPoint point, int pointIndex) {
456+
final RenderCircularChartPlotArea plotArea =
457+
series!.parent! as RenderCircularChartPlotArea;
458+
459+
plotArea.behaviorArea!.showTooltip(TooltipInfo(
460+
primaryPosition: localToGlobal(point.labelRect.topCenter),
461+
secondaryPosition: localToGlobal(point.labelRect.topCenter),
462+
text: point.text,
463+
surfaceBounds: Rect.fromPoints(
464+
plotArea.localToGlobal(paintBounds.topLeft),
465+
plotArea.localToGlobal(paintBounds.bottomRight),
466+
),
467+
));
468+
}
469+
436470
@override
437471
void setupParentData(RenderObject child) {
438472
if (child is! CircularDataLabelBoxParentData) {

packages/syncfusion_flutter_charts/lib/src/charts/common/circular_data_label_helper.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ void shiftCircularDataLabels(CircularSeriesRenderer seriesRenderer,
393393
final CircularChartPoint point = dataLabelPositioned.point!;
394394
if (point.isVisible) {
395395
final EdgeInsets margin = seriesRenderer.dataLabelSettings.margin;
396-
final Rect rect = point.labelRect;
396+
Rect rect = point.labelRect;
397397
Offset labelLocation;
398398
final Size textSize = dataLabelPositioned.size;
399399

@@ -476,6 +476,16 @@ void shiftCircularDataLabels(CircularSeriesRenderer seriesRenderer,
476476

477477
if (point.text != point.trimmedText) {
478478
details.text = point.trimmedText!;
479+
point.dataLabelSize = measureText(details.text, details.textStyle);
480+
rect = getDataLabelRect(
481+
point.dataLabelPosition,
482+
seriesRenderer.dataLabelSettings.connectorLineSettings.type,
483+
margin,
484+
shiftedConnectorPath,
485+
endPoint,
486+
point.dataLabelSize,
487+
// To avoid the extra padding added to the exact template size.
488+
null)!;
479489
}
480490
point.labelLocation = labelLocation;
481491
dataLabelPositioned.offset = labelLocation;

packages/syncfusion_flutter_charts/lib/src/charts/common/core_tooltip.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,14 @@ class _CoreTooltipRenderBox extends RenderProxyBox {
500500

501501
@override
502502
void performLayout() {
503+
if (!hasSize || size != constraints.biggest) {
504+
_nosePosition = null;
505+
_primaryPosition = null;
506+
_secondaryPosition = null;
507+
size = constraints.biggest;
508+
return;
509+
}
510+
503511
size = constraints.biggest;
504512
if (child == null) {
505513
return;

packages/syncfusion_flutter_charts/lib/src/charts/indicators/technical_indicator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ abstract class IndicatorRenderer<T, D> extends RenderBox
10241024
);
10251025
_animation ??= CurvedAnimation(
10261026
parent: _animationController!,
1027-
curve: dependentAnimation?.curve ?? const Interval(0.1, 0.8),
1027+
curve: dependentAnimation?.curve ?? const Interval(0.1, 1.0),
10281028
);
10291029
_animation!.addListener(_handleAnimationChange);
10301030
animate();

packages/syncfusion_flutter_charts/lib/src/charts/interactions/behavior.dart

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,18 +2233,20 @@ dynamic _interactiveTooltipLabel(dynamic value, RenderChartAxis axis) {
22332233
final int labelsLength = axis.visibleLabels.length;
22342234
if (axis is RenderCategoryAxis) {
22352235
value = value < 0 ? 0 : value;
2236-
value = axis
2237-
.visibleLabels[value.round() >= labelsLength
2238-
? (value.round() > labelsLength ? labelsLength - 1 : value - 1)
2239-
: value.round()]
2240-
.text;
2236+
value = axis.labels[(value.round() >= axis.labels.length
2237+
? (value.round() > axis.labels.length
2238+
? axis.labels.length - 1
2239+
: value - 1)
2240+
: value.round())
2241+
.round()];
22412242
} else if (axis is RenderDateTimeCategoryAxis) {
22422243
value = value < 0 ? 0 : value;
2243-
value = axis
2244-
.visibleLabels[value.round() >= labelsLength
2245-
? (value.round() > labelsLength ? labelsLength - 1 : value - 1)
2246-
: value.round()]
2247-
.text;
2244+
value = axis.labels[(value.round() >= axis.labels.length
2245+
? (value.round() > axis.labels.length
2246+
? axis.labels.length - 1
2247+
: value - 1)
2248+
: value.round())
2249+
.round()];
22482250
} else if (axis is RenderDateTimeAxis) {
22492251
final num interval = axis.visibleRange!.minimum.ceil();
22502252
final num previousInterval = (axis.visibleLabels.isNotEmpty)
@@ -3079,7 +3081,8 @@ class TrackballBehavior extends ChartBehavior {
30793081
_padding = (markerSettings != null &&
30803082
markerSettings!.markerVisibility ==
30813083
TrackballVisibilityMode.auto
3082-
? (series != null && series.markerSettings.isVisible == true)
3084+
? chartPointInfo[index].series is IndicatorRenderer ||
3085+
(series != null && series.markerSettings.isVisible == true)
30833086
: markerSettings != null &&
30843087
markerSettings!.markerVisibility ==
30853088
TrackballVisibilityMode.visible)
@@ -3148,8 +3151,9 @@ class TrackballBehavior extends ChartBehavior {
31483151
_padding = (markerSettings != null &&
31493152
markerSettings!.markerVisibility ==
31503153
TrackballVisibilityMode.auto
3151-
? (chartPointInfo[index].series!.markerSettings.isVisible ==
3152-
true)
3154+
? chartPointInfo[index].series is IndicatorRenderer ||
3155+
(chartPointInfo[index].series!.markerSettings.isVisible ==
3156+
true)
31533157
: markerSettings != null &&
31543158
markerSettings!.markerVisibility ==
31553159
TrackballVisibilityMode.visible)
@@ -3390,7 +3394,9 @@ class TrackballBehavior extends ChartBehavior {
33903394
if (child is IndicatorRenderer && child.effectiveIsVisible) {
33913395
final List<TrackballInfo>? trackballInfo =
33923396
child.trackballInfo(position);
3393-
if (trackballInfo != null && trackballInfo.isNotEmpty) {
3397+
if (trackballInfo != null &&
3398+
trackballInfo.isNotEmpty &&
3399+
child.animationFactor == 1) {
33943400
for (final TrackballInfo? info in trackballInfo) {
33953401
visiblePoints.add(ClosestPoints(
33963402
closestPointX: info!.position!.dx,
@@ -3944,8 +3950,10 @@ class TrackballBehavior extends ChartBehavior {
39443950
void _trackballMarker(int index) {
39453951
if (markerSettings != null &&
39463952
(markerSettings!.markerVisibility == TrackballVisibilityMode.auto
3947-
? (chartPointInfo[index].series != null &&
3948-
chartPointInfo[index].series!.markerSettings.isVisible == true)
3953+
? chartPointInfo[index].series is IndicatorRenderer ||
3954+
(chartPointInfo[index].series != null &&
3955+
chartPointInfo[index].series!.markerSettings.isVisible ==
3956+
true)
39493957
: markerSettings!.markerVisibility ==
39503958
TrackballVisibilityMode.visible)) {
39513959
final DataMarkerType markerType = markerSettings!.shape;
@@ -5325,8 +5333,7 @@ class TrackballBehavior extends ChartBehavior {
53255333
}
53265334

53275335
Paint markerPaint = Paint();
5328-
markerPaint.color =
5329-
chartPointInfo[index].color ?? settings.color ?? seriesColor;
5336+
markerPaint.color = settings.color ?? seriesColor;
53305337
markerPaint.isAntiAlias = true;
53315338
if (seriesRenderer is CartesianSeriesRenderer &&
53325339
seriesRenderer.gradient != null) {
@@ -5343,9 +5350,8 @@ class TrackballBehavior extends ChartBehavior {
53435350
}
53445351
canvas.drawPath(markerPath, markerPaint);
53455352
Paint markerBorderPaint = Paint();
5346-
markerBorderPaint.color =
5347-
chartPointInfo[index].color ?? settings.borderColor ?? seriesColor;
5348-
markerBorderPaint.strokeWidth = 1;
5353+
markerBorderPaint.color = settings.borderColor ?? seriesColor;
5354+
markerBorderPaint.strokeWidth = settings.borderWidth;
53495355
markerBorderPaint.style = PaintingStyle.stroke;
53505356
markerBorderPaint.isAntiAlias = true;
53515357

packages/syncfusion_flutter_charts/lib/src/charts/series/area_series.dart

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -531,11 +531,9 @@ class AreaSegment<T, D> extends ChartSegment {
531531
@override
532532
bool contains(Offset position) {
533533
for (int i = 0; i < points.length; i++) {
534-
final Offset a = points[i];
535-
final Offset b = _lowPoints[i];
536-
final Rect rect = Rect.fromPoints(a, b);
537-
final Rect paddedRect = rect.inflate(tooltipPadding);
538-
if (paddedRect.contains(position)) {
534+
if (Rect.fromCenter(
535+
center: points[i], width: tooltipPadding, height: tooltipPadding)
536+
.contains(position)) {
539537
return true;
540538
}
541539
}
@@ -648,11 +646,7 @@ class AreaSegment<T, D> extends ChartSegment {
648646

649647
int _findNearestChartPointIndex(List<Offset> points, Offset position) {
650648
for (int i = 0; i < points.length; i++) {
651-
final Offset a = points[i];
652-
final Offset b = _lowPoints[i];
653-
final Rect rect = Rect.fromPoints(a, b);
654-
final Rect paddedRect = rect.inflate(tooltipPadding);
655-
if (paddedRect.contains(position)) {
649+
if ((points[i] - position).distance <= pointDistance) {
656650
return i;
657651
}
658652
}

packages/syncfusion_flutter_charts/lib/src/charts/series/bar_series.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -511,9 +511,7 @@ class BarSegment<T, D> extends ChartSegment with BarSeriesTrackerMixin {
511511
final CartesianChartPoint<D> chartPoint = _chartPoint();
512512
final TooltipPosition? tooltipPosition =
513513
series.parent?.tooltipBehavior?.tooltipPosition;
514-
final Offset posFromRect = y.isNegative && bottom == 0
515-
? segmentRect!.outerRect.bottomCenter
516-
: segmentRect!.outerRect.topCenter;
514+
final Offset posFromRect = segmentRect!.outerRect.topCenter;
517515
final Offset preferredPos = tooltipPosition == TooltipPosition.pointer
518516
? position ?? posFromRect
519517
: posFromRect;

0 commit comments

Comments
 (0)