diff --git a/lib/src/guide/interaction/crosshair.dart b/lib/src/guide/interaction/crosshair.dart index e576441..3469e0c 100644 --- a/lib/src/guide/interaction/crosshair.dart +++ b/lib/src/guide/interaction/crosshair.dart @@ -30,6 +30,7 @@ class CrosshairGuide { this.labelStyles, this.labelBackgroundStyles, this.showLabel, + this.formatter, this.followPointer, this.layer, this.mark, @@ -62,6 +63,11 @@ class CrosshairGuide { /// If null, a default `[false, false]` is set. List? showLabel; + /// Convert the value to a [String] on the chart. + /// + /// If null, a default [Scale.format, Scale.format] is used. + List? formatter; + /// Whether the position for each dimension follows the pointer or stick to selected /// points. /// @@ -127,6 +133,7 @@ class CrosshairRenderOp extends Render { final labelBackgroundStyles = params['labelBackgroundStyles'] as List; final showLabel = params['showLabel'] as List; + final formatter = params['formatter'] as List; final followPointer = params['followPointer'] as List; final scales = params['scales'] as Map; final size = params['size'] as Size; @@ -211,7 +218,9 @@ class CrosshairRenderOp extends Render { final fieldX = coord.transposed ? fields[1] : fields[0]; final scaleX = scales[fieldX]; final denormalize = scaleX?.denormalize(cross.dx) ?? -1; - final text = scaleX?.format(scaleX.invert(denormalize)) ?? ''; + final invert = scaleX?.invert(denormalize); + final text = + formatter[0]?.call(invert) ?? scaleX?.format(invert) ?? ''; final rect = _getLabelBlock(text: text, style: labelStyleX); double posX = canvasCrossX; @@ -258,7 +267,9 @@ class CrosshairRenderOp extends Render { final fieldY = coord.transposed ? fields[0] : fields[1]; final scaleY = scales[fieldY]; final denormalize = scaleY?.denormalize(cross.dy) ?? -1; - final text = scaleY?.format(scaleY.invert(denormalize)) ?? ''; + final invert = scaleY?.invert(denormalize); + final text = + formatter[1]?.call(invert) ?? scaleY?.format(invert) ?? ''; final rect = _getLabelBlock(text: text, style: labelStyleY); double posY = canvasCrossY; @@ -299,7 +310,8 @@ class CrosshairRenderOp extends Render { if (showLabel[0] && labelStyleX != null) { final fieldX = coord.transposed ? fields[2] : fields[0]; final scaleX = scales[fieldX]; - final text = scaleX?.format(tuple[fieldX]) ?? ''; + final value = tuple[fieldX]; + final text = formatter[0]?.call(value) ?? scaleX?.format(value) ?? ''; final diagonal = _getLabelDiagonal(text: text, style: labelStyleX); final label = LabelElement( @@ -333,8 +345,9 @@ class CrosshairRenderOp extends Render { final fieldY = coord.transposed ? fields[0] : fields[2]; final scaleY = scales[fieldY]; final denormalize = scaleY?.denormalize(abstractRadius) ?? 0; - final value = scaleY?.invert(denormalize); - final text = scaleY?.format(value) ?? ''; + final invert = scaleY?.invert(denormalize); + final text = + formatter[0]?.call(invert) ?? scaleY?.format(value) ?? ''; final rect = _getLabelBlock(text: text, style: labelStyleY); final label = LabelElement( diff --git a/lib/src/parse/parse.dart b/lib/src/parse/parse.dart index 9d3f82f..368ebee 100644 --- a/lib/src/parse/parse.dart +++ b/lib/src/parse/parse.dart @@ -685,6 +685,7 @@ void parse( PaintStyle(fillColor: const Color(0xff000000)), ], 'showLabel': showLabel, + 'formatter': crosshairSpec.formatter ?? [null, null], 'followPointer': crosshairSpec.followPointer ?? [false, false], 'scales': scales, 'size': size,