diff --git a/example/lib/main.dart b/example/lib/main.dart index e97a55d72..6745279aa 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -10,6 +10,7 @@ import 'package:example/settings_page.dart'; import 'package:example/utils/endpoints_helper.dart'; import 'package:example/widgets/connection_status_label.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/semantics.dart'; import 'package:flutter_deriv_api/api/exceptions/exceptions.dart'; import 'package:flutter_deriv_api/api/manually/ohlc_response_result.dart'; import 'package:flutter_deriv_api/api/manually/tick.dart' as tick_api; @@ -38,6 +39,8 @@ class MyHttpOverrides extends HttpOverrides { void main() { WidgetsFlutterBinding.ensureInitialized(); + SemanticsBinding.instance.ensureSemantics(); + HttpOverrides.global = MyHttpOverrides(); runApp(const MyApp()); } diff --git a/lib/src/deriv_chart/chart/custom_painters/chart_painter.dart b/lib/src/deriv_chart/chart/custom_painters/chart_painter.dart index b2c282761..01456afb4 100644 --- a/lib/src/deriv_chart/chart/custom_painters/chart_painter.dart +++ b/lib/src/deriv_chart/chart/custom_painters/chart_painter.dart @@ -59,4 +59,11 @@ class ChartPainter extends CustomPainter { @override bool shouldRebuildSemantics(ChartPainter oldDelegate) => false; + + @override + SemanticsBuilderCallback get semanticsBuilder { + return (Size size) { + return chartData.buildSemantics(size, epochToCanvasX, quoteToCanvasY); + }; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_closed_indicator_painter.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_closed_indicator_painter.dart index 43e820b0f..5f3626120 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_closed_indicator_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_closed_indicator_painter.dart @@ -200,4 +200,12 @@ class AccumulatorsClosedIndicatorPainter // Draw exit tick position. paintDotWithGlow(canvas, exitTickPosition, color: color); } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_entry_spot_barrier_painter.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_entry_spot_barrier_painter.dart index 734eeb693..3107131ee 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_entry_spot_barrier_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_entry_spot_barrier_painter.dart @@ -106,4 +106,12 @@ class AccumulatorsEntrySpotBarrierPainter< 1, ); } + + @override + List buildSemantics( + {required ui.Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_indicator_painter.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_indicator_painter.dart index 3c05bda74..c5efa6705 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_indicator_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_indicator_painter.dart @@ -521,4 +521,12 @@ class AccumulatorIndicatorPainter extends SeriesPainter { Offset(mainLineStartX, y), Offset(mainLineEndX, y), _paint); } } + + @override + List buildSemantics( + {required ui.Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_recently_closed_indicator_painter.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_recently_closed_indicator_painter.dart index 3ca91d8e4..70ae277ed 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_recently_closed_indicator_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/accumulators_barriers/accumulators_recently_closed_indicator_painter.dart @@ -248,4 +248,12 @@ class AccumulatorsRecentlyClosedIndicatorPainter ); } } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/entry_tick_annotation.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/entry_tick_annotation.dart index d68ee3db6..0ea30e71c 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/entry_tick_annotation.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/entry_tick_annotation.dart @@ -8,6 +8,7 @@ import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/models/barr import 'package:deriv_chart/src/deriv_chart/chart/helpers/paint_functions/paint_entry_exit_marker.dart'; import 'package:deriv_chart/src/models/tick.dart'; import 'package:deriv_chart/src/theme/painting_styles/entry_exit_marker_style.dart'; +import 'package:flutter/rendering.dart'; import '../chart_annotation.dart'; @@ -57,4 +58,12 @@ class _EntryTickAnnotationPainter extends SeriesPainter { ); paintEntryExitMarker(canvas, center, series.style as EntryExitMarkerStyle); } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/horizontal_barrier/horizontal_barrier_painter.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/horizontal_barrier/horizontal_barrier_painter.dart index 067408083..f780c6bd8 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/horizontal_barrier/horizontal_barrier_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/horizontal_barrier/horizontal_barrier_painter.dart @@ -331,6 +331,15 @@ class HorizontalBarrierPainter ), arrowPaint..color = _paint.color.withOpacity(0.32)); } + + @override + List buildSemantics({ + required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY, + }) { + return []; + } } /// The painter for the [IconTickIndicator] which paints the icon on the @@ -392,4 +401,13 @@ class IconBarrierPainter extends HorizontalBarrierPainter { _barrierPosition! - Offset(innerIconSize / 2, innerIconSize / 2), ); } + + @override + List buildSemantics({ + required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY, + }) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/vertical_barrier/vertical_barrier_painter.dart b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/vertical_barrier/vertical_barrier_painter.dart index cf37b1383..fc28b9c36 100644 --- a/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/vertical_barrier/vertical_barrier_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/annotations/barriers/vertical_barrier/vertical_barrier_painter.dart @@ -6,6 +6,7 @@ import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/models/barr import 'package:deriv_chart/src/deriv_chart/chart/helpers/paint_functions/paint_line.dart'; import 'package:deriv_chart/src/theme/painting_styles/barrier_style.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/semantics.dart'; import '../../../chart_data.dart'; import 'vertical_barrier.dart'; @@ -15,73 +16,58 @@ class VerticalBarrierPainter extends SeriesPainter { /// Initializes [series]. VerticalBarrierPainter(VerticalBarrier series) : super(series); - @override - void onPaint({ - required Canvas canvas, + /// Calculates the animated epoch based on animation info + int _calculateAnimatedEpoch(AnimationInfo? animationInfo) { + if (series.previousObject == null || animationInfo == null) { + return series.epoch!; + } + + final VerticalBarrierObject prevObject = + series.previousObject as VerticalBarrierObject; + return lerpDouble(prevObject.epoch.toDouble(), series.epoch!, + animationInfo.currentTickPercent)! + .toInt(); + } + + /// Calculates the Y position for the dot based on animation info + double? _calculateDotY(QuoteToY quoteToY, AnimationInfo? animationInfo) { + if (series.quote == null) return null; + + if (series.previousObject == null || animationInfo == null) { + return quoteToY(series.quote!); + } + + final VerticalBarrierObject prevObject = + series.previousObject as VerticalBarrierObject; + if (prevObject.quote == null) return null; + + return quoteToY(lerpDouble(prevObject.quote, series.annotationObject.quote, + animationInfo.currentTickPercent)!); + } + + /// Calculates line positioning data + ({double lineX, double lineStartY, double lineEndY}) _calculateLinePositions({ required Size size, required EpochToX epochToX, required QuoteToY quoteToY, - required AnimationInfo animationInfo, + AnimationInfo? animationInfo, }) { - if (series.isOnRange) { - final VerticalBarrierStyle style = - series.style as VerticalBarrierStyle? ?? theme.verticalBarrierStyle; - - final Paint paint = Paint() - ..color = style.color - ..strokeWidth = 1 - ..style = PaintingStyle.stroke; - - int? animatedEpoch; - double lineStartY = 0; - double? dotY; - - if (series.previousObject == null) { - animatedEpoch = series.epoch; - if (series.quote != null) { - dotY = quoteToY(series.quote!); - } - } else { - final VerticalBarrierObject prevObject = - series.previousObject as VerticalBarrierObject; - animatedEpoch = lerpDouble(prevObject.epoch.toDouble(), series.epoch, - animationInfo.currentTickPercent)! - .toInt(); - - if (series.annotationObject.quote != null && prevObject.quote != null) { - dotY = quoteToY(lerpDouble( - prevObject.quote, - series.annotationObject.quote, - animationInfo.currentTickPercent)!); - } - } - - final double lineX = epochToX(animatedEpoch!); - final double lineEndY = size.height - 20; - - if (dotY != null && !series.longLine) { - lineStartY = dotY; - } - - if (style.isDashed) { - paintVerticalDashedLine( - canvas, lineX, lineStartY, lineEndY, style.color, 1); - } else { - canvas.drawLine( - Offset(lineX, lineStartY), Offset(lineX, lineEndY), paint); - } - - _paintLineLabel(canvas, lineX, lineEndY, style); + final int animatedEpoch = _calculateAnimatedEpoch(animationInfo); + final double lineX = epochToX(animatedEpoch); + final double lineEndY = size.height - 20; + double lineStartY = 0; + + final double? dotY = _calculateDotY(quoteToY, animationInfo); + if (dotY != null && !series.longLine) { + lineStartY = dotY; } + + return (lineX: lineX, lineStartY: lineStartY, lineEndY: lineEndY); } - void _paintLineLabel( - Canvas canvas, - double lineX, - double lineEndY, - VerticalBarrierStyle style, - ) { - final TextPainter titlePainter = TextPainter( + /// Creates and layouts the title TextPainter + TextPainter _createTitlePainter(VerticalBarrierStyle style) { + return TextPainter( text: TextSpan( text: series.title, style: style.textStyle.copyWith(color: style.color), @@ -89,27 +75,154 @@ class VerticalBarrierPainter extends SeriesPainter { textAlign: TextAlign.center, textDirection: TextDirection.ltr, )..layout(); + } - late double titleStartX; - - switch (style.labelPosition) { + /// Calculates the X position for the title based on label position + double _calculateTitleStartX( + double lineX, + TextPainter titlePainter, + VerticalBarrierLabelPosition labelPosition, + ) { + switch (labelPosition) { case VerticalBarrierLabelPosition.auto: - titleStartX = lineX - titlePainter.width - 5; - if (titleStartX < 0) { - titleStartX = lineX + 5; - } - break; + final double leftPosition = lineX - titlePainter.width - 5; + return leftPosition < 0 ? lineX + 5 : leftPosition; case VerticalBarrierLabelPosition.right: - titleStartX = lineX + 5; - break; + return lineX + 5; case VerticalBarrierLabelPosition.left: - titleStartX = lineX - titlePainter.width - 5; - break; + return lineX - titlePainter.width - 5; } + } + + @override + void onPaint({ + required Canvas canvas, + required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY, + required AnimationInfo animationInfo, + }) { + if (!series.isOnRange) return; + + final VerticalBarrierStyle style = + series.style as VerticalBarrierStyle? ?? theme.verticalBarrierStyle; + + final Paint paint = Paint() + ..color = style.color + ..strokeWidth = 1 + ..style = PaintingStyle.stroke; + + final linePositions = _calculateLinePositions( + size: size, + epochToX: epochToX, + quoteToY: quoteToY, + animationInfo: animationInfo, + ); + + if (style.isDashed) { + paintVerticalDashedLine( + canvas, + linePositions.lineX, + linePositions.lineStartY, + linePositions.lineEndY, + style.color, + 1, + ); + } else { + canvas.drawLine( + Offset(linePositions.lineX, linePositions.lineStartY), + Offset(linePositions.lineX, linePositions.lineEndY), + paint, + ); + } + + _paintLineLabel(canvas, linePositions.lineX, linePositions.lineEndY, style); + } + + void _paintLineLabel( + Canvas canvas, + double lineX, + double lineEndY, + VerticalBarrierStyle style, + ) { + if (series.title == null || series.title!.isEmpty) return; + + final TextPainter titlePainter = _createTitlePainter(style); + final double titleStartX = _calculateTitleStartX( + lineX, + titlePainter, + style.labelPosition, + ); titlePainter.paint( canvas, Offset(titleStartX, lineEndY - titlePainter.height), ); } + + @override + List buildSemantics({ + required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY, + }) { + if (!series.isOnRange) { + return []; + } + + final VerticalBarrierStyle style = + series.style as VerticalBarrierStyle? ?? theme.verticalBarrierStyle; + + final linePositions = _calculateLinePositions( + size: size, + epochToX: epochToX, + quoteToY: quoteToY, + animationInfo: null, // No animation for semantics + ); + + final String semanticsLabel = + series.title != null && series.title!.isNotEmpty + ? '${series.title} vertical barrier' + : 'vertical barrier'; + + final List semantics = [ + CustomPainterSemantics( + rect: Rect.fromPoints( + Offset(linePositions.lineX - 5, linePositions.lineStartY), + Offset(linePositions.lineX + 5, linePositions.lineEndY), + ), + properties: SemanticsProperties( + label: semanticsLabel, + textDirection: TextDirection.ltr, + ), + ), + ]; + + // Add semantics for the label if it exists + if (series.title != null && series.title!.isNotEmpty) { + final TextPainter titlePainter = _createTitlePainter(style); + final double titleStartX = _calculateTitleStartX( + linePositions.lineX, + titlePainter, + style.labelPosition, + ); + + semantics.add( + CustomPainterSemantics( + rect: Rect.fromLTWH( + titleStartX, + linePositions.lineEndY - titlePainter.height, + titlePainter.width, + titlePainter.height, + ), + properties: SemanticsProperties( + label: '${series.title} label', + textDirection: TextDirection.ltr, + ), + ), + ); + } + + return semantics; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_data.dart b/lib/src/deriv_chart/chart/data_visualization/chart_data.dart index 5c4f67169..29f4228ce 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_data.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_data.dart @@ -97,6 +97,19 @@ abstract class ChartData { ChartTheme theme, ChartScaleModel chartScaleModel, ); + + /// Provides semantic information for accessibility. + /// + /// This method should return a list of [CustomPainterSemantics] objects that + /// contain semantic information for this chart data. + /// + /// The returned list will be used to create semantic nodes in the semantic tree, + /// making the chart accessible to screen readers and other accessibility tools. + List buildSemantics( + Size size, + EpochToX epochToX, + QuoteToY quoteToY, + ); } /// An extension on Iterable with [ChartData] elements. diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/bar_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/bar_painter.dart index 0bc2cf8ff..b7ed948ae 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/bar_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/bar_painter.dart @@ -147,4 +147,12 @@ class BarPainter extends DataPainter> { _negativeBarPaint = Paint()..color = style.negativeColor; return isPositiveColor ? _positiveBarPaint : _negativeBarPaint; } + + @override + List buildSemantics( + {required ui.Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/scatter_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/scatter_painter.dart index ef52f1f29..c414a7489 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/scatter_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/data_painters/scatter_painter.dart @@ -43,4 +43,12 @@ class ScatterPainter extends DataPainter> { } } } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/fractals_series/arrow_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/fractals_series/arrow_painter.dart index 732c56cd5..833f2bbc4 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/fractals_series/arrow_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/fractals_series/arrow_painter.dart @@ -91,4 +91,12 @@ class ArrowPainter extends DataPainter> { ), arrowPaint); } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/sample_multi_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/sample_multi_painter.dart index ed51825a0..548134597 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/sample_multi_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/indicators_series/sample_multi_painter.dart @@ -45,4 +45,12 @@ class SampleMultiPainter extends SeriesPainter { ..style = PaintingStyle.stroke); } } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/channel_fill_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/channel_fill_painter.dart index 1cbb02e57..2743ee3b3 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/channel_fill_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/channel_fill_painter.dart @@ -170,4 +170,12 @@ class ChannelFillPainter extends DataPainter> { return; } + + @override + List buildSemantics( + {required ui.Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/line_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/line_painter.dart index dde1525cc..121a88c95 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/line_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/line_series/line_painter.dart @@ -157,6 +157,14 @@ class LinePainter extends DataPainter> { return lastVisibleTickPosition; } + + @override + List buildSemantics( + {required ui.Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } /// Returns the area paint of the given [Path]. diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/candle/candle_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/candle/candle_painter.dart index 159c7e1e7..c9456740e 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/candle/candle_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/candle/candle_painter.dart @@ -1,3 +1,4 @@ +import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/chart_data.dart'; import 'package:deriv_chart/src/models/candle.dart'; import 'package:deriv_chart/src/theme/painting_styles/candle_style.dart'; import 'package:flutter/material.dart'; @@ -72,4 +73,12 @@ class CandlePainter extends OhlcPainter { ); } } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/hollow_candle/hollow_candle_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/hollow_candle/hollow_candle_painter.dart index c14f691ed..7cbce5236 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/hollow_candle/hollow_candle_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/hollow_candle/hollow_candle_painter.dart @@ -1,3 +1,4 @@ +import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/chart_data.dart'; import 'package:deriv_chart/src/models/candle.dart'; import 'package:deriv_chart/src/theme/painting_styles/candle_style.dart'; import 'package:flutter/material.dart'; @@ -108,4 +109,12 @@ class HollowCandlePainter extends OhlcPainter { ..strokeWidth = 1.2, ); } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_candle/ohlc_candle_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_candle/ohlc_candle_painter.dart index 7f84e2aa7..97356a02f 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_candle/ohlc_candle_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/ohlc_series/ohlc_candle/ohlc_candle_painter.dart @@ -1,3 +1,4 @@ +import 'package:deriv_chart/src/deriv_chart/chart/data_visualization/chart_data.dart'; import 'package:deriv_chart/src/models/candle.dart'; import 'package:deriv_chart/src/theme/painting_styles/candle_style.dart'; import 'package:flutter/material.dart'; @@ -76,4 +77,12 @@ class OhlcCandlePainter extends OhlcPainter { ..strokeWidth = 1.2, ); } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/series.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/series.dart index f71a22877..3dfe86c50 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/series.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/series.dart @@ -87,4 +87,17 @@ abstract class Series implements ChartData { theme: theme, chartScaleModel: chartScaleModel, ); + + @override + List buildSemantics( + Size size, + EpochToX epochToX, + QuoteToY quoteToY, + ) => + seriesPainter?.buildSemantics( + size: size, + epochToX: epochToX, + quoteToY: quoteToY, + ) ?? + []; } diff --git a/lib/src/deriv_chart/chart/data_visualization/chart_series/series_painter.dart b/lib/src/deriv_chart/chart/data_visualization/chart_series/series_painter.dart index 7f59732a8..857b42ac2 100644 --- a/lib/src/deriv_chart/chart/data_visualization/chart_series/series_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/chart_series/series_painter.dart @@ -59,4 +59,14 @@ abstract class SeriesPainter { required QuoteToY quoteToY, required AnimationInfo animationInfo, }); + + /// Builds semantics for this [SeriesPainter]'s data. + /// + /// Override this method to provide custom semantics for a series. + /// By default, returns an empty list. + List buildSemantics({ + required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY, + }); } diff --git a/lib/src/deriv_chart/chart/data_visualization/markers/marker_group_painter.dart b/lib/src/deriv_chart/chart/data_visualization/markers/marker_group_painter.dart index d0e6e89eb..c85a863c8 100644 --- a/lib/src/deriv_chart/chart/data_visualization/markers/marker_group_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/markers/marker_group_painter.dart @@ -86,4 +86,12 @@ class MarkerGroupPainter extends SeriesPainter { ); } } + + @override + List buildSemantics( + {required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY}) { + return []; + } } diff --git a/lib/src/deriv_chart/chart/data_visualization/markers/marker_painter.dart b/lib/src/deriv_chart/chart/data_visualization/markers/marker_painter.dart index b7c31f5e4..7c000c99b 100644 --- a/lib/src/deriv_chart/chart/data_visualization/markers/marker_painter.dart +++ b/lib/src/deriv_chart/chart/data_visualization/markers/marker_painter.dart @@ -70,4 +70,13 @@ class MarkerPainter extends SeriesPainter { ); } } + + @override + List buildSemantics({ + required Size size, + required EpochToX epochToX, + required QuoteToY quoteToY, + }) { + return []; + } }