diff --git a/example/lib/main.dart b/example/lib/main.dart index 3216442..e39e6b6 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -89,7 +89,7 @@ class _MyAppState extends State { // "Lo": "${candle.low?.toStringAsFixed(2)}", // }, /** Callbacks */ - // onTap: (candle) => print("user tapped on $candle"), + // onTap: (candle, candleIndex, price) => print("user tapped on $candle at \$$price"), // onCandleResize: (width) => print("each candle is $width wide"), ), ), diff --git a/lib/src/chart_painter.dart b/lib/src/chart_painter.dart index 3d4662b..de61ba1 100644 --- a/lib/src/chart_painter.dart +++ b/lib/src/chart_painter.dart @@ -207,6 +207,28 @@ class ChartPainter extends CustomPainter { ..strokeWidth = max(params.candleWidth * 0.88, 1.0) ..color = params.style.selectionHighlightColor); canvas.restore(); + // Draw price line + canvas.drawLine( + Offset(0, pos.dy), + Offset(params.chartWidth, pos.dy), + Paint() + ..strokeWidth = 1 + ..color = params.style.selectionHighlightColor); + // Draw price label + final priceTp = TextPainter( + text: TextSpan( + text: getPriceLabel(params.getPriceFromOffset(pos.dy)), + style: params.style.priceLabelStyle, + ), + ) + ..textDirection = TextDirection.ltr + ..layout(); + priceTp.paint( + canvas, + Offset( + params.chartWidth + 4, + pos.dy - priceTp.height / 2, + )); // Draw info pane _drawTapInfoOverlay(canvas, params, candle); } diff --git a/lib/src/interactive_chart.dart b/lib/src/interactive_chart.dart index e48c70b..4782442 100644 --- a/lib/src/interactive_chart.dart +++ b/lib/src/interactive_chart.dart @@ -53,7 +53,7 @@ class InteractiveChart extends StatefulWidget { final OverlayInfoGetter? overlayInfo; /// An optional event, fired when the user clicks on a candlestick. - final ValueChanged? onTap; + final void Function(CandleData, int, double)? onTap; /// An optional event, fired when user zooms in/out. /// @@ -338,9 +338,11 @@ class _InteractiveChartState extends State { if (_prevParams == null || _tapPosition == null) return; final params = _prevParams!; final dx = _tapPosition!.dx; + final dy = _tapPosition!.dy; final selected = params.getCandleIndexFromOffset(dx); final candle = params.candles[selected]; - widget.onTap?.call(candle); + final price = params.getPriceFromOffset(dy); + widget.onTap?.call(candle, selected, price); } } diff --git a/lib/src/painter_params.dart b/lib/src/painter_params.dart index 228ac7e..b05d544 100644 --- a/lib/src/painter_params.dart +++ b/lib/src/painter_params.dart @@ -53,6 +53,9 @@ class PainterParams { return i; } + double getPriceFromOffset(double y) => + (priceHeight - y) / priceHeight * (maxPrice - minPrice) + minPrice; + double fitPrice(double y) => priceHeight * (maxPrice - y) / (maxPrice - minPrice);