paint method
void
paint(
- PaintingContext context,
- Offset thumbCenter,
- Offset offset,
- TextPainter textPainter, {
- required RenderBox parentBox,
- required SfSliderThemeData sliderThemeData,
- required Paint paint,
- required Animation<
double> animation, - required Rect trackRect,
override
Draws the tooltip based on the values passed in the arguments.
Implementation
@override
void paint(PaintingContext context, Offset thumbCenter, Offset offset,
TextPainter textPainter,
{required RenderBox parentBox,
required SfSliderThemeData sliderThemeData,
required Paint paint,
required Animation<double> animation,
required Rect trackRect}) {
final double leftPadding = tooltipTextPadding.dx / 2;
final double minLeftX = trackRect.left;
// ignore: avoid_as
final Path path = (_isVertical(parentBox as RenderBaseSlider))
? _updateRectangularTooltipWidth(textPainter.size + tooltipTextPadding,
offset.dy, trackRect, thumbCenter.dy,
isVertical: _isVertical(parentBox),
isLeftTooltip: _isLeftTooltip(parentBox))
: _updateRectangularTooltipWidth(textPainter.size + tooltipTextPadding,
offset.dy, trackRect, thumbCenter.dx,
isVertical: _isVertical(parentBox));
context.canvas.save();
context.canvas.translate(thumbCenter.dx, thumbCenter.dy);
context.canvas.scale(animation.value);
final Paint strokePaint = Paint();
if (_hasTooltipOverlapStroke(parentBox) &&
sliderThemeData.tooltipBackgroundColor != Colors.transparent) {
if (sliderThemeData is SfRangeSliderThemeData) {
strokePaint.color = sliderThemeData.overlappingTooltipStrokeColor!;
strokePaint.style = PaintingStyle.stroke;
strokePaint.strokeWidth = 1.0;
} else if (sliderThemeData is SfRangeSelectorThemeData) {
strokePaint.color = sliderThemeData.overlappingTooltipStrokeColor!;
strokePaint.style = PaintingStyle.stroke;
strokePaint.strokeWidth = 1.0;
}
}
// This loop is used to avoid the improper rendering of tooltips in
// web html rendering.
else {
strokePaint
..color = Colors.transparent
..style = PaintingStyle.stroke;
}
context.canvas.drawPath(path, strokePaint);
context.canvas.drawPath(path, paint);
final Rect pathRect = path.getBounds();
final double halfPathWidth = pathRect.width / 2;
final double halfTextPainterWidth = textPainter.width / 2;
final double rectLeftPosition = thumbCenter.dx - halfPathWidth;
if (_isVertical(parentBox)) {
final double halfPathHeight = pathRect.height / 2;
final double halfTextPainterHeight = textPainter.height / 2;
final double rectTopPosition = thumbCenter.dy - halfPathHeight;
if (_isLeftTooltip(parentBox)) {
final double dx = -offset.dy -
tooltipTriangleHeight -
(pathRect.size.width - tooltipTriangleHeight) / 2 -
textPainter.width / 2;
final double dy = rectTopPosition >= trackRect.top
? thumbCenter.dy + halfPathHeight >= trackRect.bottom
? -halfTextPainterHeight -
halfPathHeight -
thumbCenter.dy +
trackRect.bottom
: -halfTextPainterHeight
: -halfTextPainterHeight +
halfPathHeight -
thumbCenter.dy +
trackRect.top;
textPainter.paint(context.canvas, Offset(dx, dy));
} else {
final double dx = offset.dy +
tooltipTriangleHeight +
(pathRect.size.width - tooltipTriangleHeight) / 2 -
textPainter.width / 2;
final double dy = rectTopPosition >= trackRect.top
? thumbCenter.dy + halfPathHeight >= trackRect.bottom
? -halfTextPainterHeight -
halfPathHeight -
thumbCenter.dy +
trackRect.bottom
: -halfTextPainterHeight
: -halfTextPainterHeight +
halfPathHeight -
thumbCenter.dy +
trackRect.top;
textPainter.paint(context.canvas, Offset(dx, dy));
}
} else {
final double dx = rectLeftPosition >= minLeftX
? thumbCenter.dx + halfTextPainterWidth + leftPadding >
trackRect.right
? -halfTextPainterWidth -
halfPathWidth +
trackRect.right -
thumbCenter.dx
: -halfTextPainterWidth
: -halfTextPainterWidth +
halfPathWidth +
trackRect.left -
thumbCenter.dx;
final double dy = offset.dy +
tooltipTriangleHeight +
(pathRect.size.height - tooltipTriangleHeight) / 2 +
textPainter.height / 2;
textPainter.paint(context.canvas, Offset(dx, -dy));
}
context.canvas.restore();
}