From e226307578db9d0a1db56222679a0d567bce2c34 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:49:29 +0330 Subject: [PATCH 01/10] feat!: make KChartWidget's boilerplate optional and take the watermark as a widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `KChartWidget(candles, ChartColors())` is now a whole chart. It used to need three arguments most charts had no use for, and one of them tied every app to `flutter_svg`. ### `isTrendLine` and `timeFrame` are optional `isTrendLine` defaults to false, so the drawing tools stay off unless asked for. `timeFrame` is a `Duration?`: given one, the current-price tag counts down to the close as before; without one it reads just the price, and the one-second timer that kept the countdown ticking is never started. ### The watermark is any widget — `watermark` replaces `watermarkAssetPath` `watermarkAssetPath` took only an SVG asset, loaded through `flutter_svg`. The new `watermark` takes any widget — an `Image.asset`, an icon, a line of text, or an `SvgPicture` in an app that still depends on `flutter_svg` itself. It is sized by `ChartStyle.watermarkScale` and placed by `watermarkAlignment` inside the candle area, measured by the painter's own layout so the two cannot drift, and painted in `ChartColors.watermarkColor`. A widget cannot be drawn inside the painter, so it now sits faintly over the candles, ignoring touches, rather than under them. `flutter_svg` is no longer a dependency. BREAKING CHANGE: `watermarkAssetPath` is removed — pass the image as `watermark` — and `timeFrame` is nullable, so code reading it back off the widget needs a fallback. The tests, the docs and the example lose the placeholder `watermarkAssetPath: 'assets/none.svg'` lines, and the example's watermark is a line of text instead of a bundled SVG. --- README.md | 7 +- doc/bar-replay.md | 1 - doc/candlestick-chart.md | 1 - doc/chart-types.md | 1 - doc/date-axis.md | 1 - doc/drawing-tools.md | 5 - doc/driving-the-chart.md | 3 - doc/event-marks.md | 1 - doc/indicators.md | 1 - doc/legend-and-crosshair.md | 1 - doc/line-editor.md | 1 - doc/orders-and-positions.md | 1 - doc/panes.md | 1 - doc/price-axis.md | 4 - doc/sessions.md | 3 - example/assets/watermark.svg | 11 --- example/lib/intraday_demo.dart | 1 - example/lib/src/chart_page.dart | 4 +- example/pubspec.yaml | 2 - example/tool/screenshots.dart | 28 ++++-- lib/src/chart_style.dart | 2 +- lib/src/drawing/drawing_controller.dart | 1 - lib/src/drawing/drawing_style.dart | 1 - lib/src/indicators/indicator.dart | 1 - lib/src/k_chart_widget.dart | 112 ++++++++++++++++------- lib/src/renderer/base_chart_painter.dart | 2 - lib/src/renderer/chart_painter.dart | 56 ++++-------- pubspec.yaml | 1 - test/chart_surface_test.dart | 1 - test/chart_type_test.dart | 2 - test/comparison_test.dart | 2 - test/context_menu_test.dart | 1 - test/crosshair_sync_test.dart | 3 - test/drawing_controller_test.dart | 1 - test/drawing_manager_test.dart | 1 - test/drawing_test.dart | 8 -- test/drawing_ux_test.dart | 2 - test/events_test.dart | 1 - test/fit_content_test.dart | 1 - test/golden_test.dart | 1 - test/legend_hover_test.dart | 1 - test/load_more_and_info_dialog_test.dart | 2 - test/locked_price_scale_test.dart | 1 - test/new_tools_test.dart | 3 - test/optional_params_test.dart | 111 ++++++++++++++++++++++ test/out_of_range_lines_test.dart | 1 - test/paint_benchmark.dart | 1 - test/pane_options_test.dart | 1 - test/price_axis_gutter_test.dart | 1 - test/price_axis_test.dart | 1 - test/price_formatter_test.dart | 1 - test/price_scale_extras_test.dart | 2 - test/price_scale_test.dart | 2 - test/profile_and_levels_test.dart | 1 - test/render_perf_test.dart | 1 - test/replay_test.dart | 1 - test/scale_test.dart | 2 - test/secondary_axis_test.dart | 1 - test/sessions_test.dart | 2 - test/shapes_test.dart | 4 - test/static_chart_test.dart | 1 - test/trading_test.dart | 1 - test/transforms_test.dart | 1 - test/visible_range_test.dart | 1 - test/widget_test.dart | 2 - 65 files changed, 233 insertions(+), 191 deletions(-) delete mode 100644 example/assets/watermark.svg create mode 100644 test/optional_params_test.dart diff --git a/README.md b/README.md index 75b20af..0a79a88 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Named for the open-high-low-close-volume bars it renders. - **Info dialog** on long press, either the built-in Material popup or your own builder. - **"Now price" line** with a live countdown to the close of the current candle. - **Session dividers and a display time zone**, so an intraday chart breaks where the trader's day does. -- **SVG watermark** loaded from an asset path you supply. +- **A watermark of your own** — any widget, such as an `Image.asset` of your logo, painted faintly in one colour over the candle area. - **Fully themeable** — `ChartStyle` for geometry, `ChartColors` for every colour, `DrawingStyle` for the drawing tools; `ChartTranslations` for every label. Filled or hollow candles, dashed or solid crosshair, pane separators, axis-label pills and a placed, tinted watermark. - **Fits its box** — the candles take whatever height the volume and indicator panes leave, so the chart works from a phone to a desktop window without arithmetic on your side. @@ -141,8 +141,9 @@ One page per feature, in [`doc/`](doc/README.md): ## Notes - The zoom slider renders only where there is no pinch gesture — web and desktop. -- `watermarkAssetPath` must point at an SVG registered in your app's `pubspec.yaml` - assets; a missing asset is ignored and the chart renders without a watermark. +- `watermark` takes any widget and paints it in `ChartColors.watermarkColor`, so a + full-colour logo reads as a silhouette; the package no longer depends on + `flutter_svg` — pass `SvgPicture.asset(...)` from it yourself for an SVG. ## Credits diff --git a/doc/bar-replay.md b/doc/bar-replay.md index da8cc40..866f9f3 100644 --- a/doc/bar-replay.md +++ b/doc/bar-replay.md @@ -14,7 +14,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), replay: replay, ); diff --git a/doc/candlestick-chart.md b/doc/candlestick-chart.md index 40d2694..8199877 100644 --- a/doc/candlestick-chart.md +++ b/doc/candlestick-chart.md @@ -14,7 +14,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), indicators: [MaIndicator(period: 20), BollIndicator(), MacdIndicator()], timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, diff --git a/doc/chart-types.md b/doc/chart-types.md index 3d3a827..0746c10 100644 --- a/doc/chart-types.md +++ b/doc/chart-types.md @@ -7,7 +7,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), chartType: ChartType.bars, // candles, bars, line, area, baseline baselinePrice: 42_000, // baseline only; defaults to the oldest close in view diff --git a/doc/date-axis.md b/doc/date-axis.md index 92f6604..dd24826 100644 --- a/doc/date-axis.md +++ b/doc/date-axis.md @@ -19,7 +19,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), dateFormatter: (candle, longForm) => DateFormat( longForm ? 'EEE d MMM HH:mm' : 'HH:mm', diff --git a/doc/drawing-tools.md b/doc/drawing-tools.md index 8a818fd..4495c8b 100644 --- a/doc/drawing-tools.md +++ b/doc/drawing-tools.md @@ -19,7 +19,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), currentDrawingTool: DrawingTool.trend, trendLines: savedTrendLines, @@ -256,7 +255,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), drawingController: drawings, ); @@ -385,7 +383,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), contextMenuBuilder: (request) => [ ...request.defaults, @@ -434,7 +431,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), drawings: [HorizontalLine(price: 42_000, alert: true)], onAlertCrossed: (line, candle) => notifier.push('crossed ${line.price}'), @@ -455,7 +451,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), drawings: [ TrendLine( diff --git a/doc/driving-the-chart.md b/doc/driving-the-chart.md index 6bea743..697e938 100644 --- a/doc/driving-the-chart.md +++ b/doc/driving-the-chart.md @@ -10,7 +10,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), controller: chart, ); @@ -63,7 +62,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), onVisibleRangeChanged: (range) { setState(() => barsOnScreen = range.length); @@ -87,7 +85,6 @@ KChartWidget( sessionCandles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 5), chartType: ChartType.area, scrollEnabled: false, diff --git a/doc/event-marks.md b/doc/event-marks.md index 191dc94..72944b9 100644 --- a/doc/event-marks.md +++ b/doc/event-marks.md @@ -10,7 +10,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(days: 1), events: [ ChartEvent(time: reportedAt, kind: ChartEventKind.earnings), diff --git a/doc/indicators.md b/doc/indicators.md index 12b0103..47cc216 100644 --- a/doc/indicators.md +++ b/doc/indicators.md @@ -9,7 +9,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), indicators: [ MaIndicator(period: 7), diff --git a/doc/legend-and-crosshair.md b/doc/legend-and-crosshair.md index 7966d9d..38ffc09 100644 --- a/doc/legend-and-crosshair.md +++ b/doc/legend-and-crosshair.md @@ -14,7 +14,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), showOhlcLegend: true, crosshairOnHover: true, diff --git a/doc/line-editor.md b/doc/line-editor.md index dad7773..c2f69c6 100644 --- a/doc/line-editor.md +++ b/doc/line-editor.md @@ -10,7 +10,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), drawingStyle: const DrawingStyle( // What the user may pick diff --git a/doc/orders-and-positions.md b/doc/orders-and-positions.md index 5835f03..f73bd64 100644 --- a/doc/orders-and-positions.md +++ b/doc/orders-and-positions.md @@ -9,7 +9,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), positions: [ ChartPosition( diff --git a/doc/panes.md b/doc/panes.md index 922c0a6..2254bfe 100644 --- a/doc/panes.md +++ b/doc/panes.md @@ -10,7 +10,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), indicators: [MacdIndicator(), RsiIndicator()], resizablePanes: true, diff --git a/doc/price-axis.md b/doc/price-axis.md index 5ee3150..1608cd6 100644 --- a/doc/price-axis.md +++ b/doc/price-axis.md @@ -5,7 +5,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(days: 1), priceAxisScale: PriceAxisScale.logarithmic, ); @@ -46,7 +45,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(days: 1), chartStyle: const ChartStyle(gridRows: 12), ); @@ -117,7 +115,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(days: 1), invertPriceAxis: true, // higher prices lower down showAverageClose: true, // a level at the mean close over the window @@ -244,7 +241,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(days: 1), controller: chart, priceScaleDrag: true, diff --git a/doc/sessions.md b/doc/sessions.md index 624ce34..0b3bd9f 100644 --- a/doc/sessions.md +++ b/doc/sessions.md @@ -5,7 +5,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), chartStyle: const ChartStyle(showSessionDividers: true), timeZoneOffset: const Duration(hours: -5), @@ -30,7 +29,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), timeZoneOffset: const Duration(hours: -5), session: const TradingSession( @@ -58,7 +56,6 @@ KChartWidget( candles, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/logo.svg', timeFrame: const Duration(minutes: 15), candleColor: (candle, index) { final range = candle.high - candle.low; diff --git a/example/assets/watermark.svg b/example/assets/watermark.svg deleted file mode 100644 index e7b28db..0000000 --- a/example/assets/watermark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - OHLCV - - diff --git a/example/lib/intraday_demo.dart b/example/lib/intraday_demo.dart index e52d2c0..139e2ac 100644 --- a/example/lib/intraday_demo.dart +++ b/example/lib/intraday_demo.dart @@ -71,7 +71,6 @@ class _IntradayDemoState extends State { _session, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 5), chartType: ChartType.area, diff --git a/example/lib/src/chart_page.dart b/example/lib/src/chart_page.dart index 340e40a..9833257 100644 --- a/example/lib/src/chart_page.dart +++ b/example/lib/src/chart_page.dart @@ -87,7 +87,9 @@ class _Chart extends StatelessWidget { // Drawing tools stay enabled so a line can be selected and restyled at // any time; `tool` decides what the next tap or drag places. isTrendLine: true, - watermarkAssetPath: 'assets/watermark.svg', + watermark: const FittedBox( + child: Text('OHLCV', style: TextStyle(fontWeight: FontWeight.w900)), + ), timeFrame: MarketData.timeFrame, chartStyle: state.style, lockPriceScale: state.lockPriceScale, diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 2d3ddd3..60b8ade 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -21,5 +21,3 @@ dev_dependencies: flutter: uses-material-design: true - assets: - - assets/watermark.svg diff --git a/example/tool/screenshots.dart b/example/tool/screenshots.dart index 6f68022..de38c44 100644 --- a/example/tool/screenshots.dart +++ b/example/tool/screenshots.dart @@ -196,9 +196,7 @@ class ReplayBar extends StatelessWidget { value: replay.length == 0 ? 0 : position / replay.length, minHeight: 6, backgroundColor: const Color(0xFF2A313C), - valueColor: const AlwaysStoppedAnimation( - Color(0xFF26A69A), - ), + valueColor: const AlwaysStoppedAnimation(Color(0xFF26A69A)), ), ), ), @@ -250,15 +248,15 @@ class _ScreenshotAppState extends State { late final List _films = _asked(buildFilms(), (f) => f.name); /// The entries [requestedScenes] names, or all of them when it names none. - List _asked(List all, String Function(T) name) => - _names.isEmpty ? all : all.where((e) => _names.contains(name(e))).toList(); + List _asked(List all, String Function(T) name) => _names.isEmpty + ? all + : all.where((e) => _names.contains(name(e))).toList(); /// Where in the run we are: scenes first, then films. int _index = 0; /// What is on screen right now, whichever list it came from. - ({Size size, Widget Function() build}) get _showing => - _index < _scenes.length + ({Size size, Widget Function() build}) get _showing => _index < _scenes.length ? (size: _scenes[_index].size, build: _scenes[_index].build) : ( size: _films[_index - _scenes.length].size, @@ -550,7 +548,9 @@ List buildScenes() { rectangles.isNotEmpty || fibRetracements.isNotEmpty || drawings.isNotEmpty, - watermarkAssetPath: 'assets/watermark.svg', + watermark: const FittedBox( + child: Text('OHLCV', style: TextStyle(fontWeight: FontWeight.w900)), + ), timeFrame: MarketData.timeFrame, timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, indicators: indicators, @@ -1530,7 +1530,10 @@ List buildScenes() { Expanded( child: titled( 'ChartTheme.lightColors()', - chart(light: true, indicators: [BollIndicator(), MacdIndicator()]), + chart( + light: true, + indicators: [BollIndicator(), MacdIndicator()], + ), top: 30, ), ), @@ -1620,7 +1623,12 @@ List buildFilms() { colors, chartStyle: ChartTheme.filled, isTrendLine: false, - watermarkAssetPath: 'assets/watermark.svg', + watermark: const FittedBox( + child: Text( + 'OHLCV', + style: TextStyle(fontWeight: FontWeight.w900), + ), + ), timeFrame: MarketData.timeFrame, timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, indicators: [MaIndicator(period: 20), RsiIndicator()], diff --git a/lib/src/chart_style.dart b/lib/src/chart_style.dart index 5dc6697..3efb4df 100644 --- a/lib/src/chart_style.dart +++ b/lib/src/chart_style.dart @@ -333,7 +333,7 @@ class ChartColors { /// Defaults to a translucent [bgColor] when null. Color? legendBgColor; - /// Tint of the SVG watermark. + /// The one colour the watermark widget is painted in. /// /// Defaults to a very faint [defaultTextColor] when null. Color? watermarkColor; diff --git a/lib/src/drawing/drawing_controller.dart b/lib/src/drawing/drawing_controller.dart index d8bfbac..d5fa0b6 100644 --- a/lib/src/drawing/drawing_controller.dart +++ b/lib/src/drawing/drawing_controller.dart @@ -20,7 +20,6 @@ import 'drawing_template.dart'; /// candles, /// ChartColors(), /// isTrendLine: true, -/// watermarkAssetPath: 'assets/logo.svg', /// timeFrame: const Duration(minutes: 15), /// drawingController: drawings, /// ); diff --git a/lib/src/drawing/drawing_style.dart b/lib/src/drawing/drawing_style.dart index 3399ad1..29450c9 100644 --- a/lib/src/drawing/drawing_style.dart +++ b/lib/src/drawing/drawing_style.dart @@ -40,7 +40,6 @@ const List kDefaultDrawingThicknesses = [ /// candles, /// ChartColors(), /// isTrendLine: true, -/// watermarkAssetPath: 'assets/logo.svg', /// timeFrame: const Duration(minutes: 15), /// drawingStyle: const DrawingStyle( /// colorOptions: [Colors.tealAccent, Colors.orangeAccent], diff --git a/lib/src/indicators/indicator.dart b/lib/src/indicators/indicator.dart index 6cad992..299e70d 100644 --- a/lib/src/indicators/indicator.dart +++ b/lib/src/indicators/indicator.dart @@ -268,7 +268,6 @@ class IndicatorAlert { /// candles, /// ChartColors(), /// isTrendLine: false, -/// watermarkAssetPath: 'assets/logo.svg', /// timeFrame: const Duration(minutes: 15), /// indicators: [ /// MaIndicator(period: 50, color: Colors.amber), diff --git a/lib/src/k_chart_widget.dart b/lib/src/k_chart_widget.dart index 3288bee..400661b 100644 --- a/lib/src/k_chart_widget.dart +++ b/lib/src/k_chart_widget.dart @@ -7,7 +7,6 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'chart_controller.dart'; import 'chart_event.dart'; @@ -186,6 +185,47 @@ class TimeFormat { ]; } +/// Sizes the watermark to `ChartStyle.watermarkScale` of the candle area's +/// shorter side and places it by `ChartStyle.watermarkAlignment`, measuring +/// that area the way [painter] lays it out. +class _WatermarkLayout extends SingleChildLayoutDelegate { + _WatermarkLayout(this.painter); + + final ChartPainter painter; + + Rect _area(Size size) { + // The same layout the painter runs when it paints this size, so the + // watermark and the candles agree on where the candle area is. + painter.layout(size); + return painter.mMainRect; + } + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + final area = _area(constraints.biggest); + final width = math.max( + 0.0, + math.min(area.width, area.height) * painter.chartStyle.watermarkScale, + ); + return BoxConstraints( + minWidth: width, + maxWidth: width, + maxHeight: math.max(0.0, area.height), + ); + } + + @override + Offset getPositionForChild(Size size, Size childSize) => painter + .chartStyle + .watermarkAlignment + .inscribe(childSize, painter.mMainRect) + .topLeft; + + @override + bool shouldRelayout(_WatermarkLayout oldDelegate) => + !identical(oldDelegate.painter, painter); +} + /// An interactive candlestick chart. /// /// Pass the candles positionally along with a [ChartColors]. Run @@ -204,8 +244,6 @@ class TimeFormat { /// KChartWidget( /// candles, /// ChartColors(), -/// isTrendLine: false, -/// watermarkAssetPath: 'assets/logo.svg', /// timeFrame: const Duration(minutes: 15), /// indicators: [MaIndicator(period: 20), MacdIndicator()], /// ); @@ -215,9 +253,9 @@ class KChartWidget extends StatefulWidget { const KChartWidget( this.candles, this.chartColors, { - required this.isTrendLine, - required this.watermarkAssetPath, - required this.timeFrame, + this.isTrendLine = false, + this.watermark, + this.timeFrame, this.xFrontPadding = 80, this.signals = const [], this.verticalLines = const [], @@ -593,8 +631,11 @@ class KChartWidget extends StatefulWidget { /// between each one. final bool selectAfterDrawing; - /// Duration of one candle, used to place lines and count down the close. - final Duration timeFrame; + /// Duration of one candle, which the current-price tag counts down to. + /// + /// Null — the default — draws the current-price line and tag without a + /// countdown, since nothing else is known about when the candle closes. + final Duration? timeFrame; /// Draws a filled close-price line instead of candles. /// @@ -801,7 +842,7 @@ class KChartWidget extends StatefulWidget { /// Which side the price axis labels sit on. final VerticalTextAlignment verticalTextAlignment; - /// Enables the drawing tools and their edit panel. + /// Enables the drawing tools and their edit panel. Off by default. final bool isTrendLine; /// Hides the volume pane. @@ -876,8 +917,14 @@ class KChartWidget extends StatefulWidget { /// Empty space kept to the right of the newest candle. final double xFrontPadding; - /// Asset path of an SVG watermark; a missing asset is ignored. - final String watermarkAssetPath; + /// A watermark drawn faintly over the candle area — an `Image.asset`, an + /// icon, a line of text, any widget. + /// + /// It is painted in one colour, [ChartColors.effectiveWatermarkColor], so a + /// full-colour logo reads as a quiet silhouette; `ChartStyle.watermarkScale` + /// sets its width and `ChartStyle.watermarkAlignment` where it sits. It takes + /// no touches. Null — the default — draws none. + final Widget? watermark; /// Narrowest the long-press info dialog may be. final double infoDialogWidth; @@ -1050,7 +1097,6 @@ class _KChartWidgetState extends State Animation? aniX; Timer? _countdownTimer; - PictureInfo? _watermarkPicture; late Offset _toolbarOffset; /// The height of each indicator pane, once the user has dragged one. @@ -1116,7 +1162,6 @@ class _KChartWidgetState extends State void initState() { super.initState(); _toolbarOffset = widget.drawingStyle.toolbarInitialOffset; - _loadWatermark(); _syncCountdownTimer(); _resolveIndicators(); widget.drawingController?.addListener(_onDrawingsChanged); @@ -1558,7 +1603,7 @@ class _KChartWidgetState extends State /// Runs the one-second repaint only while the now-price countdown is shown. void _syncCountdownTimer() { - if (widget.showNowPrice) { + if (widget.showNowPrice && widget.timeFrame != null) { _countdownTimer ??= Timer.periodic(const Duration(seconds: 1), (_) { if (mounted) setState(() {}); }); @@ -1568,26 +1613,11 @@ class _KChartWidgetState extends State } } - Future _loadWatermark() async { - try { - final info = await vg.loadPicture( - SvgAssetLoader(widget.watermarkAssetPath), - null, - ); - if (mounted) setState(() => _watermarkPicture = info); - } catch (_) { - // A missing or malformed watermark asset simply leaves the chart - // unwatermarked; it must never break the chart itself. - } - } - @override void didUpdateWidget(covariant KChartWidget oldWidget) { super.didUpdateWidget(oldWidget); - if (oldWidget.watermarkAssetPath != widget.watermarkAssetPath) { - _loadWatermark(); - } - if (oldWidget.showNowPrice != widget.showNowPrice) { + if (oldWidget.showNowPrice != widget.showNowPrice || + (oldWidget.timeFrame == null) != (widget.timeFrame == null)) { _syncCountdownTimer(); } if (oldWidget.controller != widget.controller) { @@ -2141,7 +2171,6 @@ class _KChartWidgetState extends State verticalTextAlignment: widget.verticalTextAlignment, dateFormatter: widget.dateFormatter, priceFormatter: widget.priceFormatter, - watermarkPicture: _watermarkPicture, draftLine: _draft, selectedLine: _selected, selectedLines: _selection, @@ -2427,6 +2456,25 @@ class _KChartWidgetState extends State painter: painter, ), ), + if (widget.watermark case final watermark?) + Positioned.fill( + child: IgnorePointer( + child: RepaintBoundary( + child: CustomSingleChildLayout( + delegate: _WatermarkLayout(painter), + child: ColorFiltered( + colorFilter: ColorFilter.mode( + widget + .chartColors + .effectiveWatermarkColor, + BlendMode.srcIn, + ), + child: watermark, + ), + ), + ), + ), + ), RepaintBoundary( child: CustomPaint( size: Size.fromHeight( diff --git a/lib/src/renderer/base_chart_painter.dart b/lib/src/renderer/base_chart_painter.dart index 2358b69..2e2b6b6 100644 --- a/lib/src/renderer/base_chart_painter.dart +++ b/lib/src/renderer/base_chart_painter.dart @@ -354,8 +354,6 @@ abstract class BaseChartPainter extends CustomPainter { void drawSignals(Canvas canvas); - void drawWatermarkLogo(Canvas canvas, Size size); - /// Smallest the candle area may become before the panes below it give way. static const double minMainHeight = 60.0; diff --git a/lib/src/renderer/chart_painter.dart b/lib/src/renderer/chart_painter.dart index ccaa183..2e6c81b 100644 --- a/lib/src/renderer/chart_painter.dart +++ b/lib/src/renderer/chart_painter.dart @@ -1,7 +1,6 @@ import 'dart:math' as math; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart' as vg; import '../drawing/line_painting.dart'; import '../drawing/shape_geometry.dart'; @@ -24,7 +23,6 @@ class ChartPainter extends BaseChartPainter { ChartPainter( super.chartStyle, this.chartColors, { - required this.watermarkPicture, required this.drawings, required this.signals, required this.isTrendLine, @@ -38,7 +36,7 @@ class ChartPainter extends BaseChartPainter { required super.xFrontPadding, required super.baseDimension, required this.verticalTextAlignment, - required this.timeFrame, + this.timeFrame, required this.draftLine, required this.selectedLine, this.selectedLines = const [], @@ -288,8 +286,10 @@ class ChartPainter extends BaseChartPainter { /// Writes the prices the axis and its readouts show; see /// [KChartWidget.priceFormatter]. final String Function(double price)? priceFormatter; - final vg.PictureInfo? watermarkPicture; - final Duration timeFrame; + + /// Duration of one candle; null draws the current-price tag without a + /// countdown. + final Duration? timeFrame; int fixedLength; late MainRenderer mMainRenderer; @@ -501,7 +501,6 @@ class ChartPainter extends BaseChartPainter { size.height, ); canvas.drawRect(dateRect, mBgPaint); - drawWatermarkLogo(canvas, size); } @override @@ -3031,9 +3030,19 @@ class ChartPainter extends BaseChartPainter { } canvas.drawLine(Offset(lastX, y), Offset(mPlotRight, y), nowPricePaint); + final frame = timeFrame; + if (frame == null) { + final tp = getTextPainter( + mMainRenderer.formatAxis(value), + chartColors.nowPriceTextColor, + ); + drawPriceTag(canvas, tp, y, nowPricePaint.color); + return; + } + String countdown = '00:00'; if (last.dateTime != null) { - final closeTime = last.dateTime!.add(timeFrame); + final closeTime = last.dateTime!.add(frame); final now = DateTime.now().toUtc(); final remaining = closeTime.difference(now); if (!remaining.isNegative) { @@ -3212,39 +3221,6 @@ class ChartPainter extends BaseChartPainter { /// Pins [y] to the candle area, for a label that has to stay findable even /// when the price it points at is off the top or the bottom of the axis. double clampToMain(double y) => y.clamp(mMainRect.top, mMainRect.bottom); - - @override - void drawWatermarkLogo(Canvas canvas, Size size) { - final picture = watermarkPicture; - if (picture == null) return; - - final area = Rect.fromLTRB( - mPlotLeft, - mTopPadding, - mPlotRight, - mTopPadding + mMainRect.height, - ); - final logoWidth = - math.min(area.width, area.height) * chartStyle.watermarkScale; - final scale = logoWidth / picture.size.width; - final logoHeight = picture.size.height * scale; - - final spot = chartStyle.watermarkAlignment.inscribe( - Size(logoWidth, logoHeight), - area, - ); - - canvas.save(); - canvas.saveLayer( - spot, - Paint()..color = chartColors.effectiveWatermarkColor, - ); - canvas.translate(spot.left, spot.top); - canvas.scale(scale, scale); - canvas.drawPicture(picture.picture); - canvas.restore(); - canvas.restore(); - } } /// Draws the crosshair, its readouts and the legends, over the chart. diff --git a/pubspec.yaml b/pubspec.yaml index 7771eff..edef737 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,7 +64,6 @@ dependencies: flutter: sdk: flutter decimal: ^3.2.6 - flutter_svg: ^2.3.0 intl: ^0.20.3 dev_dependencies: diff --git a/test/chart_surface_test.dart b/test/chart_surface_test.dart index 3840f03..9e8b245 100644 --- a/test/chart_surface_test.dart +++ b/test/chart_surface_test.dart @@ -33,7 +33,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, controller: controller, diff --git a/test/chart_type_test.dart b/test/chart_type_test.dart index c0f3535..6bc9a89 100644 --- a/test/chart_type_test.dart +++ b/test/chart_type_test.dart @@ -17,7 +17,6 @@ Widget _chart({ChartType? type, bool isLine = false, double? baseline}) { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), chartType: type, isLine: isLine, @@ -77,7 +76,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), chartType: type, indicators: [MaIndicator(period: 5)], diff --git a/test/comparison_test.dart b/test/comparison_test.dart index ddd221b..5e0c9b8 100644 --- a/test/comparison_test.dart +++ b/test/comparison_test.dart @@ -28,7 +28,6 @@ Widget _chart( data, colors ?? ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, comparisons: comparisons, @@ -341,7 +340,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, chartType: ChartType.line, diff --git a/test/context_menu_test.dart b/test/context_menu_test.dart index 2146cbf..a76ff12 100644 --- a/test/context_menu_test.dart +++ b/test/context_menu_test.dart @@ -37,7 +37,6 @@ List _candles() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, diff --git a/test/crosshair_sync_test.dart b/test/crosshair_sync_test.dart index 5d6b904..a2011d6 100644 --- a/test/crosshair_sync_test.dart +++ b/test/crosshair_sync_test.dart @@ -19,7 +19,6 @@ Widget chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, controller: controller, @@ -211,7 +210,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, controller: top, @@ -224,7 +222,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, controller: bottom, diff --git a/test/drawing_controller_test.dart b/test/drawing_controller_test.dart index ffd0e67..e62eda4 100644 --- a/test/drawing_controller_test.dart +++ b/test/drawing_controller_test.dart @@ -26,7 +26,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, diff --git a/test/drawing_manager_test.dart b/test/drawing_manager_test.dart index d08c306..663ff6a 100644 --- a/test/drawing_manager_test.dart +++ b/test/drawing_manager_test.dart @@ -172,7 +172,6 @@ void main() { ], ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, drawingController: controller, diff --git a/test/drawing_test.dart b/test/drawing_test.dart index d497a2a..f2e1a5a 100644 --- a/test/drawing_test.dart +++ b/test/drawing_test.dart @@ -34,7 +34,6 @@ _chartWithLine({ data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, @@ -79,7 +78,6 @@ Future _selectLine(WidgetTester tester) async { candleData, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, currentDrawingTool: tool, @@ -312,7 +310,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: _grabAnything, @@ -373,7 +370,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, // Ends unreachable, stroke reachable: every grab is a body grab. @@ -556,7 +552,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, magnetMode: true, @@ -610,7 +605,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, magnetMode: true, @@ -746,7 +740,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: _grabAnything, @@ -784,7 +777,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: _grabAnything, diff --git a/test/drawing_ux_test.dart b/test/drawing_ux_test.dart index 223ae95..3d65c9f 100644 --- a/test/drawing_ux_test.dart +++ b/test/drawing_ux_test.dart @@ -30,7 +30,6 @@ Widget _host(Widget child) => MaterialApp( data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, @@ -875,7 +874,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: _grabAnything, diff --git a/test/events_test.dart b/test/events_test.dart index 7e14d4f..49fe179 100644 --- a/test/events_test.dart +++ b/test/events_test.dart @@ -30,7 +30,6 @@ Widget _chart( data, colors ?? ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, chartStyle: style ?? ChartStyle(), diff --git a/test/fit_content_test.dart b/test/fit_content_test.dart index da2c720..fca970b 100644 --- a/test/fit_content_test.dart +++ b/test/fit_content_test.dart @@ -25,7 +25,6 @@ Widget _chart({required bool fitContent, int count = 10}) { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 5), xFrontPadding: 0, volHidden: true, diff --git a/test/golden_test.dart b/test/golden_test.dart index 6455c2f..114f546 100644 --- a/test/golden_test.dart +++ b/test/golden_test.dart @@ -63,7 +63,6 @@ Widget _chart({ data ?? _market(), ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, showScrollToNowButton: false, diff --git a/test/legend_hover_test.dart b/test/legend_hover_test.dart index 7536aa0..cce41d2 100644 --- a/test/legend_hover_test.dart +++ b/test/legend_hover_test.dart @@ -25,7 +25,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, crosshairOnHover: crosshairOnHover, diff --git a/test/load_more_and_info_dialog_test.dart b/test/load_more_and_info_dialog_test.dart index 273b7ab..c245b2b 100644 --- a/test/load_more_and_info_dialog_test.dart +++ b/test/load_more_and_info_dialog_test.dart @@ -24,7 +24,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, onLoadMore: onLoadMore, @@ -51,7 +50,6 @@ Widget _chartWith(List data) => MaterialApp( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, ), diff --git a/test/locked_price_scale_test.dart b/test/locked_price_scale_test.dart index fea714e..c5e05b0 100644 --- a/test/locked_price_scale_test.dart +++ b/test/locked_price_scale_test.dart @@ -32,7 +32,6 @@ Widget _chart({ data ?? _trend(), ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, lockPriceScale: lock, diff --git a/test/new_tools_test.dart b/test/new_tools_test.dart index 831eb09..2785830 100644 --- a/test/new_tools_test.dart +++ b/test/new_tools_test.dart @@ -27,7 +27,6 @@ _chartWithTool(DrawingTool tool) { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, currentDrawingTool: tool, @@ -53,7 +52,6 @@ _chartWithTool(DrawingTool tool) { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, @@ -246,7 +244,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, currentDrawingTool: tool, diff --git a/test/optional_params_test.dart b/test/optional_params_test.dart new file mode 100644 index 0000000..9ec98d9 --- /dev/null +++ b/test/optional_params_test.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:ohlcv_chart/ohlcv_chart.dart'; + +import 'test_utils.dart'; + +void main() { + testWidgets('a chart needs nothing but its candles and colours', ( + tester, + ) async { + final data = candles([for (var i = 0; i < 40; i++) 100.0 + i % 7]); + DataUtil.calculate(data); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SizedBox( + width: 400, + height: 300, + child: KChartWidget(data, ChartColors()), + ), + ), + ), + ); + await tester.pump(); + + expect(tester.takeException(), isNull); + final widget = tester.widget(find.byType(KChartWidget)); + expect(widget.isTrendLine, isFalse); + expect(widget.watermark, isNull); + expect(widget.timeFrame, isNull); + // With no time frame there is no countdown, so no one-second timer is left + // running when the test ends — the test framework would fail on one. + }); + + testWidgets('a watermark widget is sized and centred in the candle area', ( + tester, + ) async { + final data = candles([for (var i = 0; i < 40; i++) 100.0 + i % 7]); + DataUtil.calculate(data); + const mark = Key('watermark'); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.topLeft, + child: SizedBox( + width: 400, + height: 300, + child: KChartWidget( + data, + ChartColors(), + volHidden: true, + watermark: const SizedBox(key: mark, height: 20), + ), + ), + ), + ), + ), + ); + await tester.pump(); + expect(tester.takeException(), isNull); + + final state = tester.state(find.byType(KChartWidget)) as dynamic; + final Rect main = state.painter.mMainRect; + final origin = tester.getTopLeft(find.byType(KChartWidget)); + final rect = tester.getRect(find.byKey(mark)).shift(-origin); + final scale = const ChartStyle().watermarkScale; + + expect(rect.width, closeTo(main.shortestSide * scale, 0.01)); + expect(rect.center.dx, closeTo(main.center.dx, 0.01)); + expect(rect.center.dy, closeTo(main.center.dy, 0.01)); + // It takes no touches: the chart under it still gets them. + expect( + find.descendant( + of: find.byType(IgnorePointer), + matching: find.byKey(mark), + ), + findsOneWidget, + ); + }); + + testWidgets('a time frame still counts the current candle down', ( + tester, + ) async { + final data = candles([for (var i = 0; i < 40; i++) 100.0 + i % 7]); + DataUtil.calculate(data); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SizedBox( + width: 400, + height: 300, + child: KChartWidget( + data, + ChartColors(), + timeFrame: const Duration(minutes: 1), + ), + ), + ), + ), + ); + await tester.pump(); + expect(tester.takeException(), isNull); + + // Dispose the chart so its countdown timer is cancelled. + await tester.pumpWidget(const SizedBox()); + }); +} diff --git a/test/out_of_range_lines_test.dart b/test/out_of_range_lines_test.dart index b6241af..92ac75c 100644 --- a/test/out_of_range_lines_test.dart +++ b/test/out_of_range_lines_test.dart @@ -77,7 +77,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: showNowPrice, lockPriceScale: true, diff --git a/test/paint_benchmark.dart b/test/paint_benchmark.dart index 8343532..3b1b108 100644 --- a/test/paint_benchmark.dart +++ b/test/paint_benchmark.dart @@ -82,7 +82,6 @@ void main() { data ?? _market(), ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), chartType: type, indicators: indicators, diff --git a/test/pane_options_test.dart b/test/pane_options_test.dart index 183426c..292c17b 100644 --- a/test/pane_options_test.dart +++ b/test/pane_options_test.dart @@ -26,7 +26,6 @@ Widget _chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, indicators: indicators, diff --git a/test/price_axis_gutter_test.dart b/test/price_axis_gutter_test.dart index 3414fe6..77798df 100644 --- a/test/price_axis_gutter_test.dart +++ b/test/price_axis_gutter_test.dart @@ -34,7 +34,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: true, verticalTextAlignment: alignment, diff --git a/test/price_axis_test.dart b/test/price_axis_test.dart index 7637759..d086cf8 100644 --- a/test/price_axis_test.dart +++ b/test/price_axis_test.dart @@ -48,7 +48,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), priceAxisScale: scale, ), diff --git a/test/price_formatter_test.dart b/test/price_formatter_test.dart index 4702160..2e37d2b 100644 --- a/test/price_formatter_test.dart +++ b/test/price_formatter_test.dart @@ -32,7 +32,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: true, priceAxisScale: scale, diff --git a/test/price_scale_extras_test.dart b/test/price_scale_extras_test.dart index c486c34..6dba4fe 100644 --- a/test/price_scale_extras_test.dart +++ b/test/price_scale_extras_test.dart @@ -28,7 +28,6 @@ Widget _chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, chartType: type, @@ -295,7 +294,6 @@ void main() { _candles(), ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, priceAxisScale: PriceAxisScale.indexedTo100, diff --git a/test/price_scale_test.dart b/test/price_scale_test.dart index 1f34d97..83e6f03 100644 --- a/test/price_scale_test.dart +++ b/test/price_scale_test.dart @@ -24,7 +24,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), controller: controller, priceScaleDrag: priceScaleDrag, @@ -232,7 +231,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), currentDrawingTool: DrawingTool.horizontal, ), diff --git a/test/profile_and_levels_test.dart b/test/profile_and_levels_test.dart index 5935978..8a4868d 100644 --- a/test/profile_and_levels_test.dart +++ b/test/profile_and_levels_test.dart @@ -532,7 +532,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), indicators: [ VolumeProfileIndicator(), diff --git a/test/render_perf_test.dart b/test/render_perf_test.dart index 5fd8332..548ef52 100644 --- a/test/render_perf_test.dart +++ b/test/render_perf_test.dart @@ -58,7 +58,6 @@ Widget _chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), chartType: type, indicators: indicators, diff --git a/test/replay_test.dart b/test/replay_test.dart index c9ac1fc..5af1696 100644 --- a/test/replay_test.dart +++ b/test/replay_test.dart @@ -15,7 +15,6 @@ Widget _chart(List data, {ChartReplayController? replay}) { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), replay: replay, indicators: [MaIndicator(period: 5)], diff --git a/test/scale_test.dart b/test/scale_test.dart index 0176a9c..a5fc726 100644 --- a/test/scale_test.dart +++ b/test/scale_test.dart @@ -47,8 +47,6 @@ class _ProbePainter extends BaseChartPainter { void drawCrossLineText(Canvas canvas, Size size) {} @override void drawSignals(Canvas canvas) {} - @override - void drawWatermarkLogo(Canvas canvas, Size size) {} } /// Paints [data] with [indicators] enabled and returns the computed rects. diff --git a/test/secondary_axis_test.dart b/test/secondary_axis_test.dart index 68ab904..2036154 100644 --- a/test/secondary_axis_test.dart +++ b/test/secondary_axis_test.dart @@ -59,7 +59,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, verticalTextAlignment: alignment, diff --git a/test/sessions_test.dart b/test/sessions_test.dart index d1834b8..c4b64e0 100644 --- a/test/sessions_test.dart +++ b/test/sessions_test.dart @@ -46,7 +46,6 @@ Widget _chart( data, colors ?? ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 30), showNowPrice: false, chartType: type, @@ -333,7 +332,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 30), showNowPrice: false, invertPriceAxis: true, diff --git a/test/shapes_test.dart b/test/shapes_test.dart index 0725de3..11580b0 100644 --- a/test/shapes_test.dart +++ b/test/shapes_test.dart @@ -30,7 +30,6 @@ _chartWithTool( data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, @@ -58,7 +57,6 @@ _chartWithTool( data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawingStyle: style, @@ -414,7 +412,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawings: [level], @@ -458,7 +455,6 @@ void main() { data, ChartColors(), isTrendLine: true, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, drawings: [level], diff --git a/test/static_chart_test.dart b/test/static_chart_test.dart index a1dd0ed..993c226 100644 --- a/test/static_chart_test.dart +++ b/test/static_chart_test.dart @@ -40,7 +40,6 @@ Widget _chart({ data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 5), chartType: ChartType.area, xFrontPadding: 0, diff --git a/test/trading_test.dart b/test/trading_test.dart index 69b4d58..dac1dc2 100644 --- a/test/trading_test.dart +++ b/test/trading_test.dart @@ -30,7 +30,6 @@ Widget _chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, chartStyle: style ?? ChartStyle(), diff --git a/test/transforms_test.dart b/test/transforms_test.dart index 5463a69..cb34988 100644 --- a/test/transforms_test.dart +++ b/test/transforms_test.dart @@ -33,7 +33,6 @@ Widget _chart(List data) => MaterialApp( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), ), ), diff --git a/test/visible_range_test.dart b/test/visible_range_test.dart index 3e20634..5c3bbce 100644 --- a/test/visible_range_test.dart +++ b/test/visible_range_test.dart @@ -27,7 +27,6 @@ Widget _chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 1), showNowPrice: false, controller: controller, diff --git a/test/widget_test.dart b/test/widget_test.dart index 9a97926..a758ada 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -21,7 +21,6 @@ Widget _chart( data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: showNowPrice, indicators: indicators ?? [MaIndicator()], @@ -216,7 +215,6 @@ void main() { data, ChartColors(), isTrendLine: false, - watermarkAssetPath: 'assets/none.svg', timeFrame: const Duration(minutes: 15), showNowPrice: false, timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, From a1894c0afb12fa32b3f92e54fd963745972256a6 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:52:27 +0330 Subject: [PATCH 02/10] build: accept Dart 3.6 and Flutter 3.27, and float the dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The package asked for Dart 3.13 and Flutter 3.47, which shut out every app a few releases behind, though nothing it draws needed them. The lowest Flutter left is 3.27, the release that brought `Color.withValues` and `Color.a`, which the chart uses throughout. `decimal` is accepted from 3.0.0 and `intl` from 0.19.0 up to 0.21, instead of only the newest of each, so the package resolves beside the `intl` an app's `flutter_localizations` pins. The suite passes against both ends: `flutter pub downgrade` (decimal 3.0.0, intl 0.19.0, rational 2.0.0) and `flutter pub upgrade`. The example's own ranges are widened to match. Reading under Dart 3.6 also means writing the two newer forms the older way. Nine collection elements written `?value`, which needs Dart 3.8, are now `if (value case final v?) v` — evaluated once and left out when null, so each list is the same as before — and test callbacks that named two parameters `_`, which needs 3.7, use `_, __`. Nothing changes in behaviour. Both halves share one commit because each is wrong without the other: the older forms are flagged under 3.13, and the newer ones do not parse under 3.6. --- example/lib/src/market_data.dart | 15 +++++++++++---- example/pubspec.yaml | 8 ++++---- lib/src/chart_workspace.dart | 6 ++++-- lib/src/drawing/drawing_controller.dart | 6 ++++-- lib/src/entity/drawing_codec.dart | 3 ++- lib/src/entity/fib_retracement.dart | 5 ++++- lib/src/indicators/indicator_template.dart | 6 ++++-- lib/src/k_chart_widget.dart | 2 +- lib/src/renderer/chart_painter.dart | 3 ++- pubspec.yaml | 10 +++++----- test/pane_options_test.dart | 6 +++--- test/sessions_test.dart | 2 +- test/trading_test.dart | 6 +++--- 13 files changed, 48 insertions(+), 30 deletions(-) diff --git a/example/lib/src/market_data.dart b/example/lib/src/market_data.dart index e04751e..216c54d 100644 --- a/example/lib/src/market_data.dart +++ b/example/lib/src/market_data.dart @@ -98,10 +98,17 @@ class MarketData { } return [ - ?at(over.length - 180, ChartEventKind.earnings, 'Q3 — beat by a cent'), - ?at(over.length - 120, ChartEventKind.dividend, r'$0.24 going ex'), - ?at(over.length - 70, ChartEventKind.split, '4-for-1'), - ?at(over.length - 30, ChartEventKind.news, 'Listed on another venue'), + if (at(over.length - 180, ChartEventKind.earnings, 'Q3 — beat by a cent') + case final v?) + v, + if (at(over.length - 120, ChartEventKind.dividend, r'$0.24 going ex') + case final v?) + v, + if (at(over.length - 70, ChartEventKind.split, '4-for-1') case final v?) + v, + if (at(over.length - 30, ChartEventKind.news, 'Listed on another venue') + case final v?) + v, ]; } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 60b8ade..15b214c 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -4,8 +4,8 @@ publish_to: 'none' version: 1.0.0 environment: - sdk: ^3.13.0 - flutter: ">=3.47.0" + sdk: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" dependencies: flutter: @@ -14,8 +14,8 @@ dependencies: path: ../ dev_dependencies: - flutter_lints: ^6.0.0 - image: ^4.5.4 + flutter_lints: ">=5.0.0 <7.0.0" + image: ">=4.0.0 <5.0.0" flutter_test: sdk: flutter diff --git a/lib/src/chart_workspace.dart b/lib/src/chart_workspace.dart index ab3f2d8..9afb150 100644 --- a/lib/src/chart_workspace.dart +++ b/lib/src/chart_workspace.dart @@ -64,7 +64,8 @@ class ChartWorkspace { indicators: [ if (rawIndicators is List) for (final entry in rawIndicators) - if (entry is Map) ?indicatorFromJson(entry), + if (entry is Map) + if (indicatorFromJson(entry) case final v?) v, ], drawings: switch (json['drawings']) { final Map saved => ChartDrawings.fromJson(saved), @@ -113,7 +114,8 @@ class ChartWorkspace { return { 'version': formatVersion, 'indicators': [ - for (final indicator in indicators) ?indicatorToJson(indicator), + for (final indicator in indicators) + if (indicatorToJson(indicator) case final v?) v, ], if (saved != null && saved.isNotEmpty) 'drawings': saved.toJson(), if (chartType != null) 'chartType': chartType!.name, diff --git a/lib/src/drawing/drawing_controller.dart b/lib/src/drawing/drawing_controller.dart index d5fa0b6..ef23133 100644 --- a/lib/src/drawing/drawing_controller.dart +++ b/lib/src/drawing/drawing_controller.dart @@ -102,8 +102,10 @@ class ChartDrawingController extends ChangeNotifier { /// One at most until something is added to the selection; the editor stays on /// [selected], and an edit made through it is applied to the rest by the /// chart. - List get selection => - List.unmodifiable([..._alsoSelected, ?_selected]); + List get selection => List.unmodifiable([ + ..._alsoSelected, + if (_selected case final v?) v, + ]); /// How many drawings are selected. int get selectionLength => _alsoSelected.length + (_selected == null ? 0 : 1); diff --git a/lib/src/entity/drawing_codec.dart b/lib/src/entity/drawing_codec.dart index 30041ec..a261239 100644 --- a/lib/src/entity/drawing_codec.dart +++ b/lib/src/entity/drawing_codec.dart @@ -89,7 +89,8 @@ class ChartDrawings { if (entries is! List) return ChartDrawings(); return ChartDrawings([ for (final entry in entries) - if (entry is Map) ?drawingFromJson(entry), + if (entry is Map) + if (drawingFromJson(entry) case final v?) v, ]); } diff --git a/lib/src/entity/fib_retracement.dart b/lib/src/entity/fib_retracement.dart index 84c346f..df601f4 100644 --- a/lib/src/entity/fib_retracement.dart +++ b/lib/src/entity/fib_retracement.dart @@ -76,7 +76,10 @@ class FibRetracement extends TwoPointDrawing implements AlertingDrawing { // used: what matters is where price goes after the move, not during it. final from = time1.isBefore(time2!) ? time1 : time2!; if (time.isBefore(from)) return const []; - return [for (final ratio in levels) ?priceAt(ratio)]; + return [ + for (final ratio in levels) + if (priceAt(ratio) case final v?) v, + ]; } /// The price at [ratio] of the way from the first anchor to the second. diff --git a/lib/src/indicators/indicator_template.dart b/lib/src/indicators/indicator_template.dart index 880aa80..16f8eed 100644 --- a/lib/src/indicators/indicator_template.dart +++ b/lib/src/indicators/indicator_template.dart @@ -36,7 +36,8 @@ class IndicatorTemplate { indicators: [ if (raw is List) for (final entry in raw) - if (entry is Map) ?indicatorFromJson(entry), + if (entry is Map) + if (indicatorFromJson(entry) case final v?) v, ], ); } @@ -60,7 +61,8 @@ class IndicatorTemplate { Map toJson() => { 'name': name, 'indicators': [ - for (final indicator in indicators) ?indicatorToJson(indicator), + for (final indicator in indicators) + if (indicatorToJson(indicator) case final v?) v, ], }; diff --git a/lib/src/k_chart_widget.dart b/lib/src/k_chart_widget.dart index 400661b..08dd558 100644 --- a/lib/src/k_chart_widget.dart +++ b/lib/src/k_chart_widget.dart @@ -993,7 +993,7 @@ class _KChartWidgetState extends State List get _selection { final controller = widget.drawingController; if (controller != null) return controller.selection; - return [..._localAlsoSelected, ?_localSelection]; + return [..._localAlsoSelected, if (_localSelection case final v?) v]; } /// Adds [line] to the selection, or takes it out if it is already in. diff --git a/lib/src/renderer/chart_painter.dart b/lib/src/renderer/chart_painter.dart index 2e6c81b..b0d12de 100644 --- a/lib/src/renderer/chart_painter.dart +++ b/lib/src/renderer/chart_painter.dart @@ -2413,7 +2413,8 @@ class ChartPainter extends BaseChartPainter { void drawPaths(Canvas canvas, Size size) { for (final line in _withDraft(paths)) { final points = [ - for (final point in line.points) ?_anchor(point.time, point.price), + for (final point in line.points) + if (_anchor(point.time, point.price) case final v?) v, ]; if (points.isEmpty) continue; if (points.length == 1) { diff --git a/pubspec.yaml b/pubspec.yaml index edef737..91ad430 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,16 +57,16 @@ screenshots: path: screenshots/depth.png environment: - sdk: ^3.13.0 - flutter: ">=3.47.0" + sdk: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" dependencies: flutter: sdk: flutter - decimal: ^3.2.6 - intl: ^0.20.3 + decimal: ">=3.0.0 <4.0.0" + intl: ">=0.19.0 <0.21.0" dev_dependencies: - flutter_lints: ^6.0.0 + flutter_lints: ">=5.0.0 <7.0.0" flutter_test: sdk: flutter diff --git a/test/pane_options_test.dart b/test/pane_options_test.dart index 292c17b..f0d4908 100644 --- a/test/pane_options_test.dart +++ b/test/pane_options_test.dart @@ -431,7 +431,7 @@ void main() { List.filled(30, value), alerts: const [IndicatorAlert(level: 50)], ), - ], onIndicatorAlert: (_, _, _, v) => reports.add(v)); + ], onIndicatorAlert: (_, __, ___, v) => reports.add(v)); await tester.pumpWidget(chart(10)); await tester.pumpAndSettle(); @@ -452,7 +452,7 @@ void main() { List.filled(30, value), alerts: const [IndicatorAlert(level: 50)], ), - ], onIndicatorAlert: (_, _, _, v) => reports.add(v)); + ], onIndicatorAlert: (_, __, ___, v) => reports.add(v)); await tester.pumpWidget(chart(10)); await tester.pumpAndSettle(); @@ -470,7 +470,7 @@ void main() { List.filled(30, null), alerts: const [IndicatorAlert(level: 50)], ), - ], onIndicatorAlert: (_, _, _, v) => reports.add(v)), + ], onIndicatorAlert: (_, __, ___, v) => reports.add(v)), ); await tester.pumpAndSettle(); diff --git a/test/sessions_test.dart b/test/sessions_test.dart index c4b64e0..096a422 100644 --- a/test/sessions_test.dart +++ b/test/sessions_test.dart @@ -266,7 +266,7 @@ void main() { testWidgets('returning null leaves the usual colour', (tester) async { await tester.pumpWidget( - _chart(_halfHourly(_on(1, 0), 48), candleColor: (_, _) => null), + _chart(_halfHourly(_on(1, 0), 48), candleColor: (_, __) => null), ); await tester.pumpAndSettle(); diff --git a/test/trading_test.dart b/test/trading_test.dart index dac1dc2..3fc47a2 100644 --- a/test/trading_test.dart +++ b/test/trading_test.dart @@ -337,7 +337,7 @@ void main() { final order = ChartOrder(id: '1', price: price, side: TradeSide.buy); await tester.pumpWidget( - _chart(_candles(), orders: [order], onOrderMoved: (_, _) {}), + _chart(_candles(), orders: [order], onOrderMoved: (_, __) {}), ); await tester.pumpAndSettle(); @@ -363,7 +363,7 @@ void main() { draggable: false, ), ], - onOrderMoved: (_, _) {}, + onOrderMoved: (_, __) {}, ), ); await tester.pumpAndSettle(); @@ -383,7 +383,7 @@ void main() { _chart( _candles(), orders: [far, near], - onOrderMoved: (_, _) {}, + onOrderMoved: (_, __) {}, style: ChartStyle(trading: const TradingStyle(grabTolerance: 200)), ), ); From 4c16c59f1c204e9bc448b16d0d06c8b58d3b8ca1 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:49:29 +0330 Subject: [PATCH 03/10] feat: add SeriesChart, a chart of values rather than candles A balance over time, sign-ups per month or profit per trade had nowhere to go in a candlestick package, so an app carried `fl_chart` beside this one. `SeriesChart` reads any numbers against any numbers. - `LineSeries` and `BarSeries`, from `SeriesPoint(x, y)` or plain values, with `null` for a gap; several at once, mixed. - Lines joined `linear`, `smooth`, `monotone` (never swinging past a peak) or `step`; dashed, gradient-stroked, dotted per point, and split into `negativeColor` exactly where they cross their baseline. - `SeriesFill`, which fades to the baseline and never paints across it, the lower half mirroring the upper gradient. - Bars grown from a baseline, rounded on the far end, width fixed or a share of the slot held between a minimum and a maximum, grouped side by side, one draw call per colour. - `SeriesXAxis` / `SeriesYAxis` that write, space or hide their labels, `SeriesGrid`, a plot border, reference lines and bands. - A value range fitted to the x window in view, padded without crossing zero and widened to round ticks. - Touch on press, long press, tap or hover, with a default tooltip or one built by the host and kept inside the chart; `onTouch` with every series' value; `SeriesChartController` to share one crosshair between charts. - `SeriesRangeSelector`, a draggable window over long data. - Animated data changes, including a grow-in on the first build. Unit, widget and golden tests cover the fitting, the paths, the gestures, the controller, the animation and the selector. --- lib/src/export.dart | 14 + lib/src/series/series_axis.dart | 311 +++++++++ lib/src/series/series_chart.dart | 741 ++++++++++++++++++++++ lib/src/series/series_chart_painter.dart | 676 ++++++++++++++++++++ lib/src/series/series_data.dart | 376 +++++++++++ lib/src/series/series_paths.dart | 173 +++++ lib/src/series/series_range_selector.dart | 289 +++++++++ lib/src/series/series_scale.dart | 340 ++++++++++ lib/src/series/series_touch.dart | 261 ++++++++ test/goldens/series_area.png | Bin 0 -> 16508 bytes test/goldens/series_bars.png | Bin 0 -> 7426 bytes test/goldens/series_lines_tooltip.png | Bin 0 -> 26836 bytes test/series_chart_test.dart | 353 +++++++++++ test/series_golden_test.dart | 149 +++++ test/series_scale_test.dart | 276 ++++++++ 15 files changed, 3959 insertions(+) create mode 100644 lib/src/series/series_axis.dart create mode 100644 lib/src/series/series_chart.dart create mode 100644 lib/src/series/series_chart_painter.dart create mode 100644 lib/src/series/series_data.dart create mode 100644 lib/src/series/series_paths.dart create mode 100644 lib/src/series/series_range_selector.dart create mode 100644 lib/src/series/series_scale.dart create mode 100644 lib/src/series/series_touch.dart create mode 100644 test/goldens/series_area.png create mode 100644 test/goldens/series_bars.png create mode 100644 test/goldens/series_lines_tooltip.png create mode 100644 test/series_chart_test.dart create mode 100644 test/series_golden_test.dart create mode 100644 test/series_scale_test.dart diff --git a/lib/src/export.dart b/lib/src/export.dart index 73e25c7..c75178f 100644 --- a/lib/src/export.dart +++ b/lib/src/export.dart @@ -71,3 +71,17 @@ export './renderer/main_renderer.dart' show VerticalTextAlignment; export './utils/axis_ticks.dart'; export './utils/candle_transforms.dart'; export './utils/data_util.dart'; +export './series/series_axis.dart' + show + SeriesAxisSide, + SeriesBand, + SeriesDirection, + SeriesGrid, + SeriesLabelBuilder, + SeriesReferenceLine, + SeriesXAxis, + SeriesYAxis; +export './series/series_chart.dart'; +export './series/series_data.dart' hide pointsOf; +export './series/series_range_selector.dart'; +export './series/series_touch.dart'; diff --git a/lib/src/series/series_axis.dart b/lib/src/series/series_axis.dart new file mode 100644 index 0000000..b99b42d --- /dev/null +++ b/lib/src/series/series_axis.dart @@ -0,0 +1,311 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +/// The colour axis labels use when no style is given. +const Color seriesAxisTextColor = Color(0xFF909196); + +/// The grid colour when none is given. +const Color seriesGridColor = Color(0x33909196); + +/// Which side of the plot the value axis sits on. +enum SeriesAxisSide { + /// Labels to the left of the plot, right-aligned against it. + left, + + /// Labels to the right of the plot, left-aligned against it. + right, +} + +/// Writes the label for one position on an axis; null or empty prints none. +typedef SeriesLabelBuilder = String? Function(double value); + +/// The horizontal axis of a [SeriesChart]. +/// +/// Which x values get a label — and a vertical grid line — is decided in this +/// order: [ticks] if given; otherwise every index whose entry in [labels] is +/// not empty, thinned to multiples of [interval] when that is set; otherwise +/// every [interval]; otherwise about [tickCount] round values. Labels that +/// would overlap the one before are dropped. +@immutable +class SeriesXAxis { + /// Creates a horizontal axis. + const SeriesXAxis({ + this.show = true, + this.height = 22, + this.labels, + this.labelBuilder, + this.ticks, + this.interval, + this.tickCount = 6, + this.style, + this.gap = 4, + this.fitInside = true, + }); + + /// No labels and no room held for them. + static const hidden = SeriesXAxis(show: false); + + /// Whether labels are drawn and room is held for them. + final bool show; + + /// Room below the plot for the labels. + final double height; + + /// A label per index — `labels[i]` names `x = i`. An empty string prints + /// nothing, so a list that only names month starts spaces itself. + final List? labels; + + /// Writes the label for an x value, overriding [labels]. + final SeriesLabelBuilder? labelBuilder; + + /// The exact x values to label and rule. + final List? ticks; + + /// Label every this many units of x. + final double? interval; + + /// About how many labels to print when nothing else decides. + final int tickCount; + + /// Label text style. + final TextStyle? style; + + /// Space between the plot and the labels. + final double gap; + + /// Slides the first and last labels inward so they are not cut off. + final bool fitInside; + + /// The label for [x], or null when there is none. + /// + /// [step] is the distance between two labels, which decides how many + /// decimals a plain number is written with; without it, [interval] or 1. + String? labelFor(double x, {double? step}) { + final builder = labelBuilder; + if (builder != null) return builder(x); + final names = labels; + if (names != null) { + final index = x.round(); + if ((x - index).abs() > 1e-9 || index < 0 || index >= names.length) { + return null; + } + return names[index]; + } + return formatSeriesNumber(x, step ?? interval ?? 1); + } +} + +/// The vertical axis of a [SeriesChart]. +@immutable +class SeriesYAxis { + /// Creates a vertical axis. + const SeriesYAxis({ + this.show = true, + this.side = SeriesAxisSide.left, + this.width = 40, + this.formatter, + this.ticks, + this.interval, + this.tickCount = 5, + this.style, + this.gap = 4, + }); + + /// No labels and no room held for them. + static const hidden = SeriesYAxis(show: false); + + /// Whether labels are drawn and room is held for them. + final bool show; + + /// Which side of the plot the labels sit on. + final SeriesAxisSide side; + + /// Room beside the plot for the labels. Charts stacked one above another + /// line up when they share it. + final double width; + + /// Writes a value as its label; it also writes the default tooltip's values. + final String Function(double value)? formatter; + + /// The exact values to label and rule. + final List? ticks; + + /// Label every this many units, starting from a multiple of it. + final double? interval; + + /// About how many labels to print when nothing else decides. + final int tickCount; + + /// Label text style. + final TextStyle? style; + + /// Space between the plot and the labels. + final double gap; + + /// Writes [value], using [formatter] when there is one and otherwise as many + /// decimals as [step] needs. + String format(double value, double step) { + final write = formatter; + return write != null ? write(value) : formatSeriesNumber(value, step); + } +} + +/// The lines ruled across the plot at the axis labels. +@immutable +class SeriesGrid { + /// Creates a grid. + const SeriesGrid({ + this.horizontal = true, + this.vertical = true, + this.color = seriesGridColor, + this.width = 1, + this.dashPattern, + this.verticalColor, + this.verticalDashPattern, + }); + + /// No grid lines. + static const none = SeriesGrid(horizontal: false, vertical: false); + + /// Lines across the plot at the value-axis ticks. + final bool horizontal; + + /// Lines down the plot at the x-axis ticks. + final bool vertical; + + /// Line colour. + final Color color; + + /// Line width. + final double width; + + /// Dash and gap lengths, such as `[4, 4]`; null draws solid lines. + final List? dashPattern; + + /// Colour of the vertical lines; null follows [color]. + final Color? verticalColor; + + /// Dashes of the vertical lines; null follows [dashPattern]. + final List? verticalDashPattern; +} + +/// The direction a [SeriesReferenceLine] or [SeriesBand] runs. +enum SeriesDirection { + /// Across the plot, at a value. + horizontal, + + /// Down the plot, at an x. + vertical, +} + +/// A fixed level drawn over or under the series, such as a zero line or a +/// target. +/// +/// It is not interactive, and it does not widen the value range unless +/// [extendsRange] says so — a far-off target would otherwise flatten the data. +@immutable +class SeriesReferenceLine { + /// A line across the plot at [value]. + const SeriesReferenceLine.horizontal( + this.value, { + this.color = const Color(0x99909196), + this.width = 1, + this.dashPattern, + this.label, + this.labelStyle, + this.labelAlignment = Alignment.topRight, + this.aboveSeries = false, + this.extendsRange = false, + }) : direction = SeriesDirection.horizontal; + + /// A line down the plot at x = [value]. + const SeriesReferenceLine.vertical( + this.value, { + this.color = const Color(0x99909196), + this.width = 1, + this.dashPattern, + this.label, + this.labelStyle, + this.labelAlignment = Alignment.topRight, + this.aboveSeries = false, + }) : direction = SeriesDirection.vertical, + extendsRange = false; + + /// Which way the line runs. + final SeriesDirection direction; + + /// The value (horizontal) or x (vertical) it is drawn at. + final double value; + + /// Line colour. + final Color color; + + /// Line width. + final double width; + + /// Dash and gap lengths; null draws solid. + final List? dashPattern; + + /// Text written beside the line. + final String? label; + + /// Style of [label]. + final TextStyle? labelStyle; + + /// Where along and beside the line [label] sits: `topRight` puts it above + /// the right end of a horizontal line. + final Alignment labelAlignment; + + /// Whether it is drawn over the series rather than under them. + final bool aboveSeries; + + /// Whether the value range grows to include a horizontal line. + final bool extendsRange; +} + +/// A shaded stretch of the plot between two values or two x positions. +@immutable +class SeriesBand { + /// A band across the plot between the values [from] and [to]. + const SeriesBand.horizontal(this.from, this.to, {required this.color}) + : direction = SeriesDirection.horizontal; + + /// A band down the plot between x = [from] and x = [to]. + const SeriesBand.vertical(this.from, this.to, {required this.color}) + : direction = SeriesDirection.vertical; + + /// Which way the band runs. + final SeriesDirection direction; + + /// One edge. + final double from; + + /// The other edge. + final double to; + + /// Fill colour. + final Color color; +} + +/// Writes [value] with as many decimals as a step of [step] needs to tell its +/// neighbours apart, and none for a whole number. +String formatSeriesNumber(double value, double step) { + if (!value.isFinite) return ''; + if (value == value.roundToDouble() && step >= 1) { + return value.toStringAsFixed(0); + } + // As many decimals as it takes for the step itself to be a whole number: + // one for 0.5, two for 0.25. + var decimals = 0; + var scaled = step.abs(); + while (decimals < 8 && + scaled > 0 && + (scaled - scaled.roundToDouble()).abs() > + 1e-6 * (scaled < 1 ? 1 : scaled)) { + scaled *= 10; + decimals++; + } + if (step == 0) decimals = 2; + final text = value.toStringAsFixed(decimals); + return text == '-${0.toStringAsFixed(decimals)}' ? text.substring(1) : text; +} diff --git a/lib/src/series/series_chart.dart b/lib/src/series/series_chart.dart new file mode 100644 index 0000000..51ecfb6 --- /dev/null +++ b/lib/src/series/series_chart.dart @@ -0,0 +1,741 @@ +import 'dart:math' as math; +import 'dart:ui' show lerpDouble; + +import 'package:flutter/widgets.dart'; + +import '../renderer/text_painter_cache.dart'; +import 'series_axis.dart'; +import 'series_chart_painter.dart'; +import 'series_data.dart'; +import 'series_scale.dart'; +import 'series_touch.dart'; + +/// A chart of plain values: lines, areas and bars over a numeric x axis. +/// +/// Where `KChartWidget` reads candles against time, this reads any numbers +/// against any numbers — a balance per day, a count per month, a return per +/// trade — which is what a dashboard, a wallet or a report draws. +/// +/// ```dart +/// SeriesChart( +/// series: [ +/// LineSeries.values( +/// balances, +/// color: purple, +/// curve: LineCurve.monotone, +/// fill: SeriesFill.fade(purple), +/// ), +/// ], +/// xAxis: SeriesXAxis(labels: dayNames), +/// yAxis: SeriesYAxis(formatter: formatUsd), +/// touch: const SeriesTouch(trigger: SeriesTouchTrigger.longPress), +/// ); +/// ``` +/// +/// The chart fills the box it is given. In a box with no height of its own — +/// a `Column` without an `Expanded`, a scroll view — it is [defaultHeight] +/// high. +class SeriesChart extends StatefulWidget { + /// Creates a chart of [series]. + const SeriesChart({ + super.key, + required this.series, + this.xAxis = const SeriesXAxis(), + this.yAxis = const SeriesYAxis(), + this.grid = const SeriesGrid(), + this.border, + this.minX, + this.maxX, + this.xPadding, + this.minY, + this.maxY, + this.includeZero = false, + this.yPadding = 0.1, + this.niceYRange = true, + this.referenceLines = const [], + this.bands = const [], + this.touch = const SeriesTouch(), + this.controller, + this.onTouch, + this.animationDuration = Duration.zero, + this.animationCurve = Curves.easeOutCubic, + this.animateOnMount = true, + this.padding = EdgeInsets.zero, + this.backgroundColor, + this.clipToPlot = true, + this.defaultHeight = 200, + this.semanticLabel, + }); + + /// What to draw, bottom layer first. + final List series; + + /// The horizontal axis; [SeriesXAxis.hidden] for none. + final SeriesXAxis xAxis; + + /// The value axis; [SeriesYAxis.hidden] for none. + final SeriesYAxis yAxis; + + /// Lines ruled at the axis ticks; [SeriesGrid.none] for none. + final SeriesGrid grid; + + /// A line around the plot; null draws none. + final BorderSide? border; + + /// The x at the plot's left edge; null fits the data. + /// + /// With [maxX] this shows a window of a longer series — the values outside + /// are clipped away, and the value range fits what is left. + final double? minX; + + /// The x at the plot's right edge; null fits the data. + final double? maxX; + + /// Room either side of the fitted x range, in x units; null leaves half a + /// unit when there are bars, so the end bars are whole, and none otherwise. + final double? xPadding; + + /// The value at the plot's bottom edge; null fits the data. + final double? minY; + + /// The value at the plot's top edge; null fits the data. + final double? maxY; + + /// Whether the fitted value range always reaches zero. + final bool includeZero; + + /// Room above and below the fitted values, as a share of their range. + final double yPadding; + + /// Whether a fitted value range is widened to a round tick at either end. + final bool niceYRange; + + /// Fixed levels, such as a zero line. + final List referenceLines; + + /// Shaded stretches of the plot. + final List bands; + + /// How the chart answers touch and hover; null makes it ignore both. + final SeriesTouch? touch; + + /// Shows the crosshair from code, or shares it with other charts. + final SeriesChartController? controller; + + /// Called after the crosshair moves to another x, and with null when it + /// goes. + final ValueChanged? onTouch; + + /// How long new values take to move into place; zero snaps. + /// + /// With the same number of points as before, each value moves from where it + /// was. Otherwise — and on the first build, when [animateOnMount] is set — + /// the values grow out of each series' baseline. + final Duration animationDuration; + + /// The easing of [animationDuration]. + final Curve animationCurve; + + /// Whether the first build grows in, when [animationDuration] is not zero. + final bool animateOnMount; + + /// Space kept clear around the chart, axes included. + final EdgeInsets padding; + + /// Painted behind the whole chart; null leaves it transparent. + final Color? backgroundColor; + + /// Whether the series are cut off at the plot's edges, or only at the + /// chart's. + final bool clipToPlot; + + /// The height taken in a box that sets none. + final double defaultHeight; + + /// What a screen reader announces for the chart. + final String? semanticLabel; + + @override + State createState() => _SeriesChartState(); +} + +class _SeriesChartState extends State + with SingleTickerProviderStateMixin { + late final AnimationController _animation; + final TextPainterCache _text = TextPainterCache(capacity: 128); + + /// Where the running animation started from; null when nothing is moving. + List>? _fromValues; + SeriesViewport? _fromViewport; + + /// What the last frame drew, which a new animation starts from. + List>? _drawnValues; + SeriesViewport? _drawnViewport; + + SeriesGeometry? _geometry; + double? _localX; + double? _reportedX; + + @override + void initState() { + super.initState(); + _animation = + AnimationController( + vsync: this, + duration: widget.animationDuration, + value: 1, + ) + ..addListener(_onTick) + ..addStatusListener(_onStatus); + widget.controller?.addListener(_onController); + if (widget.animateOnMount && widget.animationDuration > Duration.zero) { + _growIn(); + } + } + + @override + void didUpdateWidget(SeriesChart oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.controller != widget.controller) { + oldWidget.controller?.removeListener(_onController); + widget.controller?.addListener(_onController); + } + _animation.duration = widget.animationDuration; + + if (_sameValues(oldWidget.series, widget.series)) return; + if (widget.animationDuration <= Duration.zero) { + _fromValues = null; + _fromViewport = null; + return; + } + final drawn = _drawnValues; + if (drawn != null && _sameShape(drawn, widget.series)) { + _fromValues = drawn; + _fromViewport = _drawnViewport; + _animation.forward(from: 0); + } else { + _growIn(); + } + } + + @override + void dispose() { + widget.controller?.removeListener(_onController); + _animation.dispose(); + super.dispose(); + } + + void _onTick() => setState(() {}); + + void _onStatus(AnimationStatus status) { + if (status == AnimationStatus.completed) { + setState(() { + _fromValues = null; + _fromViewport = null; + }); + } + } + + void _onController() => setState(() {}); + + void _growIn() { + final target = _targetValues(widget.series); + final viewport = _fit(target); + _fromValues = [ + for (var i = 0; i < widget.series.length; i++) + [ + for (final v in target[i]) + v == null + ? null + : widget.series[i].baseline.clamp(viewport.minY, viewport.maxY), + ], + ]; + _fromViewport = null; + _animation.forward(from: 0); + } + + static List> _targetValues(List series) => [ + for (final s in series) [for (final p in s.points) p.isGap ? null : p.y], + ]; + + static bool _sameValues(List a, List b) { + if (identical(a, b)) return true; + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + final pa = a[i].points; + final pb = b[i].points; + if (identical(pa, pb)) continue; + if (pa.length != pb.length) return false; + for (var j = 0; j < pa.length; j++) { + if (pa[j] != pb[j]) return false; + } + } + return true; + } + + static bool _sameShape(List> values, List series) { + if (values.length != series.length) return false; + for (var i = 0; i < series.length; i++) { + if (values[i].length != series[i].points.length) return false; + } + return true; + } + + SeriesViewport _fit(List> values) => fitSeriesViewport( + series: widget.series, + values: values, + xAxis: widget.xAxis, + yAxis: widget.yAxis, + referenceLines: widget.referenceLines, + minX: widget.minX, + maxX: widget.maxX, + xPadding: widget.xPadding, + minY: widget.minY, + maxY: widget.maxY, + includeZero: widget.includeZero, + yPadding: widget.yPadding, + niceYRange: widget.niceYRange, + ); + + // ── Touch ─────────────────────────────────────────────────────────────── + + double? get _touchX { + final controller = widget.controller; + return controller != null ? controller.x : _localX; + } + + void _showAt(Offset local) { + final geometry = _geometry; + if (geometry == null) return; + final x = _snap(geometry, local.dx); + if (x == null) return; + final controller = widget.controller; + if (controller != null) { + controller.show(x); + } else if (_localX != x) { + setState(() => _localX = x); + } + } + + void _toggleAt(Offset local) { + final geometry = _geometry; + if (geometry == null) return; + final x = _snap(geometry, local.dx); + if (x != null && x == _touchX) { + _release(); + } else { + _showAt(local); + } + } + + void _release() { + final controller = widget.controller; + if (controller != null) { + controller.clear(); + } else if (_localX != null) { + setState(() => _localX = null); + } + } + + /// The x of the point nearest pixel column [px], among those in view. + double? _snap(SeriesGeometry geometry, double px) { + final wanted = geometry.pxToX(px); + final viewport = geometry.viewport; + double? best; + var bestDistance = double.infinity; + for (final s in widget.series) { + final index = _nearest(s.points, wanted); + if (index < 0) continue; + for (final j in [index - 1, index, index + 1]) { + if (j < 0 || j >= s.points.length) continue; + final p = s.points[j]; + if (p.isGap || p.x < viewport.minX || p.x > viewport.maxX) continue; + final distance = (p.x - wanted).abs(); + if (distance < bestDistance) { + bestDistance = distance; + best = p.x; + } + } + } + return best; + } + + /// The index of the point with x nearest [x], in points sorted by x. + static int _nearest(List points, double x) { + if (points.isEmpty) return -1; + var low = 0; + var high = points.length - 1; + while (low < high) { + final mid = (low + high) >> 1; + if (points[mid].x < x) { + low = mid + 1; + } else { + high = mid; + } + } + if (low > 0 && (x - points[low - 1].x).abs() <= (points[low].x - x).abs()) { + return low - 1; + } + return low; + } + + static int _indexAt(List points, double x) { + final index = _nearest(points, x); + if (index < 0) return -1; + return (points[index].x - x).abs() <= 1e-9 ? index : -1; + } + + SeriesTouchDetails _detailsAt( + SeriesGeometry geometry, + List> values, + double x, + ) { + final touched = []; + final px = geometry.xToPx(x); + for (var i = 0; i < widget.series.length; i++) { + final s = widget.series[i]; + if (!s.showInTooltip) continue; + final j = _indexAt(s.points, x); + if (j < 0) continue; + final point = s.points[j]; + final drawn = j < values[i].length ? values[i][j] : null; + if (point.isGap || drawn == null) continue; + touched.add( + SeriesTouchValue( + seriesIndex: i, + series: s, + pointIndex: j, + point: point, + position: Offset(px, geometry.yToPx(drawn)), + color: switch (s) { + final BarSeries bars => bars.barColorAt(j, point), + LineSeries() => s.colorAt(point.y!), + }, + ), + ); + } + final top = touched.isEmpty + ? geometry.plot.top + : touched.map((v) => v.position.dy).reduce(math.min); + return SeriesTouchDetails( + x: x, + values: touched, + position: Offset(px, top), + plotRect: geometry.plot, + ); + } + + void _report(SeriesTouchDetails? details) { + final x = details?.x; + if (x == _reportedX) return; + _reportedX = x; + final onTouch = widget.onTouch; + if (onTouch == null) return; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) onTouch(details); + }); + } + + // ── Build ─────────────────────────────────────────────────────────────── + + @override + Widget build(BuildContext context) { + final target = _targetValues(widget.series); + final from = _fromValues; + final t = from == null + ? 1.0 + : widget.animationCurve.transform(_animation.value); + final values = from == null || !_sameShape(from, widget.series) + ? target + : [ + for (var i = 0; i < target.length; i++) + [ + for (var j = 0; j < target[i].length; j++) + _lerpValue(from[i][j], target[i][j], t), + ], + ]; + final targetViewport = _fit(target); + final fromViewport = _fromViewport; + final viewport = from != null && fromViewport != null + ? SeriesViewport.lerp(fromViewport, targetViewport, t) + : targetViewport; + _drawnValues = values; + _drawnViewport = viewport; + + Widget chart = LayoutBuilder( + builder: (context, constraints) { + final width = constraints.hasBoundedWidth + ? constraints.maxWidth + : MediaQuery.maybeSizeOf(context)?.width ?? 300; + final height = constraints.hasBoundedHeight + ? constraints.maxHeight + : widget.defaultHeight; + final size = Size(width, height); + final geometry = SeriesGeometry.layout( + size: size, + padding: widget.padding, + xAxis: widget.xAxis, + yAxis: widget.yAxis, + viewport: viewport, + ); + _geometry = geometry; + + final touch = widget.touch; + final x = _touchX; + final details = x == null ? null : _detailsAt(geometry, values, x); + _report(details); + + final tooltip = touch?.tooltip; + final tooltipChild = details == null || tooltip == null + ? null + : (tooltip.builder != null + ? tooltip.builder!(context, details) + : _defaultTooltip(tooltip, details, viewport)); + + return SizedBox( + width: width, + height: height, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned.fill( + child: CustomPaint( + painter: SeriesChartPainter( + geometry: geometry, + series: widget.series, + values: values, + xAxis: widget.xAxis, + yAxis: widget.yAxis, + grid: widget.grid, + border: widget.border, + referenceLines: widget.referenceLines, + bands: widget.bands, + backgroundColor: widget.backgroundColor, + clipToPlot: widget.clipToPlot, + textCache: _text, + ), + foregroundPainter: details == null || touch == null + ? null + : SeriesOverlayPainter( + geometry: geometry, + details: details, + touch: touch, + ), + ), + ), + if (tooltipChild != null && details != null && tooltip != null) + Positioned.fill( + child: IgnorePointer( + child: CustomSingleChildLayout( + delegate: _TooltipLayout( + anchor: details.position, + plot: geometry.plot, + placement: tooltip.placement, + margin: tooltip.margin, + ), + child: tooltipChild, + ), + ), + ), + ], + ), + ); + }, + ); + + chart = _withGestures(chart); + final label = widget.semanticLabel; + return label == null + ? chart + : Semantics(container: true, label: label, child: chart); + } + + static double? _lerpValue(double? from, double? to, double t) { + if (to == null) return null; + if (from == null) return to; + return lerpDouble(from, to, t); + } + + Widget _withGestures(Widget child) { + final touch = widget.touch; + if (touch == null) return child; + + Widget result = switch (touch.trigger) { + SeriesTouchTrigger.press => GestureDetector( + behavior: HitTestBehavior.opaque, + onTapDown: (d) => _showAt(d.localPosition), + onTapUp: (_) => _release(), + onTapCancel: _release, + onHorizontalDragStart: (d) => _showAt(d.localPosition), + onHorizontalDragUpdate: (d) => _showAt(d.localPosition), + onHorizontalDragEnd: (_) => _release(), + onHorizontalDragCancel: _release, + child: child, + ), + SeriesTouchTrigger.longPress => GestureDetector( + behavior: HitTestBehavior.opaque, + onLongPressStart: (d) => _showAt(d.localPosition), + onLongPressMoveUpdate: (d) => _showAt(d.localPosition), + onLongPressEnd: (_) => _release(), + onLongPressCancel: _release, + child: child, + ), + SeriesTouchTrigger.tap => GestureDetector( + behavior: HitTestBehavior.opaque, + onTapUp: (d) => _toggleAt(d.localPosition), + onHorizontalDragStart: (d) => _showAt(d.localPosition), + onHorizontalDragUpdate: (d) => _showAt(d.localPosition), + child: child, + ), + SeriesTouchTrigger.none => child, + }; + + if (touch.hover) { + result = MouseRegion( + onHover: (e) => _showAt(e.localPosition), + onExit: (_) => _release(), + child: result, + ); + } + return result; + } + + Widget _defaultTooltip( + SeriesTooltip tooltip, + SeriesTouchDetails details, + SeriesViewport viewport, + ) { + const base = TextStyle( + fontSize: 12, + color: Color(0xFFFFFFFF), + decoration: TextDecoration.none, + fontWeight: FontWeight.normal, + ); + final valueStyle = base.merge(tooltip.valueStyle); + final titleStyle = base + .copyWith(fontSize: 10, color: const Color(0xB3FFFFFF)) + .merge(tooltip.titleStyle); + final titleOf = tooltip.title; + final title = titleOf != null + ? titleOf(details) + : widget.xAxis.labelFor(details.x, step: viewport.xStep); + + final rows = [ + for (final value in details.values) + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 6, + height: 6, + margin: const EdgeInsets.only(right: 4), + decoration: BoxDecoration( + color: value.color, + shape: BoxShape.circle, + ), + ), + Text(_tooltipText(tooltip, value), maxLines: 1, style: valueStyle), + ], + ), + ]; + if (rows.isEmpty && (title == null || title.isEmpty)) { + return const SizedBox.shrink(); + } + + return DecoratedBox( + decoration: BoxDecoration( + color: tooltip.backgroundColor, + borderRadius: BorderRadius.circular(tooltip.borderRadius), + border: tooltip.borderColor == null + ? null + : Border.all(color: tooltip.borderColor!), + boxShadow: tooltip.shadows, + ), + child: Padding( + padding: tooltip.padding, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (title != null && title.isNotEmpty) + Text(title, maxLines: 1, style: titleStyle), + ...rows, + ], + ), + ), + ); + } + + String _tooltipText(SeriesTooltip tooltip, SeriesTouchValue value) { + final formatter = tooltip.valueFormatter; + final axisFormatter = widget.yAxis.formatter; + final text = formatter != null + ? formatter(value) + : axisFormatter != null + ? axisFormatter(value.value) + : _plainNumber(value.value); + final label = value.series.label; + return tooltip.showSeriesLabels && label != null && label.isNotEmpty + ? '$label: $text' + : text; + } + + static String _plainNumber(double value) { + if (value == value.roundToDouble()) return value.toStringAsFixed(0); + var text = value.toStringAsFixed(2); + while (text.endsWith('0')) { + text = text.substring(0, text.length - 1); + } + return text.endsWith('.') ? text.substring(0, text.length - 1) : text; + } +} + +/// Places the tooltip beside or above the touched point, kept inside the chart. +class _TooltipLayout extends SingleChildLayoutDelegate { + _TooltipLayout({ + required this.anchor, + required this.plot, + required this.placement, + required this.margin, + }); + + final Offset anchor; + final Rect plot; + final SeriesTooltipPlacement placement; + final double margin; + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) => + BoxConstraints.loose(constraints.biggest); + + @override + Offset getPositionForChild(Size size, Size childSize) { + final maxLeft = math.max(0.0, size.width - childSize.width); + final maxTop = math.max(0.0, size.height - childSize.height); + switch (placement) { + case SeriesTooltipPlacement.beside: + var left = anchor.dx + margin; + if (left + childSize.width > size.width) { + left = anchor.dx - margin - childSize.width; + } + return Offset( + left.clamp(0.0, maxLeft), + (plot.top + 4).clamp(0.0, maxTop), + ); + case SeriesTooltipPlacement.above: + var top = anchor.dy - margin - childSize.height; + if (top < 0) top = anchor.dy + margin; + return Offset( + (anchor.dx - childSize.width / 2).clamp(0.0, maxLeft), + top.clamp(0.0, maxTop), + ); + } + } + + @override + bool shouldRelayout(_TooltipLayout oldDelegate) => + oldDelegate.anchor != anchor || + oldDelegate.plot != plot || + oldDelegate.placement != placement || + oldDelegate.margin != margin; +} diff --git a/lib/src/series/series_chart_painter.dart b/lib/src/series/series_chart_painter.dart new file mode 100644 index 0000000..3dd1ef0 --- /dev/null +++ b/lib/src/series/series_chart_painter.dart @@ -0,0 +1,676 @@ +import 'dart:math' as math; + +import 'package:flutter/rendering.dart'; + +import '../renderer/text_painter_cache.dart'; +import 'series_axis.dart'; +import 'series_data.dart'; +import 'series_paths.dart'; +import 'series_scale.dart'; +import 'series_touch.dart'; + +/// Paints a [SeriesChart]: bands, grid, reference lines, series, border and +/// axis labels. +class SeriesChartPainter extends CustomPainter { + /// Creates the painter. `values[i][j]` is the value drawn for + /// `series[i].points[j]`, which is where an animation puts its in-between + /// values. + SeriesChartPainter({ + required this.geometry, + required this.series, + required this.values, + required this.xAxis, + required this.yAxis, + required this.grid, + required this.border, + required this.referenceLines, + required this.bands, + required this.backgroundColor, + required this.clipToPlot, + required this.textCache, + }); + + final SeriesGeometry geometry; + final List series; + final List> values; + final SeriesXAxis xAxis; + final SeriesYAxis yAxis; + final SeriesGrid grid; + final BorderSide? border; + final List referenceLines; + final List bands; + final Color? backgroundColor; + final bool clipToPlot; + final TextPainterCache textCache; + + static const TextStyle _baseLabelStyle = TextStyle( + fontSize: 10, + color: seriesAxisTextColor, + ); + + @override + void paint(Canvas canvas, Size size) { + final plot = geometry.plot; + final background = backgroundColor; + if (background != null) { + canvas.drawRect(Offset.zero & size, Paint()..color = background); + } + if (plot.width <= 0 || plot.height <= 0) return; + + canvas.save(); + canvas.clipRect(clipToPlot ? plot : Offset.zero & size); + _paintBands(canvas); + _paintGrid(canvas); + _paintReferenceLines(canvas, above: false); + + final barSeries = [ + for (final s in series) + if (s is BarSeries) s, + ]; + final barSpacing = _barSpacing(barSeries); + // Counted by position, not looked up: the same series given twice is two + // groups of bars side by side, not one drawn over the other. + var barGroup = 0; + for (var i = 0; i < series.length; i++) { + final row = i < values.length ? values[i] : const []; + switch (series[i]) { + case final LineSeries line: + _paintLine(canvas, size, line, row); + case final BarSeries bars: + _paintBars( + canvas, + bars, + row, + barGroup++, + barSeries.length, + barSpacing, + ); + } + } + _paintReferenceLines(canvas, above: true); + canvas.restore(); + + _paintBorder(canvas); + _paintReferenceLabels(canvas, size); + _paintValueLabels(canvas, size); + _paintXLabels(canvas, size); + } + + // ── Plot furniture ────────────────────────────────────────────────────── + + void _paintBands(Canvas canvas) { + final plot = geometry.plot; + for (final band in bands) { + final Rect rect; + if (band.direction == SeriesDirection.horizontal) { + final a = geometry.yToPx(band.from); + final b = geometry.yToPx(band.to); + rect = Rect.fromLTRB( + plot.left, + math.min(a, b), + plot.right, + math.max(a, b), + ); + } else { + final a = geometry.xToPx(band.from); + final b = geometry.xToPx(band.to); + rect = Rect.fromLTRB( + math.min(a, b), + plot.top, + math.max(a, b), + plot.bottom, + ); + } + canvas.drawRect(rect, Paint()..color = band.color); + } + } + + void _paintGrid(Canvas canvas) { + final plot = geometry.plot; + if (grid.horizontal && grid.width > 0) { + final path = Path(); + for (final tick in geometry.viewport.yTicks) { + final y = geometry.yToPx(tick); + path + ..moveTo(plot.left, y) + ..lineTo(plot.right, y); + } + canvas.drawPath( + dashSeriesPath(path, grid.dashPattern), + _strokePaint(grid.color, grid.width), + ); + } + if (grid.vertical && grid.width > 0) { + final path = Path(); + for (final tick in geometry.viewport.xTicks) { + final x = geometry.xToPx(tick); + path + ..moveTo(x, plot.top) + ..lineTo(x, plot.bottom); + } + canvas.drawPath( + dashSeriesPath(path, grid.verticalDashPattern ?? grid.dashPattern), + _strokePaint(grid.verticalColor ?? grid.color, grid.width), + ); + } + } + + void _paintReferenceLines(Canvas canvas, {required bool above}) { + final plot = geometry.plot; + for (final line in referenceLines) { + if (line.aboveSeries != above || line.width <= 0) continue; + final path = Path(); + if (line.direction == SeriesDirection.horizontal) { + final y = geometry.yToPx(line.value); + path + ..moveTo(plot.left, y) + ..lineTo(plot.right, y); + } else { + final x = geometry.xToPx(line.value); + path + ..moveTo(x, plot.top) + ..lineTo(x, plot.bottom); + } + canvas.drawPath( + dashSeriesPath(path, line.dashPattern), + _strokePaint(line.color, line.width), + ); + } + } + + void _paintReferenceLabels(Canvas canvas, Size size) { + final plot = geometry.plot; + for (final line in referenceLines) { + final label = line.label; + if (label == null || label.isEmpty) continue; + final style = _baseLabelStyle + .copyWith(color: line.color) + .merge(line.labelStyle); + final tp = textCache.get(label, style); + final align = line.labelAlignment; + double dx; + double dy; + if (line.direction == SeriesDirection.horizontal) { + final y = geometry.yToPx(line.value); + if (y < plot.top - 0.5 || y > plot.bottom + 0.5) continue; + dx = _lerp(plot.left + 4, plot.right - 4 - tp.width, (align.x + 1) / 2); + dy = align.y < 0 + ? y - tp.height - 2 + : align.y > 0 + ? y + 2 + : y - tp.height / 2; + } else { + final x = geometry.xToPx(line.value); + if (x < plot.left - 0.5 || x > plot.right + 0.5) continue; + dx = align.x < 0 + ? x - tp.width - 2 + : align.x > 0 + ? x + 2 + : x - tp.width / 2; + dy = _lerp( + plot.top + 2, + plot.bottom - 2 - tp.height, + (align.y + 1) / 2, + ); + } + dx = dx.clamp(0.0, math.max(0.0, size.width - tp.width)); + dy = dy.clamp(0.0, math.max(0.0, size.height - tp.height)); + tp.paint(canvas, Offset(dx, dy)); + } + } + + void _paintBorder(Canvas canvas) { + final side = border; + if (side == null || side.style == BorderStyle.none || side.width <= 0) { + return; + } + canvas.drawRect( + geometry.plot.deflate(side.width / 2), + _strokePaint(side.color, side.width), + ); + } + + // ── Axis labels ───────────────────────────────────────────────────────── + + void _paintValueLabels(Canvas canvas, Size size) { + if (!yAxis.show) return; + final plot = geometry.plot; + final style = _baseLabelStyle.merge(yAxis.style); + final step = geometry.viewport.yStep; + for (final tick in geometry.viewport.yTicks) { + final text = yAxis.format(tick, step); + if (text.isEmpty) continue; + final tp = textCache.get(text, style); + final y = geometry.yToPx(tick); + final top = (y - tp.height / 2) + .clamp(0.0, math.max(0.0, size.height - tp.height)) + .toDouble(); + final left = yAxis.side == SeriesAxisSide.left + ? math.max(0.0, plot.left - yAxis.gap - tp.width) + : plot.right + yAxis.gap; + tp.paint(canvas, Offset(left, top)); + } + } + + void _paintXLabels(Canvas canvas, Size size) { + if (!xAxis.show) return; + final plot = geometry.plot; + final style = _baseLabelStyle.merge(xAxis.style); + var previousRight = double.negativeInfinity; + final step = geometry.viewport.xStep; + for (final tick in geometry.viewport.xTicks) { + final text = xAxis.labelFor(tick, step: step); + if (text == null || text.isEmpty) continue; + final tp = textCache.get(text, style); + var left = geometry.xToPx(tick) - tp.width / 2; + if (xAxis.fitInside) { + left = left.clamp(0.0, math.max(0.0, size.width - tp.width)); + } + // A label that would run into the one before it is dropped rather than + // drawn on top of it. + if (left < previousRight + 4) continue; + tp.paint(canvas, Offset(left, plot.bottom + xAxis.gap)); + previousRight = left + tp.width; + } + } + + // ── Lines ─────────────────────────────────────────────────────────────── + + void _paintLine( + Canvas canvas, + Size size, + LineSeries line, + List row, + ) { + final runs = >[]; + var run = []; + for (var j = 0; j < line.points.length; j++) { + final x = line.points[j].x; + final y = j < row.length ? row[j] : null; + if (y == null || !y.isFinite || !x.isFinite) { + if (run.isNotEmpty) { + runs.add(run); + run = []; + } + continue; + } + run.add(Offset(geometry.xToPx(x), geometry.yToPx(y))); + } + if (run.isNotEmpty) runs.add(run); + if (runs.isEmpty) return; + + if (line.fill != null) _paintFill(canvas, size, line, runs); + + if (line.width > 0) { + final path = Path(); + for (final r in runs) { + addSeriesRun(path, r, line.curve); + } + _paintStroke(canvas, size, line, dashSeriesPath(path, line.dashPattern)); + } + + _paintDots(canvas, line, row); + } + + void _paintFill( + Canvas canvas, + Size size, + LineSeries line, + List> runs, + ) { + final fill = line.fill!; + final plot = geometry.plot; + final baseY = fill.toBaseline + ? geometry.yToPx(line.baseline).clamp(plot.top, plot.bottom) + : plot.bottom; + + final area = Path(); + var highest = double.infinity; + var lowest = double.negativeInfinity; + for (final r in runs) { + if (r.length < 2) continue; + addSeriesRun(area, r, line.curve); + area + ..lineTo(r.last.dx, baseY) + ..lineTo(r.first.dx, baseY) + ..close(); + for (final p in r) { + highest = math.min(highest, p.dy); + lowest = math.max(lowest, p.dy); + } + } + if (highest > lowest) return; + + if (!fill.toBaseline) { + final paint = _areaPaint( + fill.gradient, + fill.color, + Rect.fromLTRB( + plot.left, + highest, + plot.right, + math.max(plot.bottom, highest + 1), + ), + ); + if (paint != null) canvas.drawPath(area, paint); + return; + } + + if (highest < baseY) { + final paint = _areaPaint( + fill.gradient, + fill.color, + Rect.fromLTRB( + plot.left, + highest, + plot.right, + math.max(baseY, highest + 1), + ), + ); + if (paint != null) { + canvas + ..save() + ..clipRect(Rect.fromLTRB(0, 0, size.width, baseY)) + ..drawPath(area, paint) + ..restore(); + } + } + + if (lowest > baseY) { + final upper = fill.gradient; + final gradient = + fill.negativeGradient ?? + (upper == null + ? null + : fill.mirrorBelowBaseline + ? _mirrored(upper) + : upper); + final paint = _areaPaint( + gradient, + fill.negativeColor ?? fill.color, + Rect.fromLTRB( + plot.left, + baseY, + plot.right, + math.max(lowest, baseY + 1), + ), + ); + if (paint != null) { + canvas + ..save() + ..clipRect(Rect.fromLTRB(0, baseY, size.width, size.height)) + ..drawPath(area, paint) + ..restore(); + } + } + } + + void _paintStroke(Canvas canvas, Size size, LineSeries line, Path path) { + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = line.width + ..strokeCap = line.roundCap ? StrokeCap.round : StrokeCap.butt + ..strokeJoin = StrokeJoin.round + ..isAntiAlias = true; + final gradient = line.gradient; + if (gradient != null) { + paint.shader = gradient.createShader(geometry.plot); + } else { + paint.color = line.color; + } + + final negative = line.negativeColor; + if (negative == null) { + canvas.drawPath(path, paint); + return; + } + + // Split at the baseline: whatever lies above keeps the series colour and + // whatever lies below takes the negative one, cut exactly where the line + // crosses rather than at the nearest point. + final baseY = geometry.yToPx(line.baseline).clamp(0.0, size.height); + canvas + ..save() + ..clipRect(Rect.fromLTRB(0, 0, size.width, baseY)) + ..drawPath(path, paint) + ..restore(); + paint + ..shader = null + ..color = negative; + canvas + ..save() + ..clipRect(Rect.fromLTRB(0, baseY, size.width, size.height)) + ..drawPath(path, paint) + ..restore(); + } + + void _paintDots(Canvas canvas, LineSeries line, List row) { + if (line.dot == null && line.dotBuilder == null) return; + for (var j = 0; j < line.points.length && j < row.length; j++) { + final y = row[j]; + final point = line.points[j]; + if (y == null || !y.isFinite || point.isGap) continue; + final dot = line.dotAt(j, point); + if (dot == null) continue; + paintSeriesDot( + canvas, + Offset(geometry.xToPx(point.x), geometry.yToPx(y)), + dot, + line.colorAt(point.y!), + ); + } + } + + // ── Bars ──────────────────────────────────────────────────────────────── + + /// The smallest gap between two x values any bar series uses, so bars at + /// irregular positions never overlap. + static double _barSpacing(List bars) { + var spacing = double.infinity; + for (final s in bars) { + for (var j = 1; j < s.points.length; j++) { + final gap = (s.points[j].x - s.points[j - 1].x).abs(); + if (gap > 0) spacing = math.min(spacing, gap); + } + } + return spacing.isFinite ? spacing : 1; + } + + void _paintBars( + Canvas canvas, + BarSeries bars, + List row, + int group, + int groups, + double spacing, + ) { + final plot = geometry.plot; + final slot = geometry.unitWidth * spacing; + const gap = 2.0; + final raw = bars.width ?? slot * bars.widthFactor / math.max(1, groups); + final width = raw + .clamp(bars.minWidth, math.max(bars.minWidth, bars.maxWidth)) + .toDouble(); + final offset = + (group - (groups - 1) / 2) * (width + (groups > 1 ? gap : 0)); + final baseY = geometry.yToPx(bars.baseline).clamp(plot.top, plot.bottom); + + final track = bars.trackColor; + final trackPath = Path(); + final byColor = {}; + final shaded = []; + + for (var j = 0; j < bars.points.length && j < row.length; j++) { + final y = row[j]; + final point = bars.points[j]; + if (y == null || !y.isFinite || point.isGap) continue; + final centre = geometry.xToPx(point.x) + offset; + final left = centre - width / 2; + final right = centre + width / 2; + if (right < plot.left || left > plot.right) continue; + + if (track != null) { + trackPath.addRRect( + RRect.fromLTRBR( + left, + plot.top, + right, + plot.bottom, + Radius.circular(math.min(bars.radius, width / 2)), + ), + ); + } + + final shape = seriesBarShape( + left: left, + right: right, + valueY: geometry.yToPx(y).clamp(plot.top - 1, plot.bottom + 1), + baseY: baseY, + radius: bars.radius, + ); + if (shape == null) continue; + if (bars.gradient != null) { + shaded.add(shape); + } else { + byColor + .putIfAbsent(bars.barColorAt(j, point), Path.new) + .addRRect(shape); + } + } + + if (track != null) canvas.drawPath(trackPath, Paint()..color = track); + // One draw per colour, however many bars there are. + byColor.forEach((color, path) { + canvas.drawPath(path, Paint()..color = color); + }); + final gradient = bars.gradient; + if (gradient != null) { + for (final shape in shaded) { + canvas.drawRRect( + shape, + Paint()..shader = gradient.createShader(shape.outerRect), + ); + } + } + } + + // ── Helpers ───────────────────────────────────────────────────────────── + + static Paint _strokePaint(Color color, double width) => Paint() + ..style = PaintingStyle.stroke + ..color = color + ..strokeWidth = width + ..isAntiAlias = true; + + static Paint? _areaPaint(Gradient? gradient, Color? color, Rect rect) { + if (gradient != null) return Paint()..shader = gradient.createShader(rect); + if (color != null) return Paint()..color = color; + return null; + } + + static Gradient _mirrored(Gradient gradient) => gradient is LinearGradient + ? LinearGradient( + begin: gradient.end, + end: gradient.begin, + colors: gradient.colors, + stops: gradient.stops, + tileMode: gradient.tileMode, + transform: gradient.transform, + ) + : gradient; + + static double _lerp(double a, double b, double t) => a + (b - a) * t; + + @override + bool shouldRepaint(SeriesChartPainter oldDelegate) => true; +} + +/// Paints [dot] at [centre], filled with [fallback] when it names no colour. +void paintSeriesDot( + Canvas canvas, + Offset centre, + SeriesDot dot, + Color fallback, +) { + if (dot.radius <= 0) return; + canvas.drawCircle( + centre, + dot.radius, + Paint() + ..color = dot.color ?? fallback + ..isAntiAlias = true, + ); + final ring = dot.strokeColor; + if (ring != null && dot.strokeWidth > 0) { + canvas.drawCircle( + centre, + dot.radius, + Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = dot.strokeWidth + ..color = ring + ..isAntiAlias = true, + ); + } +} + +/// Paints a [SeriesChart]'s crosshair and markers over the plot. +class SeriesOverlayPainter extends CustomPainter { + /// Creates the overlay for [details]. + SeriesOverlayPainter({ + required this.geometry, + required this.details, + required this.touch, + }); + + final SeriesGeometry geometry; + final SeriesTouchDetails details; + final SeriesTouch touch; + + @override + void paint(Canvas canvas, Size size) { + final plot = geometry.plot; + final x = details.position.dx; + if (x < plot.left - 0.5 || x > plot.right + 0.5) return; + + final vertical = touch.line; + if (vertical != null && vertical.width > 0) { + canvas.drawPath( + dashSeriesPath( + Path() + ..moveTo(x, plot.top) + ..lineTo(x, plot.bottom), + vertical.dashPattern, + ), + SeriesChartPainter._strokePaint(vertical.color, vertical.width), + ); + } + + final horizontal = touch.horizontalLine; + if (horizontal != null && + horizontal.width > 0 && + details.values.isNotEmpty) { + final y = details.values.first.position.dy; + canvas.drawPath( + dashSeriesPath( + Path() + ..moveTo(plot.left, y) + ..lineTo(plot.right, y), + horizontal.dashPattern, + ), + SeriesChartPainter._strokePaint(horizontal.color, horizontal.width), + ); + } + + if (!touch.showMarkers) return; + for (final value in details.values) { + final builder = touch.markerBuilder; + final dot = builder != null ? builder(value) : const SeriesDot(radius: 4); + if (dot == null) continue; + paintSeriesDot(canvas, value.position, dot, value.color); + } + } + + @override + bool shouldRepaint(SeriesOverlayPainter oldDelegate) => true; +} diff --git a/lib/src/series/series_data.dart b/lib/src/series/series_data.dart new file mode 100644 index 0000000..7a9355a --- /dev/null +++ b/lib/src/series/series_data.dart @@ -0,0 +1,376 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +/// One value on a [SeriesChart]'s plot. +/// +/// [x] is any number — an index, a day count, a price — and [y] is the value +/// drawn against it. A null or non-finite [y] is a gap: a line breaks there +/// and a bar is left out. +@immutable +class SeriesPoint { + /// Creates the point ([x], [y]). + const SeriesPoint(this.x, this.y); + + /// Where the point sits along the horizontal axis. + final double x; + + /// The value, or null for a gap. + final double? y; + + /// Whether there is no value here to draw. + bool get isGap { + final value = y; + return value == null || !value.isFinite; + } + + @override + bool operator ==(Object other) => + other is SeriesPoint && other.x == x && other.y == y; + + @override + int get hashCode => Object.hash(x, y); + + @override + String toString() => 'SeriesPoint($x, $y)'; +} + +/// Points at `x = 0, 1, 2, …` for a list of plain values. +List pointsOf(List values) => [ + for (var i = 0; i < values.length; i++) SeriesPoint(i.toDouble(), values[i]), +]; + +/// How a [LineSeries] joins one point to the next. +enum LineCurve { + /// Straight segments. + linear, + + /// A curve through every point that can swing past a peak or a trough + /// between two points — `fl_chart`'s `isCurved`. + smooth, + + /// A curve through every point that never swings past its neighbours, so a + /// peak on the line is a peak in the data — `fl_chart`'s `isCurved` with + /// `preventCurveOverShooting`. + monotone, + + /// Holds each value flat until the next point, then steps to it. + step, +} + +/// A dot drawn on a point. +@immutable +class SeriesDot { + /// Creates a dot of [radius], filled with [color] and ringed by + /// [strokeColor]. + const SeriesDot({ + this.radius = 3, + this.color, + this.strokeColor, + this.strokeWidth = 0, + }); + + /// Radius in logical pixels. + final double radius; + + /// Fill colour; null uses the series colour at that value. + final Color? color; + + /// Ring colour; null draws no ring. + final Color? strokeColor; + + /// Ring width; 0 draws no ring. + final double strokeWidth; + + @override + bool operator ==(Object other) => + other is SeriesDot && + other.radius == radius && + other.color == color && + other.strokeColor == strokeColor && + other.strokeWidth == strokeWidth; + + @override + int get hashCode => Object.hash(radius, color, strokeColor, strokeWidth); +} + +/// Decides the dot for one point, or returns null to leave it without one. +typedef SeriesDotBuilder = SeriesDot? Function(int index, SeriesPoint point); + +/// The area between a [LineSeries] and its baseline, or the bottom of the plot. +/// +/// A fill anchored to the baseline never paints across it. The stretch above +/// is painted with [gradient] (or [color]) measured from the line's highest +/// point down to the baseline, so it fades out exactly at the baseline; the +/// stretch below is painted with [negativeGradient] (or [negativeColor]), +/// measured from the baseline down to the line's lowest point. Left unset, the +/// part below reuses the upper gradient turned upside down, so both halves +/// fade away from the line the same way. +@immutable +class SeriesFill { + /// Creates a fill. + const SeriesFill({ + this.color, + this.gradient, + this.negativeColor, + this.negativeGradient, + this.toBaseline = true, + this.mirrorBelowBaseline = true, + }); + + /// A vertical fade from [color] at [opacity] under the line to transparent + /// at the baseline. + factory SeriesFill.fade( + Color color, { + double opacity = 0.24, + Color? negativeColor, + bool toBaseline = true, + }) => SeriesFill( + gradient: _fade(color, opacity), + negativeGradient: negativeColor == null + ? null + : _fade(negativeColor, opacity, upward: true), + toBaseline: toBaseline, + ); + + static LinearGradient _fade( + Color color, + double opacity, { + bool upward = false, + }) => LinearGradient( + begin: upward ? Alignment.bottomCenter : Alignment.topCenter, + end: upward ? Alignment.topCenter : Alignment.bottomCenter, + colors: [ + color.withValues(alpha: opacity), + color.withValues(alpha: 0), + ], + ); + + /// Flat colour above the baseline; ignored when [gradient] is set. + final Color? color; + + /// Gradient above the baseline, top of the line to the baseline. + final Gradient? gradient; + + /// Flat colour below the baseline; null follows [color]. + final Color? negativeColor; + + /// Gradient below the baseline, baseline to the bottom of the line; null + /// follows [gradient], mirrored when [mirrorBelowBaseline] is set. + final Gradient? negativeGradient; + + /// Fills to the series' `baseline` when true, and to the bottom of the plot + /// when false. + final bool toBaseline; + + /// Whether the part below the baseline turns [gradient] upside down. + final bool mirrorBelowBaseline; + + @override + bool operator ==(Object other) => + other is SeriesFill && + other.color == color && + other.gradient == gradient && + other.negativeColor == negativeColor && + other.negativeGradient == negativeGradient && + other.toBaseline == toBaseline && + other.mirrorBelowBaseline == mirrorBelowBaseline; + + @override + int get hashCode => Object.hash( + color, + gradient, + negativeColor, + negativeGradient, + toBaseline, + mirrorBelowBaseline, + ); +} + +const Color _defaultSeriesColor = Color(0xFF4C86CD); + +/// One set of values on a [SeriesChart]: a [LineSeries] or a [BarSeries]. +/// +/// Points are read in order and should run from the lowest x to the highest. +sealed class PlotSeries { + const PlotSeries({ + required this.points, + this.label, + this.color = _defaultSeriesColor, + this.negativeColor, + this.baseline = 0, + this.showInTooltip = true, + }); + + /// The values, lowest x first. + final List points; + + /// A name for the series, shown by the default tooltip. + final String? label; + + /// The series colour. + final Color color; + + /// The colour of whatever lies below [baseline]; null keeps [color]. + final Color? negativeColor; + + /// The value the series is measured from: where a fill stops, where bars + /// grow from, and where [negativeColor] takes over. + final double baseline; + + /// Whether the series gets a marker and a tooltip row when touched. + final bool showInTooltip; + + /// The colour the series is drawn in at [value]. + Color colorAt(double value) { + final negative = negativeColor; + return negative != null && value < baseline ? negative : color; + } +} + +/// A line through a series of values, optionally filled and dotted. +final class LineSeries extends PlotSeries { + /// Creates a line through [points]. + const LineSeries({ + required super.points, + super.label, + super.color, + super.negativeColor, + super.baseline, + super.showInTooltip, + this.gradient, + this.width = 2, + this.curve = LineCurve.linear, + this.dashPattern, + this.roundCap = true, + this.fill, + this.dot, + this.dotBuilder, + }); + + /// Creates a line through plain [values], placed at `x = 0, 1, 2, …`. + LineSeries.values( + List values, { + super.label, + super.color, + super.negativeColor, + super.baseline, + super.showInTooltip, + this.gradient, + this.width = 2, + this.curve = LineCurve.linear, + this.dashPattern, + this.roundCap = true, + this.fill, + this.dot, + this.dotBuilder, + }) : super(points: pointsOf(values)); + + /// Paints the stroke with a gradient laid over the whole plot, top to + /// bottom, instead of [color]. [negativeColor] still wins below the + /// baseline when it is set. + final Gradient? gradient; + + /// Stroke width; 0 draws no line, which with [dot] makes a scatter plot. + final double width; + + /// How the line joins its points. + final LineCurve curve; + + /// Alternating dash and gap lengths, such as `[6, 4]`; null draws solid. + final List? dashPattern; + + /// Whether the line's ends and dashes are rounded. + final bool roundCap; + + /// The area under the line; null leaves it unfilled. + final SeriesFill? fill; + + /// A dot on every point; null draws none unless [dotBuilder] gives one. + final SeriesDot? dot; + + /// Chooses the dot per point, overriding [dot]; return null for no dot. + final SeriesDotBuilder? dotBuilder; + + /// The dot drawn on [points]`[index]`, if any. + SeriesDot? dotAt(int index, SeriesPoint point) { + final builder = dotBuilder; + return builder != null ? builder(index, point) : dot; + } +} + +/// Chooses the colour of one bar. +typedef BarColorBuilder = Color Function(int index, SeriesPoint point); + +/// One bar per value, grown from the series' baseline. +/// +/// Several bar series on one chart stand side by side at each x. +final class BarSeries extends PlotSeries { + /// Creates bars at [points]. + const BarSeries({ + required super.points, + super.label, + super.color, + super.negativeColor, + super.baseline, + super.showInTooltip, + this.gradient, + this.colorBuilder, + this.width, + this.widthFactor = 0.6, + this.minWidth = 0, + this.maxWidth = double.infinity, + this.radius = 0, + this.trackColor, + }); + + /// Creates bars for plain [values], placed at `x = 0, 1, 2, …`. + BarSeries.values( + List values, { + super.label, + super.color, + super.negativeColor, + super.baseline, + super.showInTooltip, + this.gradient, + this.colorBuilder, + this.width, + this.widthFactor = 0.6, + this.minWidth = 0, + this.maxWidth = double.infinity, + this.radius = 0, + this.trackColor, + }) : super(points: pointsOf(values)); + + /// Paints every bar with this gradient, measured over the bar itself. + final Gradient? gradient; + + /// Chooses each bar's colour, overriding [color] and [negativeColor]. + final BarColorBuilder? colorBuilder; + + /// A fixed bar width in logical pixels; null sizes bars by [widthFactor]. + final double? width; + + /// The share of the room between two neighbouring x values that the bars + /// at one x take together, before [minWidth] and [maxWidth] are applied. + final double widthFactor; + + /// The narrowest a bar may be. + final double minWidth; + + /// The widest a bar may be. + final double maxWidth; + + /// Corner radius on the end away from the baseline — the top of a bar above + /// it, the bottom of one below. + final double radius; + + /// A full-height bar painted behind each one, such as a faint track. + final Color? trackColor; + + /// The colour of the bar at [points]`[index]`. + Color barColorAt(int index, SeriesPoint point) { + final builder = colorBuilder; + if (builder != null) return builder(index, point); + return colorAt(point.y ?? baseline); + } +} diff --git a/lib/src/series/series_paths.dart b/lib/src/series/series_paths.dart new file mode 100644 index 0000000..eedb8c4 --- /dev/null +++ b/lib/src/series/series_paths.dart @@ -0,0 +1,173 @@ +import 'dart:math' as math; +import 'dart:ui'; + +import 'series_data.dart'; + +/// Appends one unbroken run of [points], in pixels and left to right, to +/// [path], joined as [curve] says. +void addSeriesRun(Path path, List points, LineCurve curve) { + if (points.isEmpty) return; + path.moveTo(points.first.dx, points.first.dy); + if (points.length == 1) return; + switch (curve) { + case LineCurve.linear: + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i].dx, points[i].dy); + } + case LineCurve.step: + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i].dx, points[i - 1].dy); + path.lineTo(points[i].dx, points[i].dy); + } + case LineCurve.smooth: + _smooth(path, points); + case LineCurve.monotone: + _monotone(path, points); + } +} + +/// A cubic through every point whose handles follow the neighbours on either +/// side, the way `fl_chart` draws `isCurved`. +void _smooth(Path path, List points) { + const smoothness = 0.35; + var handle = Offset.zero; + for (var i = 1; i < points.length; i++) { + final previous = points[i - 1]; + final current = points[i]; + final next = i + 1 < points.length ? points[i + 1] : current; + final control1 = previous + handle; + handle = (next - previous) / 2 * smoothness; + final control2 = current - handle; + path.cubicTo( + control1.dx, + control1.dy, + control2.dx, + control2.dy, + current.dx, + current.dy, + ); + } +} + +/// A monotone cubic (Fritsch–Carlson): it passes through every point, and +/// between two points it never goes above the higher or below the lower. +void _monotone(Path path, List points) { + final tangents = monotoneTangents(points); + for (var i = 0; i < points.length - 1; i++) { + final a = points[i]; + final b = points[i + 1]; + final third = (b.dx - a.dx) / 3; + path.cubicTo( + a.dx + third, + a.dy + tangents[i] * third, + b.dx - third, + b.dy - tangents[i + 1] * third, + b.dx, + b.dy, + ); + } +} + +/// The slope of a monotone cubic at each of [points]. +List monotoneTangents(List points) { + final n = points.length; + if (n < 2) return List.filled(n, 0); + + final secants = List.filled(n - 1, 0); + for (var i = 0; i < n - 1; i++) { + final run = points[i + 1].dx - points[i].dx; + secants[i] = run == 0 ? 0 : (points[i + 1].dy - points[i].dy) / run; + } + + final tangents = List.filled(n, 0); + tangents[0] = secants[0]; + tangents[n - 1] = secants[n - 2]; + for (var i = 1; i < n - 1; i++) { + // A peak or a trough gets a flat tangent, which is what keeps the curve + // from swinging past it. + tangents[i] = secants[i - 1] * secants[i] <= 0 + ? 0 + : (secants[i - 1] + secants[i]) / 2; + } + + for (var i = 0; i < n - 1; i++) { + if (secants[i] == 0) { + tangents[i] = 0; + tangents[i + 1] = 0; + continue; + } + final a = tangents[i] / secants[i]; + final b = tangents[i + 1] / secants[i]; + final magnitude = a * a + b * b; + if (magnitude > 9) { + final scale = 3 / math.sqrt(magnitude); + tangents[i] = scale * a * secants[i]; + tangents[i + 1] = scale * b * secants[i]; + } + } + return tangents; +} + +/// [source] cut into dashes by [pattern] — dash, gap, dash, gap … +/// +/// Returns [source] itself for an empty or all-zero pattern. +Path dashSeriesPath(Path source, List? pattern) { + if (pattern == null || pattern.isEmpty || !pattern.any((v) => v > 0)) { + return source; + } + final dashed = Path(); + for (final metric in source.computeMetrics()) { + var distance = 0.0; + var index = 0; + while (distance < metric.length) { + final length = math.max(0.0, pattern[index % pattern.length]); + if (index.isEven && length > 0) { + dashed.addPath( + metric.extractPath( + distance, + math.min(distance + length, metric.length), + ), + Offset.zero, + ); + } + distance += length; + index++; + } + } + return dashed; +} + +/// The shape of one bar: [left] to [right] across, from [valueY] to [baseY] +/// down the plot, rounded by [radius] on the end at [valueY]. +/// +/// Returns null for a bar with no height or no width. +RRect? seriesBarShape({ + required double left, + required double right, + required double valueY, + required double baseY, + required double radius, +}) { + final width = right - left; + final height = (baseY - valueY).abs(); + if (width <= 0 || height <= 0) return null; + + final rect = Rect.fromLTRB( + left, + math.min(valueY, baseY), + right, + math.max(valueY, baseY), + ); + final r = Radius.circular( + math.max(0.0, math.min(radius, math.min(width / 2, height))), + ); + // Above the baseline the value is the top edge; below it, the bottom. + final up = valueY <= baseY; + return RRect.fromRectAndCorners( + rect, + topLeft: up ? r : Radius.zero, + topRight: up ? r : Radius.zero, + bottomLeft: up ? Radius.zero : r, + bottomRight: up ? Radius.zero : r, + ); +} diff --git a/lib/src/series/series_range_selector.dart b/lib/src/series/series_range_selector.dart new file mode 100644 index 0000000..148ef0d --- /dev/null +++ b/lib/src/series/series_range_selector.dart @@ -0,0 +1,289 @@ +import 'dart:math' as math; + +import 'package:flutter/gestures.dart' show DragStartBehavior; +import 'package:flutter/widgets.dart'; + +import 'series_axis.dart'; +import 'series_chart.dart'; +import 'series_data.dart'; + +/// A stretch of x, from [start] to [end]. +@immutable +class SeriesWindow { + /// Creates the window [start]–[end]. + const SeriesWindow(this.start, this.end); + + /// The first x in the window. + final double start; + + /// The last x in the window. + final double end; + + /// How much x the window covers. + double get span => end - start; + + @override + bool operator ==(Object other) => + other is SeriesWindow && other.start == start && other.end == end; + + @override + int get hashCode => Object.hash(start, end); + + @override + String toString() => 'SeriesWindow($start, $end)'; +} + +/// A small chart of a whole series with a window over it that can be dragged +/// and resized — the strip under a chart that shows only part of its data. +/// +/// Drag inside the window to move it, or drag either handle to move that edge. +/// The window itself is yours: show it on the main chart through its `minX` +/// and `maxX`, and keep the one [onChanged] reports. +/// +/// ```dart +/// SeriesChart(series: series, minX: window.start - .5, maxX: window.end + .5); +/// SeriesRangeSelector( +/// series: series, +/// window: window, +/// minSpan: 4, +/// onChanged: (next) => setState(() => window = next), +/// ); +/// ``` +class SeriesRangeSelector extends StatefulWidget { + /// Creates a range selector over [series]. + const SeriesRangeSelector({ + super.key, + required this.series, + required this.window, + required this.onChanged, + this.minSpan = 1, + this.height = 52, + this.xPadding = 0.5, + this.border = const BorderSide(color: seriesGridColor), + this.maskColor = const Color(0x99000000), + this.windowBorderColor = const Color(0xFF909196), + this.handleColor = const Color(0xFFFFFFFF), + this.handleBorderColor = const Color(0xFF909196), + this.handleGripColor = const Color(0xFF909196), + }); + + /// The whole data set, drawn small. + final List series; + + /// The part of it the main chart shows. + final SeriesWindow window; + + /// Called with the new window while it is dragged. + final ValueChanged onChanged; + + /// The narrowest the window may be made, in x units. + final double minSpan; + + /// The selector's height. + final double height; + + /// Room either side of the data, in x units. + final double xPadding; + + /// A line around the small chart; null draws none. + final BorderSide? border; + + /// Shade over the parts outside the window. + final Color maskColor; + + /// Lines along the top and bottom of the window. + final Color windowBorderColor; + + /// Handle fill. + final Color handleColor; + + /// Handle outline. + final Color handleBorderColor; + + /// The two grip lines on each handle. + final Color handleGripColor; + + @override + State createState() => _SeriesRangeSelectorState(); +} + +class _SeriesRangeSelectorState extends State { + static const double _handleWidth = 10; + static const double _handleHitWidth = 28; + + /// The window as it was when the current drag began, and where the finger + /// was then. Every update is measured from here rather than added up from + /// deltas, so the drag neither loses its slop nor drifts from the finger. + SeriesWindow? _dragFrom; + double _dragOrigin = 0; + + void _begin(DragStartDetails details) { + _dragFrom = widget.window; + _dragOrigin = details.globalPosition.dx; + } + + void _end([Object? _]) => _dragFrom = null; + + @override + Widget build(BuildContext context) { + var low = double.infinity; + var high = double.negativeInfinity; + for (final s in widget.series) { + for (final p in s.points) { + low = math.min(low, p.x); + high = math.max(high, p.x); + } + } + if (!(high > low)) return SizedBox(height: widget.height); + + final domainStart = low - widget.xPadding; + final domainEnd = high + widget.xPadding; + final domain = domainEnd - domainStart; + final minSpan = math.min(widget.minSpan, high - low); + + return SizedBox( + height: widget.height, + child: LayoutBuilder( + builder: (context, constraints) { + final width = constraints.maxWidth; + double px(double x) => (x - domainStart) / domain * width; + + GestureDragUpdateCallback drag( + SeriesWindow Function(SeriesWindow from, double units) move, + ) => (details) { + // A selector with no width has nothing to measure a drag against. + if (width <= 0) return; + final from = _dragFrom ?? widget.window; + final units = + (details.globalPosition.dx - _dragOrigin) / width * domain; + final next = move(from, units); + if (next != widget.window) widget.onChanged(next); + }; + + final pan = drag((from, units) { + final span = from.span; + final start = (from.start + units) + .clamp(low, math.max(low, high - span)) + .toDouble(); + return SeriesWindow(start, start + span); + }); + final moveStart = drag((from, units) { + final start = (from.start + units) + .clamp(low, math.max(low, from.end - minSpan)) + .toDouble(); + return SeriesWindow(start, from.end); + }); + final moveEnd = drag((from, units) { + final end = (from.end + units) + .clamp(math.min(from.start + minSpan, high), high) + .toDouble(); + return SeriesWindow(from.start, end); + }); + + final startPx = px(widget.window.start); + final endPx = px(widget.window.end); + + return Stack( + children: [ + Positioned.fill( + child: IgnorePointer( + child: SeriesChart( + series: widget.series, + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + grid: SeriesGrid.none, + border: widget.border, + minX: domainStart, + maxX: domainEnd, + yPadding: 0.05, + touch: null, + ), + ), + ), + Positioned( + left: 0, + top: 0, + bottom: 0, + width: math.max(0, startPx), + child: ColoredBox(color: widget.maskColor), + ), + Positioned( + left: endPx, + top: 0, + bottom: 0, + right: 0, + child: ColoredBox(color: widget.maskColor), + ), + Positioned( + left: startPx, + top: 0, + bottom: 0, + width: math.max(0, endPx - startPx), + child: _draggable( + onUpdate: pan, + cursor: SystemMouseCursors.grab, + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.symmetric( + horizontal: BorderSide(color: widget.windowBorderColor), + ), + ), + ), + ), + ), + _handle(startPx, moveStart), + _handle(endPx, moveEnd), + ], + ); + }, + ), + ); + } + + Widget _draggable({ + required GestureDragUpdateCallback onUpdate, + required MouseCursor cursor, + required Widget child, + }) => GestureDetector( + behavior: HitTestBehavior.translucent, + dragStartBehavior: DragStartBehavior.down, + onHorizontalDragStart: _begin, + onHorizontalDragUpdate: onUpdate, + onHorizontalDragEnd: _end, + onHorizontalDragCancel: _end, + child: MouseRegion(cursor: cursor, child: child), + ); + + Widget _handle( + double centre, + GestureDragUpdateCallback onUpdate, + ) => Positioned( + left: centre - _handleHitWidth / 2, + top: 0, + bottom: 0, + width: _handleHitWidth, + child: _draggable( + onUpdate: onUpdate, + cursor: SystemMouseCursors.resizeLeftRight, + child: Center( + child: Container( + width: _handleWidth, + height: 22, + decoration: BoxDecoration( + color: widget.handleColor, + border: Border.all(color: widget.handleBorderColor), + borderRadius: BorderRadius.circular(3), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container(width: 1, height: 10, color: widget.handleGripColor), + const SizedBox(width: 2), + Container(width: 1, height: 10, color: widget.handleGripColor), + ], + ), + ), + ), + ), + ); +} diff --git a/lib/src/series/series_scale.dart b/lib/src/series/series_scale.dart new file mode 100644 index 0000000..a3ab91d --- /dev/null +++ b/lib/src/series/series_scale.dart @@ -0,0 +1,340 @@ +import 'dart:math' as math; +import 'dart:ui'; + +import 'package:flutter/painting.dart' show EdgeInsets; + +import '../utils/axis_ticks.dart'; +import 'series_axis.dart'; +import 'series_data.dart'; + +/// The window of values a [SeriesChart] shows, and where its axes are ruled. +class SeriesViewport { + /// Creates a viewport. + const SeriesViewport({ + required this.minX, + required this.maxX, + required this.minY, + required this.maxY, + required this.xTicks, + required this.yTicks, + required this.yStep, + }); + + /// The x at the left edge of the plot. + final double minX; + + /// The x at the right edge of the plot. + final double maxX; + + /// The value at the bottom edge of the plot. + final double minY; + + /// The value at the top edge of the plot. + final double maxY; + + /// The x values labelled and ruled. + final List xTicks; + + /// The values labelled and ruled. + final List yTicks; + + /// The distance between two value labels, which decides their decimals. + final double yStep; + + /// The distance between two x labels, which decides their decimals; 1 when + /// there are fewer than two. + double get xStep { + var step = double.infinity; + for (var i = 1; i < xTicks.length; i++) { + final gap = (xTicks[i] - xTicks[i - 1]).abs(); + if (gap > 0 && gap < step) step = gap; + } + return step.isFinite ? step : 1; + } + + /// A viewport part of the way from [a] to [b]; the ticks are [b]'s. + static SeriesViewport lerp(SeriesViewport a, SeriesViewport b, double t) => + SeriesViewport( + minX: lerpDouble(a.minX, b.minX, t)!, + maxX: lerpDouble(a.maxX, b.maxX, t)!, + minY: lerpDouble(a.minY, b.minY, t)!, + maxY: lerpDouble(a.maxY, b.maxY, t)!, + xTicks: b.xTicks, + yTicks: b.yTicks, + yStep: b.yStep, + ); +} + +/// Fits a viewport around [series], whose current values are [values] — +/// `values[i][j]` standing for `series[i].points[j].y`. +/// +/// Anything given explicitly — [minX], [maxX], [minY], [maxY] — is kept as it +/// is. The rest is fitted: x spans the points, with [xPadding] either side (half +/// a unit by default when there are bars, so the end bars are whole); values +/// span what is inside that x window, plus each bar series' baseline, zero +/// when [includeZero] is set and any reference line that asks. The value range +/// is then widened by [yPadding] of its height — never across zero when the +/// data stays on one side of it — and, with [niceYRange], out to the nearest +/// round tick either side. +SeriesViewport fitSeriesViewport({ + required List series, + required List> values, + required SeriesXAxis xAxis, + required SeriesYAxis yAxis, + List referenceLines = const [], + double? minX, + double? maxX, + double? xPadding, + double? minY, + double? maxY, + bool includeZero = false, + double yPadding = 0.1, + bool niceYRange = true, +}) { + var xLow = double.infinity; + var xHigh = double.negativeInfinity; + var hasBars = false; + for (final s in series) { + if (s is BarSeries) hasBars = true; + for (final p in s.points) { + if (!p.x.isFinite) continue; + xLow = math.min(xLow, p.x); + xHigh = math.max(xHigh, p.x); + } + } + if (xLow > xHigh) { + xLow = 0; + xHigh = 1; + } + final padX = xPadding ?? (hasBars ? 0.5 : 0.0); + final left = minX ?? xLow - padX; + var right = maxX ?? xHigh + padX; + if (!(right > left)) right = left + 1; + + var yLow = double.infinity; + var yHigh = double.negativeInfinity; + void take(double v) { + if (!v.isFinite) return; + yLow = math.min(yLow, v); + yHigh = math.max(yHigh, v); + } + + for (var i = 0; i < series.length; i++) { + final s = series[i]; + final row = i < values.length ? values[i] : const []; + var any = false; + for (var j = 0; j < s.points.length && j < row.length; j++) { + final x = s.points[j].x; + if (x < left || x > right) continue; + final y = row[j]; + if (y == null) continue; + take(y); + any = true; + } + if (s is BarSeries && any) take(s.baseline); + } + if (includeZero) take(0); + for (final line in referenceLines) { + if (line.direction == SeriesDirection.horizontal && line.extendsRange) { + take(line.value); + } + } + final hasData = yLow <= yHigh; + if (!hasData) { + yLow = 0; + yHigh = 1; + } + + final span = yHigh - yLow; + final pad = span == 0 + ? math.max(yHigh.abs() * 0.1, 1.0) + : span * math.max(0.0, yPadding); + var bottom = yLow - pad; + var top = yHigh + pad; + // Padding is room, not data: a series that never goes below zero does not + // get a negative axis to sit on. + if (yLow >= 0 && bottom < 0) bottom = 0; + if (yHigh <= 0 && top > 0) top = 0; + if (minY != null) bottom = minY; + if (maxY != null) top = maxY; + if (!(top > bottom)) top = bottom + 1; + + var step = yAxis.interval ?? niceStep(top - bottom, yAxis.tickCount); + if (niceYRange && step > 0) { + if (minY == null) bottom = _floorTo(bottom, step); + if (maxY == null) top = _ceilTo(top, step); + if (!(top > bottom)) top = bottom + step; + } + + final List yTicks; + final explicitY = yAxis.ticks; + if (explicitY != null) { + yTicks = [ + for (final t in explicitY) + if (_within(t, bottom, top)) t, + ]; + if (yTicks.length > 1) step = (yTicks[1] - yTicks[0]).abs(); + } else if (yAxis.interval != null || niceYRange) { + yTicks = _stepTicks(bottom, top, step); + } else { + yTicks = niceTicks(bottom, top, target: yAxis.tickCount); + if (yTicks.length > 1) step = yTicks[1] - yTicks[0]; + } + + return SeriesViewport( + minX: left, + maxX: right, + minY: bottom, + maxY: top, + xTicks: _xTicks(xAxis, series, left, right), + yTicks: yTicks, + yStep: step, + ); +} + +List _xTicks( + SeriesXAxis axis, + List series, + double left, + double right, +) { + final explicit = axis.ticks; + if (explicit != null) { + return [ + for (final t in explicit) + if (_within(t, left, right)) t, + ]; + } + + final interval = axis.interval; + final labels = axis.labels; + if (labels != null && axis.labelBuilder == null) { + final every = interval == null ? 1 : math.max(1, interval.round()); + return [ + for ( + var i = math.max(0, left.ceil()); + i <= right.floor() && i < labels.length; + i++ + ) + if (labels[i].isNotEmpty && i % every == 0) i.toDouble(), + ]; + } + + if (interval != null && interval > 0) { + return _stepTicks(left, right, interval); + } + + var step = niceStep(right - left, axis.tickCount); + final whole = series.every( + (s) => s.points.every((p) => p.x == p.x.roundToDouble()), + ); + if (whole) step = math.max(1.0, step.ceilToDouble()); + return _stepTicks(left, right, step); +} + +bool _within(double v, double low, double high) { + final epsilon = (high - low).abs() * 1e-9; + return v >= low - epsilon && v <= high + epsilon; +} + +double _floorTo(double v, double step) { + final n = v / step; + final r = n.roundToDouble(); + return ((n - r).abs() < 1e-9 ? r : n.floorToDouble()) * step; +} + +double _ceilTo(double v, double step) { + final n = v / step; + final r = n.roundToDouble(); + return ((n - r).abs() < 1e-9 ? r : n.ceilToDouble()) * step; +} + +List _stepTicks(double low, double high, double step) { + if (!(step > 0) || !low.isFinite || !high.isFinite) return const []; + final ticks = []; + var n = _ceilTo(low, step) / step; + while (ticks.length < 64) { + final value = (n * step); + // Rounded to the step's precision so 0.1 + 0.2 reads as 0.3. + final clean = double.parse(value.toStringAsPrecision(12)); + if (!_within(clean, low, high)) break; + ticks.add(clean == 0 ? 0 : clean); + n += 1; + } + return ticks; +} + +/// Where a [SeriesChart]'s plot sits, and the mapping between values and its +/// pixels. +class SeriesGeometry { + /// Creates the geometry of a chart of [size] whose plot is [plot], showing + /// [viewport]. + const SeriesGeometry({ + required this.size, + required this.plot, + required this.viewport, + }); + + /// Lays out a chart of [size]: [padding] off every edge, then room for the + /// value axis on its side and for the x axis below. + factory SeriesGeometry.layout({ + required Size size, + required EdgeInsets padding, + required SeriesXAxis xAxis, + required SeriesYAxis yAxis, + required SeriesViewport viewport, + }) { + final axisWidth = yAxis.show ? yAxis.width : 0.0; + final left = + padding.left + (yAxis.side == SeriesAxisSide.left ? axisWidth : 0); + final right = + size.width - + padding.right - + (yAxis.side == SeriesAxisSide.right ? axisWidth : 0); + final top = padding.top; + final bottom = + size.height - padding.bottom - (xAxis.show ? xAxis.height : 0); + return SeriesGeometry( + size: size, + plot: Rect.fromLTRB( + left, + top, + math.max(left, right), + math.max(top, bottom), + ), + viewport: viewport, + ); + } + + /// The whole chart. + final Size size; + + /// The plot area. + final Rect plot; + + /// The values shown. + final SeriesViewport viewport; + + /// The pixel column of [x]. + double xToPx(double x) { + final span = viewport.maxX - viewport.minX; + return plot.left + (x - viewport.minX) / span * plot.width; + } + + /// The pixel row of [y]. + double yToPx(double y) { + final span = viewport.maxY - viewport.minY; + return plot.bottom - (y - viewport.minY) / span * plot.height; + } + + /// The x at pixel column [px]. + double pxToX(double px) { + if (plot.width <= 0) return viewport.minX; + final span = viewport.maxX - viewport.minX; + return viewport.minX + (px - plot.left) / plot.width * span; + } + + /// How many pixels one unit of x takes. + double get unitWidth => + plot.width / math.max(1e-12, viewport.maxX - viewport.minX); +} diff --git a/lib/src/series/series_touch.dart b/lib/src/series/series_touch.dart new file mode 100644 index 0000000..94d986d --- /dev/null +++ b/lib/src/series/series_touch.dart @@ -0,0 +1,261 @@ +import 'package:flutter/widgets.dart'; + +import 'series_data.dart'; + +/// The gesture that shows a [SeriesChart]'s crosshair and tooltip. +enum SeriesTouchTrigger { + /// Shown while a finger is down or dragging across the chart, gone when it + /// lifts — `fl_chart`'s default. + press, + + /// Shown after a long press, following the finger until it lifts. Leaves a + /// quick swipe free to scroll whatever the chart sits in. + longPress, + + /// A tap places it and it stays; a drag moves it, and tapping the same point + /// again clears it. + tap, + + /// Only a mouse hovering, or the controller, shows it. + none, +} + +/// Where the tooltip sits relative to the touched point. +enum SeriesTooltipPlacement { + /// Beside the crosshair, at the top of the plot, flipping to the other side + /// when there is no room. + beside, + + /// Centred above the highest touched value, dropping below it when there is + /// no room. + above, +} + +/// A line drawn through the touched point. +@immutable +class SeriesCrosshairLine { + /// Creates a crosshair line. + const SeriesCrosshairLine({ + this.color = const Color(0x66909196), + this.width = 1, + this.dashPattern, + }); + + /// Line colour. + final Color color; + + /// Line width. + final double width; + + /// Dash and gap lengths; null draws solid. + final List? dashPattern; +} + +/// Chooses the marker for one touched value; null draws none for it. +typedef SeriesMarkerBuilder = SeriesDot? Function(SeriesTouchValue value); + +/// Builds a tooltip for the touched values; return null to show none. +typedef SeriesTooltipBuilder = Widget? Function( + BuildContext context, + SeriesTouchDetails details, +); + +/// The card that names the touched values. +@immutable +class SeriesTooltip { + /// Creates a tooltip. + /// + /// With no [builder], the card lists [title] and a coloured row per touched + /// series, each value written by [valueFormatter] or the value axis's + /// formatter. + const SeriesTooltip({ + this.builder, + this.title, + this.valueFormatter, + this.placement = SeriesTooltipPlacement.beside, + this.margin = 8, + this.backgroundColor = const Color(0xF2202329), + this.borderColor, + this.borderRadius = 8, + this.padding = const EdgeInsets.symmetric(horizontal: 8, vertical: 6), + this.titleStyle, + this.valueStyle, + this.shadows = const [ + BoxShadow(color: Color(0x33000000), blurRadius: 8, offset: Offset(0, 2)), + ], + this.showSeriesLabels = false, + }); + + /// Builds the whole tooltip; the chart places it and keeps it inside. + final SeriesTooltipBuilder? builder; + + /// Writes the heading; null uses the x-axis label of the touched x. + final String? Function(SeriesTouchDetails details)? title; + + /// Writes one touched value. + final String Function(SeriesTouchValue value)? valueFormatter; + + /// Where the card sits. + final SeriesTooltipPlacement placement; + + /// Gap between the card and the crosshair or point. + final double margin; + + /// Card colour. + final Color backgroundColor; + + /// Card outline; null draws none. + final Color? borderColor; + + /// Card corner radius. + final double borderRadius; + + /// Space inside the card. + final EdgeInsets padding; + + /// Heading style. + final TextStyle? titleStyle; + + /// Value style; null uses white at 12. + final TextStyle? valueStyle; + + /// Card shadow. + final List shadows; + + /// Whether each row starts with the series label. + final bool showSeriesLabels; +} + +/// How a [SeriesChart] reacts to touch and hover. +@immutable +class SeriesTouch { + /// Creates a touch configuration. + const SeriesTouch({ + this.trigger = SeriesTouchTrigger.press, + this.hover = true, + this.line = const SeriesCrosshairLine(), + this.horizontalLine, + this.showMarkers = true, + this.markerBuilder, + this.tooltip = const SeriesTooltip(), + }); + + /// The gesture that shows the crosshair. + final SeriesTouchTrigger trigger; + + /// Whether a hovering mouse shows it too. + final bool hover; + + /// The vertical line through the touched x; null draws none. + final SeriesCrosshairLine? line; + + /// A horizontal line through the first touched value; null draws none. + final SeriesCrosshairLine? horizontalLine; + + /// Whether each touched value gets a marker. + final bool showMarkers; + + /// Chooses each marker; null draws a dot of radius 4 in the series colour at + /// that value. + final SeriesMarkerBuilder? markerBuilder; + + /// The tooltip; null shows none, leaving `onTouch` to do something else. + final SeriesTooltip? tooltip; +} + +/// One series' value at the touched x. +@immutable +class SeriesTouchValue { + /// Creates a touched value. + const SeriesTouchValue({ + required this.seriesIndex, + required this.series, + required this.pointIndex, + required this.point, + required this.position, + required this.color, + }); + + /// Where the series is in `SeriesChart.series`. + final int seriesIndex; + + /// The series. + final PlotSeries series; + + /// Where the point is in the series' points. + final int pointIndex; + + /// The point. + final SeriesPoint point; + + /// The point on the chart, in the chart's local pixels. + final Offset position; + + /// The series colour at this value. + final Color color; + + /// The value. + double get value => point.y!; +} + +/// What is under the crosshair. +@immutable +class SeriesTouchDetails { + /// Creates touch details. + const SeriesTouchDetails({ + required this.x, + required this.values, + required this.position, + required this.plotRect, + }); + + /// The touched x, snapped to the nearest point. + final double x; + + /// Every series with a value at [x], in series order. Series with + /// `showInTooltip` off and series with a gap here are left out. + final List values; + + /// The crosshair on the chart: its x, and the height of the highest touched + /// value (or the top of the plot when nothing has a value). + final Offset position; + + /// The plot area, in the chart's local pixels. + final Rect plotRect; + + /// [x] as an index, for charts of plain values. + int get index => x.round(); + + /// The touched value of the series at [seriesIndex], if it has one. + SeriesTouchValue? valueOf(int seriesIndex) { + for (final value in values) { + if (value.seriesIndex == seriesIndex) return value; + } + return null; + } +} + +/// Shows or clears a [SeriesChart]'s crosshair from code, and shares it. +/// +/// Give two charts the same controller and touching either marks the same x +/// on both — a price panel and a volume panel under it, say. +class SeriesChartController extends ChangeNotifier { + double? _x; + + /// The x under the crosshair, or null when it is hidden. + double? get x => _x; + + /// Shows the crosshair at [x]. + void show(double x) { + if (_x == x) return; + _x = x; + notifyListeners(); + } + + /// Hides the crosshair. + void clear() { + if (_x == null) return; + _x = null; + notifyListeners(); + } +} diff --git a/test/goldens/series_area.png b/test/goldens/series_area.png new file mode 100644 index 0000000000000000000000000000000000000000..c155583236bac77abe953646865b26ee7937728e GIT binary patch literal 16508 zcmeHvXIPWl+GYR|6a}_>Q$(7GAl-&Y4T1`xN;e>hN|P=%(gN5}P)cah6@f@ss&uz* zq)8D12mzwBKqx_a5)x(w_c?RE>wGiUH9zLZTyyyI67uHFT2Hy3`zed3*G%*d9~3$W zfj|z!^e>x3AZ+3g2QAoKSJQBzmDKf(9R z;)+wUZF{C`z-rvLp(Rt#n z&Ad-g7s3KAHxIGw1DA+1`*k4# z&EqbTM-C{TKmRO99bYp;W4sq~Iqa^1lM@k;cKABW zQ+{g1Wu7o?$g_va;>-vAJ03@5UJ;AG^NL4*y^mwx2mSvZwyFR2xc|*gw8X#ah{eyn z;^B-);MHb+>#q$zIYs{K(IqnL>04mKkcc-jJ*gq%?7rnKr{*+Sq@HPs1EGa!=RN|T z*AmRSK_kew#HpL%N3I)M|zv2Xg{njk@^3A_jCs0 z)E4R7be6ditRj7@gStj=B9EQu;0Y#28~{RrKprNch7x=ULFtw+q+t~{B`Nf6(xuwB zoX4LCvvNjcTEVTl)#5p2WMxyF>`04qoWVAyP56?n++4jdF#T7Rs9iiXEX^)KAR93>^4{Ejl z+LOu0mlu&8JUP<4--0lb3xngnj2%>ArOMiKy_O#i;s$$aU|HkI$e-3zN^<@K)^uPb z+%um3@v4l-S@|wZXgKZ+@5w#G*%13%-0j=>8ER#*=;yP4+>#__vs#(jfwWZESnr_B{9aL0Ti`Z-ErD9#km(?Pd+{X-0=aJv zw-Q-byvYh2$Lfapk#(<|tg^Dj@68A9UZEJEmrDy*zK+Nd+j#On>8V*c4*4H4s_cBm zbDbmi!Jc6moszk>y5^k-Z7>?epCpFcw2uyi`#f52l!fcIkm4WrGzh)pzRX2nD%7av zW24db+fDz@x}_hM+bbts`vyz;k2~Dd$X4T32xSA|=5*S@NrQ>)6wB>9ZmDZ6a(O)y zk-@VhYYx@@5`dYAyL{!4w4Gx+qPfnJ@CPbs2irB>Tb?vHBtyjV7>+;nK}@)1I#}nP zxc%ZjJ9rulqjDqN_HJ{zUC&Zn-p44Yypb?T@QGkE%cY(tZBw>29wRSm4ej5xV#py5 z6M>Y~83V~9@KIgJ2g^zHAj)qc3U%+Z^S`p87P=^Bfg35MkO_ywkYmIEU41ujcI395E98wU(tsTD;Q;>F7-0C9>GYSQ&~> zoz%Si93x3gUaAmy_909~SVY-VAR> zY<&XlHAlin34Z`Dy77&S zT%hm?X<}-e*b2!iv4WkcYzX9TJP<_(w8EMMYo`$S%)M`aJL$XC;^e&^aaSiyT{0>KR)OdhP zUjqx|N&RH#N$7?Y3^Vxl%4VYbNmubZ&nvR3)OgPr{R#H)B4S!vF~#|hj?u4DM4s?t z^-`Zwf1cr0-a}R&UxH83&dJLB9)v11+{ky_pa1PyPgSG1$TznR@<(L0QseH-lSqex z1x{b;HhzAItYb~l8|(-fH~^HA8rLy8tN=}94TaAaM9#KpSFIcd$nimNr{eZWXgb25 zF`Vk?=?aVDIqWab<8kOR7c+|8JhUvWln}k@R7yDM(n`AJezrur?H|(oU>}&iLrFFd zsm&y4sLr`r&KrMl5O)I@=WFd`70}lZap07!thEme*4Geu;LV#7jMJ5n z9tsOyS{>!eb7ilnscA<$TFnZ*w=Q4{y7>9;Wj+4cgOCk(EyZQTuNAiqKt+ZUG$j9C z7Bdck;BAp5A_4-c)XTcUGng>ho%Ex=9L_Rf!FX5=&r_X;5?cE89$Rr{t!Ia8Q$7=ufW|#c)b8Z%F?ut8RHUIODS*5ZBRL4(@ zBn@cWpq^t(w4i zup3?TvvBBZI4!l6h3!&ON~rdW%cLPOIS7Xza)Uk^2Z1cN_XFFQmfU@!y4s^@U|`zR zSyC!EZrNm8*JSAa#Kj?{J6|HZkIhEis<{v zlW{WKta|6s;HtoIyONwJEw!HJ=;@tYU8%6~__kef$%cA<_Fr#WK(P8>#r%WgmdAmO zG*+e>U=|5l$-x%om)zy{d(+o#V|a%<#F>y6@tu#@rH+o=N#yTT_hPiy&XW=c2T~9I zp?Ltrf4;wF1g2qE3cauHv?_yz9HJ<@e^P`O*L0wR+-2h-?VjvDbz&FwFpkjeiV~4h zQp*cmd^O)tpXZBTaJ27p$fw^{P1KDTKl~o=i~+LYZWvSb&TO;bsw*)&vbZJh*ec)&ON8ryx zX2xoL{~{*7d4Ayd9zUo&xHjGNQ@>6?L^_$@3GD%71>k3>)40M;?QuzQ)#HGDqCSmS zi=k{2*Kv~(`oh^5u4yqXJI0U78HKbgYQfBXhiUt}&q|&@CxzZ>@b~6g(2Ed0<477@ z#a<29dio8}kmCA+3paj07s=^h{3nZ%TvEtapVc09gU&cCx~A5!XJ8?ph)5hCQawE! zgsGXB6r!|sr=q@$;cf@QNOK8(TWb|!p=si*Mo#QLCwHgpS6x!t5$|j_v%+(5#AAtg z*@h>>qL&Y{>}!``ZEpurF_kuyc=pdvqc}<0Q{@U9uO9#P!T18(MCfMR3x!?Wr)h;! z<0VJExXgy^R66gaeJ`TNwi+)@)ai8qNfR?rod&^?n!Ao6H=G1kM<3`j0TebR0!2<( zxwMyOD#9udWAenv{jM%{-$foSDXUMHPbh|%)Qxe)CbU#pFRPm-qJF%q2(QuEkT2xmP=}-_B*HyQn z)qI#m;&XZ0adNk`0p@l~kU1J9q0tM4m#~>Ra5S+&a(m0uUQOGS89j>2ez-``c=c^b zZW^^wfE1#C$v?rN#?A9g*M@A^PMNCoZAO)sXlAVnSjkbyfr{((HpJnK24VlE;$rtj z0!kCEk#j(tKqizs(SnnWHI7GYuDWimiZl_P(~N zWo#DRCNx?M)$mgS_zch#14>NM1GFUM*@q^Qf8i-gssJ+PcTASmq*z~>P2yfn2RjzgOvRTBVx)}J!IO&pI^3rOLs_b0Uz7OJzNueODLV~1f z3tD1@c=&g_y*T%|JI5~JpqN!Yh{vZkpF<7tc2O5vS2<8~gYiEt3)O+{H^p+2CF^!q z_ScDNsYK|peb7J4)hlLq!qby`9IOYo7vTg2c2`CW&_8@#ZC{mG;s2m*j+^WCqPglg z;!ZxQM<5VBeJ$jY>k7mca%ynms)-$jS}XH}V|{M=ac=HyzSN|BO~+nDM0d)*_Kt5- z$vM^H{1`VPM_VT9(03BM)p(WH{|k+8x^BA~=KTe)h-|*`^sMIv__YzZ`(CNo zIylW<6WgJWG;Fq0H|>4P8?@1$br@v5PS5bJr2BC8OEEQZ>^f2cZ`)$Hxps^#9DN3u zBr{LAI+Nvx)85|h;__vXy&v#vac7J2cE5WpKdteQ=1xvo8xL{x^hiQlmrS?ZPz>++ za#Ku0JnEjbVp6z2iA{>AV)}5B(mK7DLPq=+45{qbvr1Y&ve?PY1 zCJWpeVU|WAr_2_Zx!)>7wRlBtB7!hDF)iyx2|}uKN~(Kbo?CTwbsm-_4{@k4)vzV} z(o%MQ_G{uP3Z+(Na|7Bj+Amzxma4Wz{OuZBOiLR$|#H0$jFF&`k zw=nd-YH~_m9(PzJRJM34Xsw%IhC-p7Z@{fIr>_jGJyvwAU3!I7d;D%W%eMS7wW4A( ztG6TQTO zM_oWuFsXIa=*M1#Jca7ekn_q~uCFjTA;q^<=((q}Ujd=y<5zaoYR_ zAXQ9+K-)k1+U8%xEdCfdi}8|i!N6!GVLhwTx?4N9D?p;dvM*wXWPTFrmj<|P>6j#O zn65O-kJlX=Z3(`ySy^rXqOfEyrI?pE_248R$o7E8&afAjp7?_pa&6D|waesW z;%Otb`U3|YJ-y5qrQ;6yk2z%|m(thtoSGVyH@w59oK{^{Wwh>|8tXzz8!G`Qlv$Wa zes!_;0h2}x@lHRxEb;2`qCV1-z{z}$UQ`_Cfiob1nOjQ!H=Oi{*u2OARxOGU=Q~8e<1~gV;bh!>e$EovS^! zvxuZ`|MV~V^vTuO9HpfN>%{`7VMskIc}_jQ?dOZJIOM7DOUWfmrO|Ynh`Eh-Ula?k zOovkQi2&}Vsw?lrpn}K}ZpZn@?mLLk7bRXZCN^DMXZ-$#e-GAy^_H_2}^j>b@5 z4bd>ZUQNiMO>2suvn(Y|#gOvzB{z$>Z{xYR_?DLj2Jd~*yZ-Nc$dEk_7$FQQGAhbZ zwwSd6y}VKd-SUclXzjhK;&<1e+ri#CJqlZ$ZcFhkZw)$*DW2JGXZy`MNomWTneT@n z;%(LQ-ewV42KUfY^>dDW!E~D<0GF+jq>cVrobc`Nms4dY<&;G=+Fk^2l0=%AffV=k z1YqsH192P?U+Zi#W%*{h+{WZ+jMR@IXbv+_fPk=0Vk{R$p6%BRC$+FRC)_x6{cI3n(WsQjf9bvm8i96r*#6Wr_Z5O5u@}3|UB~Zo# zrv68-*sWqVGaU$vul_2Cv^j7I_hHcyXwbbr;mJ!P0a0I+vquBicea*F6@Xh^f?>8E zpEx@(2{|+<*0&@*)H#9sBbpd@`tNOi3~MV~P5qKmPn#YK&MA4QJ}EqPLuiZ3Hypr| zi2YCG_(y2Po ztzGywTvgRtf3q#ft!WX6R5o!kZx{vp!Y*$PN9e2|F(v6`myBUqXmkjQDdd|x;+`ShA zX(uW!TrdcFXBijYpZg&6d*s}jd)GOOBUw36{%y)p(ivV*b-sDf59*t}19z%OALXNU ze0nf@2y1=*EH~leCY|O~?XRDI#Q;q;hHFVg%-w~?BkrNe25<$Mjt}~A;GxT)di^4| zaV;(ZHK|jmBtvZ3mEDlMI{&uoqUBVNs4AgB57bw3Y>sb@u00nyr+wW~Et@=_@S<1SqpX3i{>+9bzPw%N>PmEH)=-D9lj zSwJl=_V!-;`&my=qelSGH9TO`!y_7>d^aEGZZ(^D7JANlHnB3Z6pMZQFmM;_T~pFM zq}cLBYJDyou_zvUNL&c;p54{^i?d^+Md!aSXR@jOL7OjJ?Qs~vIWfgfA3{##693_GchSGi@J&(ke~ddQO=e4gP; zel^jOK zHwa2{U`x5o>|RmB8pOWu<>nucZA+Gfmz|!HQLPc$lHG*PUzryWl>>M(b@6sYyi8}W zyao#W^WL4F@;kAScfcCVlEgqagknw&rVI_uUdoBjmu5dF8shQDBV6iq4Pr!!Rz^Gt zTaM~YM4s{N=TR5W7;`F51qHX3_b}^EDc7=)3CDm>aagyU{l_c-ghisgX?0_@3)?YT zr`IEv(;W&K+Eo>t`uRLV=os*>-$n4@jE0gyeE$9SW2OlCRuN+-kmhB7rA8b=-1FL{ zcHnxc?#ESIaxd(;*X3tOs3FLVL0A#fJmvbG?Q~6D?Q{C~@(Nq^>0zt(rdbabv%Z#< zG0FhJsk%VNNw5cd%6m`5W=BwGv)(SXG>UtAn$R`qzkOR#{qvdM&9QN5V#t;Org4Bf z5jFc8>&GwZWLt?kiU2g2d5pqeHU9 znke(Oc8;DDq>a`{l*HY;1~JpkCz@7vT;z0o7)DR`kWO4;hYAN}23ye8SYd%#Qy-K^ za@WZ`P@6S}-fYUPkj2qd66)#e`$yu+6C~?YZpiWxO;eId~XhPW@4oZAznzRIwq9QQA03oxc5W0Kv=uxpR z_qH$0(N(8?koB-1&0dtK-k$aAkdGh22yjrR<>_sATi|4brWt^y3#YhtJB6!w+CJXv z;ywJQ2U-U#3Qj0aJvfG~`7x5?@eG)2t5=;VX4*dZ{?2P+?7bT-QbFEYX6WuiaF9?m zyExtHNtHRb*A01?NlWnm^e2aqV^dAYTqcs>63RI>`?-)pEVGG;B>{W~kzD6X(@p@hGEp7iJaNsfeb7|!oM@28 z?hHFz$vZiEbq0NZL!8qjyqAZ@EN3nrY^9u;`ONH)MZ~YVq;@ncO2Q26Z&xd+uJ3nf zB3~NQDQ`qjY?N2qhLY{I^JK)bZT`HGQ{Vh!p4I_o*YAw z8hV%YIAg)EB8TvTdYM|!Re^fT`g(;ahV6SWbC2t7Yj3l}EONP-k(cx6)&ruxkKT|R z-U(Xmbkv;62L$nVeBn4nAeOm}#jM|58B!1ZoV7#o1-~6VtY?Xk??%Z8ba`wQk z4^h58sJNigfwYw-_y2xhYv;_Bd)T2aXka#A!$cd?edtW$5dRbYy?pihbx9a$X(@pi zgvr~v&kDnMj*yl_-t(h1luR+WjR_S4OlAWzzVfv(WuCSYYTBeZkEfw$o6l{LX&5p& zeAk-v`@4H+#)qYlU`KplaQMNxUE!A9Y`bL(f=y}%0E8J&&*Vz4;WuqW^i~e??Jk{1 zZBzNrsT^7ygHCIukb+S~M7MudJ#IkA7 z5{1wwD5K7QU%GWNVyi^t=hbh9Fp;lb1k zUfjXu39m;J%e1PTntMp^u)cQ83KOu*0S|YLqU{;XKt*>|qz#o^UdI zr)dK7e>!Z$g^i@-vv&2{2=pXM(rL4$ZiZ59V^d?TNsp2Q)YUeUjqN011a*&hZfmRD z_jY0fLQSnf8BupUD=U&720FLWrgC3H+=?V&!{s3Xe>oJ_6(-EvKsG-~_}_f-D~(Yz+W%gYVvy_Ln>O2R>3Tc{xjNmb!YNLCWP=C2ijn9^j_g9#T~7e=BGN{cClF zNNAw#Q>}}|wwU#IW(5eA50Ok~=xTh@g_+?IL0TgUelJLVqnv;nuJt$^Y~zR6Ye4d< z6*ttcQ-&|VFwJ#$B1s1i?icB0u*8u&$^`iM3mr$RJ}|U4Ea@%$*s|aaBtCF1xu=Xx z)D%R4G#NWcUmS$hF->{VJeiI^()N`|>`j&oa~j~UmL7kJ;uHJ|#7bIDvF1~cMZb0Y z`J~N{7ysq{T>PS`qStN^qI8yj+C9vswzkdc)pn%UScxvq_#&gd^c zHFmaZ1_u148njl7^-qUGQx_hk%lqM zcEv&L?6!o#(hRB78_{6?=PKX~Qh$C}XE#i>Nm>!5nV51`F*u*HpQqs zovZ{e>A&vL{&XQG{Vxg)XOgfJhg`F#-cu3c<=PC zk1j|vIMuWmimXly!~J@CNJD%%S!uwABW>k;MT@G-F*m#DJv`- zqMYkGo9euTJa_Z38iOOQ(n?8I)*J@w$Qy@lyxKVDVl)+T;SMROWaegUz#@6;mo=8&|RdIm-^rNvFztm+{ zSBpr`1)3qhYx?ho${a~fcjP{WE2-2HN|7b5v9H@UYZkETb+*D0i%i3{=8u^dgWrpl zSxj6&4vv<24bBi3>|zAkP1^3m2)2(ICb8b$Z?ay$j*h`)>d#FrT;POMJO}(y+oYDrlvClSfB@Th|FC+m*v0kpyGHsi9{QkcQiJR3rIr{+ z4YA24!yGQyhOF{%Ax*3|5Yc(>VIIOZL07fy&pXj0% zmX^PAcpBWkz!&5b7WOq1)?bQ8k-ln%@KCqGSRF{q62H%u;+eZ4ziV1byE2bVhuRn( zut0AGx(b3kZ%&*PgHdY(+1B@oMvoi!qt3ipE3hQeM*2BL`s0E++)abK`=g*Imd<( z$r*WTc332(`L0ta2MpL`5z}AhJCwjH9M0}HOUju=4q4>6|~6N z33eUpxKX&6opNEk#?PiN>R^QMWiY*I6uni7zy{cl7d>g)pnu|byQ*>F&F7bD@t<6&XxHrHN~hm_0{ zru0__N>`F5xP|P7-fVmX`V~kOUMCZS>50{T{;TV*qs01p=WextkO@i6Rkpvi4Ec~Z z0x(j}rqnE?e-M+aLm!@eR59Qkt2b)PXon8JR2kr)(dur5TTqOeitEiW>x{vLs%q>O zuc#H|;(6wjSzd5ygPu)O#ntg_>}$j5jpwag=G{N@=ru#9pyZZli(P3N#~Q897K*lg z%5XwwNzRL@c;E(>X!{_Sz=j}F<1r#x!DLbZCU3wHyI{yQyR_vT^yS_Dp$pFzHlJCg z=9FjjXZ3_v_|>BE-y|WNLM;2VdvbZ6z)hDthn44febFO_=mTS;uLhzX8`lbH)HoGl zv4)!VsPr4frYPa@8!gvbnNYJhD4^n%oz%9W{SN^|oZ+cj`r0;}U)H=n6zv=4 z7}(9=DjXpAKdbLcr@ki<5RKP>9!C4dOL@xj2UH_gm?O2%s1|-P3?y}68#Qb>KRTk! zX5%g7KY#r*2b3|IYbihlstG0*Rg-+BccX0}rxEX%V~z14UWBxC#%416ntykXzS%7tVcI1`asJ_}jqgJfGV9~At15|rcwl~L{{c4-*U5h2> z)8T{l_4RHqAJkISgLs~CaUHa>yrJP{-_H^b6(DsL$pyGli~>TkC+gguBNmp=?7ZQ= zBE}0j0U!y&x&~DbBrVw0z%W`G4OeY!Y&uO$rG=VB=2kR)$AQ**6R34g=hnZfRssfC zg239SHL#-nS#CN4b!)%$8mZAGjMm#@)?bY%*E?GewtH8EK`V!D;Z){T>znR6r!fK; zH(>qM?kaOno0eFhMUc~KOkcUH;yqqg?rCD&MvY2$8^5L=ax>U0*q!HCrLm`yd`@9+ zx1qAo&bNA-0FHR}zfs^$6R z6!{Jk@?N)fs`VEfzzls1lQA!QdU8>33Fm^rt2uiJuMTtNcXmQ;UIWeo;!d7lm-Cyx znvHV$;dScp*~(HFSZ`K|V*WMf_j26@?H|FBw zE*k0a3(TibA5j+{8@m~-AFf+3$$`HtJMKM%^`-l*k^D_Y4lViFHxZMogT0V?eLMmX zBhG)w3{L>@Bv-)3)xtE+ZEY=J0n@7H<_xF0T`$BRx*_6DisSOMQ&F&e>DTFe#|4=) zvD07F7sc~8L4feu;)6p1e#R89f13zQZWRt|@`~-rf=j_F2FUI-!uQb!geuc_!EpHk zvS^Kd8^{>y%e?HVld?@hcM~r`E?x(7h86NqD0Gd`)YSBP=nV%_Owog;r)fpLYj0oe z_Pjax+wG>>+XY^kcEyRn@n;qANh>>Fs`9VPr=&GY8j=jKQl+IqzB;c{( z<%RvK`2$wS7JcMM;}yFQswBY%jgCxWeEzT%c9MFekegH?Vb{_KY#`nK1gzfOyTNO$ z#xR;F2Ni8@iwb@lAa1}MD}~NwLAbB{Jy;sKv-E4QwBg(oNIHWJA&DL)=xp@cJVaaa zAH~CK{tKHT!7n|_r?F+C%6v8Kv9Ei3N(T!EKwjP4=o*8ragDfVvPv>USvMcEp$s%%=-FEyHxr95ci_N znL29Q;bR-kAQbclNbidM207&Lo0^1Dg8rLVuWo(8kJKm-wq|G?h|Tj8_>Eo9%K~c! zuk+u$xt`)#Sm|(w9HTfqz@*bq<=VMf>LVs)6ca&|LoZa%)f#t?rW!f(2jb}>t-5Cw zW7+}&tnw9QO~d^B^ekeSa!bdy`x*Yq#KBbTL2=YuPLXzriN32`aW+-Y__gi)Yx5h4zYM*!4H`G~$39b94HshAicDft4@n0)Q2kp(ZEP_(^+YQ1%g_Yr4_Ok?w(tU3Zx$)vj7=bDuDLhSeWj5T^3_ZzX8wNKIe!qAL@dlpI`4)4g|C*jua^9ssO9*HO5{7FP+l}Z|pER?a)@YxyG54iq` znCPm!H~MP_SFI9Lv82ZL&ND>UKt%TH(pNi|jo|DH{#$n(P_^0P!>>ScbH_;!8{9F#^Sf;=gpc++iN}f)N7(W^jhb=HA7)`A;D?Z$_K&d zDw7mLAfI0iui+Mg-1uVJSiWC-#s~xL5(vcc=-)?i0O-Y6Uf=yq!QMV=>OJ4bynh6s zy>kTr-Pyf%I4DSgQ!P?2fq%4~Jh?Y7oLga#;>6x`45G6)asF?gW1fxqujg*|CS`w} z1p@2&yf@*zcWx%W5;Qy&KwC!iAIJ{*_uBw9P>uQ5b2oc4+yC7u%zr)Wz;gNs^H9jY z-}YaR;sDz5;}{U#e_0lI#XP^nBy##yeH@a(dwfh@M{l}y%16Pj#^Vb#OhkJUYc+;5L*yFvD&c%bH;mke7yAI z$B$>cYXg^THED~L@KNI|exXcVdWpfs#ie&x9IW<*;7|m({GT0$1!8@69RHk~M*cm~WrH+Gnx8+q z7WnkC&d+R1Y8V$wH{xb~4gA9&^33bM*b;d4uZPb5 z^ClA!{(q5B#4Z6X!o}S0q1D>#*0KuDZ=Ar3-u?z;aPx#XIO1_t8~E1q2yn+S7I38D z0xLLZ;;|1*@c-w={};tmyI}eO=#rcHe*ylfPF5QO&C}@%+K0hA5ZD!y%Vjz@@Ba@Z Ce+nG{ literal 0 HcmV?d00001 diff --git a/test/goldens/series_bars.png b/test/goldens/series_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..caa54d07bb1eb5670130499e9fce9916084a8309 GIT binary patch literal 7426 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 literal 0 HcmV?d00001 diff --git a/test/goldens/series_lines_tooltip.png b/test/goldens/series_lines_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..81a349393d4940a7f8eeb4cbfc38202e102a0c2b GIT binary patch literal 26836 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 + MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.topLeft, + child: SizedBox(width: width, height: height, child: child), + ), + ), + ); + +SeriesChartPainter _painter(WidgetTester tester) { + final paints = tester.widgetList( + find.descendant( + of: find.byType(SeriesChart), + matching: find.byType(CustomPaint), + ), + ); + return paints.map((p) => p.painter).whereType().first; +} + +/// A chart whose plot is the whole 300 × 200 box, so x = i sits at 75 * i. +SeriesChart _bare( + List values, { + SeriesTouch? touch = const SeriesTouch(), + SeriesChartController? controller, + ValueChanged? onTouch, + Duration animationDuration = Duration.zero, + bool animateOnMount = true, +}) => SeriesChart( + series: [LineSeries.values(values)], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + touch: touch, + controller: controller, + onTouch: onTouch, + animationDuration: animationDuration, + animateOnMount: animateOnMount, +); + +void main() { + testWidgets('draws every kind of series and furniture', (tester) async { + await tester.pumpWidget( + _host( + SeriesChart( + series: [ + BarSeries.values( + [3, -2, 5, -1, 4], + color: Colors.green, + negativeColor: Colors.red, + radius: 3, + trackColor: Colors.white10, + ), + LineSeries.values( + [1, 4, null, -3, 2], + curve: LineCurve.monotone, + negativeColor: Colors.red, + fill: SeriesFill.fade(Colors.blue, negativeColor: Colors.red), + dot: const SeriesDot(), + dashPattern: const [4, 2], + ), + LineSeries.values([2, 2, 2, 2, 2], curve: LineCurve.step), + LineSeries.values([0, 1, 0, 1, 0], curve: LineCurve.smooth), + ], + xAxis: const SeriesXAxis(labels: ['a', 'b', 'c', 'd', 'e']), + yAxis: const SeriesYAxis(side: SeriesAxisSide.right), + grid: const SeriesGrid(dashPattern: [4, 4]), + border: const BorderSide(color: Colors.grey), + referenceLines: const [ + SeriesReferenceLine.horizontal( + 0, + dashPattern: [3, 3], + label: 'zero', + ), + SeriesReferenceLine.vertical(2, label: 'now'), + ], + bands: const [SeriesBand.vertical(3, 4, color: Colors.white12)], + semanticLabel: 'demo', + ), + ), + ); + + expect(tester.takeException(), isNull); + expect(find.bySemanticsLabel('demo'), findsOneWidget); + }); + + testWidgets('hidden axes give the plot the whole chart', (tester) async { + await tester.pumpWidget(_host(_bare([1, 2, 3]), height: 58)); + + expect(_painter(tester).geometry.plot, const Rect.fromLTWH(0, 0, 300, 58)); + }); + + testWidgets('in a box with no height it takes its default height', ( + tester, + ) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: Column( + children: [ + SeriesChart( + series: [ + LineSeries.values([1, 2, 3]), + ], + defaultHeight: 120, + ), + ], + ), + ), + ), + ), + ); + + expect(tester.getSize(find.byType(SeriesChart)).height, 120); + }); + + testWidgets('a long press shows the touched values until it lifts', ( + tester, + ) async { + final reports = []; + await tester.pumpWidget( + _host( + _bare( + [10, 20, 30, 40, 50], + touch: const SeriesTouch(trigger: SeriesTouchTrigger.longPress), + onTouch: reports.add, + ), + ), + ); + + final origin = tester.getTopLeft(find.byType(SeriesChart)); + final gesture = await tester.startGesture(origin + const Offset(160, 100)); + await tester.pump(kLongPressTimeout + const Duration(milliseconds: 50)); + await tester.pump(); + + expect(reports.last!.x, 2); + expect(reports.last!.values.single.value, 30); + expect(find.text('30'), findsOneWidget); + + await gesture.up(); + await tester.pump(); + await tester.pump(); + + expect(reports.last, isNull); + expect(find.text('30'), findsNothing); + }); + + testWidgets('a press follows a drag across the chart', (tester) async { + final reports = []; + await tester.pumpWidget( + _host(_bare([10, 20, 30, 40, 50], onTouch: reports.add)), + ); + + final origin = tester.getTopLeft(find.byType(SeriesChart)); + final gesture = await tester.startGesture(origin + const Offset(75, 100)); + await tester.pump(const Duration(milliseconds: 150)); + await tester.pump(); + expect(reports.last!.x, 1); + + await gesture.moveBy(const Offset(60, 0)); + await gesture.moveBy(const Offset(90, 0)); + await tester.pump(); + await tester.pump(); + expect(reports.last!.x, 3); + + await gesture.up(); + await tester.pump(); + await tester.pump(); + expect(reports.last, isNull); + }); + + testWidgets('one controller marks the same x on two charts', (tester) async { + final controller = SeriesChartController(); + addTearDown(controller.dispose); + final top = []; + final bottom = []; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Column( + children: [ + SizedBox( + height: 100, + child: _bare( + [1, 2, 3], + controller: controller, + onTouch: top.add, + ), + ), + SizedBox( + height: 100, + child: SeriesChart( + series: [ + BarSeries.values([5, -5, 5]), + ], + controller: controller, + onTouch: bottom.add, + ), + ), + ], + ), + ), + ), + ); + + controller.show(1); + await tester.pump(); + await tester.pump(); + + expect(top.last!.values.single.value, 2); + expect(bottom.last!.values.single.value, -5); + + controller.clear(); + await tester.pump(); + await tester.pump(); + expect(top.last, isNull); + expect(bottom.last, isNull); + }); + + testWidgets('a tooltip builder replaces the card', (tester) async { + final controller = SeriesChartController(); + addTearDown(controller.dispose); + await tester.pumpWidget( + _host( + _bare( + [1, 2, 3], + controller: controller, + touch: SeriesTouch( + tooltip: SeriesTooltip( + builder: (context, details) => Text('custom ${details.index}'), + ), + ), + ), + ), + ); + + controller.show(1); + await tester.pump(); + + expect(find.text('custom 1'), findsOneWidget); + }); + + testWidgets('new values move from the old ones', (tester) async { + await tester.pumpWidget( + _host( + _bare( + [0, 0], + animationDuration: const Duration(milliseconds: 200), + animateOnMount: false, + ), + ), + ); + expect(_painter(tester).values[0][0], 0); + + await tester.pumpWidget( + _host( + _bare( + [100, 100], + animationDuration: const Duration(milliseconds: 200), + animateOnMount: false, + ), + ), + ); + await tester.pump(const Duration(milliseconds: 100)); + final halfway = _painter(tester).values[0][0]!; + expect(halfway, greaterThan(0)); + expect(halfway, lessThan(100)); + + await tester.pumpAndSettle(); + expect(_painter(tester).values[0][0], 100); + }); + + testWidgets('the first build grows out of the baseline', (tester) async { + await tester.pumpWidget( + _host( + _bare([-10, 20], animationDuration: const Duration(milliseconds: 200)), + ), + ); + // Zero is in range here, so both values start on it. + expect(_painter(tester).values[0], [0, 0]); + + await tester.pumpAndSettle(); + expect(_painter(tester).values[0], [-10, 20]); + }); + + testWidgets('a baseline out of range grows from the plot edge', ( + tester, + ) async { + await tester.pumpWidget( + _host( + _bare([10, 20], animationDuration: const Duration(milliseconds: 200)), + ), + ); + final painter = _painter(tester); + expect(painter.values[0][0], painter.geometry.viewport.minY); + + await tester.pumpAndSettle(); + expect(_painter(tester).values[0][0], 10); + }); + + testWidgets('the range selector pans and resizes its window', (tester) async { + var window = const SeriesWindow(10, 15); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.topLeft, + child: SizedBox( + width: 300, + child: StatefulBuilder( + builder: (context, setState) => SeriesRangeSelector( + series: [ + LineSeries.values([ + for (var i = 0; i < 21; i++) i.toDouble(), + ]), + ], + window: window, + minSpan: 4, + onChanged: (next) => setState(() => window = next), + ), + ), + ), + ), + ), + ), + ); + + // The data spans -0.5 to 20.5, so one unit is 300 / 21 pixels wide. + final origin = tester.getTopLeft(find.byType(SeriesRangeSelector)); + const unit = 300 / 21; + await tester.dragFrom( + origin + const Offset(12.5 * unit + 0.5, 26), + const Offset(3 * unit, 0), + ); + await tester.pump(); + expect(window.start, closeTo(13, 0.05)); + expect(window.end, closeTo(18, 0.05)); + + await tester.dragFrom( + origin + Offset((window.end + 0.5) * unit, 26), + const Offset(-200, 0), + ); + await tester.pump(); + expect(window.end, closeTo(window.start + 4, 0.001)); + }); +} diff --git a/test/series_golden_test.dart b/test/series_golden_test.dart new file mode 100644 index 0000000..5934805 --- /dev/null +++ b/test/series_golden_test.dart @@ -0,0 +1,149 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:ohlcv_chart/ohlcv_chart.dart'; + +/// Golden tests over [SeriesChart]: what an area, a set of bars and several +/// lines with a tooltip look like. Run `flutter test --update-goldens` after a +/// deliberate change to how they are drawn. +Widget _framed(Widget child) => MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + backgroundColor: const Color(0xFF17181C), + body: Center( + child: SizedBox( + width: 480, + height: 300, + child: Padding(padding: const EdgeInsets.all(12), child: child), + ), + ), + ), +); + +const _purple = Color(0xFF9775FA); +const _green = Color(0xFF12B886); +const _red = Color(0xFFFA5252); +const _amber = Color(0xFFFAB005); +const _gridColor = Color(0xFF2C2E33); + +List _wave(int count, {double phase = 0, double scale = 1}) => [ + for (var i = 0; i < count; i++) + (math.sin(i / 3 + phase) * 40 + i * 1.5 - 12) * scale, +]; + +void main() { + testWidgets('an area crossing zero', (tester) async { + await tester.pumpWidget( + _framed( + SeriesChart( + series: [ + LineSeries.values( + _wave(24), + color: _green, + negativeColor: _red, + curve: LineCurve.monotone, + fill: SeriesFill.fade(_green, negativeColor: _red), + ), + ], + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < 24; i++) i % 6 == 0 ? 'W${i ~/ 6 + 1}' : '', + ], + ), + grid: const SeriesGrid(color: _gridColor, dashPattern: [4, 4]), + border: const BorderSide(color: _gridColor), + referenceLines: const [ + SeriesReferenceLine.horizontal( + 0, + color: Color(0xFF5C5F66), + dashPattern: [3, 3], + ), + ], + ), + ), + ); + + await expectLater( + find.byType(SeriesChart), + matchesGoldenFile('goldens/series_area.png'), + ); + }); + + testWidgets('rounded profit bars', (tester) async { + await tester.pumpWidget( + _framed( + SeriesChart( + series: [ + BarSeries.values( + _wave(18, phase: 1), + color: _green, + negativeColor: _red, + radius: 3, + minWidth: 3.5, + maxWidth: 12, + ), + ], + xAxis: const SeriesXAxis(interval: 3), + grid: const SeriesGrid( + vertical: false, + color: _gridColor, + dashPattern: [4, 4], + ), + border: const BorderSide(color: _gridColor), + ), + ), + ); + + await expectLater( + find.byType(SeriesChart), + matchesGoldenFile('goldens/series_bars.png'), + ); + }); + + testWidgets('several lines with a tooltip', (tester) async { + final controller = SeriesChartController(); + addTearDown(controller.dispose); + + await tester.pumpWidget( + _framed( + SeriesChart( + series: [ + LineSeries.values( + _wave(30, scale: 20).map((v) => v + 1500).toList(), + label: 'Deposits', + color: _purple, + fill: SeriesFill.fade(_purple, opacity: 0.2), + ), + LineSeries.values( + _wave(30, phase: 2, scale: 12).map((v) => v + 900).toList(), + label: 'Withdrawals', + color: _amber, + dashPattern: const [6, 4], + ), + ], + yAxis: SeriesYAxis( + width: 44, + formatter: (v) => '\$${(v / 1000).toStringAsFixed(1)}k', + ), + grid: const SeriesGrid(color: _gridColor, dashPattern: [4, 4]), + border: const BorderSide(color: _gridColor), + controller: controller, + touch: SeriesTouch( + tooltip: SeriesTooltip( + title: (d) => 'Day ${d.index + 1}', + showSeriesLabels: true, + ), + ), + ), + ), + ); + controller.show(12); + await tester.pump(); + + await expectLater( + find.byType(SeriesChart), + matchesGoldenFile('goldens/series_lines_tooltip.png'), + ); + }); +} diff --git a/test/series_scale_test.dart b/test/series_scale_test.dart new file mode 100644 index 0000000..82034ba --- /dev/null +++ b/test/series_scale_test.dart @@ -0,0 +1,276 @@ +import 'dart:ui'; + +import 'package:flutter/painting.dart' show EdgeInsets; +import 'package:flutter_test/flutter_test.dart'; +import 'package:ohlcv_chart/ohlcv_chart.dart'; +import 'package:ohlcv_chart/src/series/series_axis.dart' + show formatSeriesNumber; +import 'package:ohlcv_chart/src/series/series_paths.dart'; +import 'package:ohlcv_chart/src/series/series_scale.dart'; + +List> _valuesOf(List series) => [ + for (final s in series) [for (final p in s.points) p.isGap ? null : p.y], +]; + +SeriesViewport _fit( + List series, { + SeriesXAxis xAxis = const SeriesXAxis(), + SeriesYAxis yAxis = const SeriesYAxis(), + List referenceLines = const [], + double? minX, + double? maxX, + double? minY, + double? maxY, +}) => fitSeriesViewport( + series: series, + values: _valuesOf(series), + xAxis: xAxis, + yAxis: yAxis, + referenceLines: referenceLines, + minX: minX, + maxX: maxX, + minY: minY, + maxY: maxY, +); + +void main() { + group('fitSeriesViewport', () { + test('spans the points and widens the values to round ticks', () { + final viewport = _fit([ + LineSeries.values([10, 20, 15, 30]), + ]); + + expect(viewport.minX, 0); + expect(viewport.maxX, 3); + expect(viewport.minY, 5); + expect(viewport.maxY, 35); + expect(viewport.yTicks, [5, 10, 15, 20, 25, 30, 35]); + }); + + test('never pads a series that stays above zero below it', () { + final viewport = _fit([ + LineSeries.values([0, 5, 10]), + ]); + + expect(viewport.minY, 0); + expect(viewport.maxY, greaterThan(10)); + }); + + test('bars reach their baseline and get half a unit either side', () { + final viewport = _fit([ + BarSeries.values([5, 8]), + ]); + + expect(viewport.minX, -0.5); + expect(viewport.maxX, 1.5); + expect(viewport.minY, 0); + }); + + test('keeps the bounds it is given', () { + final viewport = _fit( + [ + LineSeries.values([1, 2]), + ], + minY: -3, + maxY: 7, + ); + + expect(viewport.minY, -3); + expect(viewport.maxY, 7); + }); + + test('fits the values only to the x window in view', () { + final viewport = _fit( + [ + LineSeries.values([100, 1, 2, 3]), + ], + minX: 0.5, + maxX: 3.5, + ); + + expect(viewport.maxY, lessThan(10)); + }); + + test('gives a flat series a range of its own', () { + final viewport = _fit([ + LineSeries.values([5, 5, 5]), + ]); + + expect(viewport.maxY, greaterThan(viewport.minY)); + expect(viewport.minY, lessThan(5)); + expect(viewport.maxY, greaterThan(5)); + }); + + test('labels the indices whose label is not blank', () { + final viewport = _fit([ + LineSeries.values([1, 2, 3, 4, 5, 6]), + ], xAxis: const SeriesXAxis(labels: ['Jan', '', '', 'Feb', '', 'Mar'])); + + expect(viewport.xTicks, [0, 3, 5]); + }); + + test('rules only the value ticks it is given, inside the range', () { + final viewport = _fit([ + LineSeries.values([0, 100]), + ], yAxis: const SeriesYAxis(ticks: [0, 50, 100, 1000])); + + expect(viewport.yTicks, [0, 50, 100]); + }); + + test('takes a reference line into the range only when it asks', () { + final series = [ + LineSeries.values([1, 2]), + ]; + + expect( + _fit( + series, + referenceLines: const [SeriesReferenceLine.horizontal(10)], + ).maxY, + lessThan(10), + ); + expect( + _fit( + series, + referenceLines: const [ + SeriesReferenceLine.horizontal(10, extendsRange: true), + ], + ).maxY, + greaterThanOrEqualTo(10), + ); + }); + + test('maps values to pixels and back', () { + final geometry = SeriesGeometry.layout( + size: const Size(200, 100), + padding: EdgeInsets.zero, + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + viewport: const SeriesViewport( + minX: 0, + maxX: 4, + minY: 0, + maxY: 10, + xTicks: [], + yTicks: [], + yStep: 1, + ), + ); + + expect(geometry.plot, const Rect.fromLTWH(0, 0, 200, 100)); + expect(geometry.xToPx(2), 100); + expect(geometry.yToPx(10), 0); + expect(geometry.yToPx(0), 100); + expect(geometry.pxToX(50), 1); + }); + }); + + group('paths', () { + test('a monotone curve never swings past the points either side', () { + const points = [ + Offset(0, 0), + Offset(10, 10), + Offset(20, 10), + Offset(30, 0), + Offset(40, 5), + Offset(50, 50), + ]; + final path = Path(); + addSeriesRun(path, points, LineCurve.monotone); + + final metric = path.computeMetrics().single; + for (var d = 0.0; d <= metric.length; d += 0.5) { + final p = metric.getTangentForOffset(d)!.position; + var segment = 0; + while (segment < points.length - 2 && p.dx > points[segment + 1].dx) { + segment++; + } + final a = points[segment].dy; + final b = points[segment + 1].dy; + expect( + p.dy, + inInclusiveRange((a < b ? a : b) - 0.01, (a > b ? a : b) + 0.01), + reason: 'at $p', + ); + } + }); + + test('dashes cut a line into its pattern', () { + final line = Path() + ..moveTo(0, 0) + ..lineTo(100, 0); + final metrics = dashSeriesPath(line, [10, 10]).computeMetrics().toList(); + + expect(metrics, hasLength(5)); + expect( + metrics.fold(0, (sum, m) => sum + m.length), + closeTo(50, 0.001), + ); + expect(identical(dashSeriesPath(line, null), line), isTrue); + }); + + test('a bar is rounded on the end away from its baseline', () { + final up = seriesBarShape( + left: 0, + right: 10, + valueY: 20, + baseY: 100, + radius: 3, + )!; + expect(up.tlRadiusX, 3); + expect(up.blRadiusX, 0); + + final down = seriesBarShape( + left: 0, + right: 10, + valueY: 150, + baseY: 100, + radius: 3, + )!; + expect(down.tlRadiusX, 0); + expect(down.blRadiusX, 3); + + final wide = seriesBarShape( + left: 0, + right: 10, + valueY: 0, + baseY: 100, + radius: 50, + )!; + expect(wide.tlRadiusX, 5); + + expect( + seriesBarShape(left: 0, right: 10, valueY: 50, baseY: 50, radius: 3), + isNull, + ); + }); + }); + + test('numbers get the decimals their step needs', () { + expect(formatSeriesNumber(5, 1), '5'); + expect(formatSeriesNumber(7.5, 2.5), '7.5'); + expect(formatSeriesNumber(0.25, 0.25), '0.25'); + expect(formatSeriesNumber(1, 0.25), '1.00'); + expect(formatSeriesNumber(0.3, 0.1), '0.3'); + }); + + test('an x label between whole numbers keeps its decimals', () { + const axis = SeriesXAxis(); + expect(axis.labelFor(0.5, step: 0.5), '0.5'); + // Every label on an axis stepping by 0.5 carries one decimal, whole or not. + expect(axis.labelFor(2, step: 0.5), '2.0'); + expect(axis.labelFor(3), '3'); + + final viewport = _fit([ + LineSeries( + points: const [ + SeriesPoint(0, 1), + SeriesPoint(0.5, 2), + SeriesPoint(1, 3), + ], + ), + ], xAxis: const SeriesXAxis(interval: 0.25)); + expect(viewport.xTicks, [0, 0.25, 0.5, 0.75, 1]); + expect(viewport.xStep, 0.25); + }); +} From e716898f20e70b81af505933a52e3ad56e284b01 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:49:29 +0330 Subject: [PATCH 04/10] feat: show series charts in the example A third tab, Series, draws the four shapes a business app asks for: a sparkline with a press tooltip, two series over a window of long data with a range selector, a balance panel and a profit panel sharing one crosshair, and a return line split at zero. A smoke test builds it at both layouts and in both palettes. --- example/lib/main.dart | 5 +- example/lib/src/series_page.dart | 345 +++++++++++++++++++++++++++++ example/test/series_page_test.dart | 32 +++ 3 files changed, 381 insertions(+), 1 deletion(-) create mode 100644 example/lib/src/series_page.dart create mode 100644 example/test/series_page_test.dart diff --git a/example/lib/main.dart b/example/lib/main.dart index 23edaec..cb4aa6f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'src/chart_page.dart'; import 'src/demo_state.dart'; import 'src/depth_page.dart'; +import 'src/series_page.dart'; void main() => runApp(const ExampleApp()); @@ -57,7 +58,7 @@ class _Home extends StatefulWidget { } class _HomeState extends State<_Home> with SingleTickerProviderStateMixin { - late final TabController _tabs = TabController(length: 2, vsync: this); + late final TabController _tabs = TabController(length: 3, vsync: this); @override void dispose() { @@ -88,6 +89,7 @@ class _HomeState extends State<_Home> with SingleTickerProviderStateMixin { tabs: const [ Tab(icon: Icon(Icons.candlestick_chart_outlined), text: 'Candles'), Tab(icon: Icon(Icons.area_chart_outlined), text: 'Depth'), + Tab(icon: Icon(Icons.show_chart), text: 'Series'), ], ), ), @@ -96,6 +98,7 @@ class _HomeState extends State<_Home> with SingleTickerProviderStateMixin { children: [ ChartPage(state: widget.state), DepthPage(state: widget.state), + SeriesPage(state: widget.state), ], ), ); diff --git a/example/lib/src/series_page.dart b/example/lib/src/series_page.dart new file mode 100644 index 0000000..338a417 --- /dev/null +++ b/example/lib/src/series_page.dart @@ -0,0 +1,345 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; +import 'package:ohlcv_chart/ohlcv_chart.dart'; + +import 'demo_state.dart'; + +/// Business charts drawn with `SeriesChart`: a sparkline, several series over +/// a window of long data, two panels sharing one crosshair, and a line split +/// at zero. +class SeriesPage extends StatefulWidget { + /// Creates the series demo over [state]. + const SeriesPage({required this.state, super.key}); + + /// The demo's settings, shared with the other pages. + final DemoState state; + + @override + State createState() => _SeriesPageState(); +} + +class _SeriesPageState extends State { + static const _days = 120; + static const _purple = Color(0xFF9775FA); + static const _blue = Color(0xFF4DABF7); + static const _amber = Color(0xFFFAB005); + static const _green = Color(0xFF12B886); + static const _red = Color(0xFFFA5252); + static const _months = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', // + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', + ]; + + final SeriesChartController _crosshair = SeriesChartController(); + SeriesWindow _window = const SeriesWindow(_days - 30, _days - 1); + int? _sparkIndex; + + late final List _dates = [ + for (var i = 0; i < _days; i++) DateTime(2026).add(Duration(days: i)), + ]; + late final List _monthLabels = [ + for (final d in _dates) d.day == 1 ? _months[d.month - 1] : '', + ]; + late final List _deposits = _walk(1800, 0.2, 0); + late final List _withdrawals = _walk(1100, 0.3, 2); + late final List _balance = _walk(12000, 0.08, 1); + late final List _average = [ + for (var i = 0; i < _days; i++) + _balance.sublist(math.max(0, i - 9), i + 1).reduce((a, b) => a + b) / + (i - math.max(0, i - 9) + 1), + ]; + late final List _profit = [ + 0, + for (var i = 1; i < _days; i++) _balance[i] - _balance[i - 1], + ]; + late final List _roi = [ + for (var i = 0; i < 40; i++) math.sin(i / 5) * 12 + i * 0.25 - 4, + ]; + + static List _walk(double base, double swing, double phase) => [ + for (var i = 0; i < _days; i++) + base + + math.sin(i / 9 + phase) * base * swing + + math.cos(i / 2.5 + phase) * base * swing * 0.3, + ]; + + static String _usd(double v) => + '\$${v.abs() >= 1000 ? '${(v / 1000).toStringAsFixed(1)}k' : v.toStringAsFixed(0)}'; + + String _date(int index) { + final d = _dates[index.clamp(0, _days - 1)]; + return '${_months[d.month - 1]} ${d.day}'; + } + + @override + void dispose() { + _crosshair.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: widget.state, + builder: (context, _) { + final dark = widget.state.dark; + final grid = dark ? const Color(0xFF2C2E33) : const Color(0xFFDEE2E6); + final paper = dark ? const Color(0xFF16191F) : Colors.white; + final tooltip = SeriesTooltip( + backgroundColor: dark ? const Color(0xFF25282E) : Colors.white, + borderColor: grid, + valueStyle: TextStyle(color: dark ? Colors.white : Colors.black87), + titleStyle: TextStyle(color: dark ? Colors.white60 : Colors.black54), + valueFormatter: (v) => _usd(v.value), + title: (d) => _date(d.index), + ); + + return ListView( + padding: const EdgeInsets.all(16), + children: [ + _card(context, paper, grid, 'Balance sparkline — press and drag', [ + SizedBox( + height: 58, + child: SeriesChart( + series: [ + LineSeries.values( + _balance, + color: _purple, + width: _sparkIndex == null ? 1 : 2, + curve: LineCurve.monotone, + fill: SeriesFill.fade(_purple, opacity: 0.3), + dotBuilder: _sparkIndex == null + ? null + : (i, _) => i == _sparkIndex + ? const SeriesDot(radius: 3) + : null, + ), + ], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + grid: SeriesGrid.none, + touch: SeriesTouch( + line: null, + showMarkers: false, + tooltip: SeriesTooltip( + placement: SeriesTooltipPlacement.above, + backgroundColor: tooltip.backgroundColor, + borderColor: grid, + valueStyle: tooltip.valueStyle, + titleStyle: tooltip.titleStyle, + valueFormatter: tooltip.valueFormatter, + title: tooltip.title, + ), + ), + onTouch: (d) => setState(() => _sparkIndex = d?.index), + animationDuration: const Duration(milliseconds: 600), + ), + ), + ]), + _card( + context, + paper, + grid, + 'Deposits and withdrawals — long-press', + [ + SizedBox( + height: 220, + child: SeriesChart( + series: [ + LineSeries.values( + _deposits, + label: 'Deposits', + color: _blue, + fill: SeriesFill.fade(_blue), + ), + LineSeries.values( + _withdrawals, + label: 'Withdrawals', + color: _amber, + fill: SeriesFill.fade(_amber), + ), + ], + minX: _window.start - 0.5, + maxX: _window.end + 0.5, + xAxis: SeriesXAxis(labels: _labelsFor(_window)), + yAxis: SeriesYAxis(width: 40, formatter: _usd), + grid: SeriesGrid(color: grid, dashPattern: const [4, 4]), + border: BorderSide(color: grid), + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + tooltip: tooltip, + ), + ), + ), + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.only(left: 40), + child: SeriesRangeSelector( + series: [ + LineSeries.values(_deposits, color: _blue, width: 1), + LineSeries.values(_withdrawals, color: _amber, width: 1), + ], + window: _window, + minSpan: 4, + border: BorderSide(color: grid), + maskColor: paper.withValues(alpha: 0.6), + handleColor: paper, + onChanged: (next) => setState(() => _window = next), + ), + ), + ], + ), + _card(context, paper, grid, 'Balance and profit — one crosshair', [ + SizedBox( + height: 180, + child: SeriesChart( + series: [ + LineSeries.values( + _balance, + label: 'Balance', + color: _purple, + fill: SeriesFill.fade(_purple, opacity: 0.14), + ), + LineSeries.values( + _average, + label: 'Average', + color: _amber, + dashPattern: const [6, 4], + ), + ], + xPadding: 0.5, + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis(width: 40, formatter: _usd), + grid: SeriesGrid(color: grid, dashPattern: const [4, 4]), + border: BorderSide(color: grid), + controller: _crosshair, + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + tooltip: SeriesTooltip( + builder: (context, d) => DecoratedBox( + decoration: BoxDecoration( + color: tooltip.backgroundColor, + border: Border.all(color: grid), + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(8), + child: Text( + '${_date(d.index)}\n' + 'Balance ${_usd(_balance[d.index])}\n' + 'P/L ${_usd(_profit[d.index])}', + style: tooltip.valueStyle, + ), + ), + ), + ), + ), + ), + ), + SizedBox( + height: 96, + child: SeriesChart( + series: [ + BarSeries.values( + _profit, + color: _green, + negativeColor: _red, + radius: 3, + minWidth: 1, + maxWidth: 12, + ), + ], + xAxis: SeriesXAxis(labels: _monthLabels), + yAxis: SeriesYAxis(width: 40, formatter: _usd, tickCount: 3), + grid: SeriesGrid( + vertical: false, + color: grid, + dashPattern: const [4, 4], + ), + border: BorderSide(color: grid), + controller: _crosshair, + touch: const SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + tooltip: null, + ), + animationDuration: const Duration(milliseconds: 450), + ), + ), + ]), + _card(context, paper, grid, 'ROI — split at zero', [ + SizedBox( + height: 80, + child: SeriesChart( + series: [ + LineSeries.values( + _roi, + color: _green, + negativeColor: _red, + width: 1.5, + curve: LineCurve.monotone, + fill: SeriesFill.fade(_green, negativeColor: _red), + ), + ], + includeZero: true, + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + grid: SeriesGrid.none, + referenceLines: [ + SeriesReferenceLine.horizontal( + 0, + color: grid, + dashPattern: const [3, 3], + ), + ], + touch: SeriesTouch( + markerBuilder: (v) => SeriesDot(radius: 3, color: v.color), + tooltip: SeriesTooltip( + placement: SeriesTooltipPlacement.above, + backgroundColor: tooltip.backgroundColor, + borderColor: grid, + valueStyle: tooltip.valueStyle, + valueFormatter: (v) => + '${v.value >= 0 ? '+' : ''}${v.value.toStringAsFixed(2)}%', + ), + ), + animationDuration: const Duration(milliseconds: 300), + ), + ), + ]), + ], + ); + }, + ); + } + + /// Month names inside a window; on a short window, every fifth day instead. + List _labelsFor(SeriesWindow window) { + if (window.span > 45) return _monthLabels; + return [for (var i = 0; i < _days; i++) i % 5 == 0 ? _date(i) : '']; + } + + Widget _card( + BuildContext context, + Color paper, + Color border, + String title, + List children, + ) => Container( + margin: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: paper, + border: Border.all(color: border), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text(title, style: Theme.of(context).textTheme.titleSmall), + const SizedBox(height: 12), + ...children, + ], + ), + ); +} diff --git a/example/test/series_page_test.dart b/example/test/series_page_test.dart new file mode 100644 index 0000000..493f9ff --- /dev/null +++ b/example/test/series_page_test.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:ohlcv_chart/ohlcv_chart.dart'; +import 'package:ohlcv_chart_example/src/demo_state.dart'; +import 'package:ohlcv_chart_example/src/series_page.dart'; + +void main() { + testWidgets('the series demo builds at both layouts and themes', ( + tester, + ) async { + final state = DemoState(); + addTearDown(state.dispose); + + for (final size in [const Size(1280, 900), const Size(420, 900)]) { + for (final dark in [false, true]) { + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + state.update(() => state.dark = dark); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold(body: SeriesPage(state: state)), + ), + ); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull, reason: '$size dark: $dark'); + expect(find.byType(SeriesChart), findsWidgets); + } + } + }); +} From 3f1a950fa9cd98dea5a8a1a3e564c3e845a765c3 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:49:29 +0330 Subject: [PATCH 05/10] test: scroll the indicator sheet's controls into view before tapping them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The control panel has grown past the 3000-pixel box the test lays it out in, so "Add indicator" sat at y = 3132, off the screen, and the tap landed on nothing — the sheet never opened and the test failed looking for its ATR chip. Each control is now scrolled into view before it is tapped. --- example/test/widget_test.dart | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 2d8ff7d..3e0dea3 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -71,16 +71,22 @@ void main() { addTearDown(state.dispose); await tester.pumpWidget(panel(state)); - Future addAtr() async { - // The panel's button, not the sheet's title, which reads the same. - await tester.tap(find.text('Add indicator').first); + // The panel has outgrown the box and the sheet can be taller than the + // screen, so each control is scrolled into view before it is tapped. + Future tapInView(Finder finder) async { + await tester.ensureVisible(finder); await tester.pumpAndSettle(); - await tester.tap(find.widgetWithText(ChoiceChip, 'ATR')); - await tester.pumpAndSettle(); - await tester.tap(find.widgetWithText(FilledButton, 'Add')); + await tester.tap(finder); await tester.pumpAndSettle(); } + Future addAtr() async { + // The panel's button, not the sheet's title, which reads the same. + await tapInView(find.text('Add indicator').first); + await tapInView(find.widgetWithText(ChoiceChip, 'ATR')); + await tapInView(find.widgetWithText(FilledButton, 'Add')); + } + await addAtr(); expect(find.widgetWithText(InputChip, 'ATR(14)'), findsOneWidget); From 84815701bb5bf1f3f33905fbef4f94694cc50b9d Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:49:29 +0330 Subject: [PATCH 06/10] docs: document series charts and migrating from fl_chart and candlesticks `doc/series-chart.md` covers `SeriesChart` part by part. The migration page maps `fl_chart`'s line and bar APIs and `candlesticks`' widget, candle and style onto this package's, with worked examples of a sparkline, a windowed multi-series chart, two panels on one crosshair and a line split at zero. Both are linked from the doc index, and the README gains a feature line. --- README.md | 1 + doc/README.md | 5 + doc/migrating-from-fl_chart.md | 327 +++++++++++++++++++++++++++++++++ doc/series-chart.md | 294 +++++++++++++++++++++++++++++ 4 files changed, 627 insertions(+) create mode 100644 doc/migrating-from-fl_chart.md create mode 100644 doc/series-chart.md diff --git a/README.md b/README.md index 0a79a88..dd0b538 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Named for the open-high-low-close-volume bars it renders. ## Features +- **Series charts for everything else** — `SeriesChart` draws plain values rather than candles: lines with four curves, areas that fade to a baseline and split colour where they cross it, rounded bars, several series at once, axes you write or hide, a tooltip of your own, one crosshair shared across charts, a range strip for long data and animated data changes. The [migration guide](doc/migrating-from-fl_chart.md) maps `fl_chart` and `candlesticks` onto it. - **Eight chart types** — candles, OHLC bars, a line, a step line, a filled area, an HLC area, a baseline chart and columns — plus Heikin-Ashi, Renko, three-line break, Kagi, point & figure and range bars as transforms of the candles themselves. - **31 indicators**, each a configured instance rather than a flag — so `ATR(8)`, `ATR(14)` and `ATR(20)` are three panes, with their own settings and colours. - **Main-chart overlays** — `MA`, `EMA`, `BOLL`, `SAR`, `VWAP` in three flavours — whole-series, anchored to a candle, or restarted each session with standard-deviation bands — Supertrend, Keltner and Donchian channels, the Ichimoku Cloud, pivot points and a volume profile. diff --git a/doc/README.md b/doc/README.md index b6fc5ad..9a2ca6d 100644 --- a/doc/README.md +++ b/doc/README.md @@ -10,6 +10,11 @@ For installation, the feature list and support, see the - **[Candlestick chart](candlestick-chart.md)** — the candles a `KChartWidget` needs, and the shape `KLineEntity` expects them in. +- **[Series charts](series-chart.md)** — `SeriesChart` for values rather than + candles: lines, areas and bars, several at once, a touch readout of your own, + a range strip for long data, and animation between data sets. +- **[Migrating from fl_chart and candlesticks](migrating-from-fl_chart.md)** — + their APIs mapped onto this package's, with worked examples. ## Series and indicators diff --git a/doc/migrating-from-fl_chart.md b/doc/migrating-from-fl_chart.md new file mode 100644 index 0000000..5feaa33 --- /dev/null +++ b/doc/migrating-from-fl_chart.md @@ -0,0 +1,327 @@ +# Migrating from fl_chart and candlesticks + +One package can draw both kinds of chart an app usually needs. + +- Replace `fl_chart`'s line and bar charts with [`SeriesChart`](series-chart.md). +- Replace `candlesticks` with [`KChartWidget`](candlestick-chart.md). + +The tables below map each API onto its replacement, and the worked examples +show the patterns apps build most often. + +## From fl_chart + +### Data + +| fl_chart | ohlcv_chart | +| --- | --- | +| `FlSpot(x, y)` | `SeriesPoint(x, y)` | +| `FlSpot.nullSpot` | `SeriesPoint(x, null)` — a gap | +| `spots: [for (i, v) … FlSpot(i, v)]` | `LineSeries.values(values)` / `BarSeries.values(values)` | +| `LineChartData(lineBarsData: [...])` | `SeriesChart(series: [LineSeries(...), ...])` | +| `BarChartData(barGroups: [...])` | `SeriesChart(series: [BarSeries(...)])` — one `BarSeries` per rod position in a group | + +### A line + +| `LineChartBarData` | `LineSeries` | +| --- | --- | +| `color` | `color` | +| `gradient` | `gradient` | +| `barWidth` | `width` | +| `isCurved: false` | `curve: LineCurve.linear` | +| `isCurved: true` | `curve: LineCurve.smooth` | +| `isCurved` + `preventCurveOverShooting` | `curve: LineCurve.monotone` | +| `isStepLineChart` | `curve: LineCurve.step` | +| `dashArray` | `dashPattern` | +| `isStrokeCapRound` | `roundCap` | +| `dotData: FlDotData(show, getDotPainter)` | `dot: SeriesDot(...)` or `dotBuilder: (index, point) => SeriesDot(...)` | +| `belowBarData: BarAreaData(gradient)` | `fill: SeriesFill(gradient: ..., toBaseline: false)` | +| `belowBarData` + `aboveBarData` cut off at `cutOffY: 0` | `fill: SeriesFill(gradient: ...)` with `baseline: 0`; the lower half mirrors itself | +| a stroke gradient split at zero | `negativeColor` | +| `showingIndicators` | `SeriesChartController.show(x)` | + +### Bars + +| `BarChartRodData` | `BarSeries` | +| --- | --- | +| `toY` | the point's value | +| `fromY: 0` | `baseline: 0` | +| `color` / per-rod colour | `color` + `negativeColor`, or `colorBuilder` | +| `width` | `width`, or `widthFactor` with `minWidth` / `maxWidth` | +| `borderRadius` rounded away from zero | `radius` — always on the end away from the baseline | +| `backDrawRodData` | `trackColor` | +| `gradient` | `gradient` | + +### The chart around the series + +| fl_chart | `SeriesChart` | +| --- | --- | +| `minX`, `maxX`, `minY`, `maxY` | the same names; leave them null to fit the data | +| `minX: -0.5, maxX: n - 0.5` for bars | the default: bars get half a unit either side | +| `titlesData: FlTitlesData(show: false)` | `xAxis: SeriesXAxis.hidden, yAxis: SeriesYAxis.hidden` | +| `bottomTitles: SideTitles(getTitlesWidget, interval, reservedSize)` | `xAxis: SeriesXAxis(labels / labelBuilder, interval, height)` | +| `leftTitles: SideTitles(getTitlesWidget, reservedSize)` | `yAxis: SeriesYAxis(formatter, width)` | +| `rightTitles` | `yAxis: SeriesYAxis(side: SeriesAxisSide.right)` | +| `gridData: FlGridData(show: false)` | `grid: SeriesGrid.none` | +| `horizontalInterval` | `yAxis: SeriesYAxis(interval: ...)`, which also places the labels | +| `verticalInterval`, `checkToShowVerticalLine` | vertical lines follow the x labels: `xAxis.labels`, `interval` or `ticks` | +| `getDrawingHorizontalLine: FlLine(color, strokeWidth, dashArray)` | `SeriesGrid(color, width, dashPattern)` | +| `borderData: FlBorderData(border: Border.all(...))` | `border: BorderSide(...)` | +| `extraLinesData: HorizontalLine(y, dashArray)` | `referenceLines: [SeriesReferenceLine.horizontal(y, dashPattern: ...)]` | +| `VerticalLine` | `SeriesReferenceLine.vertical(x)` | +| `rangeAnnotations` | `bands: [SeriesBand.horizontal(...)]` / `SeriesBand.vertical(...)` | +| `clipData: FlClipData.all()` | the default, `clipToPlot: true` | +| `duration`, `curve` | `animationDuration`, `animationCurve`; the first build animates too | + +### Touch + +| fl_chart | `SeriesChart` | +| --- | --- | +| `lineTouchData: LineTouchData(enabled: false)` | `touch: null` | +| default touch (while pressed) | `SeriesTouch(trigger: SeriesTouchTrigger.press)` — the default | +| a `GestureDetector` with `onLongPress…` over the chart | `SeriesTouch(trigger: SeriesTouchTrigger.longPress)` | +| `touchCallback` + `response.lineBarSpots` | `onTouch: (details) => …`: `details.index`, `details.values` | +| `getTooltipItems` → `LineTooltipItem` | `SeriesTooltip(title: ..., valueFormatter: ...)` | +| a hand-built tooltip overlay in a `Stack` | `SeriesTooltip(builder: (context, details) => …)` | +| `getTooltipColor`, `tooltipBorder`, `tooltipBorderRadius`, `tooltipPadding` | `backgroundColor`, `borderColor`, `borderRadius`, `padding` | +| `fitInsideHorizontally`, `fitInsideVertically` | always on | +| `getTouchedSpotIndicator` → `TouchedSpotIndicatorData(FlLine, FlDotData)` | `SeriesTouch(line: SeriesCrosshairLine(...), markerBuilder: ...)` | +| two charts kept in step by hand | one `SeriesChartController` given to both | + +`handleBuiltInTouches` has no equivalent, because touch is always handled by the +chart. To react to a touch without showing a tooltip, pass `tooltip: null` and +use `onTouch`. + +## Worked examples + +### A sparkline with a press tooltip + +```dart +SizedBox( + height: 58, + child: SeriesChart( + series: [ + LineSeries.values( + balances, + color: context.secondaryDark, + width: isTouched ? 2 : 1, + curve: LineCurve.monotone, + fill: SeriesFill(gradient: AppGradients.chartPurpleFade(context)), + dotBuilder: isTouched + ? (i, _) => SeriesDot(radius: i == touchedIndex ? 3 : 2) + : null, + ), + ], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + grid: SeriesGrid.none, + touch: SeriesTouch( + line: null, + showMarkers: false, + tooltip: SeriesTooltip( + placement: SeriesTooltipPlacement.above, + backgroundColor: context.backgroundPaper, + borderRadius: 10, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + builder: (context, d) => BalanceTooltip( + value: formatUsd(d.values.first.value), + date: labels[d.index], + ), + ), + ), + onTouch: (d) => onTouch(active: d != null, idx: d?.index ?? -1), + ), +); +``` + +### A multi-series chart over a window of long data + +This replaces a `LineChart`, a separate y-axis `LineChart`, a long-press +overlay and a range selector built from a third `LineChart`, all with one +chart and one strip. + +```dart +Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 220, + child: SeriesChart( + series: [ + for (final (i, s) in series.indexed) + LineSeries.values( + s.values, + label: s.label, + color: seriesColor(context, i), + fill: SeriesFill.fade(seriesColor(context, i)), + ), + ], + minX: window.start - .5, + maxX: window.end + .5, + xAxis: SeriesXAxis(labels: axisLabels, style: axisLabelStyle), + yAxis: SeriesYAxis(width: 30, formatter: formatUsdAxis, style: axisLabelStyle), + grid: SeriesGrid(color: context.gray700, dashPattern: const [4, 4]), + border: BorderSide(color: context.gray700), + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + tooltip: SeriesTooltip(builder: (context, d) => TrendTooltip(d)), + ), + animationDuration: dragging ? Duration.zero : const Duration(milliseconds: 450), + ), + ), + if (count > windowPoints) ...[ + const SizedBox(height: 12), + Padding( + padding: const EdgeInsetsDirectional.only(start: 30), + child: SeriesRangeSelector( + series: overviewSeries, + window: window, + minSpan: 4, + maskColor: context.backgroundBG.withValues(alpha: .6), + onChanged: (next) => setState(() => window = next), + ), + ), + ], + ], +); +``` + +### Two panels with one crosshair + +A balance line with its average dashed over it, and profit bars underneath. +Holding either panel marks the same row in both. + +```dart +final crosshair = SeriesChartController(); + +SeriesChart( + series: [ + LineSeries.values(balance, color: purple, fill: SeriesFill.fade(purple, opacity: .14)), + LineSeries.values(average, color: amber, dashPattern: const [6, 4]), + ], + xAxis: SeriesXAxis.hidden, + yAxis: const SeriesYAxis(width: 25), + xPadding: .5, + controller: crosshair, + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + tooltip: SeriesTooltip( + builder: (context, d) => BalanceTooltip(d, profit: profits[d.index]), + ), + ), +); +SeriesChart( + series: [ + BarSeries.values(profits, color: green, negativeColor: red, + radius: 3, minWidth: 3.5, maxWidth: 12), + ], + xAxis: SeriesXAxis(labels: axisLabels), + yAxis: const SeriesYAxis(width: 25), + controller: crosshair, + touch: const SeriesTouch(trigger: SeriesTouchTrigger.longPress, tooltip: null), +); +``` + +### Green above zero, red below + +```dart +SeriesChart( + series: [ + LineSeries.values( + roi, + color: green, + negativeColor: red, + width: 1.5, + curve: LineCurve.monotone, + fill: SeriesFill.fade(green, negativeColor: red), + ), + ], + includeZero: true, + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + grid: SeriesGrid.none, + referenceLines: [ + SeriesReferenceLine.horizontal(0, color: gray600, dashPattern: const [3, 3]), + ], + touch: SeriesTouch( + markerBuilder: (v) => SeriesDot(radius: 3, color: v.color), + tooltip: SeriesTooltip( + placement: SeriesTooltipPlacement.above, + valueFormatter: (v) => formatPercentFixed(v.value), + ), + ), + animationDuration: const Duration(milliseconds: 300), +); +``` + +The `zeroStop` arithmetic an `fl_chart` stroke gradient needs is gone: the +line changes colour exactly where it crosses its baseline. + +### Draw-in on mount + +Code like `ChartDrawIn`, which renders a flat frame first and pushes the real +values a frame later, is no longer needed. A non-zero `animationDuration` grows +the first build out of the baseline by itself (`animateOnMount`, on by +default). + +## From candlesticks + +| candlesticks | ohlcv_chart | +| --- | --- | +| `Candle(date:, open:, high:, low:, close:, volume:)` | `KLineEntity.fromCustom(dateTime:, open:, high:, low:, close:, vol:)` | +| a list **newest first** | a list **oldest first**: reverse it | +| — | `DataUtil.calculate(candles)` once, before the chart gets them | +| `Candlesticks(candles: candles)` | `KChartWidget(candles, ChartColors())` | +| `loadingWidget` | `candles.isEmpty ? MyLoading() : KChartWidget(...)` | +| `onLoadMoreCandles` | `onLoadMore: (atRight) { if (!atRight) loadOlder(); }` | +| `CandlesticksController` | `KChartController` — `zoomIn`, `zoomOut`, `scrollToNow`, `showRange` | +| `CandleSticksStyle` | `ChartColors` (see below) | + +```dart +final candles = [ + for (final p in points.reversed) + KLineEntity.fromCustom( + dateTime: DateTime.fromMillisecondsSinceEpoch(p.time * 1000), + open: p.open, + high: p.high, + low: p.low, + close: p.close, + vol: p.tickVolume.toDouble(), + ), +]; +DataUtil.calculate(candles); + +KChartWidget( + candles, + ChartColors( + bgColor: context.backgroundPaper, + gridColor: context.gray700, + defaultTextColor: context.textSoft, + upColor: context.successMain, + dnColor: context.errorMain, + ), + chartTranslations: ChartTranslations(date: l10n.date, open: l10n.open, …), +); +``` + +`isTrendLine` and `timeFrame` are optional since 2.5.0, and a watermark is any +widget passed as `watermark`. +Pass `timeFrame` to get a countdown on the current-price tag, and +`isTrendLine: true` to turn on the drawing tools. + +| `CandleSticksStyle` | `ChartColors` | +| --- | --- | +| `chartBackgroundColor` | `bgColor` | +| `gridLineColor` | `gridColor` | +| `axisTextColor` | `defaultTextColor` | +| `candleBullColor`, `candleBearColor` | `upColor`, `dnColor` | +| `volumeBullColor`, `volumeBearColor` | follow `upColor` / `dnColor` | +| `crosshairLineColor` | `hCrossColor`, `vCrossColor` | +| `crosshairLabelTextColor` | `crossTextColor` | +| `ohlcInfoBullColor`, `ohlcInfoBearColor` | `infoWindowUpColor`, `infoWindowDnColor` | +| `priceIndicatorBullBackgroundColor`, `…BearBackgroundColor` | `nowPriceUpColor`, `nowPriceDnColor` | +| `priceIndicatorTextColor` | `nowPriceTextColor` | +| `loadingIndicatorColor` | your own loading widget | + +`candlesticks` builds its own zoom buttons in a toolbar. `KChartWidget` zooms +by pinch and scroll, and a host that wants buttons calls `KChartController`'s +`zoomIn` and `zoomOut` from its own. diff --git a/doc/series-chart.md b/doc/series-chart.md new file mode 100644 index 0000000..d790f79 --- /dev/null +++ b/doc/series-chart.md @@ -0,0 +1,294 @@ +# Series charts + +`KChartWidget` reads candles against time. `SeriesChart` reads any numbers +against any numbers: a balance per day, sign-ups per month, profit per trade. +These are the charts a dashboard, a wallet or a report draws. It has lines, +areas and bars, several series at once, axes you can write or hide, a touch +readout you can replace, a range strip for long data, and animation between +data sets. + +```dart +SeriesChart( + series: [ + LineSeries.values( + balances, // List, placed at x = 0, 1, 2 … + color: purple, + curve: LineCurve.monotone, + fill: SeriesFill.fade(purple), + ), + ], + xAxis: SeriesXAxis(labels: dayNames), + yAxis: SeriesYAxis(formatter: formatUsd), +); +``` + +Everything else is optional. Every parameter's default draws a plain, +readable chart, and each section below changes one part of it. + +## Series + +A chart takes a list of `PlotSeries`, drawn bottom layer first. There are two +kinds, and one chart can mix them. + +Points are `SeriesPoint(x, y)` and run from the lowest x to the highest. When +your data is just a list of values, the `.values` constructors place them at +`x = 0, 1, 2, …`. A `null` value is a gap: a line breaks there and a bar is +left out. + +### Lines + +```dart +LineSeries( + points: [SeriesPoint(0, 12), SeriesPoint(1, 18), SeriesPoint(2, null), …], + label: l10n.balance, // named by the default tooltip + color: purple, + width: 2, // 0 draws no line: with `dot`, a scatter plot + curve: LineCurve.monotone, + dashPattern: [6, 4], // null draws solid + roundCap: true, + gradient: someGradient, // paints the stroke instead of `color` + negativeColor: red, // below `baseline`, split exactly where it crosses + baseline: 0, + fill: SeriesFill.fade(purple), + dot: SeriesDot(radius: 2), + dotBuilder: (index, point) => index == touched ? SeriesDot(radius: 3) : null, +); +``` + +`curve` decides how points are joined: + +| `LineCurve` | Draws | +| --- | --- | +| `linear` | straight segments | +| `smooth` | a curve through every point that can swing past a peak (`fl_chart`'s `isCurved`) | +| `monotone` | a curve through every point that never swings past its neighbours (`isCurved` + `preventCurveOverShooting`) | +| `step` | holds each value until the next point | + +### Fills + +A `SeriesFill` colours the area between the line and its `baseline`, or the +bottom of the plot when `toBaseline` is false. A fill anchored to the baseline +never paints across it. Above the baseline it uses `gradient` (or `color`), +measured from the line's highest point down to the baseline, so it fades out +exactly at the baseline. Below the baseline it uses `negativeGradient` (or +`negativeColor`), measured the other way. Left unset, the lower half reuses the +upper gradient flipped upside down, so both halves fade away from the line. + +```dart +// Green above zero, red below, each fading towards zero. +LineSeries.values( + roi, + color: green, + negativeColor: red, + curve: LineCurve.monotone, + fill: SeriesFill.fade(green, negativeColor: red, opacity: .24), +); +``` + +### Bars + +```dart +BarSeries.values( + profits, + color: green, + negativeColor: red, // or colorBuilder: (index, point) => … + baseline: 0, // bars grow from here, up or down + radius: 3, // on the end away from the baseline + widthFactor: .6, // share of the room between two x values + minWidth: 3.5, + maxWidth: 12, + width: null, // or a fixed width + trackColor: faint, // a full-height bar behind each one + gradient: null, // painted over each bar +); +``` + +Several bar series on one chart stand side by side at each x. When there are +bars, the x range gets half a unit of room at either end, so the first and last +bars are drawn whole. + +## Axes, grid and border + +```dart +SeriesChart( + series: …, + xAxis: SeriesXAxis( + labels: monthLabels, // labels[i] names x = i; '' prints nothing + interval: 2, // keep only every second one + height: 22, // room held below the plot + style: captionStyle, + ), + yAxis: SeriesYAxis( + width: 30, // room beside the plot; charts sharing it line up + side: SeriesAxisSide.left, + formatter: formatUsdAxis, + tickCount: 5, // or interval: 500, or ticks: [0, 500, 1000] + ), + grid: SeriesGrid(color: gray700, dashPattern: [4, 4], vertical: true), + border: BorderSide(color: gray700), +); +``` + +The x axis chooses which x values to label, and to draw a vertical grid line +at, in this order: + +1. `ticks`, if given. +2. Otherwise, every index whose entry in `labels` is not blank, kept only at + multiples of `interval` when that is set. A label list that names only month + starts therefore spaces itself. +3. Otherwise, every `interval`. +4. Otherwise, about `tickCount` round values. + +Labels that would overlap the one before are dropped, and `fitInside` slides +the first and last labels in so their text is not cut off. Use `labelBuilder` +to write a label from its x. + +`SeriesXAxis.hidden`, `SeriesYAxis.hidden` and `SeriesGrid.none` remove each +part, along with the room it held. A 58-pixel sparkline is a chart with all +three hidden. + +## The range of values + +With nothing set, x spans the points and the value range fits the data. The +fitted range gets `yPadding` (10%) of room above and below, then widens to the +next round tick at each end. The padding never pushes a series that stays above +zero below zero, or one that stays below zero above it. + +| Parameter | Does | +| --- | --- | +| `minX`, `maxX` | Pin the plot's edges. Set both to show a window of a longer series; the values range then fits what is in the window. | +| `xPadding` | Room either side of the fitted x range, in x units. | +| `minY`, `maxY` | Pin the value range. | +| `includeZero` | Always reach zero. | +| `yPadding` | Room above and below, as a share of the range. | +| `niceYRange` | Widen to round ticks (on by default). | + +## Reference lines and bands + +```dart +referenceLines: [ + SeriesReferenceLine.horizontal(0, color: gray600, dashPattern: [3, 3]), + SeriesReferenceLine.horizontal(target, label: l10n.target, extendsRange: true), + SeriesReferenceLine.vertical(todayIndex.toDouble(), label: l10n.today), +], +bands: [SeriesBand.vertical(5, 7, color: weekendShade)], +``` + +Reference lines are not interactive, and they sit under the series unless +`aboveSeries` is set. A horizontal line only widens the value range when +`extendsRange` asks, because otherwise a far-off target would flatten the data. + +## Touch + +```dart +SeriesChart( + series: …, + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, // press · longPress · tap · none + hover: true, // a mouse shows it too + line: SeriesCrosshairLine(color: gray600), + horizontalLine: null, + showMarkers: true, + markerBuilder: (v) => SeriesDot(radius: 3, color: v.value < 0 ? red : green), + tooltip: SeriesTooltip( + placement: SeriesTooltipPlacement.beside, // or above the point + title: (details) => dateLabels[details.index], + valueFormatter: (v) => formatUsd(v.value), + backgroundColor: paper, + borderColor: gray700, + ), + ), + onTouch: (details) => setState(() => touched = details?.index), +); +``` + +| `SeriesTouchTrigger` | Behaviour | +| --- | --- | +| `press` | Shows while a finger is down or dragging, and hides when it lifts. This is `fl_chart`'s default. | +| `longPress` | Shows after a long press and follows the finger, so a quick swipe still scrolls the page. | +| `tap` | A tap places it and it stays there. A drag moves it, and tapping the same point again clears it. | +| `none` | Only hover or the controller can show it. | + +The crosshair snaps to the nearest point. `onTouch` is called after it moves to +another x, and with `null` when it goes away. Its `SeriesTouchDetails` carry +the x (`index` for charts of plain values) and, for every series with a value +there, the series, the point, its position on the chart and its colour at that +value. + +To draw your own tooltip, give `SeriesTooltip.builder`. The chart still places +the result beside the crosshair or above the point and keeps it inside the +chart. Return `null` from the builder, or pass `tooltip: null`, to show no +tooltip at all. Pass `touch: null` to make the chart ignore touch and hover +entirely. + +### Several charts, one crosshair + +A `SeriesChartController` shows or clears the crosshair from code. Give two +charts the same controller, and touching either one marks the same x on both. +For example, a balance panel and a profit panel under it: + +```dart +final crosshair = SeriesChartController(); + +Column(children: [ + SizedBox(height: 200, child: SeriesChart(series: balance, controller: crosshair, …)), + SizedBox(height: 96, child: SeriesChart(series: profit, controller: crosshair, + touch: SeriesTouch(tooltip: null), …)), +]); +``` + +Charts stacked like this line up as long as they give `SeriesYAxis` the same +`width` and use the same x range. + +## A window over long data + +`SeriesRangeSelector` draws the whole data set small, with a window over it. +Drag inside the window to move it, or drag a handle to move that edge. The +selector holds no data of its own: show the window through the main chart's +`minX` and `maxX`, and keep the window it reports. + +```dart +var window = SeriesWindow(count - 30, count - 1.0); + +SeriesChart(series: series, minX: window.start - .5, maxX: window.end + .5, …); +SeriesRangeSelector( + series: overviewSeries, + window: window, + minSpan: 4, + onChanged: (next) => setState(() => window = next), +); +``` + +## Animation + +```dart +SeriesChart( + series: …, + animationDuration: Duration(milliseconds: 450), + animationCurve: Curves.easeOutCubic, + animateOnMount: true, +); +``` + +With a non-zero duration, new data moves into place. If each series has the +same number of points as before, every value moves from where it was, and the +value range moves with it. Otherwise, and on the first build, the values grow +out of each series' baseline, or from the edge of the plot when the baseline is +out of range. A change of colour or style alone does not animate. + +Leave the duration at zero for data that changes while it is being dragged, +such as a window moved by a range selector, so the chart keeps up with the +finger. + +## Sizing + +The chart fills the box it is given. In a box with no height of its own, such +as a `Column` without an `Expanded` or a scroll view, it is `defaultHeight` +(200) tall. `padding` keeps space clear around the whole chart, axes included. +`clipToPlot: false` lets a thick line or a dot at the edge draw past the plot +instead of being cut off. + +## Migrating + +[Migrating from fl_chart and candlesticks](migrating-from-fl_chart.md) maps +their APIs onto this one, with worked examples. From 630bc1e7551525d5aa572aed186ca5987c730956 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 10:49:29 +0330 Subject: [PATCH 07/10] docs: count the drawing kinds and the resuming indicators correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `theming.md` called the drawing kinds seventeen; there are thirty, so it no longer gives a number. `indicators.md` said sixteen indicators recompute in full and fourteen resume, which is thirty of the thirty-one — seventeen recompute in full. --- doc/indicators.md | 2 +- doc/theming.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/indicators.md b/doc/indicators.md index 47cc216..3b17e43 100644 --- a/doc/indicators.md +++ b/doc/indicators.md @@ -336,7 +336,7 @@ class MyIndicator extends Indicator { ``` `from` is the earliest index that can have moved. Return null — the default — -and the series is computed in full, which is always correct and is what sixteen +and the series is computed in full, which is always correct and is what seventeen of the built-in indicators still do: anything reading the whole series at once, such as a volume profile, a zigzag or the swing overlays built on it, has no tail to extend. The other fourteen resume, and a chart carrying a moving diff --git a/doc/theming.md b/doc/theming.md index 1674618..a0ce46b 100644 --- a/doc/theming.md +++ b/doc/theming.md @@ -20,7 +20,7 @@ KChartWidget( `close`, `changeAmount`, `change`, `amount`, `vol`, `jumpToNow`), so localising the chart is a matter of building one from your own `AppLocalizations`. Its `drawing` field does the same for the line editor, the drawing manager and what -each of the seventeen kinds is called: +each kind of drawing is called: ```dart ChartTranslations( From ab9073aa17b1496560d487514c16e69612a1cd14 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 13:16:47 +0330 Subject: [PATCH 08/10] feat: add pie and radar charts, and scatter, stacks and rotation to series charts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An app that reached for this package still reached for another one to draw a pie of its holdings or a radar of its scores, and `SeriesChart` could draw a line and a bar but not a dot, a stack or a bar lying on its side. `PieChart` draws a pie, a doughnut or a ring gauge: each section is worth a share rather than an angle, takes a colour or a gradient, a label placed anywhere across it, a radius of its own, an offset that explodes it and a badge widget pinned to it, with a hole that holds a widget of its own. `RadarChart` draws a web of features with an outline per series, as a polygon or as rings. Both animate, both report what a touch landed on, and the geometry both are laid out by — `layOutPie`, `pieSectionAt`, `radarCorner` and `RadarLayout` — is public, so it can be tested or reused to place a widget. `SeriesChart` gains what the other packages' bar and line charts have: `ScatterSeries` with four dot shapes and a touch that snaps to the nearest point rather than to an x; bar series that stack on each other, float between two values, carry a border and label their far end; error bars on any series; a fill between two lines; a step's position; a line shadow; axis titles and an x axis that can sit above the plot. The painter is rewritten to work in an x and a value rather than in screen pixels, which is what lets `orientation: SeriesOrientation.horizontal` turn the whole chart — curves, fills, gradients, crosshair and tooltip included — on its side. Co-Authored-By: Claude Opus 5 --- doc/README.md | 12 +- doc/bar-replay.md | 1 - doc/candlestick-chart.md | 7 +- doc/chart-types.md | 1 - doc/date-axis.md | 1 - doc/driving-the-chart.md | 4 - doc/event-marks.md | 1 - doc/indicators.md | 4 - doc/legend-and-crosshair.md | 1 - doc/migrating-from-fl_chart.md | 31 + doc/orders-and-positions.md | 1 - doc/panes.md | 1 - doc/pie-chart.md | 88 + doc/price-axis.md | 4 - doc/radar-chart.md | 84 + doc/series-chart.md | 149 +- doc/sessions.md | 3 - doc/theming.md | 32 + example/README.md | 27 +- example/lib/src/series_page.dart | 200 +- example/tool/screenshots.dart | 2232 ++++++++++++++++----- lib/ohlcv_chart.dart | 9 +- lib/src/export.dart | 8 +- lib/src/pie/pie_chart.dart | 569 ++++++ lib/src/radar/radar_chart.dart | 656 ++++++ lib/src/series/series_axis.dart | 127 +- lib/src/series/series_chart.dart | 265 ++- lib/src/series/series_chart_painter.dart | 924 +++++++-- lib/src/series/series_data.dart | 278 ++- lib/src/series/series_paths.dart | 105 +- lib/src/series/series_range_selector.dart | 95 +- lib/src/series/series_scale.dart | 243 ++- lib/src/series/series_touch.dart | 63 +- screenshots/pie-radar.png | Bin 0 -> 139418 bytes screenshots/series-charts.png | Bin 0 -> 184128 bytes screenshots/series-horizontal.png | Bin 0 -> 51866 bytes screenshots/series-panels.png | Bin 0 -> 167775 bytes screenshots/series-ranges.png | Bin 0 -> 93565 bytes screenshots/series-scatter.png | Bin 0 -> 77002 bytes screenshots/series-window.png | Bin 0 -> 202728 bytes screenshots/watermark.png | Bin 0 -> 148800 bytes test/pie_radar_test.dart | 276 +++ test/series_extras_test.dart | 447 +++++ 43 files changed, 5896 insertions(+), 1053 deletions(-) create mode 100644 doc/pie-chart.md create mode 100644 doc/radar-chart.md create mode 100644 lib/src/pie/pie_chart.dart create mode 100644 lib/src/radar/radar_chart.dart create mode 100644 screenshots/pie-radar.png create mode 100644 screenshots/series-charts.png create mode 100644 screenshots/series-horizontal.png create mode 100644 screenshots/series-panels.png create mode 100644 screenshots/series-ranges.png create mode 100644 screenshots/series-scatter.png create mode 100644 screenshots/series-window.png create mode 100644 screenshots/watermark.png create mode 100644 test/pie_radar_test.dart create mode 100644 test/series_extras_test.dart diff --git a/doc/README.md b/doc/README.md index 9a2ca6d..dddd0ef 100644 --- a/doc/README.md +++ b/doc/README.md @@ -11,8 +11,16 @@ For installation, the feature list and support, see the - **[Candlestick chart](candlestick-chart.md)** — the candles a `KChartWidget` needs, and the shape `KLineEntity` expects them in. - **[Series charts](series-chart.md)** — `SeriesChart` for values rather than - candles: lines, areas and bars, several at once, a touch readout of your own, - a range strip for long data, and animation between data sets. + candles: lines, areas, bars that group, stack or float, and scatter plots, + several at once, a chart you can turn on its side, a touch readout of your + own, a range strip for long data, and animation between data sets. + +- **[Pie chart](pie-chart.md)** — `PieChart`: sections worth a share of the + whole, a doughnut hole with a widget in it, exploded slices, badges and + touch. + +- **[Radar chart](radar-chart.md)** — `RadarChart`: a web of features with one + outline per series, drawn as a polygon or as rings. - **[Migrating from fl_chart and candlesticks](migrating-from-fl_chart.md)** — their APIs mapped onto this package's, with worked examples. diff --git a/doc/bar-replay.md b/doc/bar-replay.md index 866f9f3..000c928 100644 --- a/doc/bar-replay.md +++ b/doc/bar-replay.md @@ -13,7 +13,6 @@ final replay = ChartReplayController(interval: const Duration(milliseconds: 300) KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), replay: replay, ); diff --git a/doc/candlestick-chart.md b/doc/candlestick-chart.md index 8199877..2ba5411 100644 --- a/doc/candlestick-chart.md +++ b/doc/candlestick-chart.md @@ -13,7 +13,6 @@ DataUtil.calculate(candles); KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), indicators: [MaIndicator(period: 20), BollIndicator(), MacdIndicator()], timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, @@ -24,6 +23,12 @@ KChartWidget( ); ``` +Only the candles and the colours are required, so `KChartWidget(candles, +ChartColors())` is a whole chart. `timeFrame` adds a countdown to the close on +the current-price tag, `isTrendLine: true` turns the drawing tools on, and +`watermark` takes any widget to draw faintly behind the reading (see +[Theming](theming.md#watermark)). + `KLineEntity.fromJson` accepts the usual OHLCV shape (`open`, `high`, `low`, `close`, `vol`, `time`/`id`), or build the entity directly. diff --git a/doc/chart-types.md b/doc/chart-types.md index 0746c10..90881b5 100644 --- a/doc/chart-types.md +++ b/doc/chart-types.md @@ -6,7 +6,6 @@ KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), chartType: ChartType.bars, // candles, bars, line, area, baseline baselinePrice: 42_000, // baseline only; defaults to the oldest close in view diff --git a/doc/date-axis.md b/doc/date-axis.md index dd24826..5680874 100644 --- a/doc/date-axis.md +++ b/doc/date-axis.md @@ -18,7 +18,6 @@ marking the long form the crosshair wants: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), dateFormatter: (candle, longForm) => DateFormat( longForm ? 'EEE d MMM HH:mm' : 'HH:mm', diff --git a/doc/driving-the-chart.md b/doc/driving-the-chart.md index 697e938..cb2c256 100644 --- a/doc/driving-the-chart.md +++ b/doc/driving-the-chart.md @@ -9,7 +9,6 @@ final chart = KChartController(); KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), controller: chart, ); @@ -61,7 +60,6 @@ candle says nothing: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), onVisibleRangeChanged: (range) { setState(() => barsOnScreen = range.length); @@ -84,7 +82,6 @@ chart's own gestures away. KChartWidget( sessionCandles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 5), chartType: ChartType.area, scrollEnabled: false, @@ -255,7 +252,6 @@ Column( child: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), controller: chart, ), diff --git a/doc/event-marks.md b/doc/event-marks.md index 72944b9..6ea2bf3 100644 --- a/doc/event-marks.md +++ b/doc/event-marks.md @@ -9,7 +9,6 @@ the price it happened at: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(days: 1), events: [ ChartEvent(time: reportedAt, kind: ChartEventKind.earnings), diff --git a/doc/indicators.md b/doc/indicators.md index 3b17e43..1c92ade 100644 --- a/doc/indicators.md +++ b/doc/indicators.md @@ -8,7 +8,6 @@ the candles; everything else takes a pane of its own, stacked in the order given KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), indicators: [ MaIndicator(period: 7), @@ -126,7 +125,6 @@ intraday chart reads what has been paid on average *today*. KChartWidget( data, ChartColors(), - isTrendLine: false, indicators: [ SessionVwapIndicator(), // resets daily, ±1σ SessionVwapIndicator(session: PivotSession.week), // resets on the Monday @@ -155,7 +153,6 @@ re-measures as the window moves: KChartWidget( data, ChartColors(), - isTrendLine: false, indicators: [AnchoredVwapIndicator(anchor: firstVisible)], onVisibleRangeChanged: (range) => setState(() => firstVisible = range.firstIndex), @@ -231,7 +228,6 @@ drawn at, so a daily moving average can be read on a fifteen-minute chart: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), indicators: [ MaIndicator(period: 20), diff --git a/doc/legend-and-crosshair.md b/doc/legend-and-crosshair.md index 38ffc09..978f2db 100644 --- a/doc/legend-and-crosshair.md +++ b/doc/legend-and-crosshair.md @@ -13,7 +13,6 @@ indicator legends, worded by `ChartTranslations`. KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), showOhlcLegend: true, crosshairOnHover: true, diff --git a/doc/migrating-from-fl_chart.md b/doc/migrating-from-fl_chart.md index 5feaa33..86717c0 100644 --- a/doc/migrating-from-fl_chart.md +++ b/doc/migrating-from-fl_chart.md @@ -8,6 +8,8 @@ One package can draw both kinds of chart an app usually needs. The tables below map each API onto its replacement, and the worked examples show the patterns apps build most often. +![A return split at zero, profit bars, deposits and withdrawals with a tooltip, and a balance sparkline — all SeriesChart](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-charts.png) + ## From fl_chart ### Data @@ -38,6 +40,10 @@ show the patterns apps build most often. | `belowBarData` + `aboveBarData` cut off at `cutOffY: 0` | `fill: SeriesFill(gradient: ...)` with `baseline: 0`; the lower half mirrors itself | | a stroke gradient split at zero | `negativeColor` | | `showingIndicators` | `SeriesChartController.show(x)` | +| `isStepLineChart` + `lineChartStepData.stepDirection` | `curve: LineCurve.step` + `stepPosition` | +| `shadow` | `shadow` | +| `betweenBarsData: BetweenBarsData(fromIndex, toIndex)` | `betweenFills: [SeriesBetweenFill(from:, to:)]` | +| `errorIndicatorData` + `FlErrorRange` | `SeriesPoint(x, y, yError: SeriesErrorRange(...))` + `errorBars` | ### Bars @@ -50,6 +56,10 @@ show the patterns apps build most often. | `borderRadius` rounded away from zero | `radius` — always on the end away from the baseline | | `backDrawRodData` | `trackColor` | | `gradient` | `gradient` | +| `fromY` per rod, for a floating bar | `SeriesPoint(x, y, low: ...)` | +| `BarChartRodStackItem` | one `BarSeries` per layer, sharing a `stack` | +| `borderSide` | `border` | +| `showingTooltipIndicators` on a rod | `labelBuilder` for a permanent label | ### The chart around the series @@ -71,6 +81,23 @@ show the patterns apps build most often. | `rangeAnnotations` | `bands: [SeriesBand.horizontal(...)]` / `SeriesBand.vertical(...)` | | `clipData: FlClipData.all()` | the default, `clipToPlot: true` | | `duration`, `curve` | `animationDuration`, `animationCurve`; the first build animates too | +| `rotationQuarterTurns: 1` on a bar chart | `orientation: SeriesOrientation.horizontal` | +| `axisNameWidget: AxisTitle(...)` | `xAxis: SeriesXAxis(title: ...)`, `yAxis: SeriesYAxis(title: ...)` | +| `topTitles` | `xAxis: SeriesXAxis(side: SeriesXSide.top)` | + +### The other chart types + +| fl_chart | ohlcv_chart | +| --- | --- | +| `ScatterChart(scatterSpots: [ScatterSpot(x, y, dotPainter: ...)])` | `SeriesChart(series: [ScatterSeries(points: ...)])` with `SeriesTouchSnap.nearestPoint` | +| `FlDotCirclePainter`, `FlDotSquarePainter`, `FlDotCrossPainter` | `SeriesDot(shape: SeriesDotShape.circle / square / diamond / cross)` | +| `PieChart(PieChartData(sections: [PieChartSectionData(value, title, radius)]))` | [`PieChart(sections: [PieSection(value:, label:, radius:)])`](pie-chart.md) | +| `centerSpaceRadius`, `centerSpaceColor` | the same names; `centerChild` also puts a widget in the hole | +| `PieChartSectionData.badgeWidget`, `badgePositionPercentageOffset` | `PieSection.badge`, `badgePosition` | +| `RadarChart(RadarChartData(dataSets: [RadarDataSet(dataEntries: ...)]))` | [`RadarChart(series: [RadarSeries(values: ...)])`](radar-chart.md) | +| `getTitle` per feature | `features: ['Speed', ...]` | +| `radarShape: RadarShape.circle` | `shape: RadarShape.circle` | +| `tickCount`, `ticksTextStyle` | `tickCount`, `tickStyle` with `showTicks` | ### Touch @@ -135,6 +162,8 @@ SizedBox( ### A multi-series chart over a window of long data +![Three series over a window of five months, a day read out, and the range selector that moves the window](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-window.png) + This replaces a `LineChart`, a separate y-axis `LineChart`, a long-press overlay and a range selector built from a third `LineChart`, all with one chart and one strip. @@ -187,6 +216,8 @@ Column( ### Two panels with one crosshair +![A balance panel over a profit panel, one crosshair marking the same day in both](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-panels.png) + A balance line with its average dashed over it, and profit bars underneath. Holding either panel marks the same row in both. diff --git a/doc/orders-and-positions.md b/doc/orders-and-positions.md index f73bd64..3603bab 100644 --- a/doc/orders-and-positions.md +++ b/doc/orders-and-positions.md @@ -8,7 +8,6 @@ from the venue rather than from the user, and they are not saved with a layout. KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), positions: [ ChartPosition( diff --git a/doc/panes.md b/doc/panes.md index 2254bfe..a656a92 100644 --- a/doc/panes.md +++ b/doc/panes.md @@ -9,7 +9,6 @@ down the stack by dragging its legend row: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), indicators: [MacdIndicator(), RsiIndicator()], resizablePanes: true, diff --git a/doc/pie-chart.md b/doc/pie-chart.md new file mode 100644 index 0000000..9c8ba56 --- /dev/null +++ b/doc/pie-chart.md @@ -0,0 +1,88 @@ +# Pie chart + +![A doughnut of holdings with a total in the hole, its biggest slice pulled out and badged](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/pie-radar.png) + +`PieChart` draws a ring of sections, each as wide as its share of the whole: a +pie, a doughnut when the middle is left open, or a single-section gauge. (The +radar beside it is [its own page](radar-chart.md).) + +```dart +PieChart( + sections: [ + PieSection(value: 40, color: blue, label: '40%'), + PieSection(value: 35, color: green, label: '35%'), + PieSection(value: 25, color: amber, label: '25%'), + ], + centerSpaceRadius: 40, + centerChild: const Text('Total'), +); +``` + +The chart fills the box it is given, and is `defaultSize` square in a box that +sets no size of its own. + +## Sections + +A section's `value` is a share, not an angle. The values are added up and each +section gets the part of the circle it is worth, so `[40, 35, 25]` and +`[8, 7, 5]` draw the same pie. A section worth nothing is left out, and a set of +sections worth nothing at all draws nothing. + +| Field | What it does | +| --- | --- | +| `color` | Fill colour | +| `gradient` | Fill gradient, measured over the section; it wins over `color` | +| `label`, `labelStyle` | Written on the section | +| `labelPosition` | Where the label sits: 0 at the inner edge, 1 at the outer one | +| `radius` | How far this one section reaches, so it can stand out | +| `border` | An outline round it | +| `offset` | How far it is pushed out of the circle — the exploded slice | +| `badge`, `badgePosition` | A widget pinned to the section | + +## The circle + +| Field | What it does | +| --- | --- | +| `radius` | How far the sections reach; null fills the box | +| `centerSpaceRadius` | The hole in the middle; 0 draws a full pie | +| `centerSpaceColor` | Painted in the hole | +| `centerChild` | A widget centred in the hole — a total, a title, a button | +| `sectionsSpace` | The gap between two sections, in pixels round the outer edge | +| `startDegreeOffset` | Where the first section starts, clockwise from twelve | +| `clockwise` | Whether the sections go round clockwise | + +## Touch + +A touch or a hovering mouse names the section under it. That section grows by +`touchedSectionGrowth` while it is held — the room for it is taken off the +radius, so nothing is cut off at the edge — and `onTouch` reports which one it +is, with `null` when the touch leaves. + +```dart +PieChart( + sections: sections, + onTouch: (details) => setState(() => selected = details?.index), +); +``` + +## Placing your own widgets + +The geometry is public, so anything can be put exactly where a section is: + +```dart +final slices = layOutPie( + sections: sections, + radius: 80, + innerRadius: 40, +); +final at = slices[1].pointAt(centre, 0.5); // the middle of the second section +``` + +`pieSectionAt` answers the other question — which section a point is inside, +and `null` for the hole or the space around the circle. + +## Animation + +With `animationDuration` set, the sections sweep open from the start angle, +each one keeping its place. `animateOnMount: false` draws the first build +whole. diff --git a/doc/price-axis.md b/doc/price-axis.md index 1608cd6..6d06fb0 100644 --- a/doc/price-axis.md +++ b/doc/price-axis.md @@ -4,7 +4,6 @@ KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(days: 1), priceAxisScale: PriceAxisScale.logarithmic, ); @@ -44,7 +43,6 @@ a denser axis and lower it for a sparser one. KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(days: 1), chartStyle: const ChartStyle(gridRows: 12), ); @@ -114,7 +112,6 @@ Drawings keep their own labels, which are yours to set through each one's KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(days: 1), invertPriceAxis: true, // higher prices lower down showAverageClose: true, // a level at the mean close over the window @@ -240,7 +237,6 @@ the labels hands the axis back to the chart. KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(days: 1), controller: chart, priceScaleDrag: true, diff --git a/doc/radar-chart.md b/doc/radar-chart.md new file mode 100644 index 0000000..7a34d93 --- /dev/null +++ b/doc/radar-chart.md @@ -0,0 +1,84 @@ +# Radar chart + +![A five-feature radar web with two scored strategies drawn over it](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/pie-radar.png) + +`RadarChart` compares several things over the same features: a web of spokes, +one outline per series. (The doughnut beside it is +[its own page](pie-chart.md).) + +```dart +RadarChart( + features: const ['Speed', 'Power', 'Range', 'Cost', 'Weight'], + series: [ + RadarSeries(values: const [4, 3, 5, 2, 4], color: blue, label: 'Now'), + RadarSeries(values: const [3, 5, 2, 4, 3], color: amber, label: 'Target'), + ], + maxValue: 5, +); +``` + +The chart fills the box it is given, and is `defaultSize` square in a box that +sets no size of its own. + +## Series + +A `RadarSeries` carries one value per feature, in the order `features` names +them. A value beyond the range is held at the edge rather than drawn off the +web, and a `null` leaves that corner out of the outline. + +| Field | What it does | +| --- | --- | +| `color` | The outline colour | +| `fillColor` | Inside the outline; null uses a faint `color` | +| `width`, `dashPattern` | The outline itself; `width: 0` draws none | +| `dot` | A dot on every corner | +| `label` | What the series is called, for a legend of your own | + +## The web + +| Field | What it does | +| --- | --- | +| `features` | What each corner is called; an empty list leaves them unnamed | +| `minValue`, `maxValue` | The middle and the outer ring; `maxValue` null takes the largest value given | +| `tickCount` | How many rings are drawn | +| `shape` | `RadarShape.polygon` — the spider web — or `circle` | +| `startDegreeOffset` | Where the first feature sits, clockwise from twelve | +| `gridColor`, `gridWidth` | The rings | +| `spokeColor`, `spokeWidth` | The spokes out to each corner | +| `showTicks`, `tickStyle` | The value each ring stands for, written up the first spoke | +| `featureStyle`, `featureGap` | The names outside the web | +| `radius` | How far the web reaches; null fits the box, leaving room for the names | + +## Touch + +`onTouch` reports the corner nearest the finger — which series, which feature +and the value there — within `touchThreshold` pixels, and `null` when the touch +leaves. + +```dart +RadarChart( + series: series, + onTouch: (details) => setState(() => hovered = details?.featureIndex), +); +``` + +## Placing your own widgets + +`radarCorner` and `RadarLayout` are public, so a legend chip or a badge can be +put exactly on a corner: + +```dart +const layout = RadarLayout( + centre: Offset(120, 120), + radius: 100, + count: 5, + minValue: 0, + maxValue: 10, + startAngle: -math.pi / 2, +); +final at = layout.cornerFor(2, 7); // where the third feature's 7 is drawn +``` + +## Animation + +With `animationDuration` set, the outlines grow out of the middle. diff --git a/doc/series-chart.md b/doc/series-chart.md index d790f79..842ea8c 100644 --- a/doc/series-chart.md +++ b/doc/series-chart.md @@ -7,6 +7,8 @@ areas and bars, several series at once, axes you can write or hide, a touch readout you can replace, a range strip for long data, and animation between data sets. +![A return split at zero, profit bars, deposits and withdrawals with a tooltip, and a balance sparkline — all SeriesChart](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-charts.png) + ```dart SeriesChart( series: [ @@ -27,8 +29,8 @@ readable chart, and each section below changes one part of it. ## Series -A chart takes a list of `PlotSeries`, drawn bottom layer first. There are two -kinds, and one chart can mix them. +A chart takes a list of `PlotSeries`, drawn bottom layer first. There are three +kinds — lines, bars and scatter — and one chart can mix them. Points are `SeriesPoint(x, y)` and run from the lowest x to the highest. When your data is just a list of values, the `.values` constructors place them at @@ -62,7 +64,9 @@ LineSeries( | `linear` | straight segments | | `smooth` | a curve through every point that can swing past a peak (`fl_chart`'s `isCurved`) | | `monotone` | a curve through every point that never swings past its neighbours (`isCurved` + `preventCurveOverShooting`) | -| `step` | holds each value until the next point | +| `step` | holds each value until the next point; `stepPosition` says where between two points it changes — 0 at the first, 0.5 halfway, 1 at the second | + +A line also takes a `shadow`, a blurred copy of it drawn underneath. ### Fills @@ -107,6 +111,129 @@ Several bar series on one chart stand side by side at each x. When there are bars, the x range gets half a unit of room at either end, so the first and last bars are drawn whole. +Bar series that share a `stack` are piled on each other instead: each one +starts where the ones before it ended, upwards for values above the baseline +and downwards for values below, and only the outermost bar is rounded. A stack +takes one place in the row, so a stack and a plain series still stand side by +side. + +```dart +SeriesChart( + series: [ + BarSeries.values(deposits, color: green, stack: 'flow', radius: 0), + BarSeries.values(withdrawals, color: red, stack: 'flow', radius: 3), + ], +); +``` + +A point with a `low` draws a bar that floats between two values rather than +growing from the baseline — a range, or a step of a waterfall: + +```dart +BarSeries( + points: [SeriesPoint(0, 8, low: 4), SeriesPoint(1, 11, low: 8)], +); +``` + +`border` outlines each bar, and `labelBuilder` writes past its far end: + +```dart +BarSeries.values( + profits, + border: const BorderSide(color: outline), + labelBuilder: (index, point) => formatUsd(point.y!), +); +``` + +### Scatter + +![Every trade as a dot, wins as circles and losses as crosses, one of them read out](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-scatter.png) + +A `ScatterSeries` places a dot per point, free on both axes: + +```dart +SeriesChart( + series: [ + ScatterSeries( + points: trades, + dotBuilder: (index, point) => SeriesDot( + radius: 3 + point.y! / 40, + shape: point.y! < 0 ? SeriesDotShape.cross : SeriesDotShape.circle, + color: point.y! < 0 ? red : green, + ), + labelBuilder: (index, point) => names[index], + ), + ], + touch: const SeriesTouch(snap: SeriesTouchSnap.nearestPoint), +); +``` + +`SeriesTouchSnap.nearestPoint` reads out the one dot under the finger, within +`SeriesTouch.threshold` pixels, instead of everything at that x — which is what +a scatter plot wants and a line chart does not. + +A dot's `shape` is a `circle`, a `square`, a `diamond` or a `cross`. + +### Error bars + +A point can carry how far it might be off, on either axis: + +```dart +SeriesPoint( + 0, + 5, + yError: const SeriesErrorRange(0.4, 0.9), // below, above + xError: const SeriesErrorRange.symmetric(0.2), +); +``` + +Any series draws them, styled by `errorBars: SeriesErrorBars(color, width, +capLength)`; pass `errorBars: null` to leave them out. The value range makes +room for them. + +### Filling between two lines + +![A waterfall of floating bars beside a forecast with its band and its error bars](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-ranges.png) + +The same picture shows both: floating bars on the left, and on the right a +`betweenFills` band with error bars every few points. + +`betweenFills` shades the gap between two of the series — a high and a low, a +plan and what happened: + +```dart +SeriesChart( + series: [ + LineSeries.values(high, color: blue), + LineSeries.values(low, color: blue), + ], + betweenFills: const [ + SeriesBetweenFill(from: 0, to: 1, color: Color(0x2200A3FF)), + ], +); +``` + +## Turning the chart on its side + +![Stacked in and out bars running rightwards, months down the left, values along the bottom](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-horizontal.png) + +`orientation: SeriesOrientation.horizontal` runs the x axis down the chart and +grows the values rightwards, which is the horizontal bar chart: + +```dart +SeriesChart( + orientation: SeriesOrientation.horizontal, + series: [BarSeries.values(byCategory, radius: 3)], + xAxis: SeriesXAxis(labels: categoryNames), +); +``` + +Everything turns with it: curves and steps follow the x axis rather than the +screen, gradients written for an upright chart still point at the high values, +the crosshair reads down the chart, and the tooltip hangs off the far end of +the values. `SeriesAxisSide.left` puts the value axis along the bottom and +`SeriesXSide.bottom` puts the x labels down the left. + ## Axes, grid and border ```dart @@ -143,6 +270,18 @@ Labels that would overlap the one before are dropped, and `fitInside` slides the first and last labels in so their text is not cut off. Use `labelBuilder` to write a label from its x. +Either axis takes a `title`, written beyond its labels and turned to read up an +axis that runs down the chart, and a side of its own: `SeriesXSide.top` puts +the x labels over the plot and `SeriesAxisSide.right` puts the values on the +right. + +```dart +SeriesChart( + xAxis: SeriesXAxis(labels: monthLabels, title: l10n.month), + yAxis: SeriesYAxis(formatter: formatUsdAxis, title: l10n.balance), +); +``` + `SeriesXAxis.hidden`, `SeriesYAxis.hidden` and `SeriesGrid.none` remove each part, along with the room it held. A 58-pixel sparkline is a chart with all three hidden. @@ -223,6 +362,8 @@ entirely. ### Several charts, one crosshair +![A balance panel over a profit panel, one crosshair marking the same day in both](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-panels.png) + A `SeriesChartController` shows or clears the crosshair from code. Give two charts the same controller, and touching either one marks the same x on both. For example, a balance panel and a profit panel under it: @@ -242,6 +383,8 @@ Charts stacked like this line up as long as they give `SeriesYAxis` the same ## A window over long data +![Three series over a window of five months, a day read out, and the range selector that moves the window](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/series-window.png) + `SeriesRangeSelector` draws the whole data set small, with a window over it. Drag inside the window to move it, or drag a handle to move that edge. The selector holds no data of its own: show the window through the main chart's diff --git a/doc/sessions.md b/doc/sessions.md index 0b3bd9f..6851574 100644 --- a/doc/sessions.md +++ b/doc/sessions.md @@ -4,7 +4,6 @@ KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), chartStyle: const ChartStyle(showSessionDividers: true), timeZoneOffset: const Duration(hours: -5), @@ -28,7 +27,6 @@ pre-market and the after-hours — are washed behind the candles: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), timeZoneOffset: const Duration(hours: -5), session: const TradingSession( @@ -55,7 +53,6 @@ to use it, or null to leave the up or down colour it would have had: KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), candleColor: (candle, index) { final range = candle.high - candle.low; diff --git a/doc/theming.md b/doc/theming.md index a0ce46b..23e10af 100644 --- a/doc/theming.md +++ b/doc/theming.md @@ -53,6 +53,38 @@ The long-press readout sizes itself to its content between `infoDialogWidth` and `infoDialogMaxWidth`, and is never wider than the chart. Set `isTapShowInfoDialog` to open it on a plain tap as well. +## Watermark + +![Candles under a watermark made of an icon and a name](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/watermark.png) + +`watermark` takes any widget — an `Image.asset` of your logo, an icon, a line of +text — and draws it faintly over the candle area: + +```dart +KChartWidget( + candles, + ChartColors(watermarkColor: Colors.white.withValues(alpha: .06)), + watermark: Image.asset('assets/logo.png'), + chartStyle: const ChartStyle( + watermarkScale: .3, // width, as a share of the shorter side + watermarkAlignment: Alignment.bottomRight, + ), +); +``` + +It is painted in one colour, `ChartColors.watermarkColor` — a very faint +`defaultTextColor` when left null — so a full-colour logo reads as a quiet +silhouette. It takes no touches, so the chart under it behaves as though it were +not there. The package has no SVG dependency; an app that wants an SVG +watermark passes an `SvgPicture.asset` from `flutter_svg` itself. + +## Series charts + +`SeriesChart` does not read `ChartColors` or `ChartStyle`: each series carries +its own colour, and the axes, grid, tooltip and range selector take their styles +directly, so a series chart picks up an app's theme from wherever the app keeps +it. See [Series charts](series-chart.md). + --- [← All docs](README.md) · [Package README](../README.md) diff --git a/example/README.md b/example/README.md index 14ede97..fa4d8a6 100644 --- a/example/README.md +++ b/example/README.md @@ -6,7 +6,7 @@ Run it with: flutter run ``` -A tour of the whole package in two tabs. The market data is generated locally, +A tour of the whole package in three tabs. The market data is generated locally, so the demo needs no network. ## The Candles tab @@ -65,6 +65,31 @@ through `DepthEntity.bids` and `DepthEntity.asks`, with chips for its four modes — curve, bars, both and the numeric ladder — its linear, log and percent axes, and how far either side of the mid to look. +## The Series tab + +`SeriesChart` drawing the charts a business app asks for, each in its own card: + +- **A sparkline** — 58 pixels high with no axes, a monotone line over a fading + fill; press and drag for a tooltip above the point. +- **Deposits and withdrawals** — two filled series over a 30-day window of 120 + days, with a long-press tooltip and a `SeriesRangeSelector` underneath to move + and resize the window. +- **Balance and profit** — a balance line with its dashed average over rounded + green and red profit bars, the two panels sharing one `SeriesChartController` + so holding either marks the same day on both. +- **ROI** — a line and its fill split green and red exactly at a dashed zero + line. +- **Flows per month** — two bar series stacked on each other, on a chart turned + on its side, with both axes named. +- **Trades** — a scatter plot whose dots take their size, shape and colour from + the point, read out one dot at a time. +- **Holdings** — a `PieChart` doughnut with a total in the hole; hovering a + slice pushes it out and names it. +- **Two strategies scored** — a `RadarChart` over five measures, reporting the + corner under the pointer. + +All eight follow the palette switch in the app bar. + ## The intraday demo A second entry point, for the other kind of chart: one session drawn as an diff --git a/example/lib/src/series_page.dart b/example/lib/src/series_page.dart index 338a417..e4868da 100644 --- a/example/lib/src/series_page.dart +++ b/example/lib/src/series_page.dart @@ -58,11 +58,25 @@ class _SeriesPageState extends State { ]; static List _walk(double base, double swing, double phase) => [ - for (var i = 0; i < _days; i++) - base + - math.sin(i / 9 + phase) * base * swing + - math.cos(i / 2.5 + phase) * base * swing * 0.3, + for (var i = 0; i < _days; i++) + base + + math.sin(i / 9 + phase) * base * swing + + math.cos(i / 2.5 + phase) * base * swing * 0.3, + ]; + + /// What each asset is worth, for the pie. + static const _holdings = [42.0, 26.0, 18.0, 14.0]; + static const _holdingNames = ['BTC', 'ETH', 'SOL', 'Cash']; + + /// Two strategies scored over the same five measures, for the radar. + static const _scores = [ + [4.4, 3.1, 4.8, 2.2, 3.6], + [3.0, 4.7, 2.4, 4.1, 4.4], ]; + static const _measures = ['Return', 'Sharpe', 'Win rate', 'Cost', 'Drawdown']; + + int? _slice; + String? _corner; static String _usd(double v) => '\$${v.abs() >= 1000 ? '${(v / 1000).toStringAsFixed(1)}k' : v.toStringAsFixed(0)}'; @@ -112,8 +126,8 @@ class _SeriesPageState extends State { dotBuilder: _sparkIndex == null ? null : (i, _) => i == _sparkIndex - ? const SeriesDot(radius: 3) - : null, + ? const SeriesDot(radius: 3) + : null, ), ], xAxis: SeriesXAxis.hidden, @@ -307,6 +321,145 @@ class _SeriesPageState extends State { ), ), ]), + _card(context, paper, grid, 'Flows per month, stacked and turned', [ + SizedBox( + height: 200, + child: SeriesChart( + orientation: SeriesOrientation.horizontal, + series: [ + BarSeries.values( + const [3.2, 4.1, 2.6, 5.4, 4.8, 6.1], + color: _green, + stack: 'flow', + label: 'In', + ), + BarSeries.values( + const [1.4, 2.2, 3.1, 1.8, 2.6, 2.1], + color: _red, + stack: 'flow', + radius: 3, + label: 'Out', + ), + ], + xAxis: SeriesXAxis( + labels: _months.take(6).toList(), + title: 'Month', + ), + yAxis: SeriesYAxis( + formatter: (v) => '${v.toStringAsFixed(0)}k', + title: 'Flow', + ), + grid: SeriesGrid(color: grid, dashPattern: const [4, 4]), + animationDuration: const Duration(milliseconds: 400), + ), + ), + ]), + _card(context, paper, grid, 'Trades: size against return', [ + SizedBox( + height: 220, + child: SeriesChart( + series: [ + ScatterSeries( + points: [ + for (var i = 0; i < 40; i++) + SeriesPoint( + 1 + (i * 7 % 23).toDouble(), + math.sin(i / 3) * 8 + math.cos(i / 1.7) * 4, + ), + ], + dotBuilder: (index, point) => SeriesDot( + radius: 3 + (point.x / 12), + shape: point.y! < 0 + ? SeriesDotShape.cross + : SeriesDotShape.circle, + color: point.y! < 0 ? _red : _green, + ), + ), + ], + xAxis: SeriesXAxis( + tickCount: 5, + title: 'Size', + labelBuilder: (v) => v.toStringAsFixed(0), + ), + yAxis: SeriesYAxis( + title: 'Return', + formatter: (v) => '${v.toStringAsFixed(0)}%', + ), + grid: SeriesGrid(color: grid), + referenceLines: [ + SeriesReferenceLine.horizontal(0, color: grid, width: 1), + ], + touch: const SeriesTouch( + snap: SeriesTouchSnap.nearestPoint, + tooltip: SeriesTooltip(), + ), + ), + ), + ]), + _card(context, paper, grid, 'Holdings — hover a slice', [ + SizedBox( + height: 220, + child: PieChart( + sections: [ + for (var i = 0; i < _holdings.length; i++) + PieSection( + value: _holdings[i], + color: [_purple, _blue, _amber, _green][i], + label: '${_holdings[i].toStringAsFixed(0)}%', + offset: i == _slice ? 6 : 0, + ), + ], + centerSpaceRadius: 46, + centerSpaceColor: paper, + centerChild: Text( + _slice == null ? 'Holdings' : _holdingNames[_slice!], + style: Theme.of(context).textTheme.titleSmall, + ), + sectionsSpace: 2, + onTouch: (d) => setState(() => _slice = d?.index), + animationDuration: const Duration(milliseconds: 600), + ), + ), + ]), + _card( + context, + paper, + grid, + _corner == null ? 'Two strategies scored' : 'Scored: $_corner', + [ + SizedBox( + height: 260, + child: RadarChart( + features: _measures, + series: [ + RadarSeries( + values: _scores[0], + color: _blue, + label: 'Momentum', + dot: const SeriesDot(radius: 2.5), + ), + RadarSeries( + values: _scores[1], + color: _amber, + label: 'Mean reversion', + dot: const SeriesDot(radius: 2.5), + ), + ], + maxValue: 5, + gridColor: grid, + spokeColor: grid, + showTicks: true, + onTouch: (d) => setState( + () => _corner = d == null + ? null + : '${_measures[d.featureIndex]} ' + '${d.value.toStringAsFixed(1)}', + ), + animationDuration: const Duration(milliseconds: 600), + ), + ), + ], + ), ], ); }, @@ -325,21 +478,22 @@ class _SeriesPageState extends State { Color border, String title, List children, - ) => Container( - margin: const EdgeInsets.only(bottom: 16), - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: paper, - border: Border.all(color: border), - borderRadius: BorderRadius.circular(12), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(title, style: Theme.of(context).textTheme.titleSmall), - const SizedBox(height: 12), - ...children, - ], - ), - ); + ) => + Container( + margin: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: paper, + border: Border.all(color: border), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text(title, style: Theme.of(context).textTheme.titleSmall), + const SizedBox(height: 12), + ...children, + ], + ), + ); } diff --git a/example/tool/screenshots.dart b/example/tool/screenshots.dart index de38c44..fd8de94 100644 --- a/example/tool/screenshots.dart +++ b/example/tool/screenshots.dart @@ -163,64 +163,66 @@ class ReplayBar extends StatelessWidget { @override Widget build(BuildContext context) => AnimatedBuilder( - animation: replay, - builder: (context, _) { - final position = replay.position ?? replay.length; - Widget button(IconData icon, {bool on = true}) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Icon( - icon, - size: 20, - color: on ? const Color(0xFFDCE3EB) : const Color(0xFF4A5361), - ), - ); - return ColoredBox( - color: const Color(0xFF161B23), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), - child: Row( - children: [ - button(Icons.replay, on: true), - button(Icons.skip_previous, on: replay.isActive), - button( - replay.isPlaying ? Icons.pause : Icons.play_arrow, - on: true, - ), - button(Icons.skip_next, on: replay.isActive), - button(Icons.stop, on: replay.isActive), - const SizedBox(width: 12), - Expanded( - child: ClipRRect( - borderRadius: BorderRadius.circular(3), - child: LinearProgressIndicator( - value: replay.length == 0 ? 0 : position / replay.length, - minHeight: 6, - backgroundColor: const Color(0xFF2A313C), - valueColor: const AlwaysStoppedAnimation(Color(0xFF26A69A)), - ), + animation: replay, + builder: (context, _) { + final position = replay.position ?? replay.length; + Widget button(IconData icon, {bool on = true}) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Icon( + icon, + size: 20, + color: on ? const Color(0xFFDCE3EB) : const Color(0xFF4A5361), ), - ), - const SizedBox(width: 12), - SizedBox( - width: 148, - child: Text( - replay.isActive - ? 'Candle $position of ${replay.length}' - : 'Live — all ${replay.length} candles', - textAlign: TextAlign.right, - style: const TextStyle( - color: Color(0xFFB6C0CC), - fontSize: 12, - fontFeatures: [FontFeature.tabularFigures()], + ); + return ColoredBox( + color: const Color(0xFF161B23), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), + child: Row( + children: [ + button(Icons.replay, on: true), + button(Icons.skip_previous, on: replay.isActive), + button( + replay.isPlaying ? Icons.pause : Icons.play_arrow, + on: true, ), - ), + button(Icons.skip_next, on: replay.isActive), + button(Icons.stop, on: replay.isActive), + const SizedBox(width: 12), + Expanded( + child: ClipRRect( + borderRadius: BorderRadius.circular(3), + child: LinearProgressIndicator( + value: + replay.length == 0 ? 0 : position / replay.length, + minHeight: 6, + backgroundColor: const Color(0xFF2A313C), + valueColor: + const AlwaysStoppedAnimation(Color(0xFF26A69A)), + ), + ), + ), + const SizedBox(width: 12), + SizedBox( + width: 148, + child: Text( + replay.isActive + ? 'Candle $position of ${replay.length}' + : 'Live — all ${replay.length} candles', + textAlign: TextAlign.right, + style: const TextStyle( + color: Color(0xFFB6C0CC), + fontSize: 12, + fontFeatures: [FontFeature.tabularFigures()], + ), + ), + ), + ], ), - ], - ), - ), + ), + ); + }, ); - }, - ); } void main() { @@ -406,11 +408,9 @@ class _ScreenshotAppState extends State { // A frame identical to the one before it is the last scene over again, not // this one: ask for another, and give up loudly rather than write it. var bytes = await _raster(boundary); - for ( - var attempt = 0; - _digest(bytes) == _previous && attempt < 4; - attempt++ - ) { + for (var attempt = 0; + _digest(bytes) == _previous && attempt < 4; + attempt++) { await Future.delayed(const Duration(milliseconds: 500)); bytes = await _raster(boundary); } @@ -460,6 +460,9 @@ class _ScreenshotAppState extends State { /// A wide scene, for the README. const Size wide = Size(1180, 660); +/// A single row of panels, for the charts that do not need the height. +const Size shortWide = Size(1180, 400); + /// A phone-shaped scene, for the settings sheet. const Size portrait = Size(392, 700); @@ -542,8 +545,7 @@ List buildScenes() { showInfoDialog: showInfoDialog, showScrollToNowButton: false, drawings: drawings, - isTrendLine: - trendLines.isNotEmpty || + isTrendLine: trendLines.isNotEmpty || horizontalLines.isNotEmpty || rectangles.isNotEmpty || fibRetracements.isNotEmpty || @@ -606,37 +608,39 @@ List buildScenes() { Widget child, { bool centred = false, double top = 8, - }) => Stack( - children: [ - Positioned.fill(child: child), - Positioned( - left: centred ? 0 : 10, - right: centred ? 0 : null, - top: top, - // On a chip, because the chart draws its own labels in the same corner. - child: Align( - alignment: centred ? Alignment.topCenter : Alignment.topLeft, - child: DecoratedBox( - decoration: BoxDecoration( - color: const Color(0xFF10141A).withValues(alpha: 0.82), - borderRadius: BorderRadius.circular(4), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3), - child: Text( - text, - style: const TextStyle( - color: Color(0xFFB6C0CC), - fontSize: 12, - fontWeight: FontWeight.w600, + }) => + Stack( + children: [ + Positioned.fill(child: child), + Positioned( + left: centred ? 0 : 10, + right: centred ? 0 : null, + top: top, + // On a chip, because the chart draws its own labels in the same corner. + child: Align( + alignment: centred ? Alignment.topCenter : Alignment.topLeft, + child: DecoratedBox( + decoration: BoxDecoration( + color: const Color(0xFF10141A).withValues(alpha: 0.82), + borderRadius: BorderRadius.circular(4), + ), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 6, vertical: 3), + child: Text( + text, + style: const TextStyle( + color: Color(0xFFB6C0CC), + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), ), ), ), ), - ), - ), - ], - ); + ], + ); /// The chart with the overview strip beneath it. Widget overviewScene() { @@ -707,54 +711,54 @@ List buildScenes() { size: wide, act: null, build: () => chart( - indicators: [ - MaIndicator(period: 5), - MaIndicator(period: 10), - MaIndicator(period: 20), - MacdIndicator(), - ], - signals: [ - SignalEntity( - title: 'TP', - price: last * 1.05, - color: const Color(0xFF26A69A), - ), - SignalEntity( - title: 'SL', - price: last * 0.96, - color: const Color(0xFFEF5350), - useDash: true, + indicators: [ + MaIndicator(period: 5), + MaIndicator(period: 10), + MaIndicator(period: 20), + MacdIndicator(), + ], + signals: [ + SignalEntity( + title: 'TP', + price: last * 1.05, + color: const Color(0xFF26A69A), + ), + SignalEntity( + title: 'SL', + price: last * 0.96, + color: const Color(0xFFEF5350), + useDash: true, + ), + ], ), - ], - ), ), ( name: 'overlays', size: wide, act: null, build: () => chart( - volHidden: true, - indicators: [ - IchimokuIndicator(), - SupertrendIndicator(), - StochRsiIndicator(), - AwesomeIndicator(), - ], - ), + volHidden: true, + indicators: [ + IchimokuIndicator(), + SupertrendIndicator(), + StochRsiIndicator(), + AwesomeIndicator(), + ], + ), ), ( name: 'swings', size: wide, act: null, build: () => chart( - volHidden: true, - indicators: [ - ZigZagIndicator(), - FibonacciIndicator(), - ElliottWaveIndicator(), - RsiIndicator(), - ], - ), + volHidden: true, + indicators: [ + ZigZagIndicator(), + FibonacciIndicator(), + ElliottWaveIndicator(), + RsiIndicator(), + ], + ), ), ( // A four-hour average over fifteen-minute candles: it steps once a bar @@ -763,42 +767,42 @@ List buildScenes() { size: wide, act: null, build: () => chart( - volHidden: true, - data: longRun, - indicators: [ - // Both cover about twenty hours, so they sit in the same stretch of - // price and the only difference on show is the stepping. A 4h MA20 - // would reach back eighty hours and drag the whole axis down with it. - MaIndicator(period: 80), - TimeframeIndicator( - timeframe: const Duration(hours: 4), - applied: MaIndicator(period: 5), - // A colour of its own, so the stepped line and the smooth one are - // told apart at a glance rather than by their shape. - colors: const [Color(0xFF4DABF7)], - ), - TimeframeIndicator( - timeframe: const Duration(hours: 4), - applied: RsiIndicator(period: 14), + volHidden: true, + data: longRun, + indicators: [ + // Both cover about twenty hours, so they sit in the same stretch of + // price and the only difference on show is the stepping. A 4h MA20 + // would reach back eighty hours and drag the whole axis down with it. + MaIndicator(period: 80), + TimeframeIndicator( + timeframe: const Duration(hours: 4), + applied: MaIndicator(period: 5), + // A colour of its own, so the stepped line and the smooth one are + // told apart at a glance rather than by their shape. + colors: const [Color(0xFF4DABF7)], + ), + TimeframeIndicator( + timeframe: const Duration(hours: 4), + applied: RsiIndicator(period: 14), + ), + ], ), - ], - ), ), ( name: 'session-vwap', size: wide, act: null, build: () => chart( - volHidden: true, - data: longRun, - sessionDividers: true, - indicators: [ - // One deviation rather than two: the band still says where the - // session has been trading without stretching the axis to fit it. - SessionVwapIndicator(), - AroonIndicator(period: 14), - ], - ), + volHidden: true, + data: longRun, + sessionDividers: true, + indicators: [ + // One deviation rather than two: the band still says where the + // session has been trading without stretching the axis to fit it. + SessionVwapIndicator(), + AroonIndicator(period: 14), + ], + ), ), ( name: 'overview', @@ -818,9 +822,10 @@ List buildScenes() { name: 'linked-charts', size: wide, act: (area, shoot) => hold( - Offset(area.left + area.width * 0.62, area.top + area.height * 0.24), - shoot, - ), + Offset( + area.left + area.width * 0.62, area.top + area.height * 0.24), + shoot, + ), build: () => linkedScene(), ), ( @@ -828,117 +833,117 @@ List buildScenes() { size: wide, act: null, build: () => chart( - light: true, - volHidden: true, - indicators: [ - BollIndicator(), - AtrIndicator(period: 8), - AtrIndicator(period: 14), - AtrIndicator(period: 20), - ], - ), + light: true, + volHidden: true, + indicators: [ + BollIndicator(), + AtrIndicator(period: 8), + AtrIndicator(period: 14), + AtrIndicator(period: 20), + ], + ), ), ( name: 'drawing', size: wide, act: null, build: () => chart( - volHidden: true, - // The drawn lines label themselves on the left, so the price axis - // moves over to the right rather than fighting them for the space. - axis: VerticalTextAlignment.right, - indicators: [EmaIndicator(period: 21)], - horizontalLines: [ - HorizontalLine( - price: last * 1.008, - title: 'resistance', - color: const Color(0xFFEF5350), - style: LineStyle.dashed, - showLabel: true, - ), - HorizontalLine( - price: last * 0.975, - title: 'entry', - color: const Color(0xFF4DABF7), - showLabel: true, - ), - ], - trendLines: [ - TrendLine( - time1: candles[candles.length - 90].dateTime!, - price1: candles[candles.length - 90].low, - time2: candles[candles.length - 20].dateTime!, - price2: candles[candles.length - 20].high, - color: const Color(0xFFF5C26B), - label2: 'trend', - showLabel: true, + volHidden: true, + // The drawn lines label themselves on the left, so the price axis + // moves over to the right rather than fighting them for the space. + axis: VerticalTextAlignment.right, + indicators: [EmaIndicator(period: 21)], + horizontalLines: [ + HorizontalLine( + price: last * 1.008, + title: 'resistance', + color: const Color(0xFFEF5350), + style: LineStyle.dashed, + showLabel: true, + ), + HorizontalLine( + price: last * 0.975, + title: 'entry', + color: const Color(0xFF4DABF7), + showLabel: true, + ), + ], + trendLines: [ + TrendLine( + time1: candles[candles.length - 90].dateTime!, + price1: candles[candles.length - 90].low, + time2: candles[candles.length - 20].dateTime!, + price2: candles[candles.length - 20].high, + color: const Color(0xFFF5C26B), + label2: 'trend', + showLabel: true, + ), + ], ), - ], - ), ), ( name: 'shapes', size: wide, act: null, build: () => chart( - volHidden: true, - axis: VerticalTextAlignment.right, - indicators: [], - horizontalLines: [ - HorizontalLine( - price: candles[candles.length - 60].high, - startTime: candles[candles.length - 60].dateTime, - title: 'broken', - color: const Color(0xFFEF5350), - style: LineStyle.dashed, - showLabel: true, - ), - ], - trendLines: [ - TrendLine( - time1: candles[candles.length - 150].dateTime!, - price1: candles[candles.length - 150].low, - time2: candles[candles.length - 110].dateTime!, - price2: candles[candles.length - 110].high, - extend: LineExtension.right, - color: const Color(0xFFF5C26B), - ), - TrendLine( - time1: candles[candles.length - 95].dateTime!, - price1: candles[candles.length - 95].high, - time2: candles[candles.length - 75].dateTime!, - price2: candles[candles.length - 75].low, - arrow: true, - color: const Color(0xFFB197FC), - ), - ], - rectangles: [ - RectangleDrawing( - time1: candles[candles.length - 58].dateTime!, - // The box covers the whole range the market held over that span, - // which is what a range box is for. - price1: candles - .sublist(candles.length - 58, candles.length - 38) - .map((candle) => candle.high) - .reduce(max), - time2: candles[candles.length - 38].dateTime!, - price2: candles - .sublist(candles.length - 58, candles.length - 38) - .map((candle) => candle.low) - .reduce(min), - label: 'range', - showLabel: true, - ), - ], - fibRetracements: [ - FibRetracement( - time1: candles[candles.length - 30].dateTime!, - price1: candles[candles.length - 30].low, - time2: candles[candles.length - 12].dateTime!, - price2: candles[candles.length - 12].high, + volHidden: true, + axis: VerticalTextAlignment.right, + indicators: [], + horizontalLines: [ + HorizontalLine( + price: candles[candles.length - 60].high, + startTime: candles[candles.length - 60].dateTime, + title: 'broken', + color: const Color(0xFFEF5350), + style: LineStyle.dashed, + showLabel: true, + ), + ], + trendLines: [ + TrendLine( + time1: candles[candles.length - 150].dateTime!, + price1: candles[candles.length - 150].low, + time2: candles[candles.length - 110].dateTime!, + price2: candles[candles.length - 110].high, + extend: LineExtension.right, + color: const Color(0xFFF5C26B), + ), + TrendLine( + time1: candles[candles.length - 95].dateTime!, + price1: candles[candles.length - 95].high, + time2: candles[candles.length - 75].dateTime!, + price2: candles[candles.length - 75].low, + arrow: true, + color: const Color(0xFFB197FC), + ), + ], + rectangles: [ + RectangleDrawing( + time1: candles[candles.length - 58].dateTime!, + // The box covers the whole range the market held over that span, + // which is what a range box is for. + price1: candles + .sublist(candles.length - 58, candles.length - 38) + .map((candle) => candle.high) + .reduce(max), + time2: candles[candles.length - 38].dateTime!, + price2: candles + .sublist(candles.length - 58, candles.length - 38) + .map((candle) => candle.low) + .reduce(min), + label: 'range', + showLabel: true, + ), + ], + fibRetracements: [ + FibRetracement( + time1: candles[candles.length - 30].dateTime!, + price1: candles[candles.length - 30].low, + time2: candles[candles.length - 12].dateTime!, + price2: candles[candles.length - 12].high, + ), + ], ), - ], - ), ), ( name: 'readout', @@ -947,13 +952,13 @@ List buildScenes() { // while a finger is down. act: (area, shoot) => hold(area.center, shoot), build: () => chart( - indicators: [ - MaIndicator(period: 5), - MaIndicator(period: 10), - MaIndicator(period: 20), - MacdIndicator(), - ], - ), + indicators: [ + MaIndicator(period: 5), + MaIndicator(period: 10), + MaIndicator(period: 20), + MacdIndicator(), + ], + ), ), ( name: 'line-editor', @@ -966,60 +971,60 @@ List buildScenes() { await shoot(); }, build: () => chart( - volHidden: true, - axis: VerticalTextAlignment.right, - indicators: [EmaIndicator(period: 21)], - horizontalLines: [ - HorizontalLine( - price: last * 1.008, - title: 'resistance', - color: const Color(0xFFEF5350), - style: LineStyle.dashed, - showLabel: true, + volHidden: true, + axis: VerticalTextAlignment.right, + indicators: [EmaIndicator(period: 21)], + horizontalLines: [ + HorizontalLine( + price: last * 1.008, + title: 'resistance', + color: const Color(0xFFEF5350), + style: LineStyle.dashed, + showLabel: true, + ), + ], ), - ], - ), ), ( name: 'chart-types', size: wide, act: null, build: () => ColoredBox( - color: ChartTheme.darkColors().bgColor, - child: Column( - children: [ - for (final row in const [ - [ - (ChartType.bars, 'bars'), - (ChartType.baseline, 'baseline'), - (ChartType.area, 'area'), - ], - [ - (ChartType.stepLine, 'step line'), - (ChartType.hlcArea, 'HLC area'), - (ChartType.columns, 'columns'), - ], - ]) - Expanded( - child: Row( - children: [ - for (final (type, name) in row) - Expanded( - child: titled( - name, - chart( - indicators: [], - volHidden: true, - chartType: type, - ), - ), - ), + color: ChartTheme.darkColors().bgColor, + child: Column( + children: [ + for (final row in const [ + [ + (ChartType.bars, 'bars'), + (ChartType.baseline, 'baseline'), + (ChartType.area, 'area'), ], - ), - ), - ], - ), - ), + [ + (ChartType.stepLine, 'step line'), + (ChartType.hlcArea, 'HLC area'), + (ChartType.columns, 'columns'), + ], + ]) + Expanded( + child: Row( + children: [ + for (final (type, name) in row) + Expanded( + child: titled( + name, + chart( + indicators: [], + volHidden: true, + chartType: type, + ), + ), + ), + ], + ), + ), + ], + ), + ), ), ( name: 'aggregations', @@ -1054,172 +1059,172 @@ List buildScenes() { size: wide, act: null, build: () => chart( - indicators: [EmaIndicator(period: 50)], - volHidden: true, - priceAxisScale: PriceAxisScale.logarithmic, - showOhlcLegend: true, - sessionDividers: true, - ), + indicators: [EmaIndicator(period: 50)], + volHidden: true, + priceAxisScale: PriceAxisScale.logarithmic, + showOhlcLegend: true, + sessionDividers: true, + ), ), ( name: 'planning', size: wide, act: null, build: () => chart( - indicators: [], - volHidden: true, - axis: VerticalTextAlignment.right, - showOhlcLegend: true, - drawings: [ - PositionDrawing( - time1: candles[candles.length - 60].dateTime!, - price1: candles[candles.length - 60].close, - time2: candles[candles.length - 8].dateTime!, - price2: candles[candles.length - 60].close * 1.06, - time3: candles[candles.length - 8].dateTime!, - price3: candles[candles.length - 60].close * 0.98, - profitColor: const Color(0xFF26A69A), - lossColor: const Color(0xFFEF5350), - ), - ParallelChannel( - time1: candles[candles.length - 150].dateTime!, - price1: candles[candles.length - 150].low, - time2: candles[candles.length - 70].dateTime!, - price2: candles[candles.length - 70].low, - time3: candles[candles.length - 110].dateTime!, - price3: candles[candles.length - 110].high, - color: const Color(0xFF4DABF7), - ), - MeasureDrawing( - time1: candles[candles.length - 40].dateTime!, - price1: candles[candles.length - 40].low, - time2: candles[candles.length - 20].dateTime!, - price2: candles[candles.length - 20].high, - ), - TextAnnotation( - time: candles[candles.length - 30].dateTime!, - price: candles[candles.length - 30].high * 1.02, - text: 'CPI print', - color: const Color(0xFFF5C26B), + indicators: [], + volHidden: true, + axis: VerticalTextAlignment.right, + showOhlcLegend: true, + drawings: [ + PositionDrawing( + time1: candles[candles.length - 60].dateTime!, + price1: candles[candles.length - 60].close, + time2: candles[candles.length - 8].dateTime!, + price2: candles[candles.length - 60].close * 1.06, + time3: candles[candles.length - 8].dateTime!, + price3: candles[candles.length - 60].close * 0.98, + profitColor: const Color(0xFF26A69A), + lossColor: const Color(0xFFEF5350), + ), + ParallelChannel( + time1: candles[candles.length - 150].dateTime!, + price1: candles[candles.length - 150].low, + time2: candles[candles.length - 70].dateTime!, + price2: candles[candles.length - 70].low, + time3: candles[candles.length - 110].dateTime!, + price3: candles[candles.length - 110].high, + color: const Color(0xFF4DABF7), + ), + MeasureDrawing( + time1: candles[candles.length - 40].dateTime!, + price1: candles[candles.length - 40].low, + time2: candles[candles.length - 20].dateTime!, + price2: candles[candles.length - 20].high, + ), + TextAnnotation( + time: candles[candles.length - 30].dateTime!, + price: candles[candles.length - 30].high * 1.02, + text: 'CPI print', + color: const Color(0xFFF5C26B), + ), + ], ), - ], - ), ), ( name: 'comparison', size: wide, act: null, build: () => chart( - indicators: [], - volHidden: true, - showOhlcLegend: true, - axis: VerticalTextAlignment.right, - comparisons: [MarketData.comparison(candles)], - ), + indicators: [], + volHidden: true, + showOhlcLegend: true, + axis: VerticalTextAlignment.right, + comparisons: [MarketData.comparison(candles)], + ), ), ( name: 'trading', size: wide, act: null, build: () => chart( - indicators: [EmaIndicator(period: 21)], - volHidden: true, - axis: VerticalTextAlignment.right, - orders: [ - ChartOrder( - id: 'working', - price: last * 0.985, - side: TradeSide.buy, - quantity: 0.5, - ), - ChartOrder( - id: 'target', - price: last * 1.008, - side: TradeSide.sell, - quantity: 0.5, - ), - ], - positions: [ - ChartPosition( - id: 'open', - entryPrice: candles[candles.length - 40].close, - side: TradeSide.buy, - quantity: 1, - unrealisedPnl: last - candles[candles.length - 40].close, + indicators: [EmaIndicator(period: 21)], + volHidden: true, + axis: VerticalTextAlignment.right, + orders: [ + ChartOrder( + id: 'working', + price: last * 0.985, + side: TradeSide.buy, + quantity: 0.5, + ), + ChartOrder( + id: 'target', + price: last * 1.008, + side: TradeSide.sell, + quantity: 0.5, + ), + ], + positions: [ + ChartPosition( + id: 'open', + entryPrice: candles[candles.length - 40].close, + side: TradeSide.buy, + quantity: 1, + unrealisedPnl: last - candles[candles.length - 40].close, + ), + ], ), - ], - ), ), ( name: 'events', size: wide, act: null, build: () => chart( - indicators: [MaIndicator(period: 20)], - showOhlcLegend: true, - // The demo's own events are spread over the whole history, and the - // window only holds the last half of it: these sit where they can be - // seen, one of each kind. - events: [ - for (final (back, kind, detail) in [ - (78, ChartEventKind.earnings, 'Q3 earnings, after the close'), - (56, ChartEventKind.dividend, r'$0.24 goes ex'), - (34, ChartEventKind.split, '2-for-1'), - (12, ChartEventKind.news, 'Added to the index'), - ]) - ChartEvent( - time: candles[candles.length - back].dateTime!, - kind: kind, - detail: detail, - ), - ], - ), + indicators: [MaIndicator(period: 20)], + showOhlcLegend: true, + // The demo's own events are spread over the whole history, and the + // window only holds the last half of it: these sit where they can be + // seen, one of each kind. + events: [ + for (final (back, kind, detail) in [ + (78, ChartEventKind.earnings, 'Q3 earnings, after the close'), + (56, ChartEventKind.dividend, r'$0.24 goes ex'), + (34, ChartEventKind.split, '2-for-1'), + (12, ChartEventKind.news, 'Added to the index'), + ]) + ChartEvent( + time: candles[candles.length - back].dateTime!, + kind: kind, + detail: detail, + ), + ], + ), ), ( name: 'sessions', size: wide, act: null, build: () => chart( - indicators: [], - showOhlcLegend: true, - // Kept every day, weekend included: the demo's market never closes, - // and a weekday-only set washes the whole picture when the data runs - // over a Saturday. - session: const TradingSession( - open: Duration(hours: 9, minutes: 30), - close: Duration(hours: 16), - weekdays: { - DateTime.monday, - DateTime.tuesday, - DateTime.wednesday, - DateTime.thursday, - DateTime.friday, - DateTime.saturday, - DateTime.sunday, - }, - ), - extendedHoursColor: const Color(0x2494A9C0), - // The kind of thing a per-bar colour is for: pick out the handful of - // bars that travelled much further than the ones around them. - candleColor: (candle, index) => - candle.high - candle.low > candle.close * 0.015 - ? const Color(0xFFFFD54F) - : null, - ), + indicators: [], + showOhlcLegend: true, + // Kept every day, weekend included: the demo's market never closes, + // and a weekday-only set washes the whole picture when the data runs + // over a Saturday. + session: const TradingSession( + open: Duration(hours: 9, minutes: 30), + close: Duration(hours: 16), + weekdays: { + DateTime.monday, + DateTime.tuesday, + DateTime.wednesday, + DateTime.thursday, + DateTime.friday, + DateTime.saturday, + DateTime.sunday, + }, + ), + extendedHoursColor: const Color(0x2494A9C0), + // The kind of thing a per-bar colour is for: pick out the handful of + // bars that travelled much further than the ones around them. + candleColor: (candle, index) => + candle.high - candle.low > candle.close * 0.015 + ? const Color(0xFFFFD54F) + : null, + ), ), ( name: 'profile', size: wide, act: null, build: () => chart( - volHidden: true, - showOhlcLegend: true, - axis: VerticalTextAlignment.right, - indicators: [ - VolumeProfileIndicator(bins: 28), - AnchoredVwapIndicator(anchor: candles.length - 90), - ], - ), + volHidden: true, + showOhlcLegend: true, + axis: VerticalTextAlignment.right, + indicators: [ + VolumeProfileIndicator(bins: 28), + AnchoredVwapIndicator(anchor: candles.length - 90), + ], + ), ), ( name: 'bar-types', @@ -1268,39 +1273,39 @@ List buildScenes() { size: wide, act: null, build: () => ColoredBox( - color: ChartTheme.darkColors().bgColor, - child: Row( - children: [ - Expanded( - child: titled( - 'indexed to 100', - centred: true, - chart( - indicators: [], - volHidden: true, - axis: VerticalTextAlignment.right, - priceAxisScale: PriceAxisScale.indexedTo100, - comparisons: [MarketData.comparison(candles)], + color: ChartTheme.darkColors().bgColor, + child: Row( + children: [ + Expanded( + child: titled( + 'indexed to 100', + centred: true, + chart( + indicators: [], + volHidden: true, + axis: VerticalTextAlignment.right, + priceAxisScale: PriceAxisScale.indexedTo100, + comparisons: [MarketData.comparison(candles)], + ), + ), ), - ), - ), - Expanded( - child: titled( - 'inverted', - centred: true, - chart( - indicators: [], - volHidden: true, - axis: VerticalTextAlignment.right, - invertPriceAxis: true, - showAverageClose: true, - showHighLowOnAxis: true, + Expanded( + child: titled( + 'inverted', + centred: true, + chart( + indicators: [], + volHidden: true, + axis: VerticalTextAlignment.right, + invertPriceAxis: true, + showAverageClose: true, + showHighLowOnAxis: true, + ), + ), ), - ), + ], ), - ], - ), - ), + ), ), ( name: 'depth-modes', @@ -1446,17 +1451,17 @@ List buildScenes() { await shoot(); }, build: () => Column( - children: [ - Expanded( - child: chart( - data: longRun, - replay: replay, - indicators: [MaIndicator(period: 20), RsiIndicator()], - ), + children: [ + Expanded( + child: chart( + data: longRun, + replay: replay, + indicators: [MaIndicator(period: 20), RsiIndicator()], + ), + ), + ReplayBar(replay: replay), + ], ), - ReplayBar(replay: replay), - ], - ), ), ( // Hovered rather than held: the crosshair follows a mouse without a @@ -1470,9 +1475,9 @@ List buildScenes() { await shoot(); }, build: () => chart( - showOhlcLegend: true, - indicators: [MaIndicator(period: 20), MacdIndicator()], - ), + showOhlcLegend: true, + indicators: [MaIndicator(period: 20), MacdIndicator()], + ), ), ( // The axis it picks for itself beside one taken over wholesale, on the @@ -1481,35 +1486,36 @@ List buildScenes() { size: wide, act: null, build: () => Column( - children: [ - Expanded( - child: titled( - 'the format it picks: clock times, the date where the day turns', - chart(volHidden: true, indicators: [EmaIndicator(period: 21)]), - top: 30, - ), - ), - const SizedBox(height: 8), - Expanded( - child: titled( - 'dateFormatter taking it over, xFrontPadding: 120', - chart( - volHidden: true, - indicators: [EmaIndicator(period: 21)], - xFrontPadding: 120, - dateFormatter: (candle, longForm) { - final at = candle.dateTime!; - final hour = at.hour.toString().padLeft(2, '0'); - return longForm - ? 'Sep ${at.day}, ${hour}h${at.minute}' - : '${at.day} Sep · ${hour}h'; - }, + children: [ + Expanded( + child: titled( + 'the format it picks: clock times, the date where the day turns', + chart( + volHidden: true, indicators: [EmaIndicator(period: 21)]), + top: 30, + ), ), - top: 30, - ), + const SizedBox(height: 8), + Expanded( + child: titled( + 'dateFormatter taking it over, xFrontPadding: 120', + chart( + volHidden: true, + indicators: [EmaIndicator(period: 21)], + xFrontPadding: 120, + dateFormatter: (candle, longForm) { + final at = candle.dateTime!; + final hour = at.hour.toString().padLeft(2, '0'); + return longForm + ? 'Sep ${at.day}, ${hour}h${at.minute}' + : '${at.day} Sep · ${hour}h'; + }, + ), + top: 30, + ), + ), + ], ), - ], - ), ), ( // The same chart under both palettes: ChartColors is the whole @@ -1518,27 +1524,27 @@ List buildScenes() { size: wide, act: null, build: () => Row( - children: [ - Expanded( - child: titled( - 'ChartTheme.darkColors()', - chart(indicators: [BollIndicator(), MacdIndicator()]), - top: 30, - ), - ), - const SizedBox(width: 8), - Expanded( - child: titled( - 'ChartTheme.lightColors()', - chart( - light: true, - indicators: [BollIndicator(), MacdIndicator()], + children: [ + Expanded( + child: titled( + 'ChartTheme.darkColors()', + chart(indicators: [BollIndicator(), MacdIndicator()]), + top: 30, + ), ), - top: 30, - ), + const SizedBox(width: 8), + Expanded( + child: titled( + 'ChartTheme.lightColors()', + chart( + light: true, + indicators: [BollIndicator(), MacdIndicator()], + ), + top: 30, + ), + ), + ], ), - ], - ), ), ( // Left to itself the candle area takes what the panes do not want; @@ -1547,40 +1553,112 @@ List buildScenes() { size: wide, act: null, build: () => Row( - children: [ - Expanded( - child: titled( - 'mBaseHeight unset — fills the box', - chart(indicators: [MacdIndicator()]), - ), - ), - const SizedBox(width: 8), - Expanded( - child: titled( - 'mBaseHeight: 220', - chart(mBaseHeight: 220, indicators: [MacdIndicator()]), - ), + children: [ + Expanded( + child: titled( + 'mBaseHeight unset — fills the box', + chart(indicators: [MacdIndicator()]), + ), + ), + const SizedBox(width: 8), + Expanded( + child: titled( + 'mBaseHeight: 220', + chart(mBaseHeight: 220, indicators: [MacdIndicator()]), + ), + ), + ], ), - ], - ), ), ( name: 'indicator-settings', size: portrait, act: null, build: () => Theme( - data: ThemeData.dark(useMaterial3: true), - child: Scaffold( - backgroundColor: const Color(0xFF10141A), - body: SafeArea( - child: Padding( - padding: const EdgeInsets.only(top: 8), - child: IndicatorSheet(theme: ChartTheme.darkColors()), + data: ThemeData.dark(useMaterial3: true), + child: Scaffold( + backgroundColor: const Color(0xFF10141A), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.only(top: 8), + child: IndicatorSheet(theme: ChartTheme.darkColors()), + ), + ), ), ), - ), - ), ), + ( + // Four business charts at once, one of them reading out a day, so the + // listing shows what SeriesChart is for before any code. + name: 'series-charts', + size: wide, + act: (area, shoot) async { + seriesGalleryCrosshair.show(30); + await Future.delayed(const Duration(milliseconds: 300)); + await shoot(); + seriesGalleryCrosshair.clear(); + }, + build: seriesGalleryScene, + ), + ( + // A window over five months of data, with the strip that moves it and a + // day held under the crosshair. + name: 'series-window', + size: wide, + act: (area, shoot) async { + seriesWindowCrosshair.show(118); + await Future.delayed(const Duration(milliseconds: 300)); + await shoot(); + seriesWindowCrosshair.clear(); + }, + build: seriesWindowScene, + ), + ( + // Two panels on one controller: the crosshair in both, one tooltip. + name: 'series-panels', + size: wide, + act: (area, shoot) async { + seriesPanelsCrosshair.show(41); + await Future.delayed(const Duration(milliseconds: 300)); + await shoot(); + seriesPanelsCrosshair.clear(); + }, + build: seriesPanelsScene, + ), + ( + // The two shapes an axis cannot draw: a pie and a radar. + name: 'pie-radar', + size: shortWide, + act: null, + build: pieRadarScene, + ), + ( + // Dots placed freely on both axes, read out one at a time. + name: 'series-scatter', + size: shortWide, + act: (area, shoot) async { + seriesScatterCrosshair.show(18, seriesIndex: 0, pointIndex: 12); + await Future.delayed(const Duration(milliseconds: 300)); + await shoot(); + seriesScatterCrosshair.clear(); + }, + build: seriesScatterScene, + ), + ( + // A chart turned on its side, with bars stacked on each other. + name: 'series-horizontal', + size: shortWide, + act: null, + build: seriesHorizontalScene, + ), + ( + // Bars that float between two values, and a band between two lines. + name: 'series-ranges', + size: shortWide, + act: null, + build: seriesRangesScene, + ), + (name: 'watermark', size: wide, act: null, build: watermarkScene), ]; } @@ -1647,3 +1725,1065 @@ List buildFilms() { ), ]; } + +// ── Series charts ──────────────────────────────────────────────────────────── + +const _seriesBackground = Color(0xFF0D1117); +const _seriesPaper = Color(0xFF161B22); +const _seriesGrid = Color(0xFF252C35); +const _seriesMuted = Color(0xFF5C6570); +const _seriesPurple = Color(0xFF9775FA); +const _seriesBlue = Color(0xFF4DABF7); +const _seriesAmber = Color(0xFFFAB005); +const _seriesGreen = Color(0xFF12B886); +const _seriesRed = Color(0xFFFA5252); +const _seriesAxis = TextStyle(color: Color(0xFF8B95A1), fontSize: 11); +const _seriesMonths = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', // + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', +]; + +/// The crosshairs the series scenes hold still for the shutter. +final seriesGalleryCrosshair = SeriesChartController(); +final seriesWindowCrosshair = SeriesChartController(); +final seriesPanelsCrosshair = SeriesChartController(); +final seriesScatterCrosshair = SeriesChartController(); + +/// A drifting wave: no randomness, so the pictures never change between runs. +List seriesWave( + int count, { + double base = 0, + double swing = 1, + double drift = 0, + double phase = 0, +}) => + [ + for (var i = 0; i < count; i++) + base + + sin(i / 5 + phase) * swing + + cos(i / 2.3 + phase) * swing * 0.35 + + i * drift, + ]; + +/// Day [index] of 2026, written the way a dashboard axis would. +String seriesDate(int index) { + final day = DateTime(2026).add(Duration(days: index)); + return '${_seriesMonths[day.month - 1]} ${day.day}'; +} + +/// Dollars, shortened to thousands past a thousand. +String seriesUsd(double value) { + final sign = value < 0 ? '-' : ''; + final amount = value.abs(); + final digits = amount >= 1000 + ? '${(amount / 1000).toStringAsFixed(1)}k' + : amount.toStringAsFixed(0); + return '$sign\$$digits'; +} + +/// A card with a title, a figure on the right, and a chart filling the rest. +Widget seriesPanel( + String title, + Widget child, { + String? figure, + Color figureColor = Colors.white, +}) => + Container( + margin: const EdgeInsets.all(6), + padding: const EdgeInsets.fromLTRB(14, 12, 14, 10), + decoration: BoxDecoration( + color: _seriesPaper, + border: Border.all(color: _seriesGrid), + borderRadius: BorderRadius.circular(10), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Text( + title, + style: const TextStyle( + color: Color(0xFFB6C0CC), + fontSize: 13, + fontWeight: FontWeight.w600, + ), + ), + const Spacer(), + if (figure != null) + Text( + figure, + style: TextStyle( + color: figureColor, + fontSize: 13, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + const SizedBox(height: 8), + Expanded(child: child), + ], + ), + ); + +/// The tooltip the series scenes draw: a date, then a coloured row per value. +Widget seriesCard(String title, List<(String, String, Color)> rows) => + DecoratedBox( + decoration: BoxDecoration( + color: const Color(0xF21C2128), + border: Border.all(color: _seriesGrid), + borderRadius: BorderRadius.circular(8), + boxShadow: const [BoxShadow(color: Color(0x66000000), blurRadius: 10)], + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: _seriesAxis), + const SizedBox(height: 4), + for (final (label, value, color) in rows) + Padding( + padding: const EdgeInsets.only(top: 2), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 7, + height: 7, + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + ), + ), + const SizedBox(width: 6), + Text('$label ', style: _seriesAxis.copyWith(fontSize: 12)), + Text( + value, + style: const TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ], + ), + ), + ); + +SeriesTooltip _seriesTooltip({String Function(int index)? title}) => + SeriesTooltip( + builder: (context, details) => + seriesCard((title ?? seriesDate)(details.index), [ + for (final value in details.values) + (value.series.label ?? '', seriesUsd(value.value), value.color), + ]), + ); + +/// Four business charts in a grid. +Widget seriesGalleryScene() { + final roi = [ + for (final v in seriesWave(60, swing: 9, drift: 0.14, phase: 1.2)) v - 3, + ]; + final profits = seriesWave(28, swing: 120, phase: 0.4); + final deposits = seriesWave(45, base: 1600, swing: 380, drift: 6); + final withdrawals = seriesWave(45, base: 900, swing: 220, drift: 3, phase: 2); + final balance = seriesWave( + 90, + base: 12000, + swing: 900, + drift: 14, + phase: 0.8, + ); + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: Column( + children: [ + Expanded( + child: Row( + children: [ + Expanded( + child: seriesPanel( + 'Return, split at zero', + figure: + '${roi.last >= 0 ? '+' : ''}${roi.last.toStringAsFixed(1)}%', + figureColor: roi.last >= 0 ? _seriesGreen : _seriesRed, + SeriesChart( + series: [ + LineSeries.values( + roi, + color: _seriesGreen, + negativeColor: _seriesRed, + curve: LineCurve.monotone, + fill: SeriesFill.fade( + _seriesGreen, + negativeColor: _seriesRed, + opacity: 0.3, + ), + ), + ], + includeZero: true, + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < 60; i++) + i % 15 == 0 ? seriesDate(i) : '', + ], + style: _seriesAxis, + ), + yAxis: SeriesYAxis( + width: 38, + formatter: (v) => '${v.toStringAsFixed(0)}%', + style: _seriesAxis, + ), + grid: const SeriesGrid( + vertical: false, + color: _seriesGrid, + dashPattern: [4, 4], + ), + referenceLines: const [ + SeriesReferenceLine.horizontal( + 0, + color: _seriesMuted, + dashPattern: [3, 3], + ), + ], + touch: null, + ), + ), + ), + Expanded( + child: seriesPanel( + 'Profit per trade', + figure: seriesUsd(profits.reduce((a, b) => a + b)), + SeriesChart( + series: [ + BarSeries.values( + profits, + color: _seriesGreen, + negativeColor: _seriesRed, + radius: 3, + maxWidth: 14, + ), + ], + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < 28; i++) + i % 7 == 0 ? '#${i + 1}' : '', + ], + style: _seriesAxis, + ), + yAxis: const SeriesYAxis( + width: 38, + formatter: seriesUsd, + style: _seriesAxis, + ), + grid: const SeriesGrid( + vertical: false, + color: _seriesGrid, + dashPattern: [4, 4], + ), + touch: null, + ), + ), + ), + ], + ), + ), + Expanded( + child: Row( + children: [ + Expanded( + child: seriesPanel( + 'Deposits and withdrawals', + SeriesChart( + series: [ + LineSeries.values( + deposits, + label: 'Deposits', + color: _seriesBlue, + fill: SeriesFill.fade(_seriesBlue), + ), + LineSeries.values( + withdrawals, + label: 'Withdrawals', + color: _seriesAmber, + fill: SeriesFill.fade(_seriesAmber), + ), + ], + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < 45; i++) + i % 10 == 0 ? seriesDate(i) : '', + ], + style: _seriesAxis, + ), + yAxis: const SeriesYAxis( + width: 38, + formatter: seriesUsd, + style: _seriesAxis, + ), + grid: const SeriesGrid( + color: _seriesGrid, + dashPattern: [4, 4], + ), + controller: seriesGalleryCrosshair, + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + line: const SeriesCrosshairLine(color: _seriesMuted), + tooltip: _seriesTooltip(), + ), + ), + ), + ), + Expanded( + child: seriesPanel( + 'Balance', + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '\$${(balance.last / 1000).toStringAsFixed(2)}k', + style: const TextStyle( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.w700, + ), + ), + const Text( + '+9.8% over the quarter', + style: TextStyle(color: _seriesGreen, fontSize: 12), + ), + const Spacer(), + SizedBox( + height: 96, + child: SeriesChart( + series: [ + LineSeries.values( + balance, + color: _seriesPurple, + curve: LineCurve.monotone, + fill: SeriesFill.fade( + _seriesPurple, + opacity: 0.35, + ), + dotBuilder: (i, _) => i == balance.length - 1 + ? const SeriesDot( + radius: 4, + strokeColor: _seriesPaper, + strokeWidth: 2, + ) + : null, + ), + ], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + grid: SeriesGrid.none, + clipToPlot: false, + padding: const EdgeInsets.all(4), + touch: null, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); +} + +/// Three series over a window of five months, with the strip that moves it. +Widget seriesWindowScene() { + const days = 150; + const window = SeriesWindow(95, 134); + final deposits = seriesWave(days, base: 2100, swing: 520, drift: 4); + final withdrawals = seriesWave( + days, + base: 1200, + swing: 300, + drift: 2, + phase: 2.2, + ); + final rebates = seriesWave(days, base: 420, swing: 140, drift: 1, phase: 4); + + List lines({required bool small}) => [ + for (final (label, values, color) in [ + ('Deposits', deposits, _seriesBlue), + ('Withdrawals', withdrawals, _seriesAmber), + ('Rebates', rebates, _seriesGreen), + ]) + LineSeries.values( + values, + label: label, + color: color, + width: small ? 1 : 2, + fill: SeriesFill.fade(color, opacity: small ? 0.18 : 0.24), + ), + ]; + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: seriesPanel( + 'Activity trend', + figure: '${seriesDate(window.start.round())} – ' + '${seriesDate(window.end.round())}', + figureColor: const Color(0xFF8B95A1), + Column( + children: [ + Expanded( + child: SeriesChart( + series: lines(small: false), + minX: window.start - 0.5, + maxX: window.end + 0.5, + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < days; i++) + i % 7 == 0 ? seriesDate(i) : '', + ], + style: _seriesAxis, + ), + yAxis: const SeriesYAxis( + width: 44, + formatter: seriesUsd, + style: _seriesAxis, + ), + grid: const SeriesGrid(color: _seriesGrid, dashPattern: [4, 4]), + border: const BorderSide(color: _seriesGrid), + controller: seriesWindowCrosshair, + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + line: const SeriesCrosshairLine(color: _seriesMuted), + tooltip: _seriesTooltip(), + ), + ), + ), + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.only(left: 44), + child: SeriesRangeSelector( + series: lines(small: true), + window: window, + onChanged: (_) {}, + minSpan: 4, + height: 60, + border: const BorderSide(color: _seriesGrid), + maskColor: const Color(0xB30D1117), + windowBorderColor: _seriesMuted, + handleColor: _seriesPaper, + handleBorderColor: _seriesMuted, + handleGripColor: const Color(0xFF8B95A1), + ), + ), + ], + ), + ), + ), + ); +} + +/// A balance panel over a profit panel, holding one crosshair between them. +Widget seriesPanelsScene() { + const count = 60; + final balance = seriesWave( + count, + base: 10400, + swing: 700, + drift: 22, + phase: 0.5, + ); + final average = [ + for (var i = 0; i < count; i++) + balance.sublist(max(0, i - 9), i + 1).reduce((a, b) => a + b) / + (i - max(0, i - 9) + 1), + ]; + final profit = [ + 0.0, + for (var i = 1; i < count; i++) balance[i] - balance[i - 1], + ]; + + Widget key(String label, Color color, {bool dashed = false}) => Row( + mainAxisSize: MainAxisSize.min, + children: [ + for (var i = 0; i < (dashed ? 3 : 1); i++) + Container( + width: dashed ? 5 : 20, + height: 3, + margin: EdgeInsets.only(right: dashed ? 2.5 : 0), + color: color, + ), + const SizedBox(width: 8), + Text(label, style: TextStyle(color: color, fontSize: 12)), + ], + ); + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: seriesPanel( + 'Balance and profit — one crosshair, two panels', + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + key('Balance', _seriesPurple), + const SizedBox(width: 18), + key('10-day average', _seriesAmber, dashed: true), + ], + ), + const SizedBox(height: 8), + Expanded( + flex: 3, + child: SeriesChart( + series: [ + LineSeries.values( + balance, + label: 'Balance', + color: _seriesPurple, + fill: SeriesFill.fade(_seriesPurple, opacity: 0.2), + ), + LineSeries.values( + average, + label: 'Average', + color: _seriesAmber, + dashPattern: const [6, 4], + ), + ], + xPadding: 0.5, + xAxis: SeriesXAxis.hidden, + yAxis: const SeriesYAxis( + width: 46, + formatter: seriesUsd, + style: _seriesAxis, + ), + grid: const SeriesGrid(color: _seriesGrid, dashPattern: [4, 4]), + border: const BorderSide(color: _seriesGrid), + controller: seriesPanelsCrosshair, + touch: SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + line: const SeriesCrosshairLine(color: _seriesMuted), + tooltip: SeriesTooltip( + builder: (context, details) { + final i = details.index; + return seriesCard(seriesDate(i), [ + ('Balance', seriesUsd(balance[i]), _seriesPurple), + ('Average', seriesUsd(average[i]), _seriesAmber), + ( + 'P/L', + seriesUsd(profit[i]), + profit[i] < 0 ? _seriesRed : _seriesGreen, + ), + ]); + }, + ), + ), + ), + ), + const SizedBox(height: 12), + const Text( + 'Profit / loss', + style: TextStyle(color: Color(0xFFB6C0CC), fontSize: 12), + ), + const SizedBox(height: 6), + Expanded( + flex: 2, + child: SeriesChart( + series: [ + BarSeries.values( + profit, + label: 'P/L', + color: _seriesGreen, + negativeColor: _seriesRed, + radius: 3, + minWidth: 3.5, + maxWidth: 12, + ), + ], + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < count; i++) + i % 10 == 0 ? seriesDate(i) : '', + ], + style: _seriesAxis, + ), + yAxis: const SeriesYAxis( + width: 46, + formatter: seriesUsd, + tickCount: 3, + style: _seriesAxis, + ), + grid: const SeriesGrid( + vertical: false, + color: _seriesGrid, + dashPattern: [4, 4], + ), + border: const BorderSide(color: _seriesGrid), + controller: seriesPanelsCrosshair, + touch: const SeriesTouch( + trigger: SeriesTouchTrigger.longPress, + line: SeriesCrosshairLine(color: _seriesMuted), + tooltip: null, + ), + ), + ), + ], + ), + ), + ), + ); +} + +/// Candles under a watermark that is a widget: an icon and a name. +/// Two panels the axis charts cannot draw: a doughnut and a radar web. +Widget pieRadarScene() { + const holdings = [42.0, 26.0, 18.0, 14.0]; + const names = ['BTC', 'ETH', 'SOL', 'Cash']; + const colors = [_seriesPurple, _seriesBlue, _seriesAmber, _seriesGreen]; + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: Row( + children: [ + Expanded( + child: seriesPanel( + 'Holdings', + figure: seriesUsd(48200), + PieChart( + sections: [ + for (var i = 0; i < holdings.length; i++) + PieSection( + value: holdings[i], + color: colors[i], + label: '${holdings[i].toStringAsFixed(0)}%', + labelStyle: const TextStyle(fontSize: 12), + // The biggest holding is pulled out of the ring. + offset: i == 0 ? 8 : 0, + badge: i == 0 ? seriesChip(names[i], colors[i]) : null, + badgePosition: 1.18, + ), + ], + centerSpaceRadius: 52, + centerSpaceColor: _seriesPaper, + sectionsSpace: 2, + startDegreeOffset: -18, + centerChild: const Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Total', style: _seriesAxis), + SizedBox(height: 2), + Text( + r'$48.2k', + style: TextStyle( + color: Colors.white, + fontSize: 15, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ), + ), + Expanded( + child: seriesPanel( + 'Two strategies scored', + RadarChart( + features: const [ + 'Return', + 'Sharpe', + 'Win rate', + 'Cost', + 'Drawdown', + ], + series: const [ + RadarSeries( + values: [4.4, 3.1, 4.8, 2.2, 3.6], + color: _seriesBlue, + label: 'Momentum', + dot: SeriesDot(radius: 2.5), + ), + RadarSeries( + values: [3.0, 4.7, 2.4, 4.1, 4.4], + color: _seriesAmber, + label: 'Mean reversion', + dot: SeriesDot(radius: 2.5), + ), + ], + maxValue: 5, + tickCount: 5, + gridColor: _seriesGrid, + spokeColor: _seriesGrid, + featureStyle: _seriesAxis, + tickStyle: _seriesAxis, + showTicks: true, + padding: const EdgeInsets.only(bottom: 6), + ), + ), + ), + ], + ), + ), + ); +} + +/// A small rounded label, for a badge pinned to a pie section. +Widget seriesChip(String text, Color color) => DecoratedBox( + decoration: BoxDecoration( + color: _seriesPaper, + border: Border.all(color: color), + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + child: Text( + text, + style: TextStyle( + color: color, + fontSize: 11, + fontWeight: FontWeight.w700, + ), + ), + ), + ); + +/// Every trade as a dot: how big it was against what it returned. +Widget seriesScatterScene() { + final wins = []; + final losses = []; + for (var i = 0; i < 46; i++) { + final size = 2 + (i * 7 % 23).toDouble(); + final ret = sin(i / 3.1) * 7 + cos(i / 1.7) * 3.4 + size * 0.12 - 1.6; + final point = SeriesPoint(size, double.parse(ret.toStringAsFixed(2))); + (ret >= 0 ? wins : losses).add(point); + } + wins.sort((a, b) => a.x.compareTo(b.x)); + losses.sort((a, b) => a.x.compareTo(b.x)); + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: seriesPanel( + 'Every trade: size against return', + figure: '46 trades', + SeriesChart( + series: [ + ScatterSeries( + points: wins, + label: 'Win', + color: _seriesGreen, + dot: const SeriesDot(radius: 4.5), + ), + ScatterSeries( + points: losses, + label: 'Loss', + color: _seriesRed, + dot: const SeriesDot( + radius: 4.5, + shape: SeriesDotShape.cross, + strokeWidth: 1.6, + ), + ), + ], + xAxis: SeriesXAxis( + tickCount: 6, + title: 'Size, lots', + titleStyle: _seriesAxis, + style: _seriesAxis, + labelBuilder: (v) => v.toStringAsFixed(0), + ), + yAxis: SeriesYAxis( + width: 44, + title: 'Return', + titleStyle: _seriesAxis, + style: _seriesAxis, + formatter: (v) => '${v.toStringAsFixed(0)}%', + ), + grid: const SeriesGrid(color: _seriesGrid, dashPattern: [4, 4]), + // Room either side, so the end dots are drawn whole. + xPadding: 1.5, + referenceLines: const [ + SeriesReferenceLine.horizontal( + 0, + color: _seriesMuted, + dashPattern: [3, 3], + ), + ], + controller: seriesScatterCrosshair, + touch: SeriesTouch( + snap: SeriesTouchSnap.nearestPoint, + line: null, + tooltip: SeriesTooltip( + placement: SeriesTooltipPlacement.above, + builder: (context, details) => seriesCard( + '${details.values.first.point.x.toStringAsFixed(0)} lots', + [ + for (final value in details.values) + ( + value.series.label ?? '', + '${value.value.toStringAsFixed(2)}%', + value.color, + ), + ], + ), + ), + ), + ), + ), + ), + ); +} + +/// The same bars a dashboard stacks, on a chart turned on its side. +Widget seriesHorizontalScene() { + const income = [6.4, 5.1, 7.2, 4.6, 6.8, 7.9]; + const spending = [3.1, 4.2, 2.8, 3.9, 3.2, 2.6]; + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: seriesPanel( + 'Flow per month — stacked, and turned on its side', + figure: seriesUsd(25400), + SeriesChart( + orientation: SeriesOrientation.horizontal, + series: [ + BarSeries.values( + income, + label: 'In', + color: _seriesGreen, + stack: 'flow', + maxWidth: 18, + ), + BarSeries.values( + spending, + label: 'Out', + color: _seriesRed, + stack: 'flow', + radius: 3, + maxWidth: 18, + labelBuilder: (index, point) => + seriesUsd((income[index] + point.y!) * 1000), + labelStyle: _seriesAxis, + ), + ], + xAxis: SeriesXAxis( + labels: _seriesMonths.take(6).toList(), + style: _seriesAxis, + height: 34, + ), + yAxis: SeriesYAxis( + title: 'Thousands', + titleStyle: _seriesAxis, + style: _seriesAxis, + interval: 2, + formatter: (v) => v.toStringAsFixed(0), + ), + grid: const SeriesGrid( + horizontal: true, + vertical: false, + color: _seriesGrid, + dashPattern: [4, 4], + ), + maxY: 12, + touch: null, + ), + ), + ), + ); +} + +/// Bars that float between two values, and a band between two lines. +Widget seriesRangesScene() { + // Each step runs from where the last one ended to where it leaves the + // balance; the first and the last are whole bars off zero. + const steps = [ + (0.0, 4.0), + (4.0, 9.4), + (9.4, 8.1), + (8.1, 7.2), + (7.2, 5.9), + (0.0, 5.9), + ]; + final forecast = seriesWave(30, base: 62, swing: 6, drift: 0.35); + final high = [for (var i = 0; i < 30; i++) forecast[i] + 3 + i * 0.22]; + final low = [for (var i = 0; i < 30; i++) forecast[i] - 3 - i * 0.22]; + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: Row( + children: [ + Expanded( + child: seriesPanel( + 'Where the quarter went', + figure: r'$5.9k', + SeriesChart( + series: [ + BarSeries( + points: [ + for (var i = 0; i < steps.length; i++) + SeriesPoint( + i.toDouble(), + steps[i].$2, + low: steps[i].$1, + ), + ], + color: _seriesGreen, + radius: 3, + maxWidth: 34, + colorBuilder: (index, point) => + index == 0 || index == steps.length - 1 + ? _seriesBlue + : point.y! >= (point.low ?? 0) + ? _seriesGreen + : _seriesRed, + labelBuilder: (index, point) => point.y!.toStringAsFixed(1), + labelStyle: _seriesAxis, + ), + ], + xAxis: const SeriesXAxis( + labels: ['Open', 'Sales', 'Refunds', 'Fees', 'Tax', 'Close'], + style: _seriesAxis, + ), + yAxis: const SeriesYAxis( + width: 34, + style: _seriesAxis, + formatter: seriesUsd, + ), + grid: const SeriesGrid( + vertical: false, + color: _seriesGrid, + dashPattern: [4, 4], + ), + touch: null, + ), + ), + ), + Expanded( + child: seriesPanel( + 'Forecast, with its band and its error', + figure: '± 2σ', + SeriesChart( + series: [ + LineSeries.values( + high, + color: _seriesBlue.withValues(alpha: 0.7), + width: 1, + dashPattern: const [5, 4], + ), + LineSeries.values( + low, + color: _seriesBlue.withValues(alpha: 0.7), + width: 1, + dashPattern: const [5, 4], + ), + LineSeries( + points: [ + for (var i = 0; i < 30; i++) + SeriesPoint( + i.toDouble(), + forecast[i], + yError: i % 6 == 5 + ? SeriesErrorRange.symmetric(2.4 + i * 0.06) + : null, + ), + ], + label: 'Forecast', + color: _seriesBlue, + curve: LineCurve.monotone, + errorBars: const SeriesErrorBars( + color: _seriesAmber, + capLength: 8, + ), + ), + ], + betweenFills: [ + SeriesBetweenFill( + from: 0, + to: 1, + color: _seriesBlue.withValues(alpha: 0.14), + ), + ], + xPadding: 0.8, + xAxis: SeriesXAxis( + labels: [ + for (var i = 0; i < 30; i++) + i % 7 == 0 ? seriesDate(i) : '', + ], + style: _seriesAxis, + ), + yAxis: const SeriesYAxis( + width: 34, + style: _seriesAxis, + formatter: seriesUsd, + ), + grid: const SeriesGrid( + vertical: false, + color: _seriesGrid, + dashPattern: [4, 4], + ), + touch: null, + ), + ), + ), + ], + ), + ), + ); +} + +Widget watermarkScene() { + final colors = ChartTheme.darkColors() + ..watermarkColor = const Color(0x1FFFFFFF); + return ColoredBox( + color: colors.bgColor, + child: KChartWidget( + MarketData.candles(count: 160), + colors, + chartStyle: ChartTheme.filled.copyWith(watermarkScale: 0.6), + timeFrame: MarketData.timeFrame, + timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, + indicators: [MaIndicator(period: 20)], + showInfoDialog: false, + showScrollToNowButton: false, + fixedLength: 0, + watermark: const FittedBox( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.candlestick_chart, size: 96), + SizedBox(width: 16), + Text( + 'ACME MARKETS', + style: TextStyle( + fontSize: 64, + fontWeight: FontWeight.w900, + letterSpacing: 2, + ), + ), + ], + ), + ), + ), + ); +} diff --git a/lib/ohlcv_chart.dart b/lib/ohlcv_chart.dart index 0b49296..29ef773 100644 --- a/lib/ohlcv_chart.dart +++ b/lib/ohlcv_chart.dart @@ -1,8 +1,9 @@ -/// Candlestick (K-line) and market-depth charts for Flutter. +/// Candlestick (K-line), market-depth and series charts for Flutter. /// -/// The two entry points are [KChartWidget], a fully interactive candlestick -/// chart with indicator overlays, sub-charts and drawing tools, and -/// [DepthChart], a bid/ask depth chart. +/// The three entry points are [KChartWidget], a fully interactive candlestick +/// chart with indicator overlays, sub-charts and drawing tools; [DepthChart], a +/// bid/ask depth chart; and [SeriesChart], lines, areas and bars of plain +/// values for dashboards and reports. library; export 'src/export.dart'; diff --git a/lib/src/export.dart b/lib/src/export.dart index c75178f..4b630a5 100644 --- a/lib/src/export.dart +++ b/lib/src/export.dart @@ -71,6 +71,8 @@ export './renderer/main_renderer.dart' show VerticalTextAlignment; export './utils/axis_ticks.dart'; export './utils/candle_transforms.dart'; export './utils/data_util.dart'; +export './pie/pie_chart.dart'; +export './radar/radar_chart.dart'; export './series/series_axis.dart' show SeriesAxisSide, @@ -80,8 +82,12 @@ export './series/series_axis.dart' SeriesLabelBuilder, SeriesReferenceLine, SeriesXAxis, - SeriesYAxis; + SeriesXSide, + SeriesYAxis, + seriesAxisLabelStyle, + seriesAxisTitleStyle; export './series/series_chart.dart'; export './series/series_data.dart' hide pointsOf; export './series/series_range_selector.dart'; +export './series/series_scale.dart' show SeriesOrientation; export './series/series_touch.dart'; diff --git a/lib/src/pie/pie_chart.dart b/lib/src/pie/pie_chart.dart new file mode 100644 index 0000000..8d1a1c5 --- /dev/null +++ b/lib/src/pie/pie_chart.dart @@ -0,0 +1,569 @@ +import 'dart:math' as math; + +import 'package:flutter/widgets.dart'; + +import '../renderer/text_painter_cache.dart'; + +/// The default colour of a section that names none. +const Color pieDefaultColor = Color(0xFF4C86CD); + +/// Where a section's label sits, as a share of the way out from the middle of +/// the ring to its outer edge. +const double pieDefaultLabelPosition = 0.5; + +/// One wedge of a [PieChart]. +/// +/// [value] is a share, not an angle: the sections are added up and each one +/// gets the part of the circle its value is worth. +@immutable +class PieSection { + /// Creates a section worth [value]. + const PieSection({ + required this.value, + this.color, + this.gradient, + this.label, + this.labelStyle, + this.labelPosition = pieDefaultLabelPosition, + this.radius, + this.border, + this.offset = 0, + this.badge, + this.badgePosition = 1, + }); + + /// The section's share of the circle. Zero or less draws nothing. + final double value; + + /// Fill colour; null uses [pieDefaultColor]. + final Color? color; + + /// Fill gradient, measured over the section; it wins over [color]. + final Gradient? gradient; + + /// Written on the section; null or empty writes nothing. + final String? label; + + /// Style of [label]. + final TextStyle? labelStyle; + + /// How far out the label sits: 0 at the inner edge, 1 at the outer one. + final double labelPosition; + + /// How far this section reaches out from the middle; null uses the chart's + /// own radius, so one section can stand out by asking for more. + final double? radius; + + /// An outline round the section. + final BorderSide? border; + + /// How far the section is pushed out of the circle, in logical pixels — the + /// exploded slice of a pie. + final double offset; + + /// A widget pinned to the section, such as an icon or a chip. + final Widget? badge; + + /// How far out [badge] is pinned, the way [labelPosition] measures. + final double badgePosition; +} + +/// One section as it was laid out: which part of the circle it covers. +@immutable +class PieSlice { + /// Creates a laid-out section. + const PieSlice({ + required this.index, + required this.startAngle, + required this.sweepAngle, + required this.innerRadius, + required this.outerRadius, + }); + + /// Which of `PieChart.sections` this is. + final int index; + + /// Where the section starts, in radians clockwise from three o'clock. + final double startAngle; + + /// How much of the circle it covers, in radians. + final double sweepAngle; + + /// The radius its inner edge sits at. + final double innerRadius; + + /// The radius its outer edge reaches. + final double outerRadius; + + /// The angle halfway through the section. + double get centreAngle => startAngle + sweepAngle / 2; + + /// The direction the section points in. + Offset get direction => Offset(math.cos(centreAngle), math.sin(centreAngle)); + + /// The point [t] of the way out from the inner edge to the outer one. + Offset pointAt(Offset centre, double t) => + centre + direction * (innerRadius + (outerRadius - innerRadius) * t); +} + +/// Lays [sections] out round a circle. +/// +/// Each section gets the share of `2π` its value is worth, starting at +/// [startAngle] and going round clockwise — or the other way with [clockwise] +/// off. [space] is taken off every section, so the wedges stand apart. +/// +/// Sections worth nothing are left out; a set of sections worth nothing at +/// all lays out as nothing. +List layOutPie({ + required List sections, + required double radius, + required double innerRadius, + double startAngle = -math.pi / 2, + double space = 0, + bool clockwise = true, + double animation = 1, +}) { + var total = 0.0; + for (final section in sections) { + if (section.value.isFinite && section.value > 0) total += section.value; + } + if (total <= 0) return const []; + + final gap = radius > 0 ? space / radius : 0.0; + final slices = []; + var covered = 0.0; + for (var i = 0; i < sections.length; i++) { + final section = sections[i]; + if (!section.value.isFinite || section.value <= 0) continue; + final full = section.value / total * math.pi * 2; + final sweep = math.max(0.0, full - gap) * animation.clamp(0.0, 1.0); + // Going the other way, a section ends where a clockwise one would have + // started, so it is laid out backwards from there. + final from = clockwise ? startAngle + covered : startAngle - covered - full; + slices.add( + PieSlice( + index: i, + startAngle: from + gap / 2, + sweepAngle: sweep, + innerRadius: innerRadius, + outerRadius: section.radius ?? radius, + ), + ); + covered += full; + } + return slices; +} + +/// Which section [local] is inside, or null for the hole or the space around +/// the circle. +int? pieSectionAt({ + required Offset local, + required Offset centre, + required List slices, +}) { + final delta = local - centre; + final distance = delta.distance; + var angle = math.atan2(delta.dy, delta.dx); + for (final slice in slices) { + if (distance < slice.innerRadius || distance > slice.outerRadius) continue; + // Both ends are brought into one turn of the circle so a section that + // crosses three o'clock still matches. + var from = slice.startAngle; + while (angle < from) { + angle += math.pi * 2; + } + while (angle > from + math.pi * 2) { + from += math.pi * 2; + } + if (angle <= from + slice.sweepAngle) return slice.index; + } + return null; +} + +/// What a touch on a [PieChart] landed on. +@immutable +class PieTouchDetails { + /// Creates the details of a touch on [index]. + const PieTouchDetails({ + required this.index, + required this.section, + required this.localPosition, + }); + + /// Which of `PieChart.sections` was touched, or -1 for none of them. + final int index; + + /// The section touched; null when the touch missed them all. + final PieSection? section; + + /// Where the touch was, in the chart's local pixels. + final Offset localPosition; +} + +/// A ring of sections, each as wide as its share of the whole — a pie chart, +/// or a doughnut when the middle is left open. +/// +/// ```dart +/// PieChart( +/// sections: [ +/// PieSection(value: 40, color: blue, label: '40%'), +/// PieSection(value: 35, color: green, label: '35%'), +/// PieSection(value: 25, color: amber, label: '25%'), +/// ], +/// centerSpaceRadius: 40, +/// centerChild: Text('Total'), +/// ); +/// ``` +/// +/// The chart fills the box it is given, and is [defaultSize] square in a box +/// that sets no size of its own. +class PieChart extends StatefulWidget { + /// Creates a pie of [sections]. + const PieChart({ + super.key, + required this.sections, + this.radius, + this.centerSpaceRadius = 0, + this.centerSpaceColor, + this.centerChild, + this.sectionsSpace = 0, + this.startDegreeOffset = 0, + this.clockwise = true, + this.touchedSectionGrowth = 8, + this.onTouch, + this.animationDuration = Duration.zero, + this.animationCurve = Curves.easeOutCubic, + this.animateOnMount = true, + this.padding = EdgeInsets.zero, + this.backgroundColor, + this.defaultSize = 200, + this.semanticLabel, + }); + + /// The wedges, going round from [startDegreeOffset]. + final List sections; + + /// How far the sections reach; null fills the box. + final double? radius; + + /// The hole in the middle; 0 draws a full pie. + final double centerSpaceRadius; + + /// Painted in the hole; null leaves it clear. + final Color? centerSpaceColor; + + /// A widget centred in the hole — a total, a title, a button. + final Widget? centerChild; + + /// The gap between two sections, in logical pixels round the outer edge. + final double sectionsSpace; + + /// Where the first section starts, in degrees clockwise from twelve + /// o'clock. + final double startDegreeOffset; + + /// Whether the sections go round clockwise. + final bool clockwise; + + /// How much further the section under the finger reaches; 0 leaves it be. + final double touchedSectionGrowth; + + /// Called as a touch moves over the sections, and with null when it leaves. + final ValueChanged? onTouch; + + /// How long the sections take to sweep in; zero draws them at once. + final Duration animationDuration; + + /// The easing of [animationDuration]. + final Curve animationCurve; + + /// Whether the first build sweeps in. + final bool animateOnMount; + + /// Space kept clear around the circle. + final EdgeInsets padding; + + /// Painted behind the whole chart. + final Color? backgroundColor; + + /// The size taken in a box that sets none. + final double defaultSize; + + /// What a screen reader announces for the chart. + final String? semanticLabel; + + @override + State createState() => _PieChartState(); +} + +class _PieChartState extends State + with SingleTickerProviderStateMixin { + late final AnimationController _animation; + final TextPainterCache _text = TextPainterCache(capacity: 64); + int? _touched; + + @override + void initState() { + super.initState(); + _animation = AnimationController( + vsync: this, + duration: widget.animationDuration, + value: 1, + )..addListener(() => setState(() {})); + if (widget.animateOnMount && widget.animationDuration > Duration.zero) { + _animation.forward(from: 0); + } + } + + @override + void didUpdateWidget(PieChart oldWidget) { + super.didUpdateWidget(oldWidget); + _animation.duration = widget.animationDuration; + if (oldWidget.sections.length != widget.sections.length && + widget.animationDuration > Duration.zero) { + _animation.forward(from: 0); + } + } + + @override + void dispose() { + _animation.dispose(); + super.dispose(); + } + + void _handle(Offset local, Offset centre, List slices) { + final index = pieSectionAt(local: local, centre: centre, slices: slices); + if (index == _touched) return; + setState(() => _touched = index); + widget.onTouch?.call( + index == null + ? null + : PieTouchDetails( + index: index, + section: widget.sections[index], + localPosition: local, + ), + ); + } + + void _leave() { + if (_touched == null) return; + setState(() => _touched = null); + widget.onTouch?.call(null); + } + + @override + Widget build(BuildContext context) { + final t = widget.animationCurve.transform(_animation.value); + + Widget chart = LayoutBuilder( + builder: (context, constraints) { + final width = constraints.hasBoundedWidth + ? constraints.maxWidth + : widget.defaultSize; + final height = constraints.hasBoundedHeight + ? constraints.maxHeight + : widget.defaultSize; + final size = Size(width, height); + final box = widget.padding.deflateRect(Offset.zero & size); + final centre = box.center; + final room = math.max(0.0, box.shortestSide / 2); + final radius = math.max( + 0.0, + (widget.radius ?? room) - widget.touchedSectionGrowth, + ); + final inner = widget.centerSpaceRadius.clamp(0.0, radius); + final slices = layOutPie( + sections: widget.sections, + radius: radius, + innerRadius: inner.toDouble(), + startAngle: (widget.startDegreeOffset - 90) * math.pi / 180, + space: widget.sectionsSpace, + clockwise: widget.clockwise, + animation: t, + ); + + return SizedBox( + width: width, + height: height, + child: MouseRegion( + onHover: (e) => _handle(e.localPosition, centre, slices), + onExit: (_) => _leave(), + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTapDown: (d) => _handle(d.localPosition, centre, slices), + onTapUp: (_) => _leave(), + onTapCancel: _leave, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned.fill( + child: CustomPaint( + painter: PieChartPainter( + sections: widget.sections, + slices: slices, + centre: centre, + touched: _touched, + touchedGrowth: widget.touchedSectionGrowth, + centerSpaceColor: widget.centerSpaceColor, + centerSpaceRadius: inner.toDouble(), + backgroundColor: widget.backgroundColor, + textCache: _text, + ), + ), + ), + if (widget.centerChild != null) + Positioned( + left: centre.dx - inner, + top: centre.dy - inner, + width: inner * 2, + height: inner * 2, + child: Center(child: widget.centerChild), + ), + for (final slice in slices) + if (widget.sections[slice.index].badge != null) + _badge(slice, centre), + ], + ), + ), + ), + ); + }, + ); + + final label = widget.semanticLabel; + if (label != null) { + chart = Semantics(container: true, label: label, child: chart); + } + return chart; + } + + Widget _badge(PieSlice slice, Offset centre) { + final section = widget.sections[slice.index]; + final at = slice.pointAt(centre, section.badgePosition) + + slice.direction * section.offset; + return Positioned( + left: at.dx, + top: at.dy, + child: FractionalTranslation( + translation: const Offset(-0.5, -0.5), + child: section.badge, + ), + ); + } +} + +/// Paints a [PieChart]'s sections and their labels. +class PieChartPainter extends CustomPainter { + /// Creates the painter for [slices], which lay [sections] out. + PieChartPainter({ + required this.sections, + required this.slices, + required this.centre, + required this.touched, + required this.touchedGrowth, + required this.centerSpaceColor, + required this.centerSpaceRadius, + required this.backgroundColor, + required this.textCache, + }); + + final List sections; + final List slices; + final Offset centre; + final int? touched; + final double touchedGrowth; + final Color? centerSpaceColor; + final double centerSpaceRadius; + final Color? backgroundColor; + final TextPainterCache textCache; + + static const TextStyle _labelStyle = TextStyle( + fontSize: 12, + color: Color(0xFFFFFFFF), + fontWeight: FontWeight.w600, + ); + + @override + void paint(Canvas canvas, Size size) { + final background = backgroundColor; + if (background != null) { + canvas.drawRect(Offset.zero & size, Paint()..color = background); + } + + final hole = centerSpaceColor; + if (hole != null && centerSpaceRadius > 0) { + canvas.drawCircle(centre, centerSpaceRadius, Paint()..color = hole); + } + + for (final slice in slices) { + final section = sections[slice.index]; + final grown = slice.index == touched ? touchedGrowth : 0.0; + final outer = slice.outerRadius + grown; + if (outer <= 0 || slice.sweepAngle <= 0) continue; + final shift = slice.direction * section.offset; + final path = _sectionPath(slice, outer, shift); + + final gradient = section.gradient; + final paint = Paint()..isAntiAlias = true; + if (gradient != null) { + paint.shader = gradient.createShader(path.getBounds()); + } else { + paint.color = section.color ?? pieDefaultColor; + } + canvas.drawPath(path, paint); + + final border = section.border; + if (border != null && + border.style != BorderStyle.none && + border.width > 0) { + canvas.drawPath( + path, + Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = border.width + ..color = border.color + ..isAntiAlias = true, + ); + } + + final label = section.label; + if (label == null || label.isEmpty) continue; + final tp = textCache.get(label, _labelStyle.merge(section.labelStyle)); + final at = centre + + shift + + slice.direction * + (slice.innerRadius + + (outer - slice.innerRadius) * section.labelPosition); + tp.paint(canvas, at - Offset(tp.width / 2, tp.height / 2)); + } + } + + /// The wedge of one section: the outer arc, the inner arc back, closed. + Path _sectionPath(PieSlice slice, double outer, Offset shift) { + final inner = slice.innerRadius; + final path = Path(); + final outerRect = Rect.fromCircle(center: centre + shift, radius: outer); + if (inner <= 0) { + path + ..moveTo(centre.dx + shift.dx, centre.dy + shift.dy) + ..arcTo(outerRect, slice.startAngle, slice.sweepAngle, false) + ..close(); + return path; + } + final innerRect = Rect.fromCircle(center: centre + shift, radius: inner); + path + ..arcTo(outerRect, slice.startAngle, slice.sweepAngle, true) + ..arcTo( + innerRect, + slice.startAngle + slice.sweepAngle, + -slice.sweepAngle, + false, + ) + ..close(); + return path; + } + + @override + bool shouldRepaint(PieChartPainter oldDelegate) => true; +} diff --git a/lib/src/radar/radar_chart.dart b/lib/src/radar/radar_chart.dart new file mode 100644 index 0000000..0cef01d --- /dev/null +++ b/lib/src/radar/radar_chart.dart @@ -0,0 +1,656 @@ +import 'dart:math' as math; + +import 'package:flutter/widgets.dart'; + +import '../renderer/text_painter_cache.dart'; +import '../series/series_axis.dart'; +import '../series/series_data.dart'; + +/// The colour a radar series falls back on. +const Color radarDefaultColor = Color(0xFF4C86CD); + +/// The colour of the web behind the series. +const Color radarGridColor = Color(0x33909196); + +/// Which shape the web is drawn in. +enum RadarShape { + /// Straight edges from feature to feature — the usual spider web. + polygon, + + /// Rings. + circle, +} + +/// One outline on a [RadarChart]: a value for every feature, in order. +@immutable +class RadarSeries { + /// Creates an outline through [values]. + const RadarSeries({ + required this.values, + this.label, + this.color, + this.fillColor, + this.width = 2, + this.dashPattern, + this.dot, + this.showInTooltip = true, + }); + + /// One value per feature; a value beyond the chart's range is clamped, and + /// a null one breaks the outline at that feature. + final List values; + + /// What the series is called, for a legend or a tooltip. + final String? label; + + /// Outline colour; null uses [radarDefaultColor]. + final Color? color; + + /// The fill inside the outline; null fills it with a faint [color]. + final Color? fillColor; + + /// Outline width; 0 draws no outline. + final double width; + + /// Alternating dash and gap lengths; null draws solid. + final List? dashPattern; + + /// A dot on every corner; null draws none. + final SeriesDot? dot; + + /// Whether a touch on this series reports it. + final bool showInTooltip; + + /// The colour the outline is drawn in. + Color get strokeColor => color ?? radarDefaultColor; +} + +/// What a touch on a [RadarChart] landed on. +@immutable +class RadarTouchDetails { + /// Creates the details of a touch on the corner [featureIndex] of + /// [seriesIndex]. + const RadarTouchDetails({ + required this.seriesIndex, + required this.featureIndex, + required this.value, + required this.position, + }); + + /// Which of `RadarChart.series` was touched. + final int seriesIndex; + + /// Which feature's corner it was. + final int featureIndex; + + /// The value at that corner. + final double value; + + /// Where the corner is, in the chart's local pixels. + final Offset position; +} + +/// The corner of a radar web: [count] features spread evenly round a circle, +/// the first one at twelve o'clock unless [startAngle] says otherwise. +Offset radarCorner({ + required Offset centre, + required double radius, + required int count, + required int index, + double startAngle = -math.pi / 2, +}) { + if (count <= 0) return centre; + final angle = startAngle + index * math.pi * 2 / count; + return centre + Offset(math.cos(angle), math.sin(angle)) * radius; +} + +/// A web of features with one outline per series — a radar, or spider, chart. +/// +/// ```dart +/// RadarChart( +/// features: const ['Speed', 'Power', 'Range', 'Cost', 'Weight'], +/// series: [ +/// RadarSeries(values: const [4, 3, 5, 2, 4], color: blue), +/// RadarSeries(values: const [3, 5, 2, 4, 3], color: amber), +/// ], +/// maxValue: 5, +/// ); +/// ``` +/// +/// The chart fills the box it is given, and is [defaultSize] square in a box +/// that sets no size of its own. +class RadarChart extends StatefulWidget { + /// Creates a radar of [series] over [features]. + const RadarChart({ + super.key, + required this.series, + this.features = const [], + this.minValue = 0, + this.maxValue, + this.tickCount = 4, + this.shape = RadarShape.polygon, + this.startDegreeOffset = 0, + this.gridColor = radarGridColor, + this.gridWidth = 1, + this.spokeColor, + this.spokeWidth = 1, + this.tickStyle, + this.showTicks = false, + this.featureStyle, + this.featureGap = 8, + this.radius, + this.onTouch, + this.touchThreshold = 24, + this.animationDuration = Duration.zero, + this.animationCurve = Curves.easeOutCubic, + this.animateOnMount = true, + this.padding = EdgeInsets.zero, + this.backgroundColor, + this.defaultSize = 220, + this.semanticLabel, + }); + + /// The outlines, bottom one first. + final List series; + + /// What each corner is called, in the order the values are given; an empty + /// list leaves the corners unnamed. + final List features; + + /// The value at the middle of the web. + final double minValue; + + /// The value at its outer edge; null takes the largest value given. + final double? maxValue; + + /// How many rings the web is drawn with. + final int tickCount; + + /// Whether the rings are straight-edged or round. + final RadarShape shape; + + /// Where the first feature sits, in degrees clockwise from twelve o'clock. + final double startDegreeOffset; + + /// Colour of the rings. + final Color gridColor; + + /// Width of the rings; 0 draws none. + final double gridWidth; + + /// Colour of the spokes out to each feature; null follows [gridColor]. + final Color? spokeColor; + + /// Width of the spokes; 0 draws none. + final double spokeWidth; + + /// Style of the ring values, when [showTicks] is on. + final TextStyle? tickStyle; + + /// Whether each ring is labelled with the value it stands for. + final bool showTicks; + + /// Style of the feature names. + final TextStyle? featureStyle; + + /// Space between the outer ring and the feature names. + final double featureGap; + + /// How far the web reaches; null fits the box, leaving room for the names. + final double? radius; + + /// Called when a corner is touched, and with null when the touch leaves. + final ValueChanged? onTouch; + + /// How close a touch has to be to a corner to pick it, in logical pixels. + final double touchThreshold; + + /// How long the outlines take to grow out of the middle; zero draws them at + /// once. + final Duration animationDuration; + + /// The easing of [animationDuration]. + final Curve animationCurve; + + /// Whether the first build grows in. + final bool animateOnMount; + + /// Space kept clear around the web. + final EdgeInsets padding; + + /// Painted behind the whole chart. + final Color? backgroundColor; + + /// The size taken in a box that sets none. + final double defaultSize; + + /// What a screen reader announces for the chart. + final String? semanticLabel; + + @override + State createState() => _RadarChartState(); +} + +class _RadarChartState extends State + with SingleTickerProviderStateMixin { + late final AnimationController _animation; + final TextPainterCache _text = TextPainterCache(capacity: 64); + + @override + void initState() { + super.initState(); + _animation = AnimationController( + vsync: this, + duration: widget.animationDuration, + value: 1, + )..addListener(() => setState(() {})); + if (widget.animateOnMount && widget.animationDuration > Duration.zero) { + _animation.forward(from: 0); + } + } + + @override + void didUpdateWidget(RadarChart oldWidget) { + super.didUpdateWidget(oldWidget); + _animation.duration = widget.animationDuration; + } + + @override + void dispose() { + _animation.dispose(); + super.dispose(); + } + + /// How many corners the web has: as many as the longest series, or as many + /// as there are names when there are more of those. + int get _featureCount { + var count = widget.features.length; + for (final s in widget.series) { + count = math.max(count, s.values.length); + } + return count; + } + + double get _maxValue { + final given = widget.maxValue; + if (given != null) return given; + var high = widget.minValue; + for (final s in widget.series) { + for (final v in s.values) { + if (v != null && v.isFinite) high = math.max(high, v); + } + } + return high > widget.minValue ? high : widget.minValue + 1; + } + + void _handle(Offset local, RadarLayout layout) { + final onTouch = widget.onTouch; + if (onTouch == null) return; + RadarTouchDetails? best; + var bestDistance = widget.touchThreshold * widget.touchThreshold; + for (var i = 0; i < widget.series.length; i++) { + final s = widget.series[i]; + if (!s.showInTooltip) continue; + for (var j = 0; j < s.values.length; j++) { + final value = s.values[j]; + if (value == null || !value.isFinite) continue; + final at = layout.cornerFor(j, value); + final distance = (at - local).distanceSquared; + if (distance <= bestDistance) { + bestDistance = distance; + best = RadarTouchDetails( + seriesIndex: i, + featureIndex: j, + value: value, + position: at, + ); + } + } + } + onTouch(best); + } + + @override + Widget build(BuildContext context) { + final t = widget.animationCurve.transform(_animation.value); + + Widget chart = LayoutBuilder( + builder: (context, constraints) { + final width = constraints.hasBoundedWidth + ? constraints.maxWidth + : widget.defaultSize; + final height = constraints.hasBoundedHeight + ? constraints.maxHeight + : widget.defaultSize; + final box = widget.padding.deflateRect( + Offset.zero & Size(width, height), + ); + // The names are written outside the web, so it gives up the room they + // need unless a radius was asked for. + final names = widget.features.isEmpty + ? 0.0 + : _text + .get( + widget.features.reduce( + (a, b) => a.length >= b.length ? a : b, + ), + seriesAxisLabelStyle.merge(widget.featureStyle), + ) + .width / + 2; + final radius = math.max( + 0.0, + widget.radius ?? + box.shortestSide / 2 - widget.featureGap - names.clamp(0.0, 60.0), + ); + final layout = RadarLayout( + centre: box.center, + radius: radius, + count: _featureCount, + minValue: widget.minValue, + maxValue: _maxValue, + startAngle: (widget.startDegreeOffset - 90) * math.pi / 180, + ); + + return SizedBox( + width: width, + height: height, + child: MouseRegion( + onHover: (e) => _handle(e.localPosition, layout), + onExit: (_) => widget.onTouch?.call(null), + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTapDown: (d) => _handle(d.localPosition, layout), + onTapUp: (_) => widget.onTouch?.call(null), + onTapCancel: () => widget.onTouch?.call(null), + child: CustomPaint( + painter: RadarChartPainter( + chart: widget, + layout: layout, + animation: t, + textCache: _text, + ), + ), + ), + ), + ); + }, + ); + + final label = widget.semanticLabel; + if (label != null) { + chart = Semantics(container: true, label: label, child: chart); + } + return chart; + } +} + +/// Where a radar web sits and how its values turn into pixels. +@immutable +class RadarLayout { + /// Creates the layout of a web of [count] features. + const RadarLayout({ + required this.centre, + required this.radius, + required this.count, + required this.minValue, + required this.maxValue, + required this.startAngle, + }); + + /// The middle of the web. + final Offset centre; + + /// How far the outer ring reaches. + final double radius; + + /// How many corners it has. + final int count; + + /// The value at the middle. + final double minValue; + + /// The value at the outer ring. + final double maxValue; + + /// Where the first feature sits, in radians from three o'clock. + final double startAngle; + + /// How far out [value] sits, from nothing at the middle to [radius]. + double radiusFor(double value) { + final span = maxValue - minValue; + if (span <= 0) return 0; + return ((value - minValue) / span).clamp(0.0, 1.0) * radius; + } + + /// The corner of feature [index] at [value]. + Offset cornerFor(int index, double value) => radarCorner( + centre: centre, + radius: radiusFor(value), + count: count, + index: index, + startAngle: startAngle, + ); + + /// The corner of feature [index] on the ring at [t] of the way out. + Offset ringCorner(int index, double t) => radarCorner( + centre: centre, + radius: radius * t, + count: count, + index: index, + startAngle: startAngle, + ); +} + +/// Paints a [RadarChart]: the web, the feature names and the outlines. +class RadarChartPainter extends CustomPainter { + /// Creates the painter for [chart], laid out as [layout] says. + RadarChartPainter({ + required this.chart, + required this.layout, + required this.animation, + required this.textCache, + }); + + final RadarChart chart; + final RadarLayout layout; + final double animation; + final TextPainterCache textCache; + + @override + void paint(Canvas canvas, Size size) { + final background = chart.backgroundColor; + if (background != null) { + canvas.drawRect(Offset.zero & size, Paint()..color = background); + } + if (layout.radius <= 0 || layout.count < 3) return; + + _paintWeb(canvas); + _paintFeatures(canvas, size); + for (final series in chart.series) { + _paintSeries(canvas, series); + } + } + + void _paintWeb(Canvas canvas) { + if (chart.gridWidth > 0 && chart.tickCount > 0) { + final paint = _stroke(chart.gridColor, chart.gridWidth); + for (var ring = 1; ring <= chart.tickCount; ring++) { + final t = ring / chart.tickCount; + if (chart.shape == RadarShape.circle) { + canvas.drawCircle(layout.centre, layout.radius * t, paint); + continue; + } + final path = Path(); + for (var i = 0; i < layout.count; i++) { + final at = layout.ringCorner(i, t); + if (i == 0) { + path.moveTo(at.dx, at.dy); + } else { + path.lineTo(at.dx, at.dy); + } + } + canvas.drawPath(path..close(), paint); + } + } + + if (chart.spokeWidth > 0) { + final paint = _stroke( + chart.spokeColor ?? chart.gridColor, + chart.spokeWidth, + ); + for (var i = 0; i < layout.count; i++) { + canvas.drawLine(layout.centre, layout.ringCorner(i, 1), paint); + } + } + + if (!chart.showTicks || chart.tickCount <= 0) return; + final style = seriesAxisLabelStyle.merge(chart.tickStyle); + for (var ring = 1; ring <= chart.tickCount; ring++) { + final t = ring / chart.tickCount; + final value = chart.minValue + (layout.maxValue - chart.minValue) * t; + final tp = textCache.get(_number(value), style); + // Written up the first spoke, where the outlines cross it least. + final at = layout.ringCorner(0, t); + tp.paint(canvas, at + const Offset(4, -2)); + } + } + + void _paintFeatures(Canvas canvas, Size size) { + if (chart.features.isEmpty) return; + final style = seriesAxisLabelStyle.merge(chart.featureStyle); + for (var i = 0; i < chart.features.length && i < layout.count; i++) { + final name = chart.features[i]; + if (name.isEmpty) continue; + final tp = textCache.get(name, style); + final corner = layout.ringCorner(i, 1); + final direction = corner - layout.centre; + final distance = direction.distance; + final out = + distance == 0 ? Offset.zero : direction / distance * chart.featureGap; + // Pushed clear of the web by half the label, so a name on the left ends + // where the web starts rather than lying over it. + final at = corner + + out + + Offset( + (direction.dx / (distance == 0 ? 1 : distance)) * tp.width / 2, + (direction.dy / (distance == 0 ? 1 : distance)) * tp.height / 2, + ); + tp.paint( + canvas, + Offset( + (at.dx - tp.width / 2).clamp( + 0.0, + math.max(0.0, size.width - tp.width), + ), + (at.dy - tp.height / 2).clamp( + 0.0, + math.max(0.0, size.height - tp.height), + ), + ), + ); + } + } + + void _paintSeries(Canvas canvas, RadarSeries series) { + final corners = []; + for (var i = 0; i < series.values.length && i < layout.count; i++) { + final value = series.values[i]; + if (value == null || !value.isFinite) continue; + final grown = + chart.minValue + (value - chart.minValue) * animation.clamp(0.0, 1.0); + corners.add(layout.cornerFor(i, grown)); + } + if (corners.length < 2) { + for (final at in corners) { + final dot = series.dot; + if (dot != null) _paintDot(canvas, at, dot, series.strokeColor); + } + return; + } + + final path = Path()..moveTo(corners.first.dx, corners.first.dy); + for (final at in corners.skip(1)) { + path.lineTo(at.dx, at.dy); + } + path.close(); + + final fill = series.fillColor ?? series.strokeColor.withValues(alpha: 0.2); + canvas.drawPath(path, Paint()..color = fill); + if (series.width > 0) { + canvas.drawPath( + _dashed(path, series.dashPattern), + _stroke(series.strokeColor, series.width), + ); + } + final dot = series.dot; + if (dot != null) { + for (final at in corners) { + _paintDot(canvas, at, dot, series.strokeColor); + } + } + } + + void _paintDot(Canvas canvas, Offset at, SeriesDot dot, Color fallback) { + if (dot.radius <= 0) return; + canvas.drawCircle( + at, + dot.radius, + Paint() + ..color = dot.color ?? fallback + ..isAntiAlias = true, + ); + final ring = dot.strokeColor; + if (ring != null && dot.strokeWidth > 0) { + canvas.drawCircle( + at, + dot.radius, + Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = dot.strokeWidth + ..color = ring + ..isAntiAlias = true, + ); + } + } + + static Path _dashed(Path source, List? pattern) { + if (pattern == null || pattern.isEmpty || !pattern.any((v) => v > 0)) { + return source; + } + final dashed = Path(); + for (final metric in source.computeMetrics()) { + var distance = 0.0; + var index = 0; + while (distance < metric.length) { + final length = math.max(0.0, pattern[index % pattern.length]); + if (index.isEven && length > 0) { + dashed.addPath( + metric.extractPath( + distance, + math.min(distance + length, metric.length), + ), + Offset.zero, + ); + } + distance += length; + index++; + } + } + return dashed; + } + + static Paint _stroke(Color color, double width) => Paint() + ..style = PaintingStyle.stroke + ..color = color + ..strokeWidth = width + ..strokeJoin = StrokeJoin.round + ..isAntiAlias = true; + + static String _number(double value) => value == value.roundToDouble() + ? value.toStringAsFixed(0) + : value.toStringAsFixed(1); + + @override + bool shouldRepaint(RadarChartPainter oldDelegate) => true; +} diff --git a/lib/src/series/series_axis.dart b/lib/src/series/series_axis.dart index b99b42d..c31d64e 100644 --- a/lib/src/series/series_axis.dart +++ b/lib/src/series/series_axis.dart @@ -7,7 +7,23 @@ const Color seriesAxisTextColor = Color(0xFF909196); /// The grid colour when none is given. const Color seriesGridColor = Color(0x33909196); +/// The style axis labels start from, before an axis's own style. +const TextStyle seriesAxisLabelStyle = TextStyle( + fontSize: 10, + color: seriesAxisTextColor, +); + +/// The style axis titles start from, before an axis's own title style. +const TextStyle seriesAxisTitleStyle = TextStyle( + fontSize: 11, + color: seriesAxisTextColor, + fontWeight: FontWeight.w600, +); + /// Which side of the plot the value axis sits on. +/// +/// In a horizontal chart, where the value axis runs across the plot, `left` +/// puts it along the bottom and `right` along the top. enum SeriesAxisSide { /// Labels to the left of the plot, right-aligned against it. left, @@ -16,22 +32,35 @@ enum SeriesAxisSide { right, } +/// Which side of the plot the x axis sits on. +/// +/// In a horizontal chart, where the x axis runs down the plot, `bottom` puts +/// it on the left and `top` on the right. +enum SeriesXSide { + /// Labels under the plot. + bottom, + + /// Labels over the plot. + top, +} + /// Writes the label for one position on an axis; null or empty prints none. typedef SeriesLabelBuilder = String? Function(double value); -/// The horizontal axis of a [SeriesChart]. +/// The x axis of a [SeriesChart]. /// -/// Which x values get a label — and a vertical grid line — is decided in this -/// order: [ticks] if given; otherwise every index whose entry in [labels] is -/// not empty, thinned to multiples of [interval] when that is set; otherwise -/// every [interval]; otherwise about [tickCount] round values. Labels that -/// would overlap the one before are dropped. +/// Which x values get a label — and a grid line — is decided in this order: +/// [ticks] if given; otherwise every index whose entry in [labels] is not +/// empty, thinned to multiples of [interval] when that is set; otherwise every +/// [interval]; otherwise about [tickCount] round values. Labels that would +/// overlap the one before are dropped. @immutable class SeriesXAxis { - /// Creates a horizontal axis. + /// Creates an x axis. const SeriesXAxis({ this.show = true, this.height = 22, + this.side = SeriesXSide.bottom, this.labels, this.labelBuilder, this.ticks, @@ -40,6 +69,8 @@ class SeriesXAxis { this.style, this.gap = 4, this.fitInside = true, + this.title, + this.titleStyle, }); /// No labels and no room held for them. @@ -48,9 +79,13 @@ class SeriesXAxis { /// Whether labels are drawn and room is held for them. final bool show; - /// Room below the plot for the labels. + /// Room held for the labels, measured across the axis. A horizontal chart + /// holds at least this beside the plot, and more when a label needs it. final double height; + /// Which side of the plot the labels sit on. + final SeriesXSide side; + /// A label per index — `labels[i]` names `x = i`. An empty string prints /// nothing, so a list that only names month starts spaces itself. final List? labels; @@ -76,6 +111,12 @@ class SeriesXAxis { /// Slides the first and last labels inward so they are not cut off. final bool fitInside; + /// A name for the whole axis, written beyond its labels. + final String? title; + + /// Style of [title]. + final TextStyle? titleStyle; + /// The label for [x], or null when there is none. /// /// [step] is the distance between two labels, which decides how many @@ -95,10 +136,10 @@ class SeriesXAxis { } } -/// The vertical axis of a [SeriesChart]. +/// The value axis of a [SeriesChart]. @immutable class SeriesYAxis { - /// Creates a vertical axis. + /// Creates a value axis. const SeriesYAxis({ this.show = true, this.side = SeriesAxisSide.left, @@ -109,6 +150,8 @@ class SeriesYAxis { this.tickCount = 5, this.style, this.gap = 4, + this.title, + this.titleStyle, }); /// No labels and no room held for them. @@ -121,7 +164,8 @@ class SeriesYAxis { final SeriesAxisSide side; /// Room beside the plot for the labels. Charts stacked one above another - /// line up when they share it. + /// line up when they share it. A horizontal chart measures its value labels + /// instead. final double width; /// Writes a value as its label; it also writes the default tooltip's values. @@ -142,6 +186,12 @@ class SeriesYAxis { /// Space between the plot and the labels. final double gap; + /// A name for the whole axis, written beyond its labels. + final String? title; + + /// Style of [title]. + final TextStyle? titleStyle; + /// Writes [value], using [formatter] when there is one and otherwise as many /// decimals as [step] needs. String format(double value, double step) { @@ -151,6 +201,9 @@ class SeriesYAxis { } /// The lines ruled across the plot at the axis labels. +/// +/// Named for an upright chart: [horizontal] lines sit at the values and +/// [vertical] lines at the x labels, whichever way the chart is turned. @immutable class SeriesGrid { /// Creates a grid. @@ -167,10 +220,10 @@ class SeriesGrid { /// No grid lines. static const none = SeriesGrid(horizontal: false, vertical: false); - /// Lines across the plot at the value-axis ticks. + /// Lines at the value-axis ticks. final bool horizontal; - /// Lines down the plot at the x-axis ticks. + /// Lines at the x-axis ticks. final bool vertical; /// Line colour. @@ -182,19 +235,20 @@ class SeriesGrid { /// Dash and gap lengths, such as `[4, 4]`; null draws solid lines. final List? dashPattern; - /// Colour of the vertical lines; null follows [color]. + /// Colour of the lines at the x ticks; null follows [color]. final Color? verticalColor; - /// Dashes of the vertical lines; null follows [dashPattern]. + /// Dashes of the lines at the x ticks; null follows [dashPattern]. final List? verticalDashPattern; } -/// The direction a [SeriesReferenceLine] or [SeriesBand] runs. +/// Where a [SeriesReferenceLine] or [SeriesBand] is measured, named for an +/// upright chart. enum SeriesDirection { - /// Across the plot, at a value. + /// At a value — across an upright chart, down a horizontal one. horizontal, - /// Down the plot, at an x. + /// At an x — down an upright chart, across a horizontal one. vertical, } @@ -205,7 +259,7 @@ enum SeriesDirection { /// [extendsRange] says so — a far-off target would otherwise flatten the data. @immutable class SeriesReferenceLine { - /// A line across the plot at [value]. + /// A line at the value [value]. const SeriesReferenceLine.horizontal( this.value, { this.color = const Color(0x99909196), @@ -218,7 +272,7 @@ class SeriesReferenceLine { this.extendsRange = false, }) : direction = SeriesDirection.horizontal; - /// A line down the plot at x = [value]. + /// A line at x = [value]. const SeriesReferenceLine.vertical( this.value, { this.color = const Color(0x99909196), @@ -228,10 +282,10 @@ class SeriesReferenceLine { this.labelStyle, this.labelAlignment = Alignment.topRight, this.aboveSeries = false, - }) : direction = SeriesDirection.vertical, - extendsRange = false; + }) : direction = SeriesDirection.vertical, + extendsRange = false; - /// Which way the line runs. + /// What the line is measured at. final SeriesDirection direction; /// The value (horizontal) or x (vertical) it is drawn at. @@ -252,29 +306,29 @@ class SeriesReferenceLine { /// Style of [label]. final TextStyle? labelStyle; - /// Where along and beside the line [label] sits: `topRight` puts it above - /// the right end of a horizontal line. + /// Where along and beside the line [label] sits, as it runs on screen: + /// `topRight` puts it above the right end of a line across the plot. final Alignment labelAlignment; /// Whether it is drawn over the series rather than under them. final bool aboveSeries; - /// Whether the value range grows to include a horizontal line. + /// Whether the value range grows to include a line at a value. final bool extendsRange; } /// A shaded stretch of the plot between two values or two x positions. @immutable class SeriesBand { - /// A band across the plot between the values [from] and [to]. - const SeriesBand.horizontal(this.from, this.to, {required this.color}) - : direction = SeriesDirection.horizontal; + /// A band between the values [from] and [to]. + const SeriesBand.horizontal(this.from, this.to, {this.color, this.gradient}) + : direction = SeriesDirection.horizontal; - /// A band down the plot between x = [from] and x = [to]. - const SeriesBand.vertical(this.from, this.to, {required this.color}) - : direction = SeriesDirection.vertical; + /// A band between x = [from] and x = [to]. + const SeriesBand.vertical(this.from, this.to, {this.color, this.gradient}) + : direction = SeriesDirection.vertical; - /// Which way the band runs. + /// What the band is measured at. final SeriesDirection direction; /// One edge. @@ -283,8 +337,11 @@ class SeriesBand { /// The other edge. final double to; - /// Fill colour. - final Color color; + /// Fill colour; ignored when [gradient] is set. + final Color? color; + + /// Gradient laid over the band as it is drawn. + final Gradient? gradient; } /// Writes [value] with as many decimals as a step of [step] needs to tell its diff --git a/lib/src/series/series_chart.dart b/lib/src/series/series_chart.dart index 51ecfb6..4db10f4 100644 --- a/lib/src/series/series_chart.dart +++ b/lib/src/series/series_chart.dart @@ -54,6 +54,8 @@ class SeriesChart extends StatefulWidget { this.niceYRange = true, this.referenceLines = const [], this.bands = const [], + this.betweenFills = const [], + this.orientation = SeriesOrientation.vertical, this.touch = const SeriesTouch(), this.controller, this.onTouch, @@ -116,6 +118,13 @@ class SeriesChart extends StatefulWidget { /// Shaded stretches of the plot. final List bands; + /// Areas filled between two of the [series], painted under them. + final List betweenFills; + + /// Which way the chart is turned; [SeriesOrientation.horizontal] lays the x + /// axis down the side and grows the bars rightwards. + final SeriesOrientation orientation; + /// How the chart answers touch and hover; null makes it ignore both. final SeriesTouch? touch; @@ -174,19 +183,20 @@ class _SeriesChartState extends State SeriesGeometry? _geometry; double? _localX; + int? _localSeries; + int? _localPoint; double? _reportedX; @override void initState() { super.initState(); - _animation = - AnimationController( - vsync: this, - duration: widget.animationDuration, - value: 1, - ) - ..addListener(_onTick) - ..addStatusListener(_onStatus); + _animation = AnimationController( + vsync: this, + duration: widget.animationDuration, + value: 1, + ) + ..addListener(_onTick) + ..addStatusListener(_onStatus); widget.controller?.addListener(_onController); if (widget.animateOnMount && widget.animationDuration > Duration.zero) { _growIn(); @@ -255,8 +265,9 @@ class _SeriesChartState extends State } static List> _targetValues(List series) => [ - for (final s in series) [for (final p in s.points) p.isGap ? null : p.y], - ]; + for (final s in series) + [for (final p in s.points) p.isGap ? null : p.y], + ]; static bool _sameValues(List a, List b) { if (identical(a, b)) return true; @@ -282,20 +293,20 @@ class _SeriesChartState extends State } SeriesViewport _fit(List> values) => fitSeriesViewport( - series: widget.series, - values: values, - xAxis: widget.xAxis, - yAxis: widget.yAxis, - referenceLines: widget.referenceLines, - minX: widget.minX, - maxX: widget.maxX, - xPadding: widget.xPadding, - minY: widget.minY, - maxY: widget.maxY, - includeZero: widget.includeZero, - yPadding: widget.yPadding, - niceYRange: widget.niceYRange, - ); + series: widget.series, + values: values, + xAxis: widget.xAxis, + yAxis: widget.yAxis, + referenceLines: widget.referenceLines, + minX: widget.minX, + maxX: widget.maxX, + xPadding: widget.xPadding, + minY: widget.minY, + maxY: widget.maxY, + includeZero: widget.includeZero, + yPadding: widget.yPadding, + niceYRange: widget.niceYRange, + ); // ── Touch ─────────────────────────────────────────────────────────────── @@ -304,23 +315,56 @@ class _SeriesChartState extends State return controller != null ? controller.x : _localX; } + int? get _touchSeries { + final controller = widget.controller; + return controller != null ? controller.seriesIndex : _localSeries; + } + + int? get _touchPoint { + final controller = widget.controller; + return controller != null ? controller.pointIndex : _localPoint; + } + void _showAt(Offset local) { final geometry = _geometry; if (geometry == null) return; - final x = _snap(geometry, local.dx); + final touch = widget.touch; + if (touch != null && touch.snap == SeriesTouchSnap.nearestPoint) { + final hit = _nearestPoint(geometry, local, touch.threshold); + if (hit == null) return; + final (x, seriesIndex, pointIndex) = hit; + final controller = widget.controller; + if (controller != null) { + controller.show(x, seriesIndex: seriesIndex, pointIndex: pointIndex); + } else if (_localX != x || + _localSeries != seriesIndex || + _localPoint != pointIndex) { + setState(() { + _localX = x; + _localSeries = seriesIndex; + _localPoint = pointIndex; + }); + } + return; + } + final x = _snap(geometry, geometry.pxToXAt(local)); if (x == null) return; final controller = widget.controller; if (controller != null) { controller.show(x); - } else if (_localX != x) { - setState(() => _localX = x); + } else if (_localX != x || _localSeries != null) { + setState(() { + _localX = x; + _localSeries = null; + _localPoint = null; + }); } } void _toggleAt(Offset local) { final geometry = _geometry; if (geometry == null) return; - final x = _snap(geometry, local.dx); + final x = _snap(geometry, geometry.pxToXAt(local)); if (x != null && x == _touchX) { _release(); } else { @@ -333,13 +377,49 @@ class _SeriesChartState extends State if (controller != null) { controller.clear(); } else if (_localX != null) { - setState(() => _localX = null); + setState(() { + _localX = null; + _localSeries = null; + _localPoint = null; + }); } } - /// The x of the point nearest pixel column [px], among those in view. - double? _snap(SeriesGeometry geometry, double px) { - final wanted = geometry.pxToX(px); + /// The point nearest [local], and its series, within [threshold] pixels. + (double, int, int)? _nearestPoint( + SeriesGeometry geometry, + Offset local, + double threshold, + ) { + final viewport = geometry.viewport; + (double, int, int)? best; + var bestDistance = threshold * threshold; + for (var i = 0; i < widget.series.length; i++) { + final s = widget.series[i]; + if (!s.showInTooltip) continue; + final row = _drawnValues != null && i < _drawnValues!.length + ? _drawnValues![i] + : const []; + for (var j = 0; j < s.points.length; j++) { + final point = s.points[j]; + if (point.isGap || point.x < viewport.minX || point.x > viewport.maxX) { + continue; + } + final y = j < row.length ? row[j] : point.y; + if (y == null || !y.isFinite) continue; + final at = geometry.point(point.x, y); + final distance = (at - local).distanceSquared; + if (distance <= bestDistance) { + bestDistance = distance; + best = (point.x, i, j); + } + } + } + return best; + } + + /// The x of the point nearest [wanted], among those in view. + double? _snap(SeriesGeometry geometry, double wanted) { final viewport = geometry.viewport; double? best; var bestDistance = double.infinity; @@ -388,17 +468,20 @@ class _SeriesChartState extends State SeriesTouchDetails _detailsAt( SeriesGeometry geometry, List> values, - double x, - ) { + double x, { + int? onlySeries, + int? onlyPoint, + }) { final touched = []; - final px = geometry.xToPx(x); for (var i = 0; i < widget.series.length; i++) { + if (onlySeries != null && i != onlySeries) continue; final s = widget.series[i]; if (!s.showInTooltip) continue; - final j = _indexAt(s.points, x); - if (j < 0) continue; + final j = onlyPoint ?? _indexAt(s.points, x); + if (j < 0 || j >= s.points.length) continue; final point = s.points[j]; - final drawn = j < values[i].length ? values[i][j] : null; + final row = i < values.length ? values[i] : const []; + final drawn = j < row.length ? row[j] : null; if (point.isGap || drawn == null) continue; touched.add( SeriesTouchValue( @@ -406,21 +489,34 @@ class _SeriesChartState extends State series: s, pointIndex: j, point: point, - position: Offset(px, geometry.yToPx(drawn)), + position: geometry.point(point.x, drawn), color: switch (s) { final BarSeries bars => bars.barColorAt(j, point), + final ScatterSeries dots => + dots.dotAt(j, point)?.color ?? s.colorAt(point.y!), LineSeries() => s.colorAt(point.y!), }, ), ); } - final top = touched.isEmpty - ? geometry.plot.top - : touched.map((v) => v.position.dy).reduce(math.min); + // The tooltip hangs off the furthest value along the value axis, so it + // never sits on top of what was touched. + final Offset anchor; + if (geometry.isHorizontal) { + final right = touched.isEmpty + ? geometry.plot.left + : touched.map((v) => v.position.dx).reduce(math.max); + anchor = Offset(right, geometry.xToPx(x)); + } else { + final top = touched.isEmpty + ? geometry.plot.top + : touched.map((v) => v.position.dy).reduce(math.min); + anchor = Offset(geometry.xToPx(x), top); + } return SeriesTouchDetails( x: x, values: touched, - position: Offset(px, top), + position: anchor, plotRect: geometry.plot, ); } @@ -442,9 +538,8 @@ class _SeriesChartState extends State Widget build(BuildContext context) { final target = _targetValues(widget.series); final from = _fromValues; - final t = from == null - ? 1.0 - : widget.animationCurve.transform(_animation.value); + final t = + from == null ? 1.0 : widget.animationCurve.transform(_animation.value); final values = from == null || !_sameShape(from, widget.series) ? target : [ @@ -477,20 +572,29 @@ class _SeriesChartState extends State xAxis: widget.xAxis, yAxis: widget.yAxis, viewport: viewport, + orientation: widget.orientation, ); _geometry = geometry; final touch = widget.touch; final x = _touchX; - final details = x == null ? null : _detailsAt(geometry, values, x); + final details = x == null + ? null + : _detailsAt( + geometry, + values, + x, + onlySeries: _touchSeries, + onlyPoint: _touchPoint, + ); _report(details); final tooltip = touch?.tooltip; final tooltipChild = details == null || tooltip == null ? null : (tooltip.builder != null - ? tooltip.builder!(context, details) - : _defaultTooltip(tooltip, details, viewport)); + ? tooltip.builder!(context, details) + : _defaultTooltip(tooltip, details, viewport)); return SizedBox( width: width, @@ -510,6 +614,7 @@ class _SeriesChartState extends State border: widget.border, referenceLines: widget.referenceLines, bands: widget.bands, + betweenFills: widget.betweenFills, backgroundColor: widget.backgroundColor, clipToPlot: widget.clipToPlot, textCache: _text, @@ -559,34 +664,46 @@ class _SeriesChartState extends State Widget _withGestures(Widget child) { final touch = widget.touch; if (touch == null) return child; + // A horizontal chart is read by dragging down it, an upright one across. + final dragsDown = widget.orientation == SeriesOrientation.horizontal; Widget result = switch (touch.trigger) { SeriesTouchTrigger.press => GestureDetector( - behavior: HitTestBehavior.opaque, - onTapDown: (d) => _showAt(d.localPosition), - onTapUp: (_) => _release(), - onTapCancel: _release, - onHorizontalDragStart: (d) => _showAt(d.localPosition), - onHorizontalDragUpdate: (d) => _showAt(d.localPosition), - onHorizontalDragEnd: (_) => _release(), - onHorizontalDragCancel: _release, - child: child, - ), + behavior: HitTestBehavior.opaque, + onTapDown: (d) => _showAt(d.localPosition), + onTapUp: (_) => _release(), + onTapCancel: _release, + onHorizontalDragStart: (d) => _showAt(d.localPosition), + onHorizontalDragUpdate: (d) => _showAt(d.localPosition), + onHorizontalDragEnd: (_) => _release(), + onHorizontalDragCancel: _release, + onVerticalDragStart: + dragsDown ? (d) => _showAt(d.localPosition) : null, + onVerticalDragUpdate: + dragsDown ? (d) => _showAt(d.localPosition) : null, + onVerticalDragEnd: dragsDown ? (_) => _release() : null, + onVerticalDragCancel: dragsDown ? _release : null, + child: child, + ), SeriesTouchTrigger.longPress => GestureDetector( - behavior: HitTestBehavior.opaque, - onLongPressStart: (d) => _showAt(d.localPosition), - onLongPressMoveUpdate: (d) => _showAt(d.localPosition), - onLongPressEnd: (_) => _release(), - onLongPressCancel: _release, - child: child, - ), + behavior: HitTestBehavior.opaque, + onLongPressStart: (d) => _showAt(d.localPosition), + onLongPressMoveUpdate: (d) => _showAt(d.localPosition), + onLongPressEnd: (_) => _release(), + onLongPressCancel: _release, + child: child, + ), SeriesTouchTrigger.tap => GestureDetector( - behavior: HitTestBehavior.opaque, - onTapUp: (d) => _toggleAt(d.localPosition), - onHorizontalDragStart: (d) => _showAt(d.localPosition), - onHorizontalDragUpdate: (d) => _showAt(d.localPosition), - child: child, - ), + behavior: HitTestBehavior.opaque, + onTapUp: (d) => _toggleAt(d.localPosition), + onHorizontalDragStart: (d) => _showAt(d.localPosition), + onHorizontalDragUpdate: (d) => _showAt(d.localPosition), + onVerticalDragStart: + dragsDown ? (d) => _showAt(d.localPosition) : null, + onVerticalDragUpdate: + dragsDown ? (d) => _showAt(d.localPosition) : null, + child: child, + ), SeriesTouchTrigger.none => child, }; @@ -672,8 +789,8 @@ class _SeriesChartState extends State final text = formatter != null ? formatter(value) : axisFormatter != null - ? axisFormatter(value.value) - : _plainNumber(value.value); + ? axisFormatter(value.value) + : _plainNumber(value.value); final label = value.series.label; return tooltip.showSeriesLabels && label != null && label.isNotEmpty ? '$label: $text' diff --git a/lib/src/series/series_chart_painter.dart b/lib/src/series/series_chart_painter.dart index 3dd1ef0..bfd9673 100644 --- a/lib/src/series/series_chart_painter.dart +++ b/lib/src/series/series_chart_painter.dart @@ -11,6 +11,10 @@ import 'series_touch.dart'; /// Paints a [SeriesChart]: bands, grid, reference lines, series, border and /// axis labels. +/// +/// Everything here works in two numbers — an x and a value — and leaves it to +/// the geometry to say which way each of them runs, so an upright chart and a +/// horizontal one share one set of drawing code. class SeriesChartPainter extends CustomPainter { /// Creates the painter. `values[i][j]` is the value drawn for /// `series[i].points[j]`, which is where an animation puts its in-between @@ -25,6 +29,7 @@ class SeriesChartPainter extends CustomPainter { required this.border, required this.referenceLines, required this.bands, + required this.betweenFills, required this.backgroundColor, required this.clipToPlot, required this.textCache, @@ -39,14 +44,13 @@ class SeriesChartPainter extends CustomPainter { final BorderSide? border; final List referenceLines; final List bands; + final List betweenFills; final Color? backgroundColor; final bool clipToPlot; final TextPainterCache textCache; - static const TextStyle _baseLabelStyle = TextStyle( - fontSize: 10, - color: seriesAxisTextColor, - ); + /// Whether the x axis runs down the chart rather than across it. + bool get _horizontal => geometry.isHorizontal; @override void paint(Canvas canvas, Size size) { @@ -62,6 +66,7 @@ class SeriesChartPainter extends CustomPainter { _paintBands(canvas); _paintGrid(canvas); _paintReferenceLines(canvas, above: false); + _paintBetweenFills(canvas); final barSeries = [ for (final s in series) @@ -69,8 +74,12 @@ class SeriesChartPainter extends CustomPainter { ]; final barSpacing = _barSpacing(barSeries); // Counted by position, not looked up: the same series given twice is two - // groups of bars side by side, not one drawn over the other. - var barGroup = 0; + // groups of bars side by side, not one drawn over the other. Series in a + // stack share the group of the first of them, since they pile up in one + // place rather than standing beside each other. + final groupOf = _barGroups(barSeries); + final groups = groupOf.isEmpty ? 0 : groupOf.values.reduce(math.max) + 1; + var barIndex = 0; for (var i = 0; i < series.length; i++) { final row = i < values.length ? values[i] : const []; switch (series[i]) { @@ -79,12 +88,16 @@ class SeriesChartPainter extends CustomPainter { case final BarSeries bars: _paintBars( canvas, + size, bars, + i, row, - barGroup++, - barSeries.length, + groupOf[barIndex++] ?? 0, + groups, barSpacing, ); + case final ScatterSeries dots: + _paintScatter(canvas, dots, row); } } _paintReferenceLines(canvas, above: true); @@ -94,46 +107,26 @@ class SeriesChartPainter extends CustomPainter { _paintReferenceLabels(canvas, size); _paintValueLabels(canvas, size); _paintXLabels(canvas, size); + _paintAxisTitles(canvas, size); } // ── Plot furniture ────────────────────────────────────────────────────── void _paintBands(Canvas canvas) { - final plot = geometry.plot; for (final band in bands) { - final Rect rect; - if (band.direction == SeriesDirection.horizontal) { - final a = geometry.yToPx(band.from); - final b = geometry.yToPx(band.to); - rect = Rect.fromLTRB( - plot.left, - math.min(a, b), - plot.right, - math.max(a, b), - ); - } else { - final a = geometry.xToPx(band.from); - final b = geometry.xToPx(band.to); - rect = Rect.fromLTRB( - math.min(a, b), - plot.top, - math.max(a, b), - plot.bottom, - ); - } - canvas.drawRect(rect, Paint()..color = band.color); + final rect = band.direction == SeriesDirection.horizontal + ? geometry.valueBand(band.from, band.to) + : geometry.xBand(band.from, band.to); + final paint = _areaPaint(_orient(band.gradient), band.color, rect); + if (paint != null) canvas.drawRect(rect, paint); } } void _paintGrid(Canvas canvas) { - final plot = geometry.plot; if (grid.horizontal && grid.width > 0) { final path = Path(); for (final tick in geometry.viewport.yTicks) { - final y = geometry.yToPx(tick); - path - ..moveTo(plot.left, y) - ..lineTo(plot.right, y); + _addLine(path, geometry.valueLine(tick)); } canvas.drawPath( dashSeriesPath(path, grid.dashPattern), @@ -143,10 +136,7 @@ class SeriesChartPainter extends CustomPainter { if (grid.vertical && grid.width > 0) { final path = Path(); for (final tick in geometry.viewport.xTicks) { - final x = geometry.xToPx(tick); - path - ..moveTo(x, plot.top) - ..lineTo(x, plot.bottom); + _addLine(path, geometry.xLine(tick)); } canvas.drawPath( dashSeriesPath(path, grid.verticalDashPattern ?? grid.dashPattern), @@ -156,21 +146,15 @@ class SeriesChartPainter extends CustomPainter { } void _paintReferenceLines(Canvas canvas, {required bool above}) { - final plot = geometry.plot; for (final line in referenceLines) { if (line.aboveSeries != above || line.width <= 0) continue; final path = Path(); - if (line.direction == SeriesDirection.horizontal) { - final y = geometry.yToPx(line.value); - path - ..moveTo(plot.left, y) - ..lineTo(plot.right, y); - } else { - final x = geometry.xToPx(line.value); - path - ..moveTo(x, plot.top) - ..lineTo(x, plot.bottom); - } + _addLine( + path, + line.direction == SeriesDirection.horizontal + ? geometry.valueLine(line.value) + : geometry.xLine(line.value), + ); canvas.drawPath( dashSeriesPath(path, line.dashPattern), _strokePaint(line.color, line.width), @@ -183,39 +167,44 @@ class SeriesChartPainter extends CustomPainter { for (final line in referenceLines) { final label = line.label; if (label == null || label.isEmpty) continue; - final style = _baseLabelStyle + final style = seriesAxisLabelStyle .copyWith(color: line.color) .merge(line.labelStyle); final tp = textCache.get(label, style); final align = line.labelAlignment; - double dx; - double dy; - if (line.direction == SeriesDirection.horizontal) { - final y = geometry.yToPx(line.value); - if (y < plot.top - 0.5 || y > plot.bottom + 0.5) continue; - dx = _lerp(plot.left + 4, plot.right - 4 - tp.width, (align.x + 1) / 2); - dy = align.y < 0 - ? y - tp.height - 2 - : align.y > 0 - ? y + 2 - : y - tp.height / 2; - } else { - final x = geometry.xToPx(line.value); - if (x < plot.left - 0.5 || x > plot.right + 0.5) continue; - dx = align.x < 0 - ? x - tp.width - 2 - : align.x > 0 - ? x + 2 - : x - tp.width / 2; - dy = _lerp( - plot.top + 2, - plot.bottom - 2 - tp.height, - (align.y + 1) / 2, - ); + final (start, end) = line.direction == SeriesDirection.horizontal + ? geometry.valueLine(line.value) + : geometry.xLine(line.value); + final rect = Rect.fromPoints(start, end); + if (rect.right < plot.left - 0.5 || + rect.left > plot.right + 0.5 || + rect.bottom < plot.top - 0.5 || + rect.top > plot.bottom + 0.5) { + continue; } - dx = dx.clamp(0.0, math.max(0.0, size.width - tp.width)); - dy = dy.clamp(0.0, math.max(0.0, size.height - tp.height)); - tp.paint(canvas, Offset(dx, dy)); + // A line is a segment, so one of these two is a length to slide the + // label along and the other is the line itself to sit beside. + final dx = rect.width > 0 + ? _lerp(rect.left + 4, rect.right - 4 - tp.width, (align.x + 1) / 2) + : align.x < 0 + ? rect.left - tp.width - 2 + : align.x > 0 + ? rect.left + 2 + : rect.left - tp.width / 2; + final dy = rect.height > 0 + ? _lerp(rect.top + 2, rect.bottom - 2 - tp.height, (align.y + 1) / 2) + : align.y < 0 + ? rect.top - tp.height - 2 + : align.y > 0 + ? rect.top + 2 + : rect.top - tp.height / 2; + tp.paint( + canvas, + Offset( + dx.clamp(0.0, math.max(0.0, size.width - tp.width)), + dy.clamp(0.0, math.max(0.0, size.height - tp.height)), + ), + ); } } @@ -232,60 +221,202 @@ class SeriesChartPainter extends CustomPainter { // ── Axis labels ───────────────────────────────────────────────────────── + /// How much room the value labels take across their axis. + double get _valueLabelRoom { + if (!yAxis.show) return 0; + if (!_horizontal) return yAxis.width; + final style = seriesAxisLabelStyle.merge(yAxis.style); + return textCache.get('0', style).height + yAxis.gap; + } + void _paintValueLabels(Canvas canvas, Size size) { if (!yAxis.show) return; final plot = geometry.plot; - final style = _baseLabelStyle.merge(yAxis.style); + final style = seriesAxisLabelStyle.merge(yAxis.style); final step = geometry.viewport.yStep; + var previousEnd = double.negativeInfinity; for (final tick in geometry.viewport.yTicks) { final text = yAxis.format(tick, step); if (text.isEmpty) continue; final tp = textCache.get(text, style); - final y = geometry.yToPx(tick); - final top = (y - tp.height / 2) - .clamp(0.0, math.max(0.0, size.height - tp.height)) - .toDouble(); - final left = yAxis.side == SeriesAxisSide.left - ? math.max(0.0, plot.left - yAxis.gap - tp.width) - : plot.right + yAxis.gap; - tp.paint(canvas, Offset(left, top)); + final at = geometry.yToPx(tick); + final Offset offset; + if (_horizontal) { + final left = (at - tp.width / 2) + .clamp(0.0, math.max(0.0, size.width - tp.width)) + .toDouble(); + if (left < previousEnd + 4) continue; + previousEnd = left + tp.width; + offset = Offset( + left, + yAxis.side == SeriesAxisSide.left + ? plot.bottom + yAxis.gap + : math.max(0.0, plot.top - yAxis.gap - tp.height), + ); + } else { + offset = Offset( + yAxis.side == SeriesAxisSide.left + ? math.max(0.0, plot.left - yAxis.gap - tp.width) + : plot.right + yAxis.gap, + (at - tp.height / 2).clamp( + 0.0, + math.max(0.0, size.height - tp.height), + ), + ); + } + tp.paint(canvas, offset); } } void _paintXLabels(Canvas canvas, Size size) { if (!xAxis.show) return; final plot = geometry.plot; - final style = _baseLabelStyle.merge(xAxis.style); - var previousRight = double.negativeInfinity; + final style = seriesAxisLabelStyle.merge(xAxis.style); + var previousEnd = double.negativeInfinity; final step = geometry.viewport.xStep; for (final tick in geometry.viewport.xTicks) { final text = xAxis.labelFor(tick, step: step); if (text == null || text.isEmpty) continue; final tp = textCache.get(text, style); - var left = geometry.xToPx(tick) - tp.width / 2; - if (xAxis.fitInside) { - left = left.clamp(0.0, math.max(0.0, size.width - tp.width)); + final at = geometry.xToPx(tick); + final Offset offset; + if (_horizontal) { + var top = at - tp.height / 2; + if (xAxis.fitInside) { + top = top.clamp(0.0, math.max(0.0, size.height - tp.height)); + } + if (top < previousEnd + 2) continue; + previousEnd = top + tp.height; + offset = Offset( + xAxis.side == SeriesXSide.bottom + ? math.max(0.0, plot.left - xAxis.gap - tp.width) + : plot.right + xAxis.gap, + top, + ); + } else { + var left = at - tp.width / 2; + if (xAxis.fitInside) { + left = left.clamp(0.0, math.max(0.0, size.width - tp.width)); + } + // A label that would run into the one before it is dropped rather + // than drawn on top of it. + if (left < previousEnd + 4) continue; + previousEnd = left + tp.width; + offset = Offset( + left, + xAxis.side == SeriesXSide.bottom + ? plot.bottom + xAxis.gap + : math.max(0.0, plot.top - xAxis.gap - tp.height), + ); } - // A label that would run into the one before it is dropped rather than - // drawn on top of it. - if (left < previousRight + 4) continue; - tp.paint(canvas, Offset(left, plot.bottom + xAxis.gap)); - previousRight = left + tp.width; + tp.paint(canvas, offset); } } - // ── Lines ─────────────────────────────────────────────────────────────── + void _paintAxisTitles(Canvas canvas, Size size) { + final plot = geometry.plot; + final valueTitle = yAxis.title; + if (yAxis.show && valueTitle != null && valueTitle.isNotEmpty) { + final tp = textCache.get( + valueTitle, + seriesAxisTitleStyle.merge(yAxis.titleStyle), + ); + final room = _valueLabelRoom; + if (_horizontal) { + _paintTitle( + canvas, + tp, + along: plot.center.dx, + across: yAxis.side == SeriesAxisSide.left + ? plot.bottom + room + 2 + : plot.top - room - 2 - tp.height, + turned: false, + size: size, + ); + } else { + _paintTitle( + canvas, + tp, + along: plot.center.dy, + across: yAxis.side == SeriesAxisSide.left + ? plot.left - room - 2 - tp.height + : plot.right + room + 2, + turned: true, + size: size, + ); + } + } - void _paintLine( + final xTitle = xAxis.title; + if (xAxis.show && xTitle != null && xTitle.isNotEmpty) { + final tp = textCache.get( + xTitle, + seriesAxisTitleStyle.merge(xAxis.titleStyle), + ); + if (_horizontal) { + _paintTitle( + canvas, + tp, + along: plot.center.dy, + across: xAxis.side == SeriesXSide.bottom + ? plot.left - xAxis.height - 2 - tp.height + : plot.right + xAxis.height + 2, + turned: true, + size: size, + ); + } else { + _paintTitle( + canvas, + tp, + along: plot.center.dx, + across: xAxis.side == SeriesXSide.bottom + ? plot.bottom + xAxis.height + 2 + : plot.top - xAxis.height - 2 - tp.height, + turned: false, + size: size, + ); + } + } + } + + /// Writes an axis title centred at [along] down its axis and [across] from + /// the plot; [turned] reads it bottom-to-top, for an axis that runs down the + /// chart. + void _paintTitle( Canvas canvas, - Size size, - LineSeries line, - List row, - ) { + TextPainter tp, { + required double along, + required double across, + required bool turned, + required Size size, + }) { + if (turned) { + final left = across.clamp(0.0, math.max(0.0, size.width - tp.height)); + canvas + ..save() + ..translate(left + tp.height, along + tp.width / 2) + ..rotate(-math.pi / 2); + tp.paint(canvas, Offset.zero); + canvas.restore(); + return; + } + tp.paint( + canvas, + Offset( + (along - tp.width / 2).clamp(0.0, math.max(0.0, size.width - tp.width)), + across.clamp(0.0, math.max(0.0, size.height - tp.height)), + ), + ); + } + + // ── Lines ─────────────────────────────────────────────────────────────── + + /// The pixels of one series' points, broken into unbroken runs at its gaps. + List> _runs(PlotSeries s, List row) { final runs = >[]; var run = []; - for (var j = 0; j < line.points.length; j++) { - final x = line.points[j].x; + for (var j = 0; j < s.points.length; j++) { + final x = s.points[j].x; final y = j < row.length ? row[j] : null; if (y == null || !y.isFinite || !x.isFinite) { if (run.isNotEmpty) { @@ -294,22 +425,56 @@ class SeriesChartPainter extends CustomPainter { } continue; } - run.add(Offset(geometry.xToPx(x), geometry.yToPx(y))); + run.add(geometry.point(x, y)); } if (run.isNotEmpty) runs.add(run); + return runs; + } + + Path _runPath(LineSeries line, List run) => seriesRunPath( + run, + line.curve, + stepPosition: line.stepPosition, + transpose: _horizontal, + ); + + void _paintLine( + Canvas canvas, + Size size, + LineSeries line, + List row, + ) { + final runs = _runs(line, row); if (runs.isEmpty) return; if (line.fill != null) _paintFill(canvas, size, line, runs); if (line.width > 0) { final path = Path(); - for (final r in runs) { - addSeriesRun(path, r, line.curve); + for (final run in runs) { + path.addPath(_runPath(line, run), Offset.zero); + } + final dashed = dashSeriesPath(path, line.dashPattern); + final shadow = line.shadow; + if (shadow != null) { + canvas.drawPath( + dashed.shift(shadow.offset), + Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = line.width + ..strokeCap = line.roundCap ? StrokeCap.round : StrokeCap.butt + ..strokeJoin = StrokeJoin.round + ..color = shadow.color + ..maskFilter = shadow.blurRadius > 0 + ? MaskFilter.blur(BlurStyle.normal, shadow.blurRadius) + : null, + ); } - _paintStroke(canvas, size, line, dashSeriesPath(path, line.dashPattern)); + _paintStroke(canvas, size, line, dashed); } _paintDots(canvas, line, row); + _paintErrorBars(canvas, line, row); } void _paintFill( @@ -319,92 +484,108 @@ class SeriesChartPainter extends CustomPainter { List> runs, ) { final fill = line.fill!; - final plot = geometry.plot; - final baseY = fill.toBaseline - ? geometry.yToPx(line.baseline).clamp(plot.top, plot.bottom) - : plot.bottom; + final basePx = fill.toBaseline + ? _clampValuePx(geometry.yToPx(line.baseline), inside: true) + : _lowEdgePx; final area = Path(); - var highest = double.infinity; - var lowest = double.negativeInfinity; - for (final r in runs) { - if (r.length < 2) continue; - addSeriesRun(area, r, line.curve); - area - ..lineTo(r.last.dx, baseY) - ..lineTo(r.first.dx, baseY) - ..close(); - for (final p in r) { - highest = math.min(highest, p.dy); - lowest = math.max(lowest, p.dy); + var high = double.nan; + var low = double.nan; + for (final run in runs) { + if (run.length < 2) continue; + area.addPath(_runPath(line, run), Offset.zero); + _closeToBase(area, run, basePx); + for (final p in run) { + final at = _valuePx(p); + high = high.isNaN ? at : _towardHigh(high, at); + low = low.isNaN ? at : _towardLow(low, at); } } - if (highest > lowest) return; + if (high.isNaN) return; if (!fill.toBaseline) { final paint = _areaPaint( fill.gradient, fill.color, - Rect.fromLTRB( - plot.left, - highest, - plot.right, - math.max(plot.bottom, highest + 1), - ), + _valueSpan(high, _lowEdgePx), ); if (paint != null) canvas.drawPath(area, paint); return; } - if (highest < baseY) { + if (_isAbove(high, basePx)) { final paint = _areaPaint( fill.gradient, fill.color, - Rect.fromLTRB( - plot.left, - highest, - plot.right, - math.max(baseY, highest + 1), - ), + _valueSpan(high, basePx), ); if (paint != null) { canvas ..save() - ..clipRect(Rect.fromLTRB(0, 0, size.width, baseY)) + ..clipRect(_side(size, basePx, above: true)) ..drawPath(area, paint) ..restore(); } } - if (lowest > baseY) { + if (_isAbove(basePx, low)) { final upper = fill.gradient; - final gradient = - fill.negativeGradient ?? + final gradient = fill.negativeGradient ?? (upper == null ? null : fill.mirrorBelowBaseline - ? _mirrored(upper) - : upper); + ? _mirrored(upper) + : upper); final paint = _areaPaint( gradient, fill.negativeColor ?? fill.color, - Rect.fromLTRB( - plot.left, - baseY, - plot.right, - math.max(lowest, baseY + 1), - ), + _valueSpan(basePx, low), ); if (paint != null) { canvas ..save() - ..clipRect(Rect.fromLTRB(0, baseY, size.width, size.height)) + ..clipRect(_side(size, basePx, above: false)) ..drawPath(area, paint) ..restore(); } } } + void _paintBetweenFills(Canvas canvas) { + for (final between in betweenFills) { + if (between.from < 0 || + between.from >= series.length || + between.to < 0 || + between.to >= series.length) { + continue; + } + final first = series[between.from]; + final second = series[between.to]; + if (first is! LineSeries || second is! LineSeries) continue; + final top = _runs(first, _rowOf(between.from)).expand((r) => r).toList(); + final bottom = + _runs(second, _rowOf(between.to)).expand((r) => r).toList(); + if (top.length < 2 || bottom.length < 2) continue; + + final path = Path() + ..addPath(_runPath(first, top), Offset.zero) + ..extendWithPath( + _runPath(second, bottom.reversed.toList()), + Offset.zero, + ) + ..close(); + final paint = _areaPaint( + between.gradient, + between.color, + geometry.plot, + ); + if (paint != null) canvas.drawPath(path, paint); + } + } + + List _rowOf(int index) => + index < values.length ? values[index] : const []; + void _paintStroke(Canvas canvas, Size size, LineSeries line, Path path) { final paint = Paint() ..style = PaintingStyle.stroke @@ -414,7 +595,7 @@ class SeriesChartPainter extends CustomPainter { ..isAntiAlias = true; final gradient = line.gradient; if (gradient != null) { - paint.shader = gradient.createShader(geometry.plot); + paint.shader = _orient(gradient)!.createShader(geometry.plot); } else { paint.color = line.color; } @@ -425,13 +606,13 @@ class SeriesChartPainter extends CustomPainter { return; } - // Split at the baseline: whatever lies above keeps the series colour and - // whatever lies below takes the negative one, cut exactly where the line - // crosses rather than at the nearest point. - final baseY = geometry.yToPx(line.baseline).clamp(0.0, size.height); + // Split at the baseline: whatever lies beyond it keeps the series colour + // and whatever lies short of it takes the negative one, cut exactly where + // the line crosses rather than at the nearest point. + final basePx = geometry.yToPx(line.baseline); canvas ..save() - ..clipRect(Rect.fromLTRB(0, 0, size.width, baseY)) + ..clipRect(_side(size, basePx, above: true)) ..drawPath(path, paint) ..restore(); paint @@ -439,7 +620,7 @@ class SeriesChartPainter extends CustomPainter { ..color = negative; canvas ..save() - ..clipRect(Rect.fromLTRB(0, baseY, size.width, size.height)) + ..clipRect(_side(size, basePx, above: false)) ..drawPath(path, paint) ..restore(); } @@ -454,13 +635,101 @@ class SeriesChartPainter extends CustomPainter { if (dot == null) continue; paintSeriesDot( canvas, - Offset(geometry.xToPx(point.x), geometry.yToPx(y)), + geometry.point(point.x, y), dot, line.colorAt(point.y!), ); } } + // ── Scatter ───────────────────────────────────────────────────────────── + + void _paintScatter(Canvas canvas, ScatterSeries scatter, List row) { + for (var j = 0; j < scatter.points.length && j < row.length; j++) { + final y = row[j]; + final point = scatter.points[j]; + if (y == null || !y.isFinite || point.isGap) continue; + final at = geometry.point(point.x, y); + final dot = scatter.dotAt(j, point); + final color = scatter.colorAt(point.y!); + if (dot != null) paintSeriesDot(canvas, at, dot, color); + final label = scatter.labelBuilder?.call(j, point); + if (label != null && label.isNotEmpty) { + final tp = textCache.get( + label, + seriesAxisLabelStyle.copyWith(color: color).merge(scatter.labelStyle), + ); + tp.paint( + canvas, + Offset( + at.dx - tp.width / 2, + at.dy - (dot?.radius ?? 0) - tp.height - 2, + ), + ); + } + } + _paintErrorBars(canvas, scatter, row); + } + + // ── Error bars ────────────────────────────────────────────────────────── + + void _paintErrorBars(Canvas canvas, PlotSeries s, List row) { + final style = s.errorBars; + if (style == null || style.width <= 0) return; + Paint? paint; + for (var j = 0; j < s.points.length && j < row.length; j++) { + final y = row[j]; + final point = s.points[j]; + if (y == null || !y.isFinite || point.isGap) continue; + final vertical = point.yError; + final horizontal = point.xError; + if (vertical == null && horizontal == null) continue; + paint ??= _strokePaint( + style.color ?? s.colorAt(point.y ?? s.baseline), + style.width, + ); + if (vertical != null) { + _paintErrorBar( + canvas, + paint, + from: geometry.point(point.x, y - vertical.lowerBy), + to: geometry.point(point.x, y + vertical.upperBy), + capLength: style.capLength, + alongValue: true, + ); + } + if (horizontal != null) { + _paintErrorBar( + canvas, + paint, + from: geometry.point(point.x - horizontal.lowerBy, y), + to: geometry.point(point.x + horizontal.upperBy, y), + capLength: style.capLength, + alongValue: false, + ); + } + } + } + + void _paintErrorBar( + Canvas canvas, + Paint paint, { + required Offset from, + required Offset to, + required double capLength, + required bool alongValue, + }) { + canvas.drawLine(from, to, paint); + if (capLength <= 0) return; + // The caps cross the bar, so they run along whichever axis it does not. + final cap = alongValue == _horizontal + ? Offset(0, capLength / 2) + : Offset(capLength / 2, 0); + canvas + ..drawLine(from - cap, from + cap, paint) + ..drawLine(to - cap, to + cap, paint); + } + // ── Bars ──────────────────────────────────────────────────────────────── /// The smallest gap between two x values any bar series uses, so bars at @@ -476,15 +745,33 @@ class SeriesChartPainter extends CustomPainter { return spacing.isFinite ? spacing : 1; } + /// The group each bar series stands in, counted along [bars]: series that + /// share a stack share a group, and everything else gets its own. + static Map _barGroups(List bars) { + final groups = {}; + final stacks = {}; + var next = 0; + for (var i = 0; i < bars.length; i++) { + final stack = bars[i].stack; + if (stack == null) { + groups[i] = next++; + } else { + groups[i] = stacks.putIfAbsent(stack, () => next++); + } + } + return groups; + } + void _paintBars( Canvas canvas, + Size size, BarSeries bars, + int index, List row, int group, int groups, double spacing, ) { - final plot = geometry.plot; final slot = geometry.unitWidth * spacing; const gap = 2.0; final raw = bars.width ?? slot * bars.widthFactor / math.max(1, groups); @@ -493,40 +780,53 @@ class SeriesChartPainter extends CustomPainter { .toDouble(); final offset = (group - (groups - 1) / 2) * (width + (groups > 1 ? gap : 0)); - final baseY = geometry.yToPx(bars.baseline).clamp(plot.top, plot.bottom); final track = bars.trackColor; final trackPath = Path(); final byColor = {}; final shaded = []; + final outlined = []; for (var j = 0; j < bars.points.length && j < row.length; j++) { final y = row[j]; final point = bars.points[j]; if (y == null || !y.isFinite || point.isGap) continue; + + // Where the bar starts: on the stack under it, on its own low, or on + // the series' baseline. + final double from; + final double to; + if (bars.stack != null) { + from = stackedBase(series, values, index, j); + to = from + (y - bars.baseline); + } else { + from = point.low ?? bars.baseline; + to = y; + } + final centre = geometry.xToPx(point.x) + offset; - final left = centre - width / 2; - final right = centre + width / 2; - if (right < plot.left || left > plot.right) continue; + final rect = _barRect( + centre, + width, + _clampValuePx(geometry.yToPx(from), inside: true), + _clampValuePx(geometry.yToPx(to)), + ); + if (!rect.overlaps(geometry.plot.inflate(width))) continue; if (track != null) { trackPath.addRRect( - RRect.fromLTRBR( - left, - plot.top, - right, - plot.bottom, + RRect.fromRectAndRadius( + _trackRect(centre, width), Radius.circular(math.min(bars.radius, width / 2)), ), ); } - final shape = seriesBarShape( - left: left, - right: right, - valueY: geometry.yToPx(y).clamp(plot.top - 1, plot.bottom + 1), - baseY: baseY, + final shape = seriesBarBox( + rect: rect, radius: bars.radius, + horizontal: _horizontal, + positive: to >= from, ); if (shape == null) continue; if (bars.gradient != null) { @@ -536,6 +836,8 @@ class SeriesChartPainter extends CustomPainter { .putIfAbsent(bars.barColorAt(j, point), Path.new) .addRRect(shape); } + if (bars.border != null) outlined.add(shape); + _paintBarLabel(canvas, bars, j, point, rect, positive: to >= from); } if (track != null) canvas.drawPath(trackPath, Paint()..color = track); @@ -548,12 +850,166 @@ class SeriesChartPainter extends CustomPainter { for (final shape in shaded) { canvas.drawRRect( shape, - Paint()..shader = gradient.createShader(shape.outerRect), + Paint()..shader = _orient(gradient)!.createShader(shape.outerRect), ); } } + final side = bars.border; + if (side != null && side.style != BorderStyle.none && side.width > 0) { + final paint = _strokePaint(side.color, side.width); + for (final shape in outlined) { + canvas.drawRRect(shape.deflate(side.width / 2), paint); + } + } + _paintErrorBars(canvas, bars, row); + } + + void _paintBarLabel( + Canvas canvas, + BarSeries bars, + int index, + SeriesPoint point, + Rect rect, { + required bool positive, + }) { + final label = bars.labelBuilder?.call(index, point); + if (label == null || label.isEmpty) return; + final tp = textCache.get( + label, + seriesAxisLabelStyle.merge(bars.labelStyle), + ); + const pad = 3.0; + final Offset offset; + if (_horizontal) { + offset = Offset( + positive ? rect.right + pad : rect.left - pad - tp.width, + rect.center.dy - tp.height / 2, + ); + } else { + offset = Offset( + rect.center.dx - tp.width / 2, + positive ? rect.top - pad - tp.height : rect.bottom + pad, + ); + } + tp.paint(canvas, offset); + } + + /// One bar: [width] across the x axis at [centre], reaching from [fromPx] to + /// [toPx] along the value axis. + Rect _barRect(double centre, double width, double fromPx, double toPx) { + final low = math.min(fromPx, toPx); + final high = math.max(fromPx, toPx); + return _horizontal + ? Rect.fromLTRB(low, centre - width / 2, high, centre + width / 2) + : Rect.fromLTRB(centre - width / 2, low, centre + width / 2, high); + } + + Rect _trackRect(double centre, double width) { + final plot = geometry.plot; + return _horizontal + ? Rect.fromLTRB( + plot.left, + centre - width / 2, + plot.right, + centre + width / 2, + ) + : Rect.fromLTRB( + centre - width / 2, + plot.top, + centre + width / 2, + plot.bottom, + ); + } + + // ── The value axis in pixels ──────────────────────────────────────────── + + /// Where on the screen a point sits along the value axis. + double _valuePx(Offset p) => _horizontal ? p.dx : p.dy; + + /// The pixel of the plot edge the low values are at. + double get _lowEdgePx => + _horizontal ? geometry.plot.left : geometry.plot.bottom; + + /// Whichever of two value pixels stands for the higher value. + double _towardHigh(double a, double b) => + _horizontal ? math.max(a, b) : math.min(a, b); + + /// Whichever of two value pixels stands for the lower value. + double _towardLow(double a, double b) => + _horizontal ? math.min(a, b) : math.max(a, b); + + /// Whether the value at pixel [a] is above the one at [b]. + bool _isAbove(double a, double b) => _horizontal ? a > b : a < b; + + /// A pixel on the value axis brought back to the plot, [inside] keeping it + /// strictly within rather than a pixel over the edge. + double _clampValuePx(double px, {bool inside = false}) { + final plot = geometry.plot; + final slack = inside ? 0.0 : 1.0; + return _horizontal + ? px.clamp(plot.left - slack, plot.right + slack) + : px.clamp(plot.top - slack, plot.bottom + slack); + } + + /// The stretch of plot between two value pixels, right across the x axis. + Rect _valueSpan(double a, double b) { + final plot = geometry.plot; + final low = math.min(a, b); + final high = math.max(a, b); + return _horizontal + ? Rect.fromLTRB(low, plot.top, math.max(high, low + 1), plot.bottom) + : Rect.fromLTRB(plot.left, low, plot.right, math.max(high, low + 1)); + } + + /// The half of the chart on one side of the value pixel [basePx]. + Rect _side(Size size, double basePx, {required bool above}) { + if (_horizontal) { + return above + ? Rect.fromLTRB(basePx, 0, size.width, size.height) + : Rect.fromLTRB(0, 0, basePx, size.height); + } + return above + ? Rect.fromLTRB(0, 0, size.width, basePx) + : Rect.fromLTRB(0, basePx, size.width, size.height); + } + + /// Closes a filled area back to the baseline at [basePx]. + void _closeToBase(Path area, List run, double basePx) { + if (_horizontal) { + area + ..lineTo(basePx, run.last.dy) + ..lineTo(basePx, run.first.dy); + } else { + area + ..lineTo(run.last.dx, basePx) + ..lineTo(run.first.dx, basePx); + } + area.close(); } + void _addLine(Path path, (Offset, Offset) line) { + path + ..moveTo(line.$1.dx, line.$1.dy) + ..lineTo(line.$2.dx, line.$2.dy); + } + + /// A gradient written for an upright chart, turned to follow a horizontal + /// one: what pointed at the high values still does. + Gradient? _orient(Gradient? gradient) { + if (!_horizontal || gradient is! LinearGradient) return gradient; + return LinearGradient( + begin: _turn(gradient.begin), + end: _turn(gradient.end), + colors: gradient.colors, + stops: gradient.stops, + tileMode: gradient.tileMode, + transform: gradient.transform, + ); + } + + static AlignmentGeometry _turn(AlignmentGeometry alignment) => + alignment is Alignment ? Alignment(-alignment.y, alignment.x) : alignment; + // ── Helpers ───────────────────────────────────────────────────────────── static Paint _strokePaint(Color color, double width) => Paint() @@ -593,24 +1049,60 @@ void paintSeriesDot( Color fallback, ) { if (dot.radius <= 0) return; - canvas.drawCircle( - centre, - dot.radius, - Paint() - ..color = dot.color ?? fallback - ..isAntiAlias = true, - ); + final fill = Paint() + ..color = dot.color ?? fallback + ..isAntiAlias = true; final ring = dot.strokeColor; - if (ring != null && dot.strokeWidth > 0) { - canvas.drawCircle( - centre, - dot.radius, - Paint() + final ringPaint = ring == null || dot.strokeWidth <= 0 + ? null + : (Paint() ..style = PaintingStyle.stroke ..strokeWidth = dot.strokeWidth ..color = ring - ..isAntiAlias = true, - ); + ..isAntiAlias = true); + + switch (dot.shape) { + case SeriesDotShape.circle: + canvas.drawCircle(centre, dot.radius, fill); + if (ringPaint != null) canvas.drawCircle(centre, dot.radius, ringPaint); + case SeriesDotShape.square: + final rect = Rect.fromCenter( + center: centre, + width: dot.radius * 2, + height: dot.radius * 2, + ); + canvas.drawRect(rect, fill); + if (ringPaint != null) canvas.drawRect(rect, ringPaint); + case SeriesDotShape.diamond: + final path = Path() + ..moveTo(centre.dx, centre.dy - dot.radius) + ..lineTo(centre.dx + dot.radius, centre.dy) + ..lineTo(centre.dx, centre.dy + dot.radius) + ..lineTo(centre.dx - dot.radius, centre.dy) + ..close(); + canvas.drawPath(path, fill); + if (ringPaint != null) canvas.drawPath(path, ringPaint); + case SeriesDotShape.cross: + final stroke = Paint() + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeWidth = dot.strokeWidth > 0 + ? dot.strokeWidth + : math.max(1.0, dot.radius / 3) + ..color = dot.color ?? fallback + ..isAntiAlias = true; + final r = dot.radius; + canvas + ..drawLine( + centre + Offset(-r, -r), + centre + Offset(r, r), + stroke, + ) + ..drawLine( + centre + Offset(-r, r), + centre + Offset(r, -r), + stroke, + ); } } @@ -630,35 +1122,33 @@ class SeriesOverlayPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { final plot = geometry.plot; - final x = details.position.dx; - if (x < plot.left - 0.5 || x > plot.right + 0.5) return; - - final vertical = touch.line; - if (vertical != null && vertical.width > 0) { - canvas.drawPath( - dashSeriesPath( - Path() - ..moveTo(x, plot.top) - ..lineTo(x, plot.bottom), - vertical.dashPattern, - ), - SeriesChartPainter._strokePaint(vertical.color, vertical.width), - ); + final across = touch.line; + if (across != null && across.width > 0) { + final (start, end) = geometry.xLine(details.x); + if (_inside(start, plot) && _inside(end, plot)) { + canvas.drawPath( + dashSeriesPath( + Path() + ..moveTo(start.dx, start.dy) + ..lineTo(end.dx, end.dy), + across.dashPattern, + ), + SeriesChartPainter._strokePaint(across.color, across.width), + ); + } } - final horizontal = touch.horizontalLine; - if (horizontal != null && - horizontal.width > 0 && - details.values.isNotEmpty) { - final y = details.values.first.position.dy; + final along = touch.horizontalLine; + if (along != null && along.width > 0 && details.values.isNotEmpty) { + final (start, end) = geometry.valueLine(details.values.first.value); canvas.drawPath( dashSeriesPath( Path() - ..moveTo(plot.left, y) - ..lineTo(plot.right, y), - horizontal.dashPattern, + ..moveTo(start.dx, start.dy) + ..lineTo(end.dx, end.dy), + along.dashPattern, ), - SeriesChartPainter._strokePaint(horizontal.color, horizontal.width), + SeriesChartPainter._strokePaint(along.color, along.width), ); } @@ -671,6 +1161,12 @@ class SeriesOverlayPainter extends CustomPainter { } } + static bool _inside(Offset p, Rect plot) => + p.dx >= plot.left - 0.5 && + p.dx <= plot.right + 0.5 && + p.dy >= plot.top - 0.5 && + p.dy <= plot.bottom + 0.5; + @override bool shouldRepaint(SeriesOverlayPainter oldDelegate) => true; } diff --git a/lib/src/series/series_data.dart b/lib/src/series/series_data.dart index 7a9355a..b65d004 100644 --- a/lib/src/series/series_data.dart +++ b/lib/src/series/series_data.dart @@ -1,22 +1,59 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/painting.dart'; +/// How far a measurement may be off, below and above it. +@immutable +class SeriesErrorRange { + /// A range reaching [lowerBy] below the value and [upperBy] above it. + const SeriesErrorRange(this.lowerBy, this.upperBy); + + /// A range reaching [by] either side of the value. + const SeriesErrorRange.symmetric(double by) + : lowerBy = by, + upperBy = by; + + /// How far below the value the range reaches. + final double lowerBy; + + /// How far above the value the range reaches. + final double upperBy; + + @override + bool operator ==(Object other) => + other is SeriesErrorRange && + other.lowerBy == lowerBy && + other.upperBy == upperBy; + + @override + int get hashCode => Object.hash(lowerBy, upperBy); +} + /// One value on a [SeriesChart]'s plot. /// /// [x] is any number — an index, a day count, a price — and [y] is the value -/// drawn against it. A null or non-finite [y] is a gap: a line breaks there -/// and a bar is left out. +/// drawn against it. A null or non-finite [y] is a gap: a line breaks there, +/// and a bar or a dot is left out. @immutable class SeriesPoint { /// Creates the point ([x], [y]). - const SeriesPoint(this.x, this.y); + const SeriesPoint(this.x, this.y, {this.low, this.xError, this.yError}); - /// Where the point sits along the horizontal axis. + /// Where the point sits along the x axis. final double x; /// The value, or null for a gap. final double? y; + /// Where a bar starts instead of its baseline, for a bar that floats — a + /// range from [low] to [y]. Lines and dots ignore it. + final double? low; + + /// How far [x] may be off, drawn as an error bar along the x axis. + final SeriesErrorRange? xError; + + /// How far [y] may be off, drawn as an error bar along the value axis. + final SeriesErrorRange? yError; + /// Whether there is no value here to draw. bool get isGap { final value = y; @@ -25,10 +62,15 @@ class SeriesPoint { @override bool operator ==(Object other) => - other is SeriesPoint && other.x == x && other.y == y; + other is SeriesPoint && + other.x == x && + other.y == y && + other.low == low && + other.xError == xError && + other.yError == yError; @override - int get hashCode => Object.hash(x, y); + int get hashCode => Object.hash(x, y, low, xError, yError); @override String toString() => 'SeriesPoint($x, $y)'; @@ -36,8 +78,9 @@ class SeriesPoint { /// Points at `x = 0, 1, 2, …` for a list of plain values. List pointsOf(List values) => [ - for (var i = 0; i < values.length; i++) SeriesPoint(i.toDouble(), values[i]), -]; + for (var i = 0; i < values.length; i++) + SeriesPoint(i.toDouble(), values[i]), + ]; /// How a [LineSeries] joins one point to the next. enum LineCurve { @@ -53,10 +96,26 @@ enum LineCurve { /// `preventCurveOverShooting`. monotone, - /// Holds each value flat until the next point, then steps to it. + /// Holds each value flat, then steps to the next; where along the way the + /// step falls is `LineSeries.stepPosition`. step, } +/// The shape of a [SeriesDot]. +enum SeriesDotShape { + /// A filled circle. + circle, + + /// A filled square, [SeriesDot.radius] from its centre to each side. + square, + + /// A filled square turned on its corner. + diamond, + + /// Two crossed strokes. + cross, +} + /// A dot drawn on a point. @immutable class SeriesDot { @@ -67,6 +126,7 @@ class SeriesDot { this.color, this.strokeColor, this.strokeWidth = 0, + this.shape = SeriesDotShape.circle, }); /// Radius in logical pixels. @@ -78,24 +138,51 @@ class SeriesDot { /// Ring colour; null draws no ring. final Color? strokeColor; - /// Ring width; 0 draws no ring. + /// Ring width; 0 draws no ring. A cross is drawn this thick, or at a third + /// of its radius when 0. final double strokeWidth; + /// The dot's shape. + final SeriesDotShape shape; + @override bool operator ==(Object other) => other is SeriesDot && other.radius == radius && other.color == color && other.strokeColor == strokeColor && - other.strokeWidth == strokeWidth; + other.strokeWidth == strokeWidth && + other.shape == shape; @override - int get hashCode => Object.hash(radius, color, strokeColor, strokeWidth); + int get hashCode => + Object.hash(radius, color, strokeColor, strokeWidth, shape); } /// Decides the dot for one point, or returns null to leave it without one. typedef SeriesDotBuilder = SeriesDot? Function(int index, SeriesPoint point); +/// Writes the label drawn beside one point, or returns null for none. +typedef SeriesPointLabelBuilder = String? Function( + int index, SeriesPoint point); + +/// How a series draws the error bars of points that carry +/// [SeriesPoint.xError] or [SeriesPoint.yError]. +@immutable +class SeriesErrorBars { + /// Creates an error-bar style. + const SeriesErrorBars({this.color, this.width = 1, this.capLength = 6}); + + /// Stroke colour; null uses the series colour. + final Color? color; + + /// Stroke width. + final double width; + + /// Length of the crossbar at either end; 0 draws none. + final double capLength; +} + /// The area between a [LineSeries] and its baseline, or the bottom of the plot. /// /// A fill anchored to the baseline never paints across it. The stretch above @@ -105,6 +192,9 @@ typedef SeriesDotBuilder = SeriesDot? Function(int index, SeriesPoint point); /// measured from the baseline down to the line's lowest point. Left unset, the /// part below reuses the upper gradient turned upside down, so both halves /// fade away from the line the same way. +/// +/// Gradients are written for an upright chart — top is the high values — and +/// turn with a horizontal one. @immutable class SeriesFill { /// Creates a fill. @@ -124,26 +214,28 @@ class SeriesFill { double opacity = 0.24, Color? negativeColor, bool toBaseline = true, - }) => SeriesFill( - gradient: _fade(color, opacity), - negativeGradient: negativeColor == null - ? null - : _fade(negativeColor, opacity, upward: true), - toBaseline: toBaseline, - ); + }) => + SeriesFill( + gradient: _fade(color, opacity), + negativeGradient: negativeColor == null + ? null + : _fade(negativeColor, opacity, upward: true), + toBaseline: toBaseline, + ); static LinearGradient _fade( Color color, double opacity, { bool upward = false, - }) => LinearGradient( - begin: upward ? Alignment.bottomCenter : Alignment.topCenter, - end: upward ? Alignment.topCenter : Alignment.bottomCenter, - colors: [ - color.withValues(alpha: opacity), - color.withValues(alpha: 0), - ], - ); + }) => + LinearGradient( + begin: upward ? Alignment.bottomCenter : Alignment.topCenter, + end: upward ? Alignment.topCenter : Alignment.bottomCenter, + colors: [ + color.withValues(alpha: opacity), + color.withValues(alpha: 0), + ], + ); /// Flat colour above the baseline; ignored when [gradient] is set. final Color? color; @@ -177,18 +269,44 @@ class SeriesFill { @override int get hashCode => Object.hash( - color, - gradient, - negativeColor, - negativeGradient, - toBaseline, - mirrorBelowBaseline, - ); + color, + gradient, + negativeColor, + negativeGradient, + toBaseline, + mirrorBelowBaseline, + ); +} + +/// The area between two [LineSeries] on the same chart — a band between a +/// high and a low, or the gap between a plan and what happened. +@immutable +class SeriesBetweenFill { + /// Fills between `SeriesChart.series[from]` and `SeriesChart.series[to]`. + const SeriesBetweenFill({ + required this.from, + required this.to, + this.color, + this.gradient, + }); + + /// Index of one line in `SeriesChart.series`. + final int from; + + /// Index of the other. + final int to; + + /// Flat colour; ignored when [gradient] is set. + final Color? color; + + /// Gradient laid over the filled area. + final Gradient? gradient; } const Color _defaultSeriesColor = Color(0xFF4C86CD); -/// One set of values on a [SeriesChart]: a [LineSeries] or a [BarSeries]. +/// One set of values on a [SeriesChart]: a [LineSeries], a [BarSeries] or a +/// [ScatterSeries]. /// /// Points are read in order and should run from the lowest x to the highest. sealed class PlotSeries { @@ -199,6 +317,7 @@ sealed class PlotSeries { this.negativeColor, this.baseline = 0, this.showInTooltip = true, + this.errorBars = const SeriesErrorBars(), }); /// The values, lowest x first. @@ -220,6 +339,9 @@ sealed class PlotSeries { /// Whether the series gets a marker and a tooltip row when touched. final bool showInTooltip; + /// How error ranges on the points are drawn; null draws none. + final SeriesErrorBars? errorBars; + /// The colour the series is drawn in at [value]. Color colorAt(double value) { final negative = negativeColor; @@ -237,11 +359,14 @@ final class LineSeries extends PlotSeries { super.negativeColor, super.baseline, super.showInTooltip, + super.errorBars, this.gradient, this.width = 2, this.curve = LineCurve.linear, + this.stepPosition = 1, this.dashPattern, this.roundCap = true, + this.shadow, this.fill, this.dot, this.dotBuilder, @@ -255,11 +380,14 @@ final class LineSeries extends PlotSeries { super.negativeColor, super.baseline, super.showInTooltip, + super.errorBars, this.gradient, this.width = 2, this.curve = LineCurve.linear, + this.stepPosition = 1, this.dashPattern, this.roundCap = true, + this.shadow, this.fill, this.dot, this.dotBuilder, @@ -270,18 +398,25 @@ final class LineSeries extends PlotSeries { /// baseline when it is set. final Gradient? gradient; - /// Stroke width; 0 draws no line, which with [dot] makes a scatter plot. + /// Stroke width; 0 draws no line. final double width; /// How the line joins its points. final LineCurve curve; + /// For [LineCurve.step], where between two points the value changes: 0 at + /// the first point, 0.5 halfway, 1 — the default — at the second. + final double stepPosition; + /// Alternating dash and gap lengths, such as `[6, 4]`; null draws solid. final List? dashPattern; /// Whether the line's ends and dashes are rounded. final bool roundCap; + /// A blurred copy of the line drawn under it. + final Shadow? shadow; + /// The area under the line; null leaves it unfilled. final SeriesFill? fill; @@ -303,7 +438,8 @@ typedef BarColorBuilder = Color Function(int index, SeriesPoint point); /// One bar per value, grown from the series' baseline. /// -/// Several bar series on one chart stand side by side at each x. +/// Several bar series on one chart stand side by side at each x, unless they +/// share a [stack], in which case they are piled on each other. final class BarSeries extends PlotSeries { /// Creates bars at [points]. const BarSeries({ @@ -313,6 +449,7 @@ final class BarSeries extends PlotSeries { super.negativeColor, super.baseline, super.showInTooltip, + super.errorBars, this.gradient, this.colorBuilder, this.width, @@ -321,6 +458,10 @@ final class BarSeries extends PlotSeries { this.maxWidth = double.infinity, this.radius = 0, this.trackColor, + this.stack, + this.border, + this.labelBuilder, + this.labelStyle, }); /// Creates bars for plain [values], placed at `x = 0, 1, 2, …`. @@ -331,6 +472,7 @@ final class BarSeries extends PlotSeries { super.negativeColor, super.baseline, super.showInTooltip, + super.errorBars, this.gradient, this.colorBuilder, this.width, @@ -339,6 +481,10 @@ final class BarSeries extends PlotSeries { this.maxWidth = double.infinity, this.radius = 0, this.trackColor, + this.stack, + this.border, + this.labelBuilder, + this.labelStyle, }) : super(points: pointsOf(values)); /// Paints every bar with this gradient, measured over the bar itself. @@ -361,12 +507,28 @@ final class BarSeries extends PlotSeries { final double maxWidth; /// Corner radius on the end away from the baseline — the top of a bar above - /// it, the bottom of one below. + /// it, the bottom of one below. In a stack only the outermost bar is + /// rounded. final double radius; /// A full-height bar painted behind each one, such as a faint track. final Color? trackColor; + /// Bar series with the same key are stacked: at each x, each bar starts + /// where the ones before it in `SeriesChart.series` ended — upwards for + /// values above the baseline, downwards for values below. Null stands the + /// series beside the others. + final Object? stack; + + /// An outline drawn round each bar. + final BorderSide? border; + + /// Writes the label drawn beyond the end of each bar. + final SeriesPointLabelBuilder? labelBuilder; + + /// Style of the labels [labelBuilder] writes. + final TextStyle? labelStyle; + /// The colour of the bar at [points]`[index]`. Color barColorAt(int index, SeriesPoint point) { final builder = colorBuilder; @@ -374,3 +536,43 @@ final class BarSeries extends PlotSeries { return colorAt(point.y ?? baseline); } } + +/// A dot per point, placed freely on both axes — a scatter plot. +/// +/// Pair it with `SeriesTouch(snap: SeriesTouchSnap.nearestPoint)`, so a touch +/// reads out the dot under the finger rather than everything at that x. +final class ScatterSeries extends PlotSeries { + /// Creates dots at [points]. + const ScatterSeries({ + required super.points, + super.label, + super.color, + super.negativeColor, + super.baseline, + super.showInTooltip, + super.errorBars, + this.dot = const SeriesDot(radius: 4), + this.dotBuilder, + this.labelBuilder, + this.labelStyle, + }); + + /// The dot on every point; [dotBuilder] overrides it. + final SeriesDot? dot; + + /// Chooses the dot per point — its size, colour or shape; return null to + /// leave a point out. + final SeriesDotBuilder? dotBuilder; + + /// Writes the label drawn above each dot. + final SeriesPointLabelBuilder? labelBuilder; + + /// Style of the labels [labelBuilder] writes. + final TextStyle? labelStyle; + + /// The dot drawn on [points]`[index]`, if any. + SeriesDot? dotAt(int index, SeriesPoint point) { + final builder = dotBuilder; + return builder != null ? builder(index, point) : dot; + } +} diff --git a/lib/src/series/series_paths.dart b/lib/src/series/series_paths.dart index eedb8c4..d3365cb 100644 --- a/lib/src/series/series_paths.dart +++ b/lib/src/series/series_paths.dart @@ -1,11 +1,20 @@ import 'dart:math' as math; +import 'dart:typed_data'; import 'dart:ui'; import 'series_data.dart'; /// Appends one unbroken run of [points], in pixels and left to right, to /// [path], joined as [curve] says. -void addSeriesRun(Path path, List points, LineCurve curve) { +/// +/// [stepPosition] is where a [LineCurve.step] changes value between two +/// points: 0 at the first, 1 at the second. +void addSeriesRun( + Path path, + List points, + LineCurve curve, { + double stepPosition = 1, +}) { if (points.isEmpty) return; path.moveTo(points.first.dx, points.first.dy); if (points.length == 1) return; @@ -15,9 +24,14 @@ void addSeriesRun(Path path, List points, LineCurve curve) { path.lineTo(points[i].dx, points[i].dy); } case LineCurve.step: + final at = stepPosition.clamp(0.0, 1.0); for (var i = 1; i < points.length; i++) { - path.lineTo(points[i].dx, points[i - 1].dy); - path.lineTo(points[i].dx, points[i].dy); + final previous = points[i - 1]; + final current = points[i]; + final stepX = previous.dx + (current.dx - previous.dx) * at; + path.lineTo(stepX, previous.dy); + path.lineTo(stepX, current.dy); + path.lineTo(current.dx, current.dy); } case LineCurve.smooth: _smooth(path, points); @@ -171,3 +185,88 @@ RRect? seriesBarShape({ bottomRight: up ? Radius.zero : r, ); } + +/// The swap of a point's two coordinates, which turns a horizontal chart's +/// pixels into the upright ones every curve is worked out in. +final Float64List _swapAxes = Float64List.fromList(const [ + 0, 1, 0, 0, // + 1, 0, 0, 0, // + 0, 0, 1, 0, // + 0, 0, 0, 1, // +]); + +/// One run of [points] as a path in pixels. +/// +/// With [transpose] the run is worked out with its coordinates swapped and +/// swapped back afterwards, so a horizontal chart curves and steps along its +/// own x axis rather than along the screen's. +Path seriesRunPath( + List points, + LineCurve curve, { + double stepPosition = 1, + bool transpose = false, +}) { + final path = Path(); + if (!transpose) { + addSeriesRun(path, points, curve, stepPosition: stepPosition); + return path; + } + addSeriesRun( + path, + [ + for (final p in points) Offset(p.dy, p.dx), + ], + curve, + stepPosition: stepPosition); + return path.transform(_swapAxes); +} + +/// The shape of one bar filling [rect], rounded by [radius] on the end away +/// from its baseline — the top of an upright bar above it, the right-hand end +/// of a horizontal one. +/// +/// Returns null for a bar with no width or no length. +RRect? seriesBarBox({ + required Rect rect, + required double radius, + required bool horizontal, + required bool positive, +}) { + if (rect.width <= 0 || rect.height <= 0) return null; + // Never more than half the bar's width, nor more than its whole length. + final across = horizontal ? rect.height : rect.width; + final along = horizontal ? rect.width : rect.height; + final r = Radius.circular( + math.max(0.0, math.min(radius, math.min(across / 2, along))), + ); + final start = horizontal + ? (positive ? _Corners.right : _Corners.left) + : (positive ? _Corners.top : _Corners.bottom); + return RRect.fromRectAndCorners( + rect, + topLeft: start.topLeft ? r : Radius.zero, + topRight: start.topRight ? r : Radius.zero, + bottomLeft: start.bottomLeft ? r : Radius.zero, + bottomRight: start.bottomRight ? r : Radius.zero, + ); +} + +/// Which two corners of a bar are the rounded end. +class _Corners { + const _Corners({ + this.topLeft = false, + this.topRight = false, + this.bottomLeft = false, + this.bottomRight = false, + }); + + static const top = _Corners(topLeft: true, topRight: true); + static const bottom = _Corners(bottomLeft: true, bottomRight: true); + static const left = _Corners(topLeft: true, bottomLeft: true); + static const right = _Corners(topRight: true, bottomRight: true); + + final bool topLeft; + final bool topRight; + final bool bottomLeft; + final bool bottomRight; +} diff --git a/lib/src/series/series_range_selector.dart b/lib/src/series/series_range_selector.dart index 148ef0d..d91c3d9 100644 --- a/lib/src/series/series_range_selector.dart +++ b/lib/src/series/series_range_selector.dart @@ -150,15 +150,16 @@ class _SeriesRangeSelectorState extends State { GestureDragUpdateCallback drag( SeriesWindow Function(SeriesWindow from, double units) move, - ) => (details) { - // A selector with no width has nothing to measure a drag against. - if (width <= 0) return; - final from = _dragFrom ?? widget.window; - final units = - (details.globalPosition.dx - _dragOrigin) / width * domain; - final next = move(from, units); - if (next != widget.window) widget.onChanged(next); - }; + ) => + (details) { + // A selector with no width has nothing to measure a drag against. + if (width <= 0) return; + final from = _dragFrom ?? widget.window; + final units = + (details.globalPosition.dx - _dragOrigin) / width * domain; + final next = move(from, units); + if (next != widget.window) widget.onChanged(next); + }; final pan = drag((from, units) { final span = from.span; @@ -244,46 +245,50 @@ class _SeriesRangeSelectorState extends State { required GestureDragUpdateCallback onUpdate, required MouseCursor cursor, required Widget child, - }) => GestureDetector( - behavior: HitTestBehavior.translucent, - dragStartBehavior: DragStartBehavior.down, - onHorizontalDragStart: _begin, - onHorizontalDragUpdate: onUpdate, - onHorizontalDragEnd: _end, - onHorizontalDragCancel: _end, - child: MouseRegion(cursor: cursor, child: child), - ); + }) => + GestureDetector( + behavior: HitTestBehavior.translucent, + dragStartBehavior: DragStartBehavior.down, + onHorizontalDragStart: _begin, + onHorizontalDragUpdate: onUpdate, + onHorizontalDragEnd: _end, + onHorizontalDragCancel: _end, + child: MouseRegion(cursor: cursor, child: child), + ); Widget _handle( double centre, GestureDragUpdateCallback onUpdate, - ) => Positioned( - left: centre - _handleHitWidth / 2, - top: 0, - bottom: 0, - width: _handleHitWidth, - child: _draggable( - onUpdate: onUpdate, - cursor: SystemMouseCursors.resizeLeftRight, - child: Center( - child: Container( - width: _handleWidth, - height: 22, - decoration: BoxDecoration( - color: widget.handleColor, - border: Border.all(color: widget.handleBorderColor), - borderRadius: BorderRadius.circular(3), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container(width: 1, height: 10, color: widget.handleGripColor), - const SizedBox(width: 2), - Container(width: 1, height: 10, color: widget.handleGripColor), - ], + ) => + Positioned( + left: centre - _handleHitWidth / 2, + top: 0, + bottom: 0, + width: _handleHitWidth, + child: _draggable( + onUpdate: onUpdate, + cursor: SystemMouseCursors.resizeLeftRight, + child: Center( + child: Container( + width: _handleWidth, + height: 22, + decoration: BoxDecoration( + color: widget.handleColor, + border: Border.all(color: widget.handleBorderColor), + borderRadius: BorderRadius.circular(3), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 1, height: 10, color: widget.handleGripColor), + const SizedBox(width: 2), + Container( + width: 1, height: 10, color: widget.handleGripColor), + ], + ), + ), ), ), - ), - ), - ); + ); } diff --git a/lib/src/series/series_scale.dart b/lib/src/series/series_scale.dart index a3ab91d..6a0a0f3 100644 --- a/lib/src/series/series_scale.dart +++ b/lib/src/series/series_scale.dart @@ -1,7 +1,7 @@ import 'dart:math' as math; import 'dart:ui'; -import 'package:flutter/painting.dart' show EdgeInsets; +import 'package:flutter/painting.dart'; import '../utils/axis_ticks.dart'; import 'series_axis.dart'; @@ -124,11 +124,27 @@ SeriesViewport fitSeriesViewport({ final row = i < values.length ? values[i] : const []; var any = false; for (var j = 0; j < s.points.length && j < row.length; j++) { - final x = s.points[j].x; + final point = s.points[j]; + final x = point.x; if (x < left || x > right) continue; final y = row[j]; if (y == null) continue; - take(y); + // A stacked bar reaches as far as everything under it plus itself, and + // a floating one as far as both of its ends. + if (s is BarSeries && s.stack != null) { + final base = stackedBase(series, values, i, j); + take(base); + take(base + (y - s.baseline)); + } else { + final low = point.low; + if (low != null) take(low); + take(y); + } + final error = point.yError; + if (error != null) { + take(y - error.lowerBy); + take(y + error.upperBy); + } any = true; } if (s is BarSeries && any) take(s.baseline); @@ -211,11 +227,9 @@ List _xTicks( if (labels != null && axis.labelBuilder == null) { final every = interval == null ? 1 : math.max(1, interval.round()); return [ - for ( - var i = math.max(0, left.ceil()); - i <= right.floor() && i < labels.length; - i++ - ) + for (var i = math.max(0, left.ceil()); + i <= right.floor() && i < labels.length; + i++) if (labels[i].isNotEmpty && i % every == 0) i.toDouble(), ]; } @@ -264,8 +278,24 @@ List _stepTicks(double low, double high, double step) { return ticks; } +/// Which way a [SeriesChart] is turned. +enum SeriesOrientation { + /// The x axis runs across the chart and the values grow upwards — the + /// upright chart. + vertical, + + /// The x axis runs down the chart and the values grow rightwards, which is + /// what a horizontal bar chart is. + horizontal, +} + /// Where a [SeriesChart]'s plot sits, and the mapping between values and its /// pixels. +/// +/// Two numbers place anything on the plot: the x, along the x axis, and the +/// value, along the value axis. Which screen direction each of those runs in +/// is [orientation]'s business, so everything that paints works in x and +/// value and lets [point] turn them into pixels. class SeriesGeometry { /// Creates the geometry of a chart of [size] whose plot is [plot], showing /// [viewport]. @@ -273,27 +303,62 @@ class SeriesGeometry { required this.size, required this.plot, required this.viewport, + this.orientation = SeriesOrientation.vertical, }); - /// Lays out a chart of [size]: [padding] off every edge, then room for the - /// value axis on its side and for the x axis below. + /// Lays out a chart of [size]: [padding] off every edge, then room for each + /// axis on its side of the plot. factory SeriesGeometry.layout({ required Size size, required EdgeInsets padding, required SeriesXAxis xAxis, required SeriesYAxis yAxis, required SeriesViewport viewport, + SeriesOrientation orientation = SeriesOrientation.vertical, }) { - final axisWidth = yAxis.show ? yAxis.width : 0.0; - final left = - padding.left + (yAxis.side == SeriesAxisSide.left ? axisWidth : 0); - final right = - size.width - - padding.right - - (yAxis.side == SeriesAxisSide.right ? axisWidth : 0); - final top = padding.top; - final bottom = - size.height - padding.bottom - (xAxis.show ? xAxis.height : 0); + final horizontal = orientation == SeriesOrientation.horizontal; + final valueRoom = yAxis.show + ? (horizontal + ? _lineHeight(seriesAxisLabelStyle.merge(yAxis.style)) + + yAxis.gap + : yAxis.width) + + _titleRoom(yAxis.title, yAxis.titleStyle) + : 0.0; + final xRoom = xAxis.show + ? xAxis.height + _titleRoom(xAxis.title, xAxis.titleStyle) + : 0.0; + + // Each axis takes its room off one edge; which edge depends on the side + // it was given and on which way the chart is turned. + var left = padding.left; + var right = size.width - padding.right; + var top = padding.top; + var bottom = size.height - padding.bottom; + + if (horizontal) { + if (yAxis.side == SeriesAxisSide.left) { + bottom -= valueRoom; + } else { + top += valueRoom; + } + if (xAxis.side == SeriesXSide.bottom) { + left += xRoom; + } else { + right -= xRoom; + } + } else { + if (yAxis.side == SeriesAxisSide.left) { + left += valueRoom; + } else { + right -= valueRoom; + } + if (xAxis.side == SeriesXSide.bottom) { + bottom -= xRoom; + } else { + top += xRoom; + } + } + return SeriesGeometry( size: size, plot: Rect.fromLTRB( @@ -303,6 +368,7 @@ class SeriesGeometry { math.max(top, bottom), ), viewport: viewport, + orientation: orientation, ); } @@ -315,26 +381,147 @@ class SeriesGeometry { /// The values shown. final SeriesViewport viewport; - /// The pixel column of [x]. + /// Which way the chart is turned. + final SeriesOrientation orientation; + + /// Whether the x axis runs down the chart rather than across it. + bool get isHorizontal => orientation == SeriesOrientation.horizontal; + + /// How far along the x axis [x] falls, in pixels — a column on an upright + /// chart, a row on a horizontal one. double xToPx(double x) { final span = viewport.maxX - viewport.minX; - return plot.left + (x - viewport.minX) / span * plot.width; + final t = (x - viewport.minX) / span; + return isHorizontal + ? plot.top + t * plot.height + : plot.left + t * plot.width; } - /// The pixel row of [y]. + /// How far along the value axis [y] falls, in pixels. double yToPx(double y) { final span = viewport.maxY - viewport.minY; - return plot.bottom - (y - viewport.minY) / span * plot.height; + final t = (y - viewport.minY) / span; + return isHorizontal + ? plot.left + t * plot.width + : plot.bottom - t * plot.height; } - /// The x at pixel column [px]. + /// The pixel the pair ([x], [y]) sits on. + Offset point(double x, double y) => + isHorizontal ? Offset(yToPx(y), xToPx(x)) : Offset(xToPx(x), yToPx(y)); + + /// The x at [px] pixels along the x axis. double pxToX(double px) { - if (plot.width <= 0) return viewport.minX; + final length = isHorizontal ? plot.height : plot.width; + if (length <= 0) return viewport.minX; final span = viewport.maxX - viewport.minX; - return viewport.minX + (px - plot.left) / plot.width * span; + final start = isHorizontal ? plot.top : plot.left; + return viewport.minX + (px - start) / length * span; } + /// The x under [local], wherever the chart is pointing. + double pxToXAt(Offset local) => pxToX(isHorizontal ? local.dy : local.dx); + /// How many pixels one unit of x takes. double get unitWidth => - plot.width / math.max(1e-12, viewport.maxX - viewport.minX); + (isHorizontal ? plot.height : plot.width) / + math.max(1e-12, viewport.maxX - viewport.minX); + + /// The stretch of plot between the x values [from] and [to]. + Rect xBand(double from, double to) { + final a = xToPx(from); + final b = xToPx(to); + return isHorizontal + ? Rect.fromLTRB(plot.left, math.min(a, b), plot.right, math.max(a, b)) + : Rect.fromLTRB(math.min(a, b), plot.top, math.max(a, b), plot.bottom); + } + + /// The stretch of plot between the values [from] and [to]. + Rect valueBand(double from, double to) { + final a = yToPx(from); + final b = yToPx(to); + return isHorizontal + ? Rect.fromLTRB(math.min(a, b), plot.top, math.max(a, b), plot.bottom) + : Rect.fromLTRB(plot.left, math.min(a, b), plot.right, math.max(a, b)); + } + + /// The box covering x [x0] to [x1] and values [v0] to [v1] — a bar. + Rect box(double x0, double x1, double v0, double v1) { + final a = point(x0, v0); + final b = point(x1, v1); + return Rect.fromLTRB( + math.min(a.dx, b.dx), + math.min(a.dy, b.dy), + math.max(a.dx, b.dx), + math.max(a.dy, b.dy), + ); + } + + /// The line ruled right across the plot at the value [y]. + (Offset, Offset) valueLine(double y) { + final band = valueBand(y, y); + return isHorizontal + ? (Offset(band.left, plot.top), Offset(band.left, plot.bottom)) + : (Offset(plot.left, band.top), Offset(plot.right, band.top)); + } + + /// The line ruled right across the plot at the x [x]. + (Offset, Offset) xLine(double x) { + final band = xBand(x, x); + return isHorizontal + ? (Offset(plot.left, band.top), Offset(plot.right, band.top)) + : (Offset(band.left, plot.top), Offset(band.left, plot.bottom)); + } + + /// How much room a title and its gap take across an axis. + static double _titleRoom(String? title, TextStyle? style) { + if (title == null || title.isEmpty) return 0; + return _lineHeight(seriesAxisTitleStyle.merge(style)) + 2; + } + + /// The height of one line of [style], measured once per layout. + static double _lineHeight(TextStyle style) { + final painter = TextPainter( + text: TextSpan(text: '0', style: style), + textDirection: TextDirection.ltr, + )..layout(); + final height = painter.height; + painter.dispose(); + return height; + } +} + +/// The value a stacked bar starts from: how far the bars before it in the +/// same stack have already reached at that point, on its own side of the +/// baseline. A bar that stacks on nothing starts at its series' baseline. +double stackedBase( + List series, + List> values, + int index, + int pointIndex, +) { + final self = series[index]; + if (self is! BarSeries) return self.baseline; + final stack = self.stack; + if (stack == null) return self.baseline; + final row = index < values.length ? values[index] : const []; + final own = pointIndex < row.length ? row[pointIndex] : null; + if (own == null) return self.baseline; + final up = own >= self.baseline; + final x = self.points[pointIndex].x; + + var base = self.baseline; + for (var i = 0; i < index; i++) { + final other = series[i]; + if (other is! BarSeries || other.stack != stack) continue; + final otherRow = i < values.length ? values[i] : const []; + for (var j = 0; j < other.points.length && j < otherRow.length; j++) { + if (other.points[j].x != x) continue; + final y = otherRow[j]; + if (y == null || !y.isFinite) continue; + final height = y - other.baseline; + if (height >= 0 == up) base += height; + } + } + return base; } diff --git a/lib/src/series/series_touch.dart b/lib/src/series/series_touch.dart index 94d986d..e7b3885 100644 --- a/lib/src/series/series_touch.dart +++ b/lib/src/series/series_touch.dart @@ -2,7 +2,7 @@ import 'package:flutter/widgets.dart'; import 'series_data.dart'; -/// The gesture that shows a [SeriesChart]'s crosshair and tooltip. +/// The gesture that shows a chart's crosshair and tooltip. enum SeriesTouchTrigger { /// Shown while a finger is down or dragging across the chart, gone when it /// lifts — `fl_chart`'s default. @@ -20,6 +20,17 @@ enum SeriesTouchTrigger { none, } +/// What a touch picks out on a [SeriesChart]. +enum SeriesTouchSnap { + /// The x nearest the finger, and every series' value there — right for + /// lines and bars over a shared x. + x, + + /// The single point nearest the finger, within `SeriesTouch.threshold` — + /// right for a scatter plot. + nearestPoint, +} + /// Where the tooltip sits relative to the touched point. enum SeriesTooltipPlacement { /// Beside the crosshair, at the top of the plot, flipping to the other side @@ -56,9 +67,7 @@ typedef SeriesMarkerBuilder = SeriesDot? Function(SeriesTouchValue value); /// Builds a tooltip for the touched values; return null to show none. typedef SeriesTooltipBuilder = Widget? Function( - BuildContext context, - SeriesTouchDetails details, -); + BuildContext context, SeriesTouchDetails details); /// The card that names the touched values. @immutable @@ -133,6 +142,8 @@ class SeriesTouch { const SeriesTouch({ this.trigger = SeriesTouchTrigger.press, this.hover = true, + this.snap = SeriesTouchSnap.x, + this.threshold = 24, this.line = const SeriesCrosshairLine(), this.horizontalLine, this.showMarkers = true, @@ -146,10 +157,18 @@ class SeriesTouch { /// Whether a hovering mouse shows it too. final bool hover; - /// The vertical line through the touched x; null draws none. + /// Whether a touch picks an x or a single point. + final SeriesTouchSnap snap; + + /// How close, in logical pixels, a point has to be for + /// [SeriesTouchSnap.nearestPoint] to pick it. + final double threshold; + + /// The line through the touched x, across the values; null draws none. final SeriesCrosshairLine? line; - /// A horizontal line through the first touched value; null draws none. + /// A line through the first touched value, across the x axis; null draws + /// none. final SeriesCrosshairLine? horizontalLine; /// Whether each touched value gets a marker. @@ -188,7 +207,8 @@ class SeriesTouchValue { /// The point. final SeriesPoint point; - /// The point on the chart, in the chart's local pixels. + /// The point on the chart, in the chart's local pixels — the far end of a + /// bar. final Offset position; /// The series colour at this value. @@ -212,12 +232,14 @@ class SeriesTouchDetails { /// The touched x, snapped to the nearest point. final double x; - /// Every series with a value at [x], in series order. Series with + /// Every series with a value at [x], in series order — or, for + /// [SeriesTouchSnap.nearestPoint], the one point touched. Series with /// `showInTooltip` off and series with a gap here are left out. final List values; - /// The crosshair on the chart: its x, and the height of the highest touched - /// value (or the top of the plot when nothing has a value). + /// Where the tooltip is anchored: on an upright chart the crosshair's x at + /// the height of the highest touched value; on a horizontal one the + /// crosshair's y beside the furthest value. final Offset position; /// The plot area, in the chart's local pixels. @@ -241,14 +263,27 @@ class SeriesTouchDetails { /// on both — a price panel and a volume panel under it, say. class SeriesChartController extends ChangeNotifier { double? _x; + int? _seriesIndex; + int? _pointIndex; /// The x under the crosshair, or null when it is hidden. double? get x => _x; - /// Shows the crosshair at [x]. - void show(double x) { - if (_x == x) return; + /// The series of the single point shown, when one was named. + int? get seriesIndex => _seriesIndex; + + /// The index of the single point shown, when one was named. + int? get pointIndex => _pointIndex; + + /// Shows the crosshair at [x] — or, given [seriesIndex] and [pointIndex], + /// on that one point. + void show(double x, {int? seriesIndex, int? pointIndex}) { + if (_x == x && _seriesIndex == seriesIndex && _pointIndex == pointIndex) { + return; + } _x = x; + _seriesIndex = seriesIndex; + _pointIndex = pointIndex; notifyListeners(); } @@ -256,6 +291,8 @@ class SeriesChartController extends ChangeNotifier { void clear() { if (_x == null) return; _x = null; + _seriesIndex = null; + _pointIndex = null; notifyListeners(); } } diff --git a/screenshots/pie-radar.png b/screenshots/pie-radar.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7d6f0617519ee4b11edec71715dd507e6d1c37 GIT binary patch literal 139418 zcmdq}hgVbG_XZ9I6;u#VsZv!?I;b@1C<4-ZZvxUnlis9Qu+T+%@4ZOxASy)=kP<=* zpp-!9B?Jgb=EV2=`ORN2Yt77ED~lvI_ndpq-R0TO-kXown#z>qOym#| zOdbL`fAbO<_$KIUl_~gh!RxV#{v~j{y!8A71acFi^5l`ef5s-l&z}}H+q)O!r>FAx z94BY)ou?Es`Z`x%=jCzdbsB#OizxZ<+D4&<;whyeZ}n5g$H$cG|A&hi_0Y$iAp{ z(^rCJ+5l1M+2c>#pb|z=Cu!@;<4SU>szTFT>-~d+YScDyLyDs|H~CrR z(yF4OmOLdg4G@{S*3!fWpdXEr%qpQLxf?eWZ?>x!n zr!Sqr59Ku+YK-j~OjeSm^uDdq-+L;TQMA-Iw&H1UqMd8Zs70J5vAigXt4tbl{VHR@ zht^NM-iNekA_D%AvuO4xId&^Nh#OG-#$92hNtDs^~uM5uc$px@^Ng zPxbuGTe%I<#q|%go^v1kxSaKixW=-$9vg#a+W4<`a4*tgSY>o!i2aEFuIkWl+Ix~n zDi2kj(5Z~Or!rQPubhyXXh4S`&bb(#-PQH@v9nry47(cqQ@w%#;towO4LBo@Hn8ZW zF}M!-$z1V}g^E=!@a_6K@q5wd4Wc71cRWpd?;uV0{)ELw1i0cjvjShY$DzE&|qPJx9xA1E| z9CkIvydBj4H+(5?A59`Xq?GRZ-EvqN*k@X9;ub$y#!{#JT zo`WZ30fEHZW*S)Wc;=wv6TT>;T?!BpNNBMq|E2y25@;;8vjn3><&}c zga5YerGgz;mNdks?&Rmlh*iucKRF$7X3>oC^#l$nwU7{e?erP%ng73KK^AnTmp+nH zhaF$M@HD=5^C&`=mN=+toS$p9U!~Qj|7Pwie9%Wj#|F84=}H2pom4H~sW$i(g!j>W zL-2ea!&f9*Z#fkXBV zl0Es_&x2o-oa|R^9aN$DuK(MPuTA=^{(0Zd-!ya%XD8mcJY7kYbMXINU6!!-B%J;K zF=RRM|6gj=*zFojVTH5nO)UG8u6y>B|oq?JZ8CJ)$9T)GmQc!J6#7wHG;SEVzPqw z>`qQjey(_~uXC}F_lClg$8Ugf63ln%0#ScS82UeL{oa(2Gw|^%n7gRN`E%Xd@Yo}7 zL)l4dVE(h)Y+itH2l|vxDM(8-qKffB{bTIKoWK_JkrZs{mt}l`K)U$)Pi6Kplwj`l zlN0Plrw8>QwB~6%{n=4D{jY2z7~&ixr+5DZ((m)#O}Bi~l~W~V(?#a=H%`$l)RI5} zYuk}f!uB|1>p)SRo*P=mTQ5Z2rw1H&W*X}BN#cer+IYCRjpJzzX-g9 zCASE1cbF;7=k|K+6`pRYjcAR|ckryta~*e%kE}VhyHB=<-@c9F7TD5GJi467b?>IU zfY}|!t@?TqqJvC$HF8mYrg0-DWopXCeWA>USrnQe_q#%`$+Cq^p7;Bz1~aTr;6t4k z_K0_j8UlGJ+OfOIX%Vt6PfE60yzJs@s&~iTG(RfpO7Kw+ycLO$mzh4Bj53<2QILvV znVychEeG$kU=9{L2v&UZ#J_@ql2T_@tP<9!;Y``Oe4DZpC0S|SQ1k@n={GCz9X<7Z zNjeF8GCh&=sDer418kuqXq`~is;P#@7fT#Z}dINp`J{eW#vjLN`JAaeItxbWF zSu~z=Yc@SExwu0cW}zFIRO!9-n>qTZm_0P7!P(HrDVyBua7`yXJX|H7h3b6_i-bAM z0%&kaO$o{0Hz9;ABLVY!R?0CflMyR~wK^@iDilB~VR}!!ai^xINOvYr*fYJ|?-nm! ze5q<%<;BVFD1))+ox3_lP^ERB1CyKOGOtUail-O+DMM&!E!!GH&hUI_RDjaQSPm5} znY|D2Mde4YUcEY9jntZ0I&>?Pq|(mxQQs_RJ}!!gbT2z%l>+*}sS?d3e*ct~VL@Nx zZ@QsRGC6vn9@!8C7c4B=9*;7zs@fF^2CCHg3+WJ+Q8w?tm1yHa3VbEL6N}Olb($958~oJ*>N=$KNNZm@VW^HJi+^{!+8Qoqg8t zt_?VybDFQbe9rZm`uj5k*ZGQkDV zV<9YuYyW}m{uzuu;g7YuUsIEIxEZMwgl&AT5o8?!9}#z+e|#%fLO5eAmSuF3(3mo* ztlY;fDQ;2CAvL>XD#y>Su93b1e>?rfEpzioJ$6aN?Rv3hW?NZ^dQ=A0`=g@G(fFRw zq(QW|qhrd9&sxdbN!R5U59>X?2Uc3t&4_gNfBxMXeeT@(737XP|3TgK#I5@d^!su$%c3V)2Qfv|KaoB3WnTE(&&YclQOW z^b2|76}8*;+S+lZck9Jw%*0$LfJ)HbpewZO_)N=mz3k*5WO6uDN?O(|X{SpwvlTUi z^X~Z}_8X5YHSMrzf!hL%Q+o@dtI8_nGubb-y`MJuXC_x1x|bIoxRp32Q^>7?%nE%~ z)w&uu?b3J_{zee~iQ~QKR>02r3h6CL@86kz2z~>1f~wQ)D-`+wteUSK^#Cg4-Pz3stqW;1qgUlO0QJVx8Fv z@2OB#I!$S^?ls2VvnBUY^WQUU@{D#kRe;*`yZFGEEhIBdBYp!8QMA%ad*Di)m%+e#9Vpv@bgl;b8u`w-rBA9_?#rnDlPm zJ5sFL%A`V;E(2HdEEgI5#VQnwkfwM-AM2`lH`hQ-FX&HRkJ2v3$b0rsD0$d%8-iOf z#`(Q@A@Z))J%Mz>?9K)GveHr89lfm?iC1kE75oV4O{VeF`EtNPLB&zFI1 zcoQpajmqZCmz#}mf&v)8!@=?0*pHwP8+aCQaDag$FslXOQl7_Owpjw|YPRP+sF`=* z)n?`S>&g>bhi5g94(J6mNaFfSxDnW|{)&Am&eC@?5nA!}a-s&Y(V<^yGg@4B6D7;F ztYQzO@{uNz;1yqBWR+Fa6G@*oX%)Psoe3vAjy<^HJ^hST(px(=mfgtFdOs)Urp(cV zFk1t6b(eKB-ndylNbhKEzuV}>U~$L29`7ta1U3vcQOdVMrt99aCmCxyQO;2Mo;~~7 z1yyo3JP{^&(@D`(xq z|5}zHye5e+0A6)tT15+>ya3$UBH#NGLRjRG?V7pxLSUQh>7vCDHlV7n6`(1nAFh6k zTd{KfMnGzFZ|CPl*#Vt9U0$M&@-^uURbdL~vq1R z{kGtjCyV71Rl&-!KCIWJ)=|#Yn3=vWU+zT*9eY%7%xQ%Dxf2`d=9imm9cc6Sd4t=A z$r^|)^tIkorMh2IQdBC_*tih8<<{ww&^wQbBfhp<{W9=^d5p(F?pKUu z^;5w!owmiLGP`*c(v2-=W3P&QRaJjR8fj&mRS*UG-;1)#05gZl=@ZjfT2kNot{g)f zL@4&#DRamU7^rvIYDKs1r&-_G=Hu-viY74a;BYv)Yu246rgD>!id7lF<_p}8x^Ro?LYduJf}Hu{@db>IcLxt<Ta&c-J=3ZSNW*owWn{HhE@YpYB?6Fn>$gGD2LME7t>Q&S4!x_gvo#J@LyCiT z*aTF_FAu52wulC#%N{!x{d=7r>$%Rf_iW(FtU^ki?0Z7ZKBHG>cM?mq@|6~BQF;Ir zH@v``N4FgKMt9m4tP;-Nw0es%Ksyh%v8vuzRA!nz>Q>K=|Gn%-PE^`3DQ~zNzJK%X z+iFTls+C~HvXR603;QXrT$u=GKwhL4udph1{b{Dr=htFBlhkfNG?6P2cHwN}IP==N z+JsM^at{yBAb&&^+(mGBcA2y)(Q+dw055vbg0ElYGiT+xs)kQ}oEroJ%KKcRIo?w< z<7VoDl55)GCc)m*i+mcmg-!vJ!KAeD^Y7ojLzOyY9Wc^Fw=W5bIyzFZ*g4qoi27uY zj^w>IeMJL#j0mlGTc}ht**mnI-I8R zU@*1^MbVNTx4+k)C4KS>4E{P|VL2nY5+dgtRCIq>U<0$zX`3g==AGJiKbA$-I0k+)5bxO z6;h&_02%jt*5m-)%;bp9Xw&%n7k&KJA!5_EJ8~Y3<9xxY^YmrXcF?Z1sB@NAUA|>U zzo!JC?X>qmbd*$WTsoY2J=%^wQZXb%0#1d@8aGOZS5Ihl{Tinjx18*a4o8kPO}nI> z9nvVxf;j(_St+4eYtX1de?%6EiiQ_4*XfvwxEFa~5L-1{e>jxA32$Q8VihCRUS{M? zxrhy&;MK+{WsAp4XLk-a75)WAD}6h(SFb+fS5s5d%MM}S=96kO$9~*zILq!@@ob6O z_1009_BtFWC(djR7vGHFVQ4AGhAej!H#ZiMT=9Msx%0zb(ZV zBwGayHh;`WO)XVsZ|ySflL1bhE!01Qie+l2rb^}WLpvnCb7#ImFIGB*y}$(+)~vu) ziG0NUn$NN)Yr!gGdEpfGj(^UfWsv5S9rp>{Rnu}W%cmEDmpn4~-Yv_0UG;1^JWD9n zSeUid(s+RSNOZ{b0yOn|3up30SU)ZmFXUNH?0jgS;{s;!J9NA;xTcfZT~jWw_1xd$$lDdA4;gaufU;Y z{!%ZW?N@3?Aj2ie=WD~WN{pqm0FJMPuU9i6Cp!9412L61dXJ2#?iXLe;%BQh){A@R zyt=MStrR%a13PDZd?}jM!n^UEkF$|8s_wJQSYIL<+qFsf^(w8tULo+=rsI-zU$>D( zJ_&=B?(+q}jQz~;6qX+t=pQWhY8=P8bHxQmMaxaNvom#uIsn`61&8ea;L;$y*yOG@iQQ>8$&!BqZK3zB*d5MAoX7`2+g$a;DAte?Dy5dao z_3p})n!1&0$`bZB9y>&2M8Tl2;mkJjA=YdpCOopDi;r4{zQj1E5u|<>S>QExfBnixuK?aj zX{OW-5tMS&@C+}#6g*-XtiDksL#QaF?*rV-sm-MNxLAM>t?IzYh*rn&fLsqlm86T7(zA}`mj>g_7Di02|493})-&g%pHw6<=D zKH9falX4HBqW&v=rPC_^HTaJPXmL-c7BNwtuK6>05so>MP}~F4DlxP6#XQ z*jqrG9%+TheEK|ex1_|wxM^EPy)Llx1m$Jh)imdydF?E2`P$XM?bMG&UlmMeZUtk| z$&$XCDKV^4cUy)Sq0_wGw8okm2&7Js?aYCmy5jbRqEhOq;cxtezDCw@0enURxNyYy zJa8v6d%JInI)~CutZO2B&O^ffO03w2B`6vjr>ws|TI@bQ@GxY~wryoFsVpG!OrLTa z0B(4-fZj8oyOWJ}9$^9;kda{^jWl&oF|A}kDIt4&8U`_(urGt-s)c-drk zwz?Jn?oT+|!OopXpVJ#BCq^TvaifkvE+_W^HrJWsYI*_l9Q4Ly(t10PPS^{{OjPKo z9g)|GW(;|A-L!$<+ujlD>so(UO^WhWir@5YtC1GFYieXAG3Ds+{P|i{P;X+{KbEJh z+WtnJc7*3>IL^nKaNvDH2ZxUS?NarT_A@Lu@CrRPt)%%y-SQGQgh|^!i{!$+eD*9y znKJQ!>PK$1AMT{$Cy2;A}5i%uVZNgcpyo?gu_6bVkfuC38!3eMO-JQRow6etOC-v@d0c z(_7%wtBCP6UPulE&GGP`JOlFyw03rOnch+$wd2bw`H%3RrZ%dKyBhxXZJDosvs3z* z1P47D)e;lrnt_zV}*FsjJkEUOdA6j8B}QN<1AeYV{>? z`7$S_bh9reAoKzE(y@n~g9C$!Z9eBwz>W4P;VsK1gIAG_-?A(Rh6i*(2+EV0+*YWD zA44VbO?2i<$SA41oF|6nCc&q?!oqr8BiY5&^FeKI9YA)a>`kow@R+i&0}mjAh2{K} zE!w>ITP@VR>&eXhJ3G%%X13E&M#bq_sv$Ptgo_|59)K}K%?iogCzS(s$pom99Gtd3T3J`aBfS zAVR(HE`s4Ej(+8L?i((|>d~lQxpUL_peXB?HcirVj3F&Z^907G_r2uv^@5u!c-Gm* zL`jJ53#IO#r^Ry<&RzKZ&p;;b0sI0&KrMwTW~ixUv8IL3`izA|t1n!G!)?5ac`~3N zsZ38?ZpG8ucJW&?T=-J~q0yhv=Fu0kRRnp8TT6L-{^qu*H97AfhMi$y;;_wZ$^&4w z;IZIyz@A90=ssh8_@%4gsQb3lb}hxSapQFR#hd5OpI3KPzU(R7mZ7=Sfz9d4iD+FD zqQdaBZnu~s0C)2E4SPUVy0i{^2cb$=4-;U)&d692g0#x1!N?f*vH??7mXH;qFNfPN z=UgwZ?$RSf3Xa##0DVf$hG(3TcK=mYBj?M>T6Vh6(2tiwv77uqH#NsSOn-7KETpKg~?vTD=_X<5# z1d)^}3a2`@QLV1`c6NNbWWLc|&9HIy*Sji&mN=af9=X#MRg7E_(ea2JIid^Z zyPv8tKzT-Iq@?t2n?0yFBulFJ_rcDxASr_NpOz_P0IA0|JvXwaCIy?*uF$?8y@7}-MK!OqbME7& z6kdyqB#OvYQc9|-6`yn>-qSZvbOknjY5guRJ4E7*b+#$B(IeZ?BB8~r6Fw)gz}IXj z;Ilrak=g32*B6tyjP!j4qVzm~?A2d^*|cT;WiX})=J~j<$9?L;QVC`WXVFayur-~g z8-suU?z>+KR5O6(DIR=glX~!=_@3)hZ*-I$Lo-^jg*3CHu+g*y8vWqG16mdq7yb=D zO{0cS25w?|^>8eO=vH_F)#!T3U@=+5FF*ujBeF__BbOP78lvqN&chP#@7U?0P# z8U?0H^5ML>4UZr1v)?ua7TptsPEGFBdHJ@>NMtcF(wK8ZC(*;*nwY!FA3b_x8G8ey zq`d2nj_;35bSO%A{Cz9yj}Zvo-8L&T64FIz$|+>F`RakxhdP$kf88!k3W>eG)mC6y z?_w7?Mpzs54kip4ncfS{(xLf#;zSUpD;A6n#{MFCr6n6^Ro6vm{JlkC+UZj2ME2x; z%ttmf_cD0kD$RsVt&INPmEx2#>kjRuB_2~K13n_-Zc=I3u<=_bv&~yC*{zt5pa0iX z5%43!Ytw37xYNi4Gq3zd-!rGC*QLLe-qgylDoj99PIym3AT(JuoZx9__?rPb)zrV`Oi+* zdLcs=Y}Xp@h@?6g*JGuTVrUfta|Sn?Yl7qyV|8)%OLZNcRqq_|BpEUssMK9%8x`of z*G1&QH+Ocbrx-^}FI@vNxcHttzy@E&CkXd}n;WdDTZGEV38aYkaUAc>L^Y|>oy8S2 z+XF0-y;5YiHPbk{CKaK%6@jvy9=p?vog$;u7kYpkc@h}ds-yQ}sO(IVEg5fxXIy+? znx^b}1w-2ikevfYYGf&efs*ApbZ08dd=tNFQG5|zb_b}~`HM%+!_*7VzcjIHjeit0 zaF;15`8=(-(&;Q&IzA7JHCP3$+!?~-%{Y#&8%#Bv5+d@ml0|w*olCtpCwgp|SBfm4 zAS8-T|B*T@=d)lr{_8bRa_^sZ1c%ejl2Ka?w5sX=?p>(1_80g8C>0VpO=d9eC#d&C zeFv2ML8$xdH!I$f4bUFXj)T>W)}_gG5#&X$n?E~xhmwX)c;*4bKh3hmV;;p5St0j! z?5FvcJGMjqNQET~bO>cov^CSPv$luv0&G1Guuh2tQA)=0YlFf_0J2|Dv?Kn)kgtV^3KkCV{(9sFWz;&D+NsXk0U#F$5Aav|i z9qni(W@l%Eh$uru5e}#`J#Fn_4Km=f_NeD<2VSLRWx37Fo86KIqJnEj4_|CuMV+NL z`JkRS_AEp`Z&)>Fz5-I2nSR^TMQJwiB1@HiQJ5q3HZj+E-RF|pKsH33Y&1FQR=O(V z3n-bzmGSq!|rPM&uz4{0~18#eBeH*si~e1Sz2xS z(WY%SA9P{D~)i^jBkb0#;$dQ+lM7q0m$#BUJ z;nu{*H|RDOc9isZ3O5oyWUn_ijS~r-AL)_o6erbt=(9bhQEs$KTh?e=8Mrper6q|6 zDvqgh#*Cw3$U5&sM|`s_rYe(2*?d|R&-Gyj^x)Hl(9ZS;MYdI7N+lj&(x;_}IpwzjoXbOY1`uW)yI znksX;ExXSbpcf5<%qdm)yH$p;m`l{~zu^Z_>1Ff#l@9jys1}Bz8(VxAt?U7xJp89O z7Y^+;+hH1fw;=M17}_Toh+pYw{OxseP<70Z)8?st=^z zicF}!yD{Z%yh9Xh&BmjTzb{3=sQtPKN9CuP$yT#~n?sfb#R?~eEPuJ3k76iy`?0FA z%6xL|nvV#sLENs%0o8-N%N$-@+;yA*c(rS`8N$Z{x0nFU%_`|He=FCzXfc5^__Ri% z2R1lv`TNIDjfos<1zQtfV@rb{3JmEl6>_eQV1e{y+0rghUA{a@nD;ljNX@35B%`K- z-bn8)00j2~(g0p4%MqF(o99pN8KfUAegz)RKsj-=HA{QrMj|*}4^8`$ZKCgjr$B@gF=wjI$TW$WZu;?Dq?M0gJg3No#xuXl!fmf}Ejm+X+vB zX~Sdb*X-<}yHy~}*3QF8WopXEhGZyr`}p<6u%Z3Q%W5kvTOPA_VjAHgY!WYxN7Vh> z`@N1gKgaqk_gm+?f`l@spe2Y1#4Ws~Sg1O%lTqXkK?#<&&UWy#_IDtI;@j5Izg1gX z=L7Fp@Ev@^fV2iB9$qqOnNmZgi+})~thQM42_>cm zb&pau7{S^>T4l1zvXGdKi}&BDyiw$Q0(k2?^=|n;G%eJ-V>y(moL7~10$$?Vs=E%2 z?dzu7izs+w04ENLH#Em<KeX5kr$mOL8j2i zG7ZZ6mlebyDN|%@-LZfHgs1o{ZP)Bk`=9YAVuc9@u?wOOM}CUgyDHKrYYIh7^Z+QJ zQHs2G#U@4W%6Kk+$x7XQyIu#(oLQG!rC7y?7S09K5E{st61SFAj?-xvvk(|n%+5>* z>l@+X=APm>uJJ|l;GE@r zz>5c$^~oZz>si+U-)yJR0Y!=T# zdTO%EI1s#V|AP_^1tim9PlcAq!FLRL!gk3A*`MCvwA57;+4UM307OwKmL*q?aEx%y z`SIt4W8aZ$>qd-O!)A7u%p{28P_7_&o@li7L-_1G3>NW9S~p$HPp$KY%TSkC^lhK6 zEorGW5L}f1P@B@$`z^?3dQ3{B?X60&IlY*(1LO~m+M!G>cAic6LFdW##lp>@5nRab z;;q_Ktr%B$%wW)Q89i>C~VOL%)YCrtOZoMe2cN#yGDg-ytYM6h#jz zEKoiR(;#UY^wTDqP2!ugw)M1J=teZ$a*tcv;ziV-?dJ$>yVj?*0aKbj6KD238SQL-1X(en+ zp|{P14~LAhH$sIpV3|#naOdjw#1;uRei#wew4UVmVyabszjhBCQg7^0>hG&c$yBc>5Z%AZ5^mt4xN&pKS*fnTX(GDlLSxHhyi*Z(Xc5}FgODK zSvuw-$fb;2H{_Z*u-f#b9luvRHT6fKGxZxcC+8DTI#p)b@ig<{r(7Z(aq{uHU&HtB zumY8KmKYb;`TClP7S%z$jmE8nHN&gB$QCbYGI5aL6SYHm=XapH1Qa#>sHvz7LFphZ z<5eOIKz)6M3wHwr4$!Roe)Clzt5I3qiPvnJlWkSSUcY)ZhppIed>zp`03`++1V=yy zMu>iIG#U{mhH@uexR5c|U? zlL@KjyCDLhlX-=}v`to8xYD`_RV^+)1NgN_U*2xCM8_6ZYGx$W=q^qwtNLwZ!Rpbg zN0OfczH!|ATLsqKBkEda+TD;4U#o0JnAKgT1a$yZ_s3F*wQ*Jms{&>> zwu1VibU_8AZnpBvmwJjyuw=l~uSOG4famEsejXFS^nTh!Ow@T^7rg<81OL)KoWK*+ z)z$SkJ*x;5-GJi^hQC+qFv+&DuR-x>>?V!xsAF z;!*kmF0d_U;Y&y+5eC0z2iHSh&c8l65W%*&OY7dCW8njoqcbpGmqNfP{d@LdIqF2r zD(Q>LOGz;ffA@}e_RsI`^H?IhAr>)(3RvpHEC9bKPx_4Pl6Ldj8Y6BY(Wu-yzqd@U zDGS73KET=?fjTP!$aibW4Ga3^IUPcmR94X+*+sSf{xhGNo*H*mO`8)JRjriFv z^~rY4SuZ?hq5BRPV7ZuPra9>2InS>1ZR2iuSr*?_mH(dO#52$tv#4*K_;&+yFRfT~ z^QKBfZ2x5ekrB$5%RdcsO1J8tr_LmiZ$eF$N$vRQi~rj0j~ESS9Q>pxIOZ8YY#HL= zOUMvga3nN2C&pt0s-gtJ>cEk64m8SyrJ*>5A2LnsRE^)3Qj7m<8`!_X8z`wTsgk4* z4^y_59&VC{aFu^OjA@=4j)>fHsSj!zwo1;Z)i+GG_{qapFlWL^Vpxp4a=j^7QefCq z=AT{wuy6&)W=XE5b6j>7uk3A=kd~c;=bt-E=YI5gC&E^$k5goIxB0JQZg7G@>Q5HG z&0!*=<%x|5;3y;Z{FDd|SS!7Eig{E1w{3HfeAwTE?*5wsYZnL6Uzsvv#ao#Y*-Z}< zGis+w6dt(uh}brMNV)&tj%oh^4@X|qdWh2ZUjBE#AAN`SP;rOOUgZf=W}FhPowb=E zzv%xf-Y<~{o0}8yLm3kXW6CLbYaL(EJS8mCXsx6?Wbophrr~x%eEalmL6r_Khe*z1 ze%Q7Gh37)`?_Pu&)N+*W-`$2m-+?|R{rKaxj5OBZ+1Pka(P)&D>CV3HJC@>i$0=3N z8<}QdGPjVS>AK0h0Xx@S5lv5i1|{n|5&m5df!;oM6QXTt{s89hs4b_XvEgU*(%Y{G zzO!xTb&jpL_BD-kE&u8bjy<$jhYn33=`Yl{ov)=<&m{#ZWnn? zv*%841rP|fxP$nDmO)FSFj0Bm85p{=1q?3YTGNYJGN6y(;ui$_ccSoa#>= zwFd0(bGE)8IPF1m8u7?hhFpMnu8_+8wY^TqKCUpdaij}$s3z;hMQGW-eMFe3T((Wf zsD1p?=|I%)WWxX<@bAhnaz)~$5-a-Po^dmCwzT)T)?TFz=;maKEBuq0D1ob2Op<7> z)T|Cued6R2e)8`+dCGrNk~SmGNHs|%>N2k_j+^dz^Gl1*j@noK0vJ=3_4X( z)8`3_7>Ima(7vGn!Qmrdh06*;fvD4h-R!sXo1uF~`TLAgPn7>%`qy1oQs;L+dVCGd zT^!I(!A(H%Myt+Kl->YCzKAF_6ViP|EW84}L!h|912ws%-hn&ilk{AEks1R#sNnPg z6#$^VcaphUQ)s*s(B?#a>QD5`7niV8H1H!W(cMG0l`HBS0pWu{GV-WcrE|h5LPTdk zeY{TjTQTy>lm>t>a$~%&DElA??pMMomh^A~nC(bnPIFg5fK&))11qZ8l5)OYC4*Et= zzq{W6YNY{xX8WoJ;WT8n7C%@OH)Q{r6LeFds<3SFoI_Zr7(+pVvViH`wY*2kd?1Zi z-F{r5ELYWPUt+^726BCa=!00fr}2S@(rONeo0SR|sU6p?Ld!7IxTxtndUs_7Ra%1& zWymjGnP{>KF7n-?p@ScakX~4hIv>lX0dKMjDaw>;G+Oh!1Sv5Gmg8pfcx7*QXi!qW z!7~}^_9cD8FZNFts5oFo9KbRe6Sl01PWXzLotB>r5j}M_$gMuFF^>BBiWB65DOp3x zzkTP3vICi9^lc6pCEbpca4b+_`0>Lnmt@oazebbs{CbI5;vglG3fC?P%-@ zI&J`b;tw@()Ksl(Mc;-I^3<;EoRduxLv;aeo^R!!Yz zYHHwKi^|HRa{AC+pf?LhLLS-~4vO;!ZPVl8v|Z;9t3$F5-c*Q{4{yShwmD3Q&KM;CJAxlD?F<>rukbSXDQL+w=kgW63+Wg`Ff`_C&P@Pt#b;_LnaXU71tUJX-c%VF9-ah`zHn}u9VD9XsD$#TxEHhy z{Q5P)#ok$djYFAF`u1asR?P1i(Q@8G0z1f$@W|@{aD4G_r6N@+=*Z8CPg?qM^wM90 zCd=oAhu0w562KPj-l#IHsXg21xMbzzGN<8sK1bxQZEKmGx8|S2c9UDom|Z0BXE{YB z?5z3BZk5 ztHOT}0_uX?osx+%|$8cm)*VC>0(8@@wIvx+)Mb2};dhE$oKRY3IZ}bw1e!7ih zBZ5rp=zFm>)Y9f_cu@Hdq-e!EDLBJ0fgk(Rfo*3t{cjCF$f@)ADN#Va`T^Xa&Czn* zrjR6aS^a~KkY0UT`k!0t%tqyo5<=UYcYZ9_dnvH@uGEdE3ezmNO!xA~)qauMqV*!< zmDk1UNH$q$jvls4-tsNBFkFGtd6<@Ue`N$W5nr&=i8tp^ib>+Mc)3nkf8#fQZ}N^i zA`f)usKgg_-D@$Ab#5^2Ak#Q^PDPIt!p+8edak6CpI(B-X1TezD+6Y4WTm8&a7-RHFN@z;AD|Hk>Ksi8pJ{%DurrqlWkyw>?aVG;&;lN zm%SxdUOZgh*%49!+0;{fx{x|{wl*MtcnxM257Jvk{lH};x70P*OzZw%nJehG(m@2G zy~hQb20;qr=1qsFRc}cX!#CrO>G_v;c+t`Zi(CPLt;-L?zp3s%t` zlQ-(*@zPEI8@ zIdZnhx;5RQRyFr}g@l9zEYS1_VJB|t>+XLv4 z*2e_`QK)HprlsLR1?{VDr%V{&jQXC<|@%Hw*JdC1RPb)s5))}kPBtQZBU$qY= zBBOLc&x`KSrr5c=ikB~6{sc%M&}Y+86${KQAQTg1+AeED!eWW>KhGD4K4UU}ycyIm znNMyg@w!b^n6lzrFMq6vvF3Y33K!DbSSE|}_6EPU2SB-Dj@gZVWm>aRqM>MSTx($9 zaMabNj};e)c&#k_tU{7uNYoWIM8m#*6^tA6-&@J&;cZzs#l z;WI|S&~reyr_Z}`fQ_WMz2GQ6VIm|U#7ruh=@u9Y*ukenW0GNb-_vqVMfJl^i)WQ_ z(`@t2rac2N-o{@}U*=3Kd`&FyCw*U@C(d?~B&c_ZN%%Zo1yBZHV+W=G{&T^uc0OA# znYJ+TGLHp_#CFG5fn%MMjAU;?IBv)c6WFp%EkAwdPSog+TN~cKfBT6|x5T5wK8565 z&O}D-)5bGZ#w7YtHeuP9rP3Cj12$XgCu)25KgJjE+w{vP?iq6YSovjgw1HYTnBe<& zt#&5S00#zi$3FV#d8Cz40V}`fA5h#40?>rP5Qu&hSZx&M!lQpbhQtb;=cY3%H*V=Y zO7`lF_M}?lpRQ;Tmfg34Jqjr51`rUKYiP?BwS3Q0sGKTIwPo>vWOSUlZdmx@oqt0V z-v-LceGQBuA+*kKR6d0gMdV+ya z$+QI|>^_a#4+V%i-|P!!81NuKTCRJ(VXrz@4doW1Gz z&RAMw2>D8D^JjAgu7SL{%j_`kBxSoAsV$(h(B}5X>-Z4gA&aBdYg6@Yn+9{j|E|)W z2hZZ`n}hh_fe^3e1m?4nb>al`(Yl|=C`$JJ-}c-PX7O)v5W2UJOD|OGp3;}^dEWUk z;IR|#NvRGjbIbGl9Z(iE{9u4e@q?Y=?ONvQmW`)xNGG0eqaU%g1||+~h&=XGAxVOe z8lQ`(`M!qq1@zwz~m8z&z}zydURdjO#(khJpZE*QX4zPnoKf7 zo5ZB+kaEJvy3hkG z?!$+O94fqBZekkj!+Mr%+G_Ui% z{ohe$!T(B8zmGHF+klqY>#NxdNeqYDxA;VwBD87cBl0qbwMn$*PsSAcd2i(n#MSO% zFh^hj@Ot)Q`D#`G`j3s#D93+8=|Q|;nzi|f@t zHx*a|esl^tE(DZuBOmAszP>IR@7PS8D^L4|WMd<(~s%_>1h;?L0eMvP(KL(^Dje zPr}S6mG@?X$IUaY#2MRM&3#rdHhwGbfoJU_n~#sKP+^P$CBdCN5&emDe+@@oggk%X zBz`IW!ROu6vu#^@Pv~S#(@Wlnsx2wOAUqt8b2x@O5K1|{xNhgoe1%-np`_7<2*B6d ztEJNS9v$!+-r!d=zNgQTPI6svVB$lG(sTW177iCSBsspkebxQvea>oP56xKF+8Ox& zG#|>Qf5jW|2wxVK2&dySIv+qn&2{N7`sBVu$hB1U85w0{Yx&{BI4r_;(?8BA^o>gwG@s3^jSdz5aiie0*wBEqI z=}62X2m7Q0OHW0AQoT!Yj+qL~r!KigrkZ9pI|n!{5pnVJ5Y6@jvH8FQq?asQXlbx* zl>@A=53Dab-c0f)#-|0xZ@gW0#&6x?_tJq^=EiMaJ|2qi!$yAIf6ThjOk`G}mxv-C zF$5mxhmy1v%xOQhy}9b$&r0^vTVxvhYBnccxJUDBtljByp_Nza!1kH`Nbmg!jhlj# zV!JyOomUYbesr!lI4>u+-C&WZ-#oacvlTi2Le8!24_;O44RP4AhZ;kfi$t*rc*B13 zYnfKp{(666k7STMEzL7TS1|RK;lbW#9QM`(f~v zt`A*N+ArGLG)#{8KbFudx;L}K>ldQBKPfQE_*{7h{c59i6^J@iTUgCfBgV>nEC9^% zYdIlER%1}mDO2X)nqiaGE9b_yxf_!6Xa6s*-a0I*xa}4mx@G86W&jE4PH7NCT98nX zkd%_{Zj_XiZboTE5u}msZcw_r7I62A9)*vb|-}7{kkIPQ@-Oz%A@pjI4l{|0>|b{{&I7lEI;M;lV+a z`zq{?`F7`Z7KWpbG*br`eZo_a1{rDnhlKXO%HABo>2o)c8GwPq0!`bzchxLDh2eoQ zCC#|@v6&U~nQkwHE?1<0Z0x~z8z0ERZK+UYttl29B}iNv8LOdvi6=|w^hzs;6P>?0 z_E-32b+=F4K9RUTO?}GJeT?xfQ7O@x6I_HjN(dd|A;(z`J8AH_9oL&5)x&(bX56FO z^h`l;xv$V)L%!xg;PPtp4Z9G&`0|PX6i=zHYKgPb3@S_`q4VOPZ*)*tX#U*z)18-n^{y%C+ z)V0HBvmHs)9rGx~b=ZyR(BNo`4=|;}*Lm}`@O~E>q5CfM( zkl^BA^p7o1*8IK}4L{F)%qxk*Ig3NJ>tFRA9$vvARIWPNyH1xI@{Da{j|v%?8}9?M z>TlKM*N~@Mi-WOz)#JEc8(bhCVNhbiwlD=qg`o%WH#)d^O`U5x@tS6T$}s~Pr{+S;WS ze@y+-!yeIf5T%&<6rN1f0>=i2{U?%LBchYzLFe^ZIS8=gV=c>o<)rA`+q3RH92vQ< zq&Y_DS8n2w>JAnKMKa*s2%4;jcR$u6lE1_}<4JgqAq^E&WTr<*f-0Tp|DTovaE$h3 z#B<5^uJfqDxWH&FWRVkiSX#WR3qZzA)&d<`ttKZpB=5_redQwU__v}TT#)clJJA5F1@VPnxrQUu_;z3_aZ zC67NQ#V+w)*PHUc$VZgu*OD&_qG@s8jZK^kL_Wg!g6iHQKD`4&SU{P9CE?0tW_xJt z`BXJoYS{DJo`0~&jn9$D)!ugbP&JT)kAVmxIBUc{owLC<$mKN)JFrv7S3BHC`X6E%)jW= zQ;#G2jGshuZG`;L5Owarn>yOk|D5wsE$uG0K7TH#)cL&cd0>tn;ZZ1aH19fxN_N3O5F!|aRTIZkomdW9GUoeE?$SM@3OOq zYCk0JXm=G)0j2a%$UUX2BoN*S{+kLLye$fdV~)VtVH6~EdK4o!Rthi<`%EBX_1{#X z+gwX02KuyT_FrK+Ms0l($Z^3@$&jwR)@|&#qJra`Gx;X&FCIE;CdwZNB@-SRP`q7{ z=RpdbhalKjVUN9v%E}z2{@`$GbUtJ^!>;`jQ>$dCP1Xk?j<`5`_7Fjj_Hd!s23k}O zu%$K(bQy9f(0jW+V`?FR%Dk8lY2@*bpzvbd^h~&we7pU^DYjQ2=wbpD2y17Fpfn+) zm)sN%?^DCIRWKDL_(WDP6Vv@ks=P3_dd1PK=6ep?7R333Hywb(_qK+Q$VJvlN^COw*Q+Ck2+acIPX58n}?W9qJ(hA+6 zw-t~QoY7Hlm?1%4F6QDJxUg9Y02|g-68EVfRDDuCzaL=x{Us`r#)$l8VVLfEbh*}!@^)zcrNI#pwg`agK7bhVHzxBrZXHW>7w18!ekv{Ed5IQ7y+D+yt|G@4V++HSPGuA0=tL;1_UV^ZkIXs+m z0OVR@Ed~NXm++K9L!e=K4A?j_%rp#fqt+mOww2B!aRIq^5@YV@h zR^j+6q|~lX(1uJ%Od^47%O5fS0M=%BnHO$1yY}-ur;grC*bboG_KkFpngbz3;$*~on(=TtbtX5eg+UG&%PHe`9=03*v9ZZkZ!t6;B zio$7;$b;gnBcK`OqGl45X6-j{#2@3|h}T1>3|aPa3l zW>PwbgB??U#7`>v&O}Hlx$0APB)04O0FJa<5lrvrL27*G(oSreNB|3g;P8bi7Kfog z=~-z`(Q`D7AmH27gAv-#spm_)&X|%lrp(+g?3?~96sMDGO3(WjZe}d%vwMA2n(F)n zkXTA8Iq>=Js5`q2wiC1HEW{KG9wK*C&+b$>q?r;pu>;p>3G<=aRA1@oS((8+&q`8T z5R?jY#z9rGBmHY<^-Q-tg_LM0_kTcc-S-`=e-*I3`1lx<1xs29KN2uRW^d8H;oU&6 zdtl&5Y0OpLp5Cm_&S7ao5Rl-s2Sw2jez)f^#LAH0dqn3{6sOtJKe-zYBBb*T?vu65 ztDzcWv0zdt!f<2nwhByJ|3Tui6XKS3w*T^&*BBB^oknsEPkZLuE9>n$Q#G*m#vcU4 zHinEGS$ih9qH^EzYQGT}X2Ckme1!2fv=uT8P4p*xxW?z+8I5yZh)a^29tH_Py$)xp zYr?KBi6(!TMv!oFF*_tK&;(0E>2rqxuA(Lng7L#}Ts(ut=vsSvh^uVyl6s>p=Fg*Y z`x3$}ALTAd$T9rtRR!e~p{ZIZB_JdUzKF?}g(EWO-C7uwh0;_ZW^s0i8J?tjYqhz& zC46%D7y9#Fj+%uxdfgSI&Q)TdLRyqa!-EGRL+})o%l)A4n7tozT4vy_ZFawWsAGx< z52x;W#aNEu-C}rMwx&=~XFo2B%=uI*a1bhEv6R$O-s=v{t5U*&`#v$8H}zyjOhpb$ z*Lr7-kC4?jD zJ*e$o6gRx{UQ=Y^D#l+yW& z*ElLYi`O&dQr4LH2)v!Ukhd$e4cDXU)^=l$m1=Q;SgAj?u2TK!u<=AMBmdU$hqN z5%O|c`mcQRellfCSz5c!j$u?5;UR|sI3hpK{u%@S5x}2XPr+Cf97uEudNe%(QnXCw z*jIJb!=U|HPh65WHSiz`cEgjPZ~JLR6_DM!lQ2h_;42ddEgy6=Ua zf$;K&|B?o)S}{3K`rhm8Tqr<ay?`OXU*y#{_z;a z#=?3qWUMCEr`>PV-LT^5HS_ds%e)rsO_1c;$xT4?ZDIw!ffll-v z9fW+Xf^}!RL%dh}<*ysf+ZiUcK09 zL}Zsb0U#1(>?<0FpVQGhhKz4FiPzD}-x=8#6gfW4_$SCXC{)jv?|>bZHKv<~A|e*_KQJs*jg!?JF8 z@yGlbdtNEL?CpG>)RdtF3<@Rx3 zbZe<0(7XMc|Freu%=MpGhK-HcLmuDGE*-E*lYVKIwlp^GNgQPHB?H84 zi_aXt@|@cw!Z=+_DAI|d8kQ1Lk&Otwx{FrweSjTY@!O3|6m5czbT&c?9;{f56{k)J zei=Xd*z}lUfc;JYFoTHX#@LLmd_X6@WjaTB69ilGx+21+FsxHfgtdD&7TC z9^i^zZdgJ4dWgvZi=m<2z5Ig9?pFWQV@Jy#~qI;x=V)_ghqRyyDvNz%M5ZUE-K5 zv=Y5m5oKq?U^C;iX;6=)yv)Kz|K3W0D@``VSPpUvS`(0Pcdl-1uderJfKOgf#5WE( z7bi&_UB0}RbcmxrU9}Mf2CnWRI#kN*Y)5PRkjv|t9?_5ll=zfz2G5&c&`8bvF2HTa zcX*tU7;w)9AB$gJoG?5`}884y<`)=SwlCAj4du^qjLFvk)kd!x-pHx1e z3@}wl4MCl>poSMTJI8Jp@n#727})_<7UuLzHgN)L^qo@m=&VpjSCg)yiUNWXODJUg z`<`6(x4h!#59#$q3yfYlwX3L$lh2FX@IFQq<>MU-+28nhTdm#UWbL*(ctgXowp!md zp1(U4Asbb8Sgay#dSUDBeoA(|J;yvW{*}5}igL+CL+Wg4?))e*b14vvK61_;0LonV zaY)%Md0xw)%8aUx2Lwa-A1syo!U9TXs{EQhZgVe)MZ3Z7OchfJyx9fML4>Eh)X!Pv z<&A%y(3#IcX_$2-K-x|aNNKoG9}p{LL?+=eV>{>q)8}RC_YA6qE4Y5Oxj_FN1Cu?R zeX7`pCO^Jv5vk1d;bSU0b}%=#jNG?y0MX^EV6%9&A$Xly5}QZ%Tx^i|*IW|Dzo8eC z%e9bjckn>ggdBqc5t1hNizit0CMtc?GB zIJ?96d#Zqqm52RJVQ{$-HLnPhO{5hAV5)FSyPvxOjkWC@TOWB76jeEIe&%Q{11w!j z8Ae4Tz1?NAZ~6$te8Vdo=9zxD8Pi--C<&zUi_INjj}jTW3?~Kpl-C4B&ejw@@dKvo z=N57MZmNEgh``ef@f1oQ9CLcZY7}S(m=fpy29V|!2HMDtPJ-)QIeM!lrybHvh(NC_ ze~aQ}uh4%!F5vNFWf5dh8m3x1_|Al`fKYjkl1;nu}e@w}g+6s`ntc zo7J$;6x)ehumAA^@Q^M}zEs!`^1BiR?NH6`lGxSWi+cu7o`>8)2K0Aw3BQDyFQN%g zO&zaI`i`xjngQz0Zm-V9!YU8bXmTb|mCE*zhitQGByArX(tUbj>53+slqln9?Kpq< z;zhS}PbgI=#ckoL-j&TlC5cKXiZ*t-`;khqOg4uPQIVlHu?!K$O;6yQkG}ydi|c<; zY~9LuI)*$weYXiD*gA7^qJ0rdI~XW*qglVMFE0VpYJFFx5arw7mr*xFvVjJ{$A8e) zvv;5K(rGmCyXr09?P(FvT!$RETwh&*dtZWtAl6{nnhR#eqZ{$;g4Tt2`Tg7>Ki3bA78+fh982=5K!6P3jE>Z;kHDg9hGN) z^I!bLfz%1VJuvvO6MB{GCLs%tvJ?lHVOj*!pV(_}19Vw0qK=)L2jTS-5|X1%{rG*`HJ zZ*8k>5K^cbP5PL8dso(S@78RfC=IZA0G%WuxniP#nGhK!TOU_~69)BPi9UNWi?v3ee`a zSBI>US2?zS@7df;pJh)DKLBAOix#ze0mLHqZ_8ueUp_`Ci-yohX4($=9xh{1!m@%h zDsxx_`Co=;1%E0vv9PJXoBVFnAcV_e?J6uCyF34L1LsdlDglz872pMpdlfJ(C*A)5 zAOcCjk$?FQxkc`ip0GkhU~%OOpkd48sP533&gb+A3kTsVA;86iboWvMKoR%)5HU`j zLD8A$gBwgQ-*>I6ly_9{W97LQidcM%XS&!J^w<~-iYYkPJ&k8* zxJFO$l3q1=<)GuYJ9NBy{n}N65B7R{!b4nHOWrNZudln0`}(cYw5obb_xe)lDd(MybG!V(r_^u{=x)-sci9kp7imRU_T zzG&~i?40mzC)2IlWrZ{i9!Z9z_HrK6gi?g=5lcgjTi?gPU4=inq-E_?{g-c2;+;@3 z0VEdvK6RvZ*gu@7&GE#fWhI&e}WNdJPHY%c{fm|FeEuyw`d9o--okk z5XxwRCc`(7$*$P-Eh@Pt3Wx8^z38!5{%`36-04H(CgFxR^2Vko+Mfmg&aZEa8E`Qt zQT|?Pw)w4OOqdY#L!urJWw{Scik_&|!3NUG5amS+!I+|zt@OQqvJB77F>Eslijtrp zA|eYb^IAN)ntQSaAk8N|n1_tl8N=k9(Az6bUP=7&fxgR%9sDm^h=+QxXtf1bF-Vhg zL2Q-g50gG%42kJ*@CqzW3q9GAjg38Dyg8fYH8l4|KgelaKX0=qPj|9C^Z9W;*djSF zO1x$mmIDYo$tHV-jy)?(t>-3 zX|pjIva>{cEIGGDJCQFaZJ&Bi*Yb2FAy-_}$N-KWCpJ$^^~Fj*Xnq$3-5VvJjO?NZ zO9glEt2LUaj<|o{Tf3G#$zOyrx^_mgy$LJvK98?h8xQ)QpMU6VwlSKe@D~tx@v%_^ z(D@F?#a)5Vm#EzxrV)kU5w+J6Pr8BJzU+uIrD6G}6Jx!Scr%~n zBO$YDN^e6hiKD4qkuwc4jG=)yXpDYWk_}xcPB^KN{l=^S|}?n2ZF_+i3lMj9%BUPEZyUM8Gh*O+Au82PvXIp9Cq#p}Ta z05su?c<`ify0~zT%UaG8-$w=hA5F$j)!~7b%h_JDnpalB9W;m~Ov%-1tGOZv`?Dtc zET>B@WmfT!C3nFi2IBXJ_83GOsbijbN2tI6R?92-+t3}~Q~~z#e1rd2{)c`p3u{N> z4Q0=Mu><2*bItMga#}RJok{gS1g^s<#ZRbB8t?zyzRi)U z>3z*Ek-p>iwevkDb3*G<9BS)<^nH(0|4&rJACBpWH{YE_1k<~(j%~jy>Td{DxHI#7 zC!0u~8zaNzSz59AQ8!#E%J-HjXE#38o$IaE6?Y> z!D5tfcGpOS0qX%{5z{m7rDtA;m5slaO@(~DY3L1R;=11KpU1Uw<8$%%p~XzZIJ4rk z-!w1+!V?>vVLzlr-RWJz|4tv!>{WxKzIO@orD=M^JzGb7faKpK=aVW%RBnij5mOl& zX4{pxJtQI0PVjQQahUf(t(8!SXxoqHrRH>bU+rUKjgKaa<+Ox%rZ?BYM@6!i?%Dq! zuPD0qM)rQ?IsA#*16eR3yQxZqx&L`^RtfH)gmHBbpclS!U#!lIzmuN`2R0+XIpq-X zVjzO``(gz^`J}?byR*xvGu9qG86afdYQ^!@eSz3+j%lyZWCG(9FsNf*-JjmAReU`i6o^XQUh++)@O0=T@dKBon@gN&^?5MV<4eXsmW4D;Y zQ*$dBiwyt4Nq1;QOA_s1!`QYVl(|zF!^A#G~Qx3ErHWNTRSo z@^KZ(a@gv!w>WC$tRGkq?=4PpRq0VBeVt{G)Abg9`G+l8ffzfO{KiMr#Jom1<>)6M zp{zhtJ<&W=fwV|e!mla9u*d#Txf*k4sB^_WED|z#_dta{vnjE0dD|Xu}-e;sS3m( z54D|rjQnbar|l0H1L>^cS0`ek#Qz=ece9S(6}dfWQGWAGrf-DQyRfzj4yv2$>pIvz zN{-ZMAMZPWE7OIXmWOAG7?`$DL)OGSR{NgOPTV=ypilJ18$_9@d_eIirvb(MwQtvF zeLH7EBlCe6DuRKz-WUvY$@C_y?#XrU5<@>*%JN3RR}~yI6SpniX3uyonrXtt zFKmMw_7yNXLar`(9E&L;beAqRReYba8=M&dPZpAta{5FGI}TPa2i zD4|dJXT#LFdEIJ4t7Gk%BI8lwUuf~OvD!_YLhPn4A>){JgZN}t#XpP;+H#7#z!>Y? zy!PpvL87`g83K`8T0(+=?z;QgoCby`;QTQUW(k=|YT+1aN2@aXD>F3Bmq>Ggdn4%*H)=9xwmif-dar zaxcgyp>4zCi}W4V!oBw=7v30G*dH5qMXr3IM2Wu(lnlqBo}K(7wT?z%a5m(1_PtuYdI@0K$Yc0uC~Ukrdij&~miOTqcqj{1^O z=;bh>s8H01s3N%5Qnbrw35hEyB<$Z!IXTg6Sg8L(MNh9U!Mp{Sd%JOk(&Q^W#etZ~ zr6BIV49Of`+HXJfCtCyk+n5sC^1C)q&18F>=*@^}6@x?H2arF0&2L`~0Hf6>oE3E3 zRG?>niv*aC-Rv@}iW${gBEB)An2C%H+XM-HF3SX-$(?YK&PE%=p<&FVJF23*&bFk2 z1N2*2!t<~f9aN{*#eKSCLbCZ2YMhf^kL_zJ_y{cZF9`$275YqhhD&+^PZi&6RAz=> zDA)FNBlJUW1Dab7Ku+)pHy=G8A!WDjKUvL@e8wXlZmm(-4Sb9( zi=8>S=|DkD|48+>dSX6CC1ZvTp8Z*r*c>0inHtBFg#qI;{l!F@Qpem?PX&*3=;*w< z!+oU9Qd{ZjLLsWN+i70Qf~nQ+52adf&^~{)jABE$(|kHeYlFMnZTGsRV^0c>4pDq) z^33yBcsNUs)$aDkqmr;MF{nq!*C~%Let*e?Mdto!wSwOJZgu{~;A4GS%=7skjO)adk_k}M@bVX)AsB;rqa1Iu*Ix;c!(M3ud6&*M{W0Io{1?>q540@^ z?N3E9Z}o#3b^`+c0@5ydwugZfY*Z3Q7@wj65-|6tt#c-`_d;G&_qF=R?UNsf&HanC z%?2=}43|7qW}}$|eZpJiGZ9SU@!LitHyA37o0d^%Vk_o`oK_F{>)@2)aIKd>jSf_& zy3M|%2QtDxcC;dR1yfq4S#fCfiJTS=@QVy7av}Y+HV#7RbLKdBQ7V_t^RNe2B}+fq zB!i*{?ijLBRXo|QpRhsTXi~{jKi7gP14Od+9I4<=825em?O%5^XEtvTfa~z&EGDj7 zxrO}E`7aa}^(FStDoO!h{ACx15J#dyOd^&Te;ES9kn)81{^bowj&9{~mGLkn-rN6m zgZ;|Mw8la{`eL5NMD6xn%|aLgrG-=2P)USst5vChnttoACOB|8CW6+jkV2I6m8a>K zb&~DVnf9n2TnppnK7{r+6AQ9`+Su$Q$+XAswpOoq0sjqNmOrC`6Cp8^oM_1G-B>EC z5^|ES7G4PqM?B@}HWI-zV+Rt#2|e|0>uUdl@b>EFAayuuo>gD&fK!Q73!>0Pcje_8 zxSKx#J`Ax|YlWs-?Wx{icBZY|u;na>s{X$V{6$=Pf7Y2nF7sy0wU@wuRc2ujkq=iHAqoBmt& zt`9&Rx-Pz&brQd0_qdTOyP32@hf1;Yysvc1i^^ms(#W$8j@PLuZCO+((+L5W2$>*u ziCmtEpYxkTh;)f5oGPh8E=G@YD4b;y6*ZPn=w>ZGW!FYjFH4E{!M>tT)S{?xlk< zyLO1t;%%`<#}57pDg=lVy|-|BeSc3*4}s_B4GI=!zA2UUy)jgb<&fT~^>ofYrBndI z0HG40lZ6UFrymir{|CNz6}C5Sar>(rfp(s##I(gVsVFC)^1nRx3rH>D1G#&Z<)1A- z3EE5wi=EKb*y>&z3%aF0xPjJhQxBF5qJ znnqn4EizZyL6v?T`5rZk_oEmK z2x4-LWw|2_CeBP+loval7J@s+yt4LA9#O2R4n!Q_G5XLNszHZjF0NJfg}zH^3jjm+ zL*}9$$}u#Qf7+vQPXO$Vm#^Z+y`x`$r!rwmf}30+!MQBzq!?+d0Rwws9SH=5FJB;7 z7jy{92|N4B(>VIn`Ood$@n>6$dQaizrDGISmO;V5-@a0*pxwY@k#i+?P6n~Y~T zlt=(tgj4baD_w7cq0haQi1t1f1VTIW!XI?`@3caC|Fxc9VtNmf6~9Tsc&wVeeCYZ#S}av9D$taUz`Scv58~kRuNxCQtW%3_O*|7 z0{fn8&Z261sxZoOTF&0&K43&kSZ#J^KUfNXy5SLaE(XSadW1e7O~z}W^4(TRI8F=B z1@8yIdZ%e&qVL-VrKDG}96$8m+?orW8|#x_`LI8~MV*%0UIX}bNAD{5pEDru%Mn7* zCRSB$EEJrtPbQq`Bx8{#=Khoj|LBiM#F|JSB4#)3E`+(@albHA`mFR$Y}{?PlU&69 zA+XS*AxyHJR?GnnTC+}bf1_i)1lZ-p0K=8Hl_~PfaEu1!pM7Lk>YN5t`p7^Y*JJGd z2R^7W*w{Qb9V7dfi}u!`ga6sLGaI z>G8+z?hQX;{9p&SuP~I?5HJAa--9_`1ps$xQo>2j7VY;vsb5L;j$XdUCj*}A%Y&xE ze8<9&0;9Ud5~|Q8495>`dWVRwzoR8WD=BE%{@H69_J$(+N{|euknqOG&!&RdM2VkP zPrl!0Um^MWwG`s$_D21$$p)LXB@lPA{OVYWsMUP@fg%UIQD*Zu5#iR&n}tx-`a67rr%+CqyuGG5#g7eoM@Vgd;k=|N(D^vL$r$N`o2#<;BR3f|%xnB09&A^Ew|kXY@@ z8!Ty`4j;2ffKl*>% zFKr-BOKQFVTL7c@irPW+pO5xDN^t06c@seW0D1~gxLB0tl0Gx!hOkYXpo58fS@$xM z+MtqG%AJCnXsp_Dna2GDaLDZqgplu1sM2ynPH;X_#;B{k&!23`pB4$J%9sS#!weMy49nI&a_(Fv798uV+8xqUbq znc$17^508Yz7PJoQZFs422V4D+id<;C;?pNbse`BT3YUy@00Le%x^-j-k5Gan_NVC z69mhizSrmLFzFUf%CShK@Ack)R5V~d16q7nS65p1JzabhoDvU*lLu$nf1}G~6Nw{v z#eFYYh|+zQ4qn9v1S71uy?rTb<=?PnATG|j^?M=j-Zu(_C-uk3zV?vkjKZ><`br|| zt$6?Lk^4zf-)t2hRdHI{&Bci)7!yXD{v#kJz6V~&cLPO0K+KKQfY15$jFqa#aF*jI zC7=-FoFElG7x|uFuQBxl&lk6!x$m^a99)KR(M{6IR4~5p{Ap)XZ_O3UL!|b8)En~V zD0FT;;=bJRr6HjA+IlH5GsVJ}-0n?i`Tz4`eFGKwdzO5+GQEh1#%soM^VqZibvOH( z2tf$r-b-)~k7z>`bpKE`Z^!k-|@2ttNT%HOq4 zc`4i^7-py(#$+F3iOJ4I{UqMLuzj+I=)=ay0|MdxhA0GX%*6e8IL2b$(_ODzr{Mpw zGEm1nKkNqENtJZu3KK31F)nWR9U5K#zyMvVc;5%LM#^<)a=+Q)&0YT+UaA!H8l3u% zj0W?MqLRjK2J1$nj0>_$AX)?sMwB^qgfgiI3x99+{Lt1EqFaSCo9RpMw zB;-Eifu`yCbU>Bh**}|(|<{g2f~s|dyz zZ-djP3F_n>J*gUO+TK!-B{?* z+O`0DVgw|kpJGze15?u-{q`~ze1LXVoWknkqv-NP3T1a1(^(-K7bWNLo(p~0k7~T> z&gai0=Ho{m?O1(KA&4mUwZ(l>@rbe+EZ%@TOQJu}+*WXZbjtAcJn#q8xfP%c(b0%N zAf|BWv`jdz9OLjNa(o(!Kifn1kKkh_Qp0CR>cp%V$beP77iR3-4bN6|$%x`(AXWVt zCJo=kraXnGm8R%vfITp}>st%jN7EMo;iv$9NB8k3jCeoOtzfE-&&<(A!h(x-&$Yj0 zqbKtG-EvHB;+^w*SVcuE)%+K10a%)kE3l^8ys!IfaeUqB=D5!D&{15{TLK2Y_9Kjc zu8V#TQ3Pj1UUd+>K^?t$U|Yev0v5_Ov)7iMRy=wCb3|&o3{%Dvr?)iDb3tIQPDl>^ zF5^^nNC! zcp??smj?CFd)I<#q{fA*t&KN1J9@PCOipfu8nK*+9;?G>e6w>kRD0z=vn{(!8wos0 zfX-1TBTP$6bL_wcl;7MJLIgoX4hni8(YcH<=q`0kb4-C%UT8UEpL%MLa*H8c*M_~>U|FDih&9q;^r1i^?^=2NnAdj*^Kz^#a|2MoQS z+io#ZW-CTdf3nt(Y5`_Sw|%sb<`|c`v;L_g2G?_V?>Tn1U|n;JGE>mO0Uo~ZXxjgw zRl}wwT?qAS7CuDGwloZ^1r01{#aX>z0GojyQ_&sGD#4=BPErR0y*@jpl%*c&qd7W> zGqzZDTudS|uwC_KZNVLz_MefC>%TJFJw>TR1b|1yH2`?qrP45O!u?%4O~K>&;5@VpfV7i zSA<+P`Y%B=<9cq!E@`6XOS4hwwuHo48$g=^?hS&my*%1L+GO7U zaG5)LGr<1RN)g$Vejn|SH}A(_)(X1fQML5>G<3+s>i>3sH-~N}{GZk{J@jAqH{yfN zY~Vld_vU$EKsa?2uPM^C;(oWylTIax6SEoc&sIJAU>3p+n7;gh)-9aeOW=+9TBeI5 zphIrycumjFroCa6IHuirs{Li>mYNiYg&2zP*9v%j|AMcxnmOC6%I)^$3tX^2Iwhqy zAJ>mgTfZZG&-;+T`yllD0o&UFI-aTb&q-AFty!J5LpZGKW{SlnLce12mp2k=YNMz? z5dQNuv?a_Ofi{qeBk z-EZGzZVo>8NPNhlR!rfMlM#mi$G%nvzaqLfUH$F6Bn13h8@SEs^;xnSac)=1;ooCL zeCbf=s4d>XAT{#~F#=iZk0zPupkmh+QuLTCtfY)I*OvKT2qEX2eS3czXD_G)OC@6b z2c9%p7(c&4_bj`DShfG&?{Wo?J%@xNthm*p;X(NN;|6=DS|{JIhN_mx(|tA~L?|wI zlna-9U$4dkbDBwPcyZZ(Y~+@D|CSu}ZX+!#BZ>IG28V#{XqF=|Ew}O8!{BmSgu9TShK<4eY5HY=cU#f zL(@*&h4?pQ@W{!&({-u1Hdh!NNlp?<Gqqmnm=)FzK#zw zkMl)&A>Zi$@I@f8Vhm>86)@l}+<5ZF`J0)enS>5>%u{%zV{UX}=<9rW)i)6q&RN2F z8?0_taUe1@OvZ+W4#8BoM`jEZ?=dzsF5Z0;gME_qSFHmu@Pqy}d&g>t^hE`Rk0nI^ zudyaFL&X>nz~PcU*qtXbscC64zj?QQqWq8r+ZBxdirnu~8LG zv~TvdCsiNab_j&e{qoQFHO^PWGz$-(SX-0v%LHaAytRQUV505=lD|H2QUkqy1EBTX zDfo#5at$VSUpE1wO$+CP;bAw9H3Yf(^VN3RaKC~IChZM(JBqL1k?=*4;eRn6W_tCL z&;7VZ)-Kl6Zsgeudx?Gi2G=dI^XbyPk7mARIo4ozAoH8ZN=&PgXoS9;+ zA-B&`^oZXAO=HkSt)NI=PCHm-(CR4&uk2snhDYEC+kX>|S6A4~aHtl4`loPHpDSRv zPR`N>J6egPOVLtW+T6}~dzro%q1IB*`32?6p}=XK>#dsSq&*f3;x;`!*sOq6ytFDF z>R-rkJ+{YC;X)Iu0ZDzZy7BjXMe=$qUL)e=(X^*C0h zLfX?X$Qf9>0D!MI1lx58l$D>E>iRl{dc%#_&EK|AAQb&s94jO0R6JKf#qLPR$_V?+ zIzj~p3D@X0!yumq9-`rLq!}GXBF5n=v@C5dZVAz2svLcX4U0n{-21Ck7i$ z*@S}X%lZOT)0pyE&R5+xP5sC;;D%_ewBxRaIR+>CD7OmXz&)_+TGHRdmlz&%=E+VsGc;;Z26XU zZx4J(uv)QPUZ|~IPG0=`R#s~c3>Z1d$J<)Tl-I?yk@qY;teRi?ysa2d{*cLJWU}5{ z(vu~Hfv+v!Ng>rq;m@_lv6Sk>Y}BvZ(Z2)pClt@YM%_1tOS~T{apKk@d-0^VRuUqI zma|>2Owv)P+V{&34J_Da-27;7&U@qBu^T;TO=N!}RWfN)~9& z*(Rt|P8cRtGb92*mmxwrd8!B}r_@$8bz&)LrA*eXQp~Ac&8q^dImG41X3baPjPAd_ z8|A9-xv8yxfQv>e({uYJ#T?JO0jD^%rGvvjntlkVJ2PmlLU}~tgNzWG*Scq<{zXP5 zP5W&I;Uz@x%LxBY_#L_NoF7Ae_nVdLJWt*1qkJHCNok`E|8ZpJ_HuEWGnnvkAaE%= zp02SA`4pXnR1fa4pE~78_INxPWP zxJ!AqGgJJZn@w0-VXe8mi~K-9NA5?Jvv}I`09gBlz%~WoKf>F?ko%3fq5J^ahbB;5 zW1pSW1rT;P@3*4M`Cv&xj1(;H$El+ZsiVd%iWE;5;6=Z0(^=|^(dQv1Tugi}G3(}p zpEb{o$)SVWLyn87@M38x&zKTH2>#}iPDU$5OJz^5lx)5kBrXXB(&R+3_r%14G)Rq* z^u~)L8=E*9{?!d2jEU(JID4dLCQykz6V&m5(X2!B1C3qnQd#d5=Dc9ewgj6>I$T ziN{0anwUA^ouIiL`RHP7uVuJKkqY#soaPWF4LUnC4K?RccJg$;$XU#D7li7G%*b1p zv$LJg+q=~g+FBW+14kYWSuupV0$xNk$%6Yuwp^#8w^fIFHl4c({PFa@q&&0mW0~m8 z$@V|BLd!9wogd2K*a@FPr%-#@<9qx~NRl9rc5zmVX zBsh!8i`rfVi`SUq#O&y{2;gn|Zqw|oik6V$REJH(DCd3iAy@m(X*TEh68&QNFsMw= zcs^IcLG~iX^2edVS7pMAHC;0Bm#bRE5Jo*BV*9BlaLV5>gnXZC*JpdH7XJGCR~M$P zDN6Tx9;U9-rLO1HR}mYWY4X@!j@~MhYp@er{Zy?gQjnvUPB96G(Br>PYHa19X+^VR zeJ{SCdu=Spt`}ktojGlvt1f#pwq5H}#`cA?>z!Zm{Dsd-kKaJ57W0*zF9aqrj?wxH z9a;{aN#Gka(m)Wmldn8df=^@brc__NE zlKQI?o-r(9y!IHGKXJBgu6FH;jOv~xmeqib}@UY>qx&IK7Clf&<2rpDcrj(mHZp=wNtiC7q@8HWZ)`RCo%m3+2gB98(Kl3QojCj##_ z-~M@AaR`r_WKYXO5&S-S@1iz_8o_ZX_ucm4S38E49B-Ppc0Lf&1k;(uJ$5#4dlxs? zpRCfc)>vV3YC@^b(_O5?MILewiGv@7V#8aSD3dq>zmOc{kzUvYoDa#zkBHB)vwp(y zFThVPUwSUk;Nz2bbjHVg<}@=~ACferfT75uj?wg#p)1EutclZ+sUI=rgtIO|%0A(< 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

^fvpC}2AL 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 literal 0 HcmV?d00001 diff --git a/screenshots/series-charts.png b/screenshots/series-charts.png new file mode 100644 index 0000000000000000000000000000000000000000..27c9a1abc6852170907f1f42aa5704b6bfbe6be4 GIT binary patch literal 184128 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

1DJHxK+&5{gR^1)5T5tvF)l@~!iq)e)gQ^?= zqX4L3KwzffXTW<>_DeYz*rjHoi| z1%T~~x#zRCdqv%8E(~f(UX2-t$`gT$yB#PDU{@JMiAaX&w`?tb_VB|S*sGVC8g0&^8%#@ZgQaF@EjzqE!d27+R6duI;9N*SBX

`31YdA#_sq|8sxiD-SS=N~Cj0$voIcWJiT1)$Y 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

l*Re(#2ql28 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 z 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

rsiFX`EiYtzCZXe8ndt!t7cjPJr-9d0#IC@Z;~Z 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 literal 0 HcmV?d00001 diff --git a/screenshots/series-horizontal.png b/screenshots/series-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..df6537ca867cbdc9e67ef2e4a6cf4d33361637c6 GIT binary patch literal 51866 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

RV2gW(Pn6&0g`Ub9v6C+)ag?f5;jiXZQ(&Xh>E| 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 literal 0 HcmV?d00001 diff --git a/screenshots/series-panels.png b/screenshots/series-panels.png new file mode 100644 index 0000000000000000000000000000000000000000..cc82a642eeec9dbb23a0dd31e4babecb54e5e05e GIT binary patch literal 167775 zcmd>m1y>x~)@|buG`LHEKyY^rPLSXbAh-k%?rtGi2*Dc-ZowhAyE~1$J2cL#-0z%w z&i51Edo{WTjHY(guDzGcIoE2wyjPMze?j~L1OlPU$x5n%K!{=>5d1G>MBtMgn9xMv z2fWi;Idx><@J2Qb2Z1O-a+2ce?rDch9^N=EPok%@3KLw-h9Bfn-cyP(Z(-y!Wve%7 z>n)YdR+5W0mKD3tlJF0{d1cj%H9qYbnC*RVT-3*)DOFOSZ5Ir?#sKpoxVHLJim9(3 zP4W=U9?WIisps8p=g3v^sCQiQ{*Lg;sEn-aA!ShbKL>qac&R?jtACE{ydDtp%YP0j zQbe(TP7kMFX9K;J{O5QX27~p_;8ziRX#QCL3|8qf0tNqT^eYTF%74a6;(jIsQT;PI zJG}G%&09ye)G)p$04v4N2f>8yT1rY0WlqY7;}Vts>*1}K$zzc0w3w}|!45N1nKOIA zkRz)js}Ncm8rN9eMr_|e`d6=C<5!%aj2+~BXcYL@GERXKi}5vn;1!gW1sDf}-J@C}0(2L@mv7xEeP_79wE7AqGk1};m> zOWNqcf>uq<`1NXPN;UBQnc^z}iOR!(oZl~4v`XVZS(69v?L?Ouu3qYH{CrvsgB(eB zf7w9u{g>5AA#2$(GboY%`5SQ21=%m9sxkPO{$1U5DuEPqj060$NdG*AO7NMx5TA}p z8NB%VI;7g2>;u=I=Voy7Ro6&xYQg+xBH75agXHSB+aNhh#&#@QoAHY}?LX@*E7$LD zKZ0rgzvjRb)0?9Z%tA{mffbA|==K#s%y2%t~zdUf4bgigV3RtLY`d2(G zS=}R$S1?%OxIePWtw^I2_-Ox`=u0r|Lq$MvEjE0GnIq?iO(u5s3Xngs4EN3>$Pes6+cSqSSYRd0W|0?w<kVv_d^A&-(e;{w;!TxJa5FtXQvy+e{PlSlq{;b8bijFznuXmNr7-gM;CPPRC3J&YxRuNJa5WKTQj$Ov;^1lki5is_6J049`~B zpQLM+s=Z?)j;i-Q{2}{JSq4c>COkXbMf5qC_M`;?6#G+>$^FS}_sX-cGLp_>%lO`2 zSGRFNQjy^xuQW;A}_8XUSIf z`;K+sJUfIn^RVxmW+~49Y=(-7q&H|Y;m|Kr>qJCW@dy?)*XoyH?o~SZrP-@w?zb7v z48e26eo@iua*4O8wX*L{a+xUjer3SKB2VO4q-qWsHNV%GFVBgj>&-o#@MRM4z@7LPyL=6c@EMW^@^!e7WUhKBn zV!;D=&bgyr-6nF}`3bM9nFp}-ib%-cdFxI;{01bu;tOZEKc}K|jr4ZvH+1*QIDr9d z;$X;5x-WJrudU762kgg|#m}?NRPC6cf>IZT*2KfPXyBx5rjwOMUeo7_jj|33meZDI zmO+l~p`?g~g$46sUX`DPB_)z?-@=00j$Ct^9wdvWHkvL!*5A%R;!W=vaE*YAl7?@h8IgVS8F9<~wsrlIo!O(?ig(mU zqGt9s4&+AHgw-6(#NhZz`!r<+znlr%MvXY&o$P)FAj4k0hi!aI5?SVDR?KK=0g z>AF|ckl2{g$obzqUV5B{>fdyGS3Gdi-+#nzI(NG}SBL{I4)T_`iX?Nx1Fm%y9u=kG zTSvwuwN}L1c?`WPM%DeLDY=tgs>@?CVS-uf%Kf)nj>zxmfi_diTPK+Onrzd6uIAhG?r>XL!+bRZvjCw{b@lC4ITSgtXV}NzKmw5_l-X zjXPsf0n_4(q?X4!iJesIHN#JDqDe*IebjM7(TG9=f)H~`4v~E!zjMd!H!z4?MLaJR zBpO|h-g~ZsW(dkV$q$aD$slF=9HGxfGy*RBXdrrKVgKwCt&N*AlPG}}k^F^Y>718) zM9n|8z=E|KoBiLzW0c$aR0!G^n~|=MAVE>xt)WBcI7+-uZkHr%SaNblzwA%Qam(+w zB6}Cgi=&SgXiZi#+hva?@MH#~4Lk4F1$OWXiz7F$kJ$IK6}o!6a~!4d~>^-oDlu@)oyYq3>*?w zt^|_0y1JpnnSc%Cx77FBoP@=e<~U{=FQK`5BjMH5;toICjE5B&2R>4&UW{L8Z-EV@ zp{tWIGo!^wAa8@N_~5v%7~U1oUmi~q_}pE~05&i0YSX(NMY8`$`tZkz#Re%afxDUX zMjIb&E8ZN{*+yA;aXUfD3HkS5f!dTspZv)ne%7aiD!AjEM?$8T$3aS9HI)yZAYC5Y zt}-yK%Lwa4O)8OUHdLfYzyq6Bu-3XZ?EW4L2PX)Xg*0lUQ2*Cw3HF)ChsihksUM7u zv41-sAOhE4@N_xK6C$X!hr9^u48R~$*j*)wQ+@O~{rdH*#OTGu53}dbR!i z&F{D*c7z$!=XWBp1qHlsqs~_Mbf;A>fA1%vzeJc#lBk9G90oP$&#FE=UJJg&!^5jo zOfbV`G6+>p@WZ{<7RO@yw4jidpF*Qy3z=bdw;G9@Org1PhWKn2pnmSvhrSs+Y5g9P z)j2BTS-wnVhWmVn`qA4?d@foqh>DnVXJpnpX4U#TMTsUT@1#7y4onB51y{G|t+E{EZAljhlqskKIR_RG~TQMZRN z8d^{Mc2&^GITUo#dG^>9!0a*?k;&&bohhq}ZQ?NWr*1j4Y zP$9z}|K>&NlzE^!ydD^MA;b-AiJ|d=$DX_Cx+!54yHO0Y-WBcna}A&AV+mcxj6&ek zoCMTlL=E+=2vQv+Dt~*Z>w2X&l=*qT#QH4pzz(_L^7eYlJ52CB{t4? z(2CpU2*hsO2J`9uy^cz>(GJpr#mcg9(p^^$pZ;_G28$lw-MS}K=kgqt{zDZpKc*s6_1|ht+tuRZ6)UENnp&6t?G*jc3QXE%7?81Ja=d*Z~PW# z1LgtFgRt*q`~B%Eb&Pc=Z19QGo$pnhyU+Nb(I7v`(@4g#)B4>R@7h4|QwftOw*_LY z-F(UXj`PW11V@0kM)C6Lx$#JBx2auG&Sqx9k1jhqn@i%3RK%IyG-GOt#r>`!asMzl ztUTu_nE?OQn>XG&@ATot+b&pH%c|7iTa<44CoPQneq9_eGuFJ*GSzqTnNz9;yxHC6 zy!ux!Iw=?7bDD$l+-g{Bv|qzDqGDL>!scGpKALYEl;?iqd;Y90)FGvEsrPYj)F_Ao zWJtsXUuXJEeOL=zHxynJu;_0&EL~<=k?3BFdxX$@QIp-%i%wtPLjB*y>pxF3G8U$F zW~~A#+Sk|D*({!_TwJm5M!7AXII*NeUJ*~k9}(fz+rPb_P#uZC|CJ*^{FHY z`DlX4>Oisl+p0rJ7wTZhqoc(r>OKFivjE@-A7u0SK|*(3>UvI(2A#{$Q+?=)T}#b~ zg}RB$k@*a~=!XyEn8n)nq{^mMlOfddb5@FT}tpMoQf+l#EDW>pHAMVg2 z!%FM(5o?+0O%~}|0;Fa-J#oniC8jVSTm5tw8SorWKb=BG~MW&>*r4}ty zc3oX1Y>gTh78Z){1;C|jtR0ZjUc;dvUsva!_1Y*gg_RMx}!n6o!F{@@mm% zB}i5cU3a~xw0nj*wZdakdN{R~sQG?%r17M)&~m^PiixA9qZ1I6i}bcqSlYl_PBv^} zxNbQwd5)mvqz|Q0-viRD@3_<+sgK$;RV37r8}+}GJJVo6kpK$7jIGj?+6WHOS}^h_?@3?Sg{crk_ZU38R{du^xn{Q=_)aqdx9GK7 z6uzHPA-|Osett-_=H6Lq`V5!QbdT@L^dYCee&76u|vCpPHE_V-QTxTSC7w7N!G2i z=>ecx>>6lLIqiKqD$+Yl5XkqgLiPf@M}m85nK2<=bvRmbb}%i-_A|Y>R?`EY`^sky z%daO2a)cqcIn6!$h}V37IbC9X)Os;|nJrU?PyH`z8P5Ws5=udK@^TRfVoOp(kLGfJ3{ zFnum}tjjtll}BK`B|HmO>VYJFdI|^4%wB{P;u8>rS$xzkXu=aP-YgIZD@VyMggjnJ zv6@`Dt$;w-3)StMqpc-P=#0p)znzalfqXmg)J_)NT6RywDs<0fsuQY|-&vjPBmqlf zVP(;eF$CsEx2q!oco7h1CYw-v_O?taZ1%ja5-Q9tq&Jz9C^)7D=NQZ1>dL7mfJcah z9H3-?Y=r1dW^s}3@$pu~d2a#z5$OZ4MC>JvZbo;Ty#bkP+Q6?S$3vlY&SlSy8fpC%0D2=JOci~8)_0>{VU&~a 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 literal 0 HcmV?d00001 diff --git a/screenshots/series-scatter.png b/screenshots/series-scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3f8953d5f860502cdfc74d94c0b1514ebb0c81 GIT binary patch literal 77002 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 literal 0 HcmV?d00001 diff --git a/screenshots/series-window.png b/screenshots/series-window.png new file mode 100644 index 0000000000000000000000000000000000000000..f50a76c0ca86e44efbbce2ebcf3864e982c9319e GIT binary patch literal 202728 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 s.index), [0, 1, 2]); + expect(slices[0].sweepAngle, closeTo(math.pi, 1e-9)); + expect(slices[1].sweepAngle, closeTo(math.pi / 2, 1e-9)); + expect(slices[1].startAngle, closeTo(math.pi, 1e-9)); + expect(slices[2].startAngle, closeTo(math.pi * 1.5, 1e-9)); + }); + + test( + 'sections worth nothing are left out, and nothing at all lays out ' + 'as nothing', () { + final some = layOutPie( + sections: const [ + PieSection(value: 1), + PieSection(value: 0), + PieSection(value: 1), + ], + radius: 50, + innerRadius: 0, + ); + expect(some.map((s) => s.index), [0, 2]); + + expect( + layOutPie( + sections: const [PieSection(value: 0)], + radius: 50, + innerRadius: 0, + ), + isEmpty, + ); + }); + + test('going anticlockwise mirrors the sections about the start', () { + final back = layOutPie( + sections: sections, + radius: 100, + innerRadius: 0, + startAngle: 0, + clockwise: false, + ); + // The first section ends where a clockwise one would have started. + expect(back[0].startAngle + back[0].sweepAngle, closeTo(0, 1e-9)); + expect(back[1].startAngle + back[1].sweepAngle, closeTo(-math.pi, 1e-9)); + }); + + test('the animation sweeps the sections open without moving them', () { + final half = layOutPie( + sections: sections, + radius: 100, + innerRadius: 0, + startAngle: 0, + animation: 0.5, + ); + expect(half[0].sweepAngle, closeTo(math.pi / 2, 1e-9)); + expect(half[1].startAngle, closeTo(math.pi, 1e-9)); + }); + + test('the space between sections is taken off each of them', () { + final spaced = layOutPie( + sections: sections, + radius: 100, + innerRadius: 0, + startAngle: 0, + space: 10, + ); + expect(spaced[0].sweepAngle, closeTo(math.pi - 0.1, 1e-9)); + expect(spaced[0].startAngle, closeTo(0.05, 1e-9)); + }); + }); + + group('what a touch on a pie lands on', () { + final slices = layOutPie( + sections: const [PieSection(value: 1), PieSection(value: 1)], + radius: 100, + innerRadius: 40, + startAngle: 0, + ); + const centre = Offset(100, 100); + + test('a point in a section names it', () { + expect( + pieSectionAt( + local: centre + const Offset(60, 20), + centre: centre, + slices: slices, + ), + 0, + ); + expect( + pieSectionAt( + local: centre + const Offset(-60, -20), + centre: centre, + slices: slices, + ), + 1, + ); + }); + + test('the hole and the space outside name nothing', () { + expect( + pieSectionAt(local: centre, centre: centre, slices: slices), + isNull, + ); + expect( + pieSectionAt( + local: centre + const Offset(200, 0), + centre: centre, + slices: slices, + ), + isNull, + ); + }); + + test('a section that crosses three o\'clock still matches', () { + final wrapped = layOutPie( + sections: const [PieSection(value: 1)], + radius: 100, + innerRadius: 0, + startAngle: -math.pi / 4, + ); + expect( + pieSectionAt( + local: centre + const Offset(50, 1), + centre: centre, + slices: wrapped, + ), + 0, + ); + }); + }); + + group('radar geometry', () { + test('features are spread evenly, the first at twelve o\'clock', () { + const centre = Offset(100, 100); + final top = radarCorner( + centre: centre, + radius: 50, + count: 4, + index: 0, + ); + final right = radarCorner( + centre: centre, + radius: 50, + count: 4, + index: 1, + ); + expect(top.dx, closeTo(100, 1e-9)); + expect(top.dy, closeTo(50, 1e-9)); + expect(right.dx, closeTo(150, 1e-9)); + expect(right.dy, closeTo(100, 1e-9)); + }); + + test('a value is placed between the middle and the outer ring', () { + const layout = RadarLayout( + centre: Offset.zero, + radius: 100, + count: 5, + minValue: 0, + maxValue: 10, + startAngle: 0, + ); + expect(layout.radiusFor(0), 0); + expect(layout.radiusFor(5), 50); + expect(layout.radiusFor(10), 100); + // Values beyond the range are held at the edge rather than drawn off it. + expect(layout.radiusFor(20), 100); + expect(layout.radiusFor(-5), 0); + }); + }); + + group('the widgets', () { + testWidgets('a pie draws its sections and answers a tap', (tester) async { + final touched = []; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 200, + height: 200, + child: PieChart( + sections: const [ + PieSection(value: 1, color: Color(0xFF00FF00), label: 'a'), + PieSection(value: 1, color: Color(0xFF0000FF), label: 'b'), + ], + centerSpaceRadius: 20, + centerChild: const Text('mid'), + onTouch: touched.add, + ), + ), + ), + ), + ); + + expect(find.text('mid'), findsOneWidget); + expect(find.byType(CustomPaint), findsWidgets); + + // Right of the middle is the first section, which starts at twelve. + await tester.tapAt( + tester.getCenter(find.byType(PieChart)) + const Offset(60, 10)); + await tester.pump(); + expect(touched.first?.index, 0); + }); + + testWidgets('a radar reports the corner under a tap', (tester) async { + final touched = []; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 300, + height: 300, + child: RadarChart( + features: const ['a', 'b', 'c', 'd'], + series: const [ + RadarSeries(values: [10, 5, 5, 5]), + ], + minValue: 0, + maxValue: 10, + radius: 100, + onTouch: touched.add, + ), + ), + ), + ), + ); + + final centre = tester.getCenter(find.byType(RadarChart)); + final top = Offset(centre.dx, centre.dy - 100); + await tester.tapAt(top); + await tester.pump(); + expect(touched.first?.featureIndex, 0); + expect(touched.first?.value, 10); + }); + + testWidgets('a radar with no features still draws', (tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: SizedBox( + width: 200, + height: 200, + child: RadarChart( + series: [ + RadarSeries(values: [1, 2, 3]), + ], + ), + ), + ), + ); + expect(tester.takeException(), isNull); + }); + }); +} diff --git a/test/series_extras_test.dart b/test/series_extras_test.dart new file mode 100644 index 0000000..d1640f9 --- /dev/null +++ b/test/series_extras_test.dart @@ -0,0 +1,447 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:ohlcv_chart/ohlcv_chart.dart'; +import 'package:ohlcv_chart/src/renderer/text_painter_cache.dart'; +import 'package:ohlcv_chart/src/series/series_chart_painter.dart'; +import 'package:ohlcv_chart/src/series/series_paths.dart'; +import 'package:ohlcv_chart/src/series/series_scale.dart'; + +/// Records the geometry that actually reached the canvas. +class Recorder implements Canvas { + final List paths = []; + final List rrects = []; + final List rects = []; + final List<(Offset, Offset)> lines = []; + int labels = 0; + + @override + void drawPath(Path path, Paint paint) => paths.add(path.getBounds()); + @override + void drawRRect(RRect rrect, Paint paint) => rrects.add(rrect); + @override + void drawRect(Rect rect, Paint paint) => rects.add(rect); + @override + void drawLine(Offset a, Offset b, Paint paint) => lines.add((a, b)); + @override + void drawParagraph(Paragraph paragraph, Offset offset) => labels++; + @override + void noSuchMethod(Invocation invocation) {} +} + +Recorder paintChart( + List series, { + SeriesOrientation orientation = SeriesOrientation.vertical, + List betweenFills = const [], + SeriesXAxis xAxis = const SeriesXAxis(), + SeriesYAxis yAxis = const SeriesYAxis(), + Size size = const Size(200, 100), +}) { + final values = [ + for (final s in series) [for (final p in s.points) p.isGap ? null : p.y], + ]; + final viewport = fitSeriesViewport( + series: series, + values: values, + xAxis: xAxis, + yAxis: yAxis, + ); + final geometry = SeriesGeometry.layout( + size: size, + padding: EdgeInsets.zero, + xAxis: xAxis, + yAxis: yAxis, + viewport: viewport, + orientation: orientation, + ); + final recorder = Recorder(); + SeriesChartPainter( + geometry: geometry, + series: series, + values: values, + xAxis: xAxis, + yAxis: yAxis, + grid: SeriesGrid.none, + border: null, + referenceLines: const [], + bands: const [], + betweenFills: betweenFills, + backgroundColor: null, + clipToPlot: true, + textCache: TextPainterCache(capacity: 16), + ).paint(recorder, size); + return recorder; +} + +void main() { + group('a horizontal chart', () { + test('runs its x axis down the plot and grows its values rightwards', () { + const viewport = SeriesViewport( + minX: 0, + maxX: 10, + minY: 0, + maxY: 100, + xTicks: [], + yTicks: [], + yStep: 10, + ); + final geometry = SeriesGeometry( + size: const Size(200, 100), + plot: const Rect.fromLTRB(0, 0, 200, 100), + viewport: viewport, + orientation: SeriesOrientation.horizontal, + ); + + expect(geometry.point(0, 0), const Offset(0, 0)); + expect(geometry.point(10, 100), const Offset(200, 100)); + expect(geometry.point(5, 50), const Offset(100, 50)); + // The x under a touch is read down the chart, not across it. + expect(geometry.pxToXAt(const Offset(180, 50)), 5); + }); + + test( + 'lays the value axis along the bottom and the x axis down the ' + 'left', () { + final geometry = SeriesGeometry.layout( + size: const Size(200, 100), + padding: EdgeInsets.zero, + xAxis: const SeriesXAxis(height: 30), + yAxis: const SeriesYAxis(), + viewport: const SeriesViewport( + minX: 0, + maxX: 1, + minY: 0, + maxY: 1, + xTicks: [], + yTicks: [], + yStep: 1, + ), + orientation: SeriesOrientation.horizontal, + ); + expect(geometry.plot.left, 30); + expect(geometry.plot.right, 200); + expect(geometry.plot.top, 0); + expect(geometry.plot.bottom, lessThan(100)); + }); + + test('grows its bars rightwards from the baseline', () { + final recorder = paintChart( + [ + BarSeries.values(const [1, 2], color: const Color(0xFF00FF00)), + ], + orientation: SeriesOrientation.horizontal, + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + ); + expect(recorder.paths, hasLength(1)); + final bars = recorder.paths.single; + expect(bars.left, 0); + // The bars run rightwards out of the baseline rather than upwards. + expect(bars.right, greaterThan(100)); + expect(bars.height, lessThan(100)); + }); + }); + + group('stacked bars', () { + final lower = BarSeries.values(const [2, 2], stack: 'a'); + final upper = BarSeries.values(const [3, 1], stack: 'a'); + + test('a bar starts where the ones under it ended', () { + final values = [ + [2.0, 2.0], + [3.0, 1.0], + ]; + expect(stackedBase([lower, upper], values, 0, 0), 0); + expect(stackedBase([lower, upper], values, 1, 0), 2); + expect(stackedBase([lower, upper], values, 1, 1), 2); + }); + + test('the value range reaches the top of the stack', () { + final viewport = fitSeriesViewport( + series: [lower, upper], + values: [ + [2.0, 2.0], + [3.0, 1.0], + ], + xAxis: const SeriesXAxis(), + yAxis: const SeriesYAxis(), + yPadding: 0, + ); + expect(viewport.maxY, greaterThanOrEqualTo(5)); + }); + + test('bars below the baseline stack downwards', () { + final down = [ + BarSeries.values(const [-2], stack: 'a'), + BarSeries.values(const [-3], stack: 'a'), + ]; + final values = [ + [-2.0], + [-3.0], + ]; + expect(stackedBase(down, values, 1, 0), -2); + }); + + test('a stack stands in one place rather than side by side', () { + final stacked = paintChart([ + BarSeries.values(const [1, 1], + stack: 'a', color: const Color(0xFF110000)), + BarSeries.values(const [1, 1], + stack: 'a', color: const Color(0xFF220000)), + ], xAxis: SeriesXAxis.hidden, yAxis: SeriesYAxis.hidden); + final beside = paintChart([ + BarSeries.values(const [1, 1], color: const Color(0xFF110000)), + BarSeries.values(const [1, 1], color: const Color(0xFF220000)), + ], xAxis: SeriesXAxis.hidden, yAxis: SeriesYAxis.hidden); + + expect(stacked.paths[0].center.dx, stacked.paths[1].center.dx); + expect( + beside.paths[0].center.dx, + isNot(closeTo(beside.paths[1].center.dx, 1)), + ); + }); + }); + + group('floating bars and error bars', () { + test('a bar with a low runs between its two ends', () { + final recorder = paintChart([ + const BarSeries( + points: [SeriesPoint(0, 8, low: 4)], + color: Color(0xFF00FF00), + ), + ], xAxis: SeriesXAxis.hidden, yAxis: SeriesYAxis.hidden); + + final bar = recorder.paths.single; + expect(bar.top, greaterThan(0)); + expect(bar.bottom, lessThan(100)); + }); + + test('the value range takes in the low end', () { + final viewport = fitSeriesViewport( + series: const [ + BarSeries(points: [SeriesPoint(0, 8, low: 4)]), + ], + values: const [ + [8.0], + ], + xAxis: const SeriesXAxis(), + yAxis: const SeriesYAxis(), + yPadding: 0, + niceYRange: false, + ); + expect(viewport.minY, lessThanOrEqualTo(0)); + expect(viewport.maxY, greaterThanOrEqualTo(8)); + }); + + test('an error range draws a bar with a cap at either end', () { + final recorder = paintChart([ + const ScatterSeries( + points: [ + SeriesPoint(0, 5, yError: SeriesErrorRange.symmetric(1)), + ], + ), + ], xAxis: SeriesXAxis.hidden, yAxis: SeriesYAxis.hidden); + + // The bar itself and one cap at each end. + expect(recorder.lines, hasLength(3)); + final (from, to) = recorder.lines.first; + expect(from.dx, closeTo(to.dx, 1e-9)); + expect(from.dy, greaterThan(to.dy)); + }); + + test('the value range makes room for the error ranges', () { + final viewport = fitSeriesViewport( + series: const [ + ScatterSeries( + points: [SeriesPoint(0, 5, yError: SeriesErrorRange(2, 3))], + ), + ], + values: const [ + [5.0], + ], + xAxis: const SeriesXAxis(), + yAxis: const SeriesYAxis(), + yPadding: 0, + niceYRange: false, + ); + expect(viewport.maxY, greaterThanOrEqualTo(8)); + }); + }); + + group('scatter', () { + testWidgets('a touch picks the dot under the finger, not the whole x', ( + tester, + ) async { + final reported = []; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 200, + height: 200, + child: SeriesChart( + series: const [ + ScatterSeries( + points: [SeriesPoint(0, 0), SeriesPoint(0, 10)], + ), + ], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + minY: 0, + maxY: 10, + niceYRange: false, + yPadding: 0, + touch: const SeriesTouch( + snap: SeriesTouchSnap.nearestPoint, + trigger: SeriesTouchTrigger.press, + ), + onTouch: reported.add, + ), + ), + ), + ), + ); + + final chart = tester.getRect(find.byType(SeriesChart)); + // The top of the plot is the point at 10, the bottom the one at 0. + await tester.startGesture(chart.topLeft + const Offset(2, 2)); + await tester.pumpAndSettle(); + + expect(reported, isNotEmpty); + final details = reported.whereType().first; + expect(details.values, hasLength(1)); + expect(details.values.single.pointIndex, 1); + expect(details.values.single.value, 10); + }); + }); + + group('lines', () { + test('a step changes value where its step position says', () { + const points = [Offset(0, 10), Offset(10, 0)]; + final late = seriesRunPath(points, LineCurve.step).getBounds(); + final middle = seriesRunPath( + points, + LineCurve.step, + stepPosition: 0.5, + ).getBounds(); + expect(late, middle); + + // Where the corner sits is what changes, so the paths differ in metric + // length rather than in their bounds. + expect( + seriesRunPath(points, LineCurve.step, stepPosition: 0) + .computeMetrics() + .first + .length, + closeTo(20, 1e-6), + ); + }); + + test('a fill between two lines covers the gap between them', () { + final recorder = paintChart( + [ + LineSeries.values(const [10, 10], width: 0), + LineSeries.values(const [0, 0], width: 0), + ], + betweenFills: const [ + SeriesBetweenFill(from: 0, to: 1, color: Color(0x8800FF00)), + ], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + ); + expect(recorder.paths, hasLength(1)); + expect(recorder.paths.single.width, closeTo(200, 1)); + }); + + test('a fill naming a series that is not there is left out', () { + final recorder = paintChart( + [ + LineSeries.values(const [1, 2], width: 0), + ], + betweenFills: const [ + SeriesBetweenFill(from: 0, to: 4, color: Color(0x8800FF00)), + ], + xAxis: SeriesXAxis.hidden, + yAxis: SeriesYAxis.hidden, + ); + expect(recorder.paths, isEmpty); + }); + }); + + group('axis titles', () { + testWidgets('each axis writes its name beyond its labels', (tester) async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 300, + height: 200, + child: SeriesChart( + series: [ + LineSeries.values(const [1, 2, 3]), + ], + xAxis: const SeriesXAxis(title: 'Day'), + yAxis: const SeriesYAxis(title: 'Balance'), + ), + ), + ), + ), + ); + expect(tester.takeException(), isNull); + }); + + test('a title takes room off the plot', () { + const viewport = SeriesViewport( + minX: 0, + maxX: 1, + minY: 0, + maxY: 1, + xTicks: [], + yTicks: [], + yStep: 1, + ); + final plain = SeriesGeometry.layout( + size: const Size(200, 100), + padding: EdgeInsets.zero, + xAxis: const SeriesXAxis(), + yAxis: const SeriesYAxis(), + viewport: viewport, + ); + final titled = SeriesGeometry.layout( + size: const Size(200, 100), + padding: EdgeInsets.zero, + xAxis: const SeriesXAxis(title: 'Day'), + yAxis: const SeriesYAxis(title: 'Balance'), + viewport: viewport, + ); + expect(titled.plot.width, lessThan(plain.plot.width)); + expect(titled.plot.height, lessThan(plain.plot.height)); + }); + + test('an axis on the far side leaves its room on that side', () { + const viewport = SeriesViewport( + minX: 0, + maxX: 1, + minY: 0, + maxY: 1, + xTicks: [], + yTicks: [], + yStep: 1, + ); + final flipped = SeriesGeometry.layout( + size: const Size(200, 100), + padding: EdgeInsets.zero, + xAxis: const SeriesXAxis(side: SeriesXSide.top, height: 20), + yAxis: const SeriesYAxis(side: SeriesAxisSide.right, width: 40), + viewport: viewport, + ); + expect(flipped.plot.left, 0); + expect(flipped.plot.right, 160); + expect(flipped.plot.top, 20); + expect(flipped.plot.bottom, 100); + }); + }); +} From fe5c178c6f445da87bff1f00e9444f2c2901c91a Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 13:47:03 +0330 Subject: [PATCH 09/10] feat: add HeatmapChart, a grid of squares coloured by their value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A table of numbers hides what a heatmap says at a glance: which hour of which weekday is busy, which pair of instruments moves together, which weeks of the year went quiet. The package could draw the line, the bar, the pie and the radar, but not that. It takes a matrix — rows of columns — or sparse `HeatmapCell`s where the data has holes in it, and colours each square through a `HeatmapGradientScale` that fades between colours or a `HeatmapStepScale` that paints whole bands. The range is fitted from the cells, or pinned with `minValue` and `maxValue`, which is what keeps two heatmaps beside each other comparable. Three decisions worth knowing about. A square with no cell is drawn empty and still answers a touch, reporting a null value, because "nothing happened here" is an answer rather than a missed tap. A label inside a square is written in black or white by how dark that square is, and is dropped when it will not fit rather than spilling over its neighbour. `squareCells` holds the squares square, which is the whole difference between a contribution graph and a row of coloured columns. `HeatmapAxis` names the columns and the rows on either side, every nth one when there is no room for all of them; `HeatmapLegend` draws the scale as a bar; and `HeatmapLayout` is public, like the pie and radar geometry before it, so where a square lands can be tested or reused to put a widget on it. Co-Authored-By: Claude Opus 5 --- doc/README.md | 3 + doc/heatmap-chart.md | 122 +++++ example/README.md | 4 +- example/lib/src/series_page.dart | 52 ++ example/tool/screenshots.dart | 118 ++++ lib/src/export.dart | 2 + lib/src/heatmap/heatmap_chart.dart | 831 +++++++++++++++++++++++++++++ lib/src/heatmap/heatmap_data.dart | 195 +++++++ screenshots/heatmap.png | Bin 0 -> 141000 bytes test/heatmap_test.dart | 265 +++++++++ 10 files changed, 1591 insertions(+), 1 deletion(-) create mode 100644 doc/heatmap-chart.md create mode 100644 lib/src/heatmap/heatmap_chart.dart create mode 100644 lib/src/heatmap/heatmap_data.dart create mode 100644 screenshots/heatmap.png create mode 100644 test/heatmap_test.dart diff --git a/doc/README.md b/doc/README.md index dddd0ef..39fec3f 100644 --- a/doc/README.md +++ b/doc/README.md @@ -21,6 +21,9 @@ For installation, the feature list and support, see the - **[Radar chart](radar-chart.md)** — `RadarChart`: a web of features with one outline per series, drawn as a polygon or as rings. + +- **[Heatmap](heatmap-chart.md)** — `HeatmapChart`: a grid of squares coloured + by their value, with a scale, a legend and a readout per square. - **[Migrating from fl_chart and candlesticks](migrating-from-fl_chart.md)** — their APIs mapped onto this package's, with worked examples. diff --git a/doc/heatmap-chart.md b/doc/heatmap-chart.md new file mode 100644 index 0000000..d0bfb88 --- /dev/null +++ b/doc/heatmap-chart.md @@ -0,0 +1,122 @@ +# Heatmap + +![Six months of activity as a contribution graph, beside orders by hour and weekday](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/heatmap.png) + +`HeatmapChart` draws a grid of squares coloured by their value — the thing a +table of numbers hides. A contribution graph, a correlation matrix, sales by +weekday and hour, a risk grid. + +```dart +HeatmapChart.matrix( + byHourAndDay, // a list of rows, each a list of columns + scale: HeatmapGradientScale.of(green), + xAxis: const HeatmapAxis(labels: dayNames), + yAxis: const HeatmapAxis(labels: hourNames, size: 34), + spacing: 3, + radius: 3, +); +``` + +The chart fills the box it is given, and is `defaultHeight` high in a box with +no height of its own. + +## The squares + +`HeatmapChart.matrix` reads a list of rows, each holding its columns — a row +shorter than the widest one simply has no squares past its end. Give the cells +yourself when the data is sparse, or when a square needs a colour or a label +of its own: + +```dart +HeatmapChart( + cells: [ + for (final day in days) + HeatmapCell(x: day.week, y: day.weekday, value: day.commits), + const HeatmapCell(x: 9, y: 3, value: 12, color: amber, label: 'ship'), + ], + columns: 53, + rows: 7, +); +``` + +A cell with a `null` value is empty and takes the scale's `emptyColor`, which +is what a month that has not happened yet should look like. Two cells at the +same position draw the later one. `columns` and `rows` are fitted from the +cells unless they are given, so a grid that must keep its shape while the data +fills in should name them. + +## Colour + +| Scale | Draws | +| --- | --- | +| `HeatmapGradientScale(colors: [...], stops: [...])` | a fade through the colours, spread over the value range | +| `HeatmapGradientScale.of(color)` | one colour deepening from faint to full — the contribution graph | +| `HeatmapStepScale(steps: [HeatmapStep(from, color)])` | whole bands: under 0, 0 to 5, 5 and up | + +The range the scale is spread over is the lowest and highest value among the +cells, or `minValue` and `maxValue` when those are set — which is what keeps +two heatmaps beside each other comparable. + +A `HeatmapCell.color` overrules the scale for that one square. + +## Labels + +`HeatmapAxis` names the columns and the rows: + +```dart +HeatmapChart( + cells: cells, + xAxis: const HeatmapAxis(labels: months, interval: 2), + yAxis: const HeatmapAxis(labels: weekdays, size: 34), +); +``` + +| Field | What it does | +| --- | --- | +| `labels`, `labelBuilder` | What each column or row is called | +| `interval` | Label only every nth one | +| `side` | `start` — under the grid, or left of it — or `end` | +| `size`, `gap`, `style` | The room held, the space before it, and the text | + +`HeatmapAxis.hidden` removes an axis along with its room. + +`labelBuilder` on the chart writes inside the squares, and a `HeatmapCell`'s +own `label` wins over it. With no `labelStyle` the text is black or white by +how dark its square is, and a label too big for its square is left out rather +than drawn over the next one. + +## Touch + +A touch or a hovering mouse names the square under it. `hoverBorder` marks it, +`onTouch` reports it — column, row, cell and the square in pixels — and +`tooltipBuilder` puts a card above it: + +```dart +HeatmapChart( + cells: cells, + onTouch: (details) => setState(() => reading = details), + tooltipBuilder: (context, details) => Card( + child: Text('${days[details.x]}: ${details.value ?? 0}'), + ), +); +``` + +A square with no cell still reports itself, with a `null` cell and value, so an +empty day reads as "nothing here" rather than as no touch at all. + +## The legend + +`HeatmapLegend` draws the scale as a bar, with a word at either end: + +```dart +HeatmapLegend(scale: scale, low: 'Less', high: 'More', width: 90); +``` + +Left without a `width` it fills the row it is in. + +## Shape and animation + +`squareCells` keeps the squares square, leaving the grid smaller than the box +when the two are not the same shape — a contribution graph wants this. With +`animationDuration` set, the squares come up from the empty colour to their +own. diff --git a/example/README.md b/example/README.md index fa4d8a6..63e54e1 100644 --- a/example/README.md +++ b/example/README.md @@ -87,8 +87,10 @@ and how far either side of the mid to look. slice pushes it out and names it. - **Two strategies scored** — a `RadarChart` over five measures, reporting the corner under the pointer. +- **Orders by hour and weekday** — a `HeatmapChart` with a legend under it; the + card title reads out the square under the pointer. -All eight follow the palette switch in the app bar. +All nine follow the palette switch in the app bar. ## The intraday demo diff --git a/example/lib/src/series_page.dart b/example/lib/src/series_page.dart index e4868da..3a1cae9 100644 --- a/example/lib/src/series_page.dart +++ b/example/lib/src/series_page.dart @@ -77,6 +77,22 @@ class _SeriesPageState extends State { int? _slice; String? _corner; + HeatmapTouchDetails? _square; + + /// Orders per weekday and hour of the day, for the heatmap. + static final _byHourAndDay = [ + for (var hour = 0; hour < 12; hour++) + [ + for (var day = 0; day < 7; day++) + hour < 2 && day > 4 + ? null + : (math.sin(hour / 2.4) + 1.4) * + (math.cos(day / 2.1 + 1) + 1.6) * + 14 + + (hour * day % 5) * 2.0, + ], + ]; + static const _weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; static String _usd(double v) => '\$${v.abs() >= 1000 ? '${(v / 1000).toStringAsFixed(1)}k' : v.toStringAsFixed(0)}'; @@ -421,6 +437,42 @@ class _SeriesPageState extends State { ), ), ]), + _card( + context, + paper, + grid, + _square == null + ? 'Orders by hour and weekday' + : '${_weekdays[_square!.x]} ' + '${(_square!.y + 9).toString().padLeft(2, '0')}:00 — ' + '${_square!.value?.round() ?? 0} orders', + [ + SizedBox( + height: 280, + child: HeatmapChart.matrix( + _byHourAndDay, + scale: HeatmapGradientScale.of(_blue), + xAxis: const HeatmapAxis(labels: _weekdays), + yAxis: HeatmapAxis( + size: 36, + labelBuilder: (index) => + '${(index + 9).toString().padLeft(2, '0')}:00', + ), + spacing: 3, + radius: 3, + onTouch: (d) => setState(() => _square = d), + animationDuration: const Duration(milliseconds: 500), + ), + ), + const SizedBox(height: 10), + HeatmapLegend( + scale: HeatmapGradientScale.of(_blue), + low: 'Quiet', + high: 'Busy', + width: 120, + ), + ], + ), _card( context, paper, diff --git a/example/tool/screenshots.dart b/example/tool/screenshots.dart index fd8de94..35253ce 100644 --- a/example/tool/screenshots.dart +++ b/example/tool/screenshots.dart @@ -1632,6 +1632,13 @@ List buildScenes() { act: null, build: pieRadarScene, ), + ( + // A grid coloured by value: months of activity, and a week of hours. + name: 'heatmap', + size: shortWide, + act: null, + build: heatmapScene, + ), ( // Dots placed freely on both axes, read out one at a time. name: 'series-scatter', @@ -2349,6 +2356,117 @@ Widget seriesPanelsScene() { } /// Candles under a watermark that is a widget: an icon and a name. +/// Half a year of activity beside a week of trading hours, both by value. +Widget heatmapScene() { + // A contribution graph: a column per week, a row per weekday. + const weeks = 26; + final activity = [ + for (var weekday = 0; weekday < 7; weekday++) + [ + for (var week = 0; week < weeks; week++) + weekday >= 5 && week % 3 == 0 + ? null + : (sin(week / 3.3) + 1.2) * (cos(weekday / 1.9) + 1.3) * 3 + + (week * weekday % 4), + ], + ]; + final byHourAndDay = [ + for (var hour = 0; hour < 8; hour++) + [ + for (var day = 0; day < 5; day++) + (sin(hour / 2.2) + 1.4) * (cos(day / 2.4 + 1) + 1.5) * 16 + + (hour * day % 5) * 3.0, + ], + ]; + + return ColoredBox( + color: _seriesBackground, + child: Padding( + padding: const EdgeInsets.all(6), + child: Row( + children: [ + Expanded( + flex: 3, + child: seriesPanel( + 'Six months of activity', + figure: '1,284 trades', + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Square cells leave the grid shorter than the panel, so it + // is given the height it actually needs and centred. + SizedBox( + height: 210, + child: HeatmapChart.matrix( + activity, + scale: HeatmapGradientScale.of(_seriesGreen), + xAxis: HeatmapAxis( + interval: 5, + style: _seriesAxis, + labelBuilder: (index) => + _seriesMonths[(index ~/ 4.4).clamp(0, 11).toInt()], + ), + yAxis: const HeatmapAxis( + size: 30, + interval: 2, + style: _seriesAxis, + labels: ['Mon', '', 'Wed', '', 'Fri', '', 'Sun'], + ), + spacing: 3, + radius: 2, + // A contribution graph wants squares, not columns. + squareCells: true, + ), + ), + const SizedBox(height: 12), + Row( + children: [ + const Spacer(), + HeatmapLegend( + scale: HeatmapGradientScale.of(_seriesGreen), + low: 'Less', + high: 'More', + labelStyle: _seriesAxis, + width: 90, + ), + ], + ), + ], + ), + ), + ), + Expanded( + flex: 2, + child: seriesPanel( + 'Orders by hour and weekday', + HeatmapChart.matrix( + byHourAndDay, + scale: const HeatmapGradientScale( + colors: [_seriesPaper, _seriesBlue, _seriesAmber], + ), + xAxis: const HeatmapAxis( + style: _seriesAxis, + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + ), + yAxis: HeatmapAxis( + size: 36, + style: _seriesAxis, + labelBuilder: (index) => + '${(index + 9).toString().padLeft(2, '0')}:00', + ), + spacing: 3, + radius: 3, + labelBuilder: (cell) => cell.value!.round().toString(), + ), + ), + ), + ], + ), + ), + ); +} + /// Two panels the axis charts cannot draw: a doughnut and a radar web. Widget pieRadarScene() { const holdings = [42.0, 26.0, 18.0, 14.0]; diff --git a/lib/src/export.dart b/lib/src/export.dart index 4b630a5..197d6c5 100644 --- a/lib/src/export.dart +++ b/lib/src/export.dart @@ -71,6 +71,8 @@ export './renderer/main_renderer.dart' show VerticalTextAlignment; export './utils/axis_ticks.dart'; export './utils/candle_transforms.dart'; export './utils/data_util.dart'; +export './heatmap/heatmap_chart.dart'; +export './heatmap/heatmap_data.dart'; export './pie/pie_chart.dart'; export './radar/radar_chart.dart'; export './series/series_axis.dart' diff --git a/lib/src/heatmap/heatmap_chart.dart b/lib/src/heatmap/heatmap_chart.dart new file mode 100644 index 0000000..2ede9cb --- /dev/null +++ b/lib/src/heatmap/heatmap_chart.dart @@ -0,0 +1,831 @@ +import 'dart:math' as math; + +import 'package:flutter/widgets.dart'; + +import '../renderer/text_painter_cache.dart'; +import '../series/series_axis.dart'; +import 'heatmap_data.dart'; + +/// Which side of the grid an axis's labels sit on. +enum HeatmapAxisSide { + /// Under the grid, for the columns; to the left of it, for the rows. + start, + + /// Over the grid, for the columns; to the right of it, for the rows. + end, +} + +/// The labels down one side of a [HeatmapChart]. +@immutable +class HeatmapAxis { + /// Creates an axis. + const HeatmapAxis({ + this.labels = const [], + this.labelBuilder, + this.show = true, + this.size = 24, + this.side = HeatmapAxisSide.start, + this.style, + this.gap = 4, + this.interval = 1, + }); + + /// No labels and no room held for them. + static const hidden = HeatmapAxis(show: false, size: 0); + + /// A label per column or row; a blank one prints nothing. + final List labels; + + /// Writes the label for a column or row from its index; it wins over + /// [labels]. + final String? Function(int index)? labelBuilder; + + /// Whether labels are drawn and room is held for them. + final bool show; + + /// Room held for the labels, across the axis. + final double size; + + /// Which side of the grid they sit on. + final HeatmapAxisSide side; + + /// Style of the labels. + final TextStyle? style; + + /// Space between the grid and the labels. + final double gap; + + /// Label only every nth column or row. + final int interval; + + /// The label for [index], or null when there is none. + String? labelFor(int index) { + if (!show) return null; + if (interval > 1 && index % interval != 0) return null; + final builder = labelBuilder; + if (builder != null) return builder(index); + return index >= 0 && index < labels.length ? labels[index] : null; + } + + /// How much room this axis takes, counting its gap. + double get room => show ? size + gap : 0; +} + +/// Where a heatmap's grid sits, and which square is where. +@immutable +class HeatmapLayout { + /// Creates the layout of a [rows] by [columns] grid filling [grid]. + const HeatmapLayout({ + required this.grid, + required this.rows, + required this.columns, + this.spacing = 0, + }); + + /// The whole grid, labels excluded. + final Rect grid; + + /// How many rows it has. + final int rows; + + /// How many columns it has. + final int columns; + + /// The gap left between two squares. + final double spacing; + + /// How wide one column is, gap included. + double get columnWidth => columns <= 0 ? 0 : grid.width / columns; + + /// How tall one row is, gap included. + double get rowHeight => rows <= 0 ? 0 : grid.height / rows; + + /// The square at column [x], row [y]. + Rect cellRect(int x, int y) => Rect.fromLTWH( + grid.left + x * columnWidth, + grid.top + y * rowHeight, + columnWidth, + rowHeight, + ).deflate(spacing / 2); + + /// The square under [local], or null when it is off the grid. + (int, int)? cellAt(Offset local) { + if (columns <= 0 || rows <= 0 || !grid.contains(local)) return null; + final x = ((local.dx - grid.left) / columnWidth).floor(); + final y = ((local.dy - grid.top) / rowHeight).floor(); + if (x < 0 || x >= columns || y < 0 || y >= rows) return null; + return (x, y); + } + + /// The middle of column [x], across the grid. + double columnCentre(int x) => grid.left + (x + 0.5) * columnWidth; + + /// The middle of row [y], down the grid. + double rowCentre(int y) => grid.top + (y + 0.5) * rowHeight; +} + +/// What a touch on a [HeatmapChart] landed on. +@immutable +class HeatmapTouchDetails { + /// Creates the details of a touch on the square at ([x], [y]). + const HeatmapTouchDetails({ + required this.x, + required this.y, + required this.cell, + required this.rect, + }); + + /// The column touched. + final int x; + + /// The row touched. + final int y; + + /// The cell there; null when that square has none. + final HeatmapCell? cell; + + /// The square, in the chart's local pixels. + final Rect rect; + + /// The value there, or null when the square is empty. + double? get value => cell?.value; +} + +/// A grid of squares coloured by their value — a heatmap. +/// +/// It draws what a table of numbers hides: a contribution graph, a +/// correlation matrix, sales by weekday and hour, a risk grid. +/// +/// ```dart +/// HeatmapChart( +/// cells: heatmapCellsOf(byHourAndDay), +/// scale: HeatmapGradientScale.of(green), +/// xAxis: const HeatmapAxis(labels: dayNames), +/// yAxis: const HeatmapAxis(labels: hourNames, size: 34), +/// spacing: 3, +/// radius: 3, +/// ); +/// ``` +/// +/// The chart fills the box it is given, and is [defaultHeight] high in a box +/// with no height of its own. +class HeatmapChart extends StatefulWidget { + /// Creates a heatmap of [cells]. + const HeatmapChart({ + super.key, + required this.cells, + this.columns, + this.rows, + this.scale = const HeatmapGradientScale( + colors: [Color(0x224C86CD), heatmapDefaultColor], + ), + this.minValue, + this.maxValue, + this.xAxis = const HeatmapAxis(), + this.yAxis = const HeatmapAxis(size: 30), + this.spacing = 2, + this.radius = 2, + this.squareCells = false, + this.border, + this.labelBuilder, + this.labelStyle, + this.hoverBorder = const BorderSide(color: Color(0xCCFFFFFF), width: 1.5), + this.onTouch, + this.tooltipBuilder, + this.tooltipMargin = 10, + this.animationDuration = Duration.zero, + this.animationCurve = Curves.easeOutCubic, + this.animateOnMount = true, + this.padding = EdgeInsets.zero, + this.backgroundColor, + this.defaultHeight = 220, + this.semanticLabel, + }); + + /// Creates a heatmap of [values], a list of rows each holding its columns. + HeatmapChart.matrix( + List> values, { + super.key, + this.columns, + this.rows, + this.scale = const HeatmapGradientScale( + colors: [Color(0x224C86CD), heatmapDefaultColor], + ), + this.minValue, + this.maxValue, + this.xAxis = const HeatmapAxis(), + this.yAxis = const HeatmapAxis(size: 30), + this.spacing = 2, + this.radius = 2, + this.squareCells = false, + this.border, + this.labelBuilder, + this.labelStyle, + this.hoverBorder = const BorderSide(color: Color(0xCCFFFFFF), width: 1.5), + this.onTouch, + this.tooltipBuilder, + this.tooltipMargin = 10, + this.animationDuration = Duration.zero, + this.animationCurve = Curves.easeOutCubic, + this.animateOnMount = true, + this.padding = EdgeInsets.zero, + this.backgroundColor, + this.defaultHeight = 220, + this.semanticLabel, + }) : cells = heatmapCellsOf(values); + + /// The squares, in any order; two cells at one position draw the later one. + final List cells; + + /// How many columns the grid has; null takes the widest cell plus one. + final int? columns; + + /// How many rows it has; null takes the lowest cell plus one. + final int? rows; + + /// What turns a value into a colour. + final HeatmapScale scale; + + /// The value the scale starts at; null takes the lowest cell. + final double? minValue; + + /// The value it reaches; null takes the highest cell. + final double? maxValue; + + /// The labels along the columns; [HeatmapAxis.hidden] for none. + final HeatmapAxis xAxis; + + /// The labels down the rows; [HeatmapAxis.hidden] for none. + final HeatmapAxis yAxis; + + /// The gap left between two squares. + final double spacing; + + /// The corner radius of a square. + final double radius; + + /// Whether the squares are kept square, which leaves the grid smaller than + /// the box when the two do not have the same shape. + final bool squareCells; + + /// An outline round every square. + final BorderSide? border; + + /// Writes what is printed in a square; [HeatmapCell.label] wins over it. + final String? Function(HeatmapCell cell)? labelBuilder; + + /// Style of the printed labels; null picks black or white per square, by + /// how dark the square is. + final TextStyle? labelStyle; + + /// Drawn round the square under the pointer; null marks none. + final BorderSide? hoverBorder; + + /// Called as a touch moves over the squares, and with null when it leaves. + final ValueChanged? onTouch; + + /// Builds a card shown beside the touched square; null shows none. + final Widget? Function(BuildContext context, HeatmapTouchDetails details)? + tooltipBuilder; + + /// How far the card sits from the square. + final double tooltipMargin; + + /// How long the squares take to come up to their colour; zero draws them at + /// once. + final Duration animationDuration; + + /// The easing of [animationDuration]. + final Curve animationCurve; + + /// Whether the first build fades in. + final bool animateOnMount; + + /// Space kept clear around the chart, labels included. + final EdgeInsets padding; + + /// Painted behind the whole chart. + final Color? backgroundColor; + + /// The height taken in a box that sets none. + final double defaultHeight; + + /// What a screen reader announces for the chart. + final String? semanticLabel; + + @override + State createState() => _HeatmapChartState(); +} + +class _HeatmapChartState extends State + with SingleTickerProviderStateMixin { + late final AnimationController _animation; + final TextPainterCache _text = TextPainterCache(capacity: 128); + (int, int)? _touched; + + @override + void initState() { + super.initState(); + _animation = AnimationController( + vsync: this, + duration: widget.animationDuration, + value: 1, + )..addListener(() => setState(() {})); + if (widget.animateOnMount && widget.animationDuration > Duration.zero) { + _animation.forward(from: 0); + } + } + + @override + void didUpdateWidget(HeatmapChart oldWidget) { + super.didUpdateWidget(oldWidget); + _animation.duration = widget.animationDuration; + if (oldWidget.cells.length != widget.cells.length && + widget.animationDuration > Duration.zero) { + _animation.forward(from: 0); + } + } + + @override + void dispose() { + _animation.dispose(); + super.dispose(); + } + + /// The cells by position, so a square is looked up rather than searched for. + Map<(int, int), HeatmapCell> get _byPosition => { + for (final cell in widget.cells) (cell.x, cell.y): cell, + }; + + int get _columns { + final given = widget.columns; + if (given != null) return math.max(0, given); + var high = -1; + for (final cell in widget.cells) { + high = math.max(high, cell.x); + } + return high + 1; + } + + int get _rows { + final given = widget.rows; + if (given != null) return math.max(0, given); + var high = -1; + for (final cell in widget.cells) { + high = math.max(high, cell.y); + } + return high + 1; + } + + void _handle(Offset local, HeatmapLayout layout) { + final at = layout.cellAt(local); + if (at == _touched) return; + setState(() => _touched = at); + final onTouch = widget.onTouch; + if (onTouch == null) return; + onTouch(at == null ? null : _detailsAt(at, layout)); + } + + void _leave() { + if (_touched == null) return; + setState(() => _touched = null); + widget.onTouch?.call(null); + } + + HeatmapTouchDetails _detailsAt((int, int) at, HeatmapLayout layout) { + final (x, y) = at; + return HeatmapTouchDetails( + x: x, + y: y, + cell: _byPosition[at], + rect: layout.cellRect(x, y), + ); + } + + /// The grid, after the labels have taken their room, and squared off when + /// that was asked for. + HeatmapLayout _layout(Size size, int columns, int rows) { + final box = widget.padding.deflateRect(Offset.zero & size); + var left = box.left; + var right = box.right; + var top = box.top; + var bottom = box.bottom; + + if (widget.yAxis.side == HeatmapAxisSide.start) { + left += widget.yAxis.room; + } else { + right -= widget.yAxis.room; + } + if (widget.xAxis.side == HeatmapAxisSide.start) { + bottom -= widget.xAxis.room; + } else { + top += widget.xAxis.room; + } + + var grid = Rect.fromLTRB( + left, + top, + math.max(left, right), + math.max(top, bottom), + ); + if (widget.squareCells && columns > 0 && rows > 0) { + final side = math.min(grid.width / columns, grid.height / rows); + grid = Rect.fromLTWH(grid.left, grid.top, side * columns, side * rows); + } + return HeatmapLayout( + grid: grid, + rows: rows, + columns: columns, + spacing: widget.spacing, + ); + } + + @override + Widget build(BuildContext context) { + final columns = _columns; + final rows = _rows; + final cells = _byPosition; + final (fittedMin, fittedMax) = heatmapValueRange(widget.cells); + final min = widget.minValue ?? fittedMin; + final max = widget.maxValue ?? fittedMax; + final t = widget.animationCurve.transform(_animation.value); + + Widget chart = LayoutBuilder( + builder: (context, constraints) { + final width = constraints.hasBoundedWidth + ? constraints.maxWidth + : MediaQuery.maybeSizeOf(context)?.width ?? 300; + final height = constraints.hasBoundedHeight + ? constraints.maxHeight + : widget.defaultHeight; + final size = Size(width, height); + final layout = _layout(size, columns, rows); + + final touched = _touched; + final details = touched == null ? null : _detailsAt(touched, layout); + final builder = widget.tooltipBuilder; + final tooltip = details == null || builder == null + ? null + : builder(context, details); + + return SizedBox( + width: width, + height: height, + child: MouseRegion( + onHover: (e) => _handle(e.localPosition, layout), + onExit: (_) => _leave(), + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTapDown: (d) => _handle(d.localPosition, layout), + onTapUp: (_) => _leave(), + onTapCancel: _leave, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned.fill( + child: CustomPaint( + painter: HeatmapChartPainter( + chart: widget, + layout: layout, + cells: cells, + minValue: min, + maxValue: max, + touched: touched, + animation: t, + textCache: _text, + ), + ), + ), + if (tooltip != null && details != null) + Positioned.fill( + child: IgnorePointer( + child: CustomSingleChildLayout( + delegate: _HeatmapTooltipLayout( + anchor: details.rect, + margin: widget.tooltipMargin, + ), + child: tooltip, + ), + ), + ), + ], + ), + ), + ), + ); + }, + ); + + final label = widget.semanticLabel; + if (label != null) { + chart = Semantics(container: true, label: label, child: chart); + } + return chart; + } +} + +/// Puts the tooltip above the touched square, kept inside the chart. +class _HeatmapTooltipLayout extends SingleChildLayoutDelegate { + _HeatmapTooltipLayout({required this.anchor, required this.margin}); + + final Rect anchor; + final double margin; + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) => + BoxConstraints.loose(constraints.biggest); + + @override + Offset getPositionForChild(Size size, Size childSize) { + var top = anchor.top - margin - childSize.height; + if (top < 0) top = anchor.bottom + margin; + return Offset( + (anchor.center.dx - childSize.width / 2).clamp( + 0.0, + math.max(0.0, size.width - childSize.width), + ), + top.clamp(0.0, math.max(0.0, size.height - childSize.height)), + ); + } + + @override + bool shouldRelayout(_HeatmapTooltipLayout oldDelegate) => + oldDelegate.anchor != anchor || oldDelegate.margin != margin; +} + +/// Paints a [HeatmapChart]: the squares, their labels and the axis labels. +class HeatmapChartPainter extends CustomPainter { + /// Creates the painter for [chart], laid out as [layout] says. + HeatmapChartPainter({ + required this.chart, + required this.layout, + required this.cells, + required this.minValue, + required this.maxValue, + required this.touched, + required this.animation, + required this.textCache, + }); + + final HeatmapChart chart; + final HeatmapLayout layout; + final Map<(int, int), HeatmapCell> cells; + final double minValue; + final double maxValue; + final (int, int)? touched; + final double animation; + final TextPainterCache textCache; + + @override + void paint(Canvas canvas, Size size) { + final background = chart.backgroundColor; + if (background != null) { + canvas.drawRect(Offset.zero & size, Paint()..color = background); + } + if (layout.grid.width <= 0 || + layout.grid.height <= 0 || + layout.columns <= 0 || + layout.rows <= 0) { + return; + } + + _paintCells(canvas); + _paintLabels(canvas, size); + } + + void _paintCells(Canvas canvas) { + final radius = Radius.circular(chart.radius); + final side = chart.border; + final outline = + side != null && side.style != BorderStyle.none && side.width > 0 + ? (Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = side.width + ..color = side.color + ..isAntiAlias = true) + : null; + // One path per colour, so a grid of a thousand squares is a handful of + // draws rather than a thousand. + final byColor = {}; + + for (var y = 0; y < layout.rows; y++) { + for (var x = 0; x < layout.columns; x++) { + final rect = layout.cellRect(x, y); + if (rect.width <= 0 || rect.height <= 0) continue; + final shape = RRect.fromRectAndRadius(rect, radius); + final color = _colorOf(cells[(x, y)]); + byColor.putIfAbsent(color, Path.new).addRRect(shape); + if (outline != null) canvas.drawRRect(shape, outline); + } + } + byColor.forEach((color, path) { + canvas.drawPath( + path, + Paint() + ..color = color + ..isAntiAlias = true); + }); + + final at = touched; + final hover = chart.hoverBorder; + if (at != null && + hover != null && + hover.style != BorderStyle.none && + hover.width > 0) { + canvas.drawRRect( + RRect.fromRectAndRadius( + layout.cellRect(at.$1, at.$2).deflate(hover.width / 2), + radius, + ), + Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = hover.width + ..color = hover.color + ..isAntiAlias = true, + ); + } + + _paintCellLabels(canvas); + } + + /// The colour of one square, faded towards the empty colour while the chart + /// is still coming up. + Color _colorOf(HeatmapCell? cell) { + final empty = chart.scale.emptyColor; + if (cell == null || cell.isEmpty) return empty; + final full = + cell.color ?? chart.scale.colorAt(cell.value!, minValue, maxValue); + final t = animation.clamp(0.0, 1.0); + return t >= 1 ? full : Color.lerp(empty, full, t)!; + } + + void _paintCellLabels(Canvas canvas) { + final builder = chart.labelBuilder; + for (final cell in cells.values) { + if (cell.x < 0 || + cell.x >= layout.columns || + cell.y < 0 || + cell.y >= layout.rows) { + continue; + } + final text = cell.label ?? (builder == null ? null : builder(cell)); + if (text == null || text.isEmpty) continue; + final rect = layout.cellRect(cell.x, cell.y); + // A label that cannot fit is left out rather than drawn over its + // neighbours. + final style = chart.labelStyle ?? + TextStyle( + fontSize: 11, + fontWeight: FontWeight.w600, + color: _readableOn(_colorOf(cell)), + ); + final tp = textCache.get(text, style); + if (tp.width > rect.width || tp.height > rect.height) continue; + tp.paint( + canvas, + rect.center - Offset(tp.width / 2, tp.height / 2), + ); + } + } + + void _paintLabels(Canvas canvas, Size size) { + final grid = layout.grid; + if (chart.xAxis.show) { + final style = seriesAxisLabelStyle.merge(chart.xAxis.style); + for (var x = 0; x < layout.columns; x++) { + final text = chart.xAxis.labelFor(x); + if (text == null || text.isEmpty) continue; + final tp = textCache.get(text, style); + tp.paint( + canvas, + Offset( + (layout.columnCentre(x) - tp.width / 2).clamp( + 0.0, + math.max(0.0, size.width - tp.width), + ), + chart.xAxis.side == HeatmapAxisSide.start + ? grid.bottom + chart.xAxis.gap + : math.max(0.0, grid.top - chart.xAxis.gap - tp.height), + ), + ); + } + } + + if (chart.yAxis.show) { + final style = seriesAxisLabelStyle.merge(chart.yAxis.style); + for (var y = 0; y < layout.rows; y++) { + final text = chart.yAxis.labelFor(y); + if (text == null || text.isEmpty) continue; + final tp = textCache.get(text, style); + tp.paint( + canvas, + Offset( + chart.yAxis.side == HeatmapAxisSide.start + ? math.max(0.0, grid.left - chart.yAxis.gap - tp.width) + : grid.right + chart.yAxis.gap, + (layout.rowCentre(y) - tp.height / 2).clamp( + 0.0, + math.max(0.0, size.height - tp.height), + ), + ), + ); + } + } + } + + /// Black or white, whichever reads on [background]. + static Color _readableOn(Color background) => + background.computeLuminance() > 0.5 + ? const Color(0xDD000000) + : const Color(0xFFFFFFFF); + + @override + bool shouldRepaint(HeatmapChartPainter oldDelegate) => true; +} + +/// The key to a [HeatmapChart]'s colours: the scale as a bar, from the lowest +/// value to the highest. +class HeatmapLegend extends StatelessWidget { + /// Creates a legend for [scale]. + const HeatmapLegend({ + super.key, + required this.scale, + this.low, + this.high, + this.labelStyle, + this.height = 10, + this.width, + this.radius = 3, + this.gap = 6, + }); + + /// The scale it draws. + final HeatmapScale scale; + + /// What the low end is called; null writes nothing. + final String? low; + + /// What the high end is called. + final String? high; + + /// Style of [low] and [high]. + final TextStyle? labelStyle; + + /// How thick the bar is. + final double height; + + /// How long the bar is; null lets it take the room it is given. + final double? width; + + /// The bar's corner radius. + final double radius; + + /// Space between the bar and its labels. + final double gap; + + @override + Widget build(BuildContext context) { + final style = seriesAxisLabelStyle + .copyWith(decoration: TextDecoration.none) + .merge(labelStyle); + final colors = scale.colors; + Widget bar = DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(radius), + // One colour would make a gradient of nothing, so it is doubled. + gradient: LinearGradient( + colors: colors.length >= 2 + ? colors + : [ + ...colors, + ...colors, + if (colors.isEmpty) ...[ + heatmapEmptyColor, + heatmapDefaultColor, + ], + ], + ), + ), + child: SizedBox(height: height, width: width), + ); + // Without a width the bar takes the room it is given, which only works in + // a row that is allowed to fill it. + final fills = width == null; + if (fills) bar = Expanded(child: bar); + + return Row( + mainAxisSize: fills ? MainAxisSize.max : MainAxisSize.min, + children: [ + if (low != null) ...[ + Text(low!, style: style), + SizedBox(width: gap), + ], + bar, + if (high != null) ...[ + SizedBox(width: gap), + Text(high!, style: style), + ], + ], + ); + } +} diff --git a/lib/src/heatmap/heatmap_data.dart b/lib/src/heatmap/heatmap_data.dart new file mode 100644 index 0000000..2adde87 --- /dev/null +++ b/lib/src/heatmap/heatmap_data.dart @@ -0,0 +1,195 @@ +import 'dart:math' as math; +import 'dart:ui' show lerpDouble; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +/// The colour a heatmap falls back on when its scale names none. +const Color heatmapDefaultColor = Color(0xFF4C86CD); + +/// The colour of a square with no value in it. +const Color heatmapEmptyColor = Color(0x14909196); + +/// One square of a [HeatmapChart]: the value at column [x], row [y]. +/// +/// [x] and [y] are whole positions in the grid, counted from zero — the +/// column and the row, not pixels. +@immutable +class HeatmapCell { + /// Creates the square at ([x], [y]). + const HeatmapCell({ + required this.x, + required this.y, + required this.value, + this.color, + this.label, + }); + + /// The column, counted from the left. + final int x; + + /// The row, counted from the top. + final int y; + + /// The value the square is coloured by; null leaves it empty. + final double? value; + + /// A colour of this square's own, which the scale does not overrule. + final Color? color; + + /// Written in the square; null asks `HeatmapChart.labelBuilder`. + final String? label; + + /// Whether there is no value here to colour. + bool get isEmpty { + final v = value; + return v == null || !v.isFinite; + } + + @override + bool operator ==(Object other) => + other is HeatmapCell && + other.x == x && + other.y == y && + other.value == value && + other.color == color && + other.label == label; + + @override + int get hashCode => Object.hash(x, y, value, color, label); + + @override + String toString() => 'HeatmapCell($x, $y, $value)'; +} + +/// Turns a value into the colour its square is painted. +sealed class HeatmapScale { + /// Creates a scale. + const HeatmapScale({this.emptyColor = heatmapEmptyColor}); + + /// The colour of a square with no value. + final Color emptyColor; + + /// The colour for [value], where the values run from [min] to [max]. + Color colorAt(double value, double min, double max); + + /// The colours this scale runs through, lowest first — what a legend draws. + List get colors; +} + +/// A scale that fades from one colour to the next. +/// +/// The values are spread over [colors] evenly, or at [stops] when those are +/// given — each a share of the way from the lowest value to the highest. +final class HeatmapGradientScale extends HeatmapScale { + /// Creates a scale fading through [colors]. + const HeatmapGradientScale({ + required this.colors, + this.stops, + super.emptyColor, + }); + + /// A single colour deepening from [lowOpacity] to full — the contribution + /// graph's scale. + HeatmapGradientScale.of( + Color color, { + double lowOpacity = 0.12, + super.emptyColor, + }) : colors = [color.withValues(alpha: lowOpacity), color], + stops = null; + + @override + final List colors; + + /// Where each colour sits, from 0 at the lowest value to 1 at the highest; + /// null spreads them evenly. + final List? stops; + + @override + Color colorAt(double value, double min, double max) { + if (colors.isEmpty) return heatmapDefaultColor; + if (colors.length == 1) return colors.first; + final span = max - min; + final t = span <= 0 ? 1.0 : ((value - min) / span).clamp(0.0, 1.0); + final at = stops ?? _evenStops(colors.length); + for (var i = 1; i < at.length && i < colors.length; i++) { + if (t > at[i]) continue; + final width = at[i] - at[i - 1]; + final local = width <= 0 ? 1.0 : (t - at[i - 1]) / width; + return Color.lerp(colors[i - 1], colors[i], local.clamp(0.0, 1.0))!; + } + return colors.last; + } + + static List _evenStops(int count) => [ + for (var i = 0; i < count; i++) + count < 2 ? 0.0 : lerpDouble(0, 1, i / (count - 1))!, + ]; +} + +/// One band of a [HeatmapStepScale]. +@immutable +class HeatmapStep { + /// Paints every value from [from] up to the next step in [color]. + const HeatmapStep(this.from, this.color, {this.label}); + + /// The lowest value this band covers. + final double from; + + /// What that band is painted. + final Color color; + + /// What the band is called, for a legend. + final String? label; +} + +/// A scale that paints whole bands rather than a fade — under 0, 0 to 5, and +/// so on. +/// +/// The steps are read in order; a value below the first one takes the first +/// step's colour. +final class HeatmapStepScale extends HeatmapScale { + /// Creates a scale of [steps], lowest first. + const HeatmapStepScale({required this.steps, super.emptyColor}); + + /// The bands, lowest first. + final List steps; + + @override + List get colors => [for (final step in steps) step.color]; + + @override + Color colorAt(double value, double min, double max) { + if (steps.isEmpty) return heatmapDefaultColor; + var chosen = steps.first.color; + for (final step in steps) { + if (value < step.from) break; + chosen = step.color; + } + return chosen; + } +} + +/// The lowest and the highest value among [cells], or (0, 1) when there is +/// nothing to measure. +(double, double) heatmapValueRange(List cells) { + var low = double.infinity; + var high = double.negativeInfinity; + for (final cell in cells) { + if (cell.isEmpty) continue; + low = math.min(low, cell.value!); + high = math.max(high, cell.value!); + } + if (low > high) return (0, 1); + return (low, high); +} + +/// Reads [values] — a list of rows, each a list of columns — as cells. +/// +/// A row shorter than the widest one simply has no cells past its end, so a +/// ragged table is drawn as the gaps it is. +List heatmapCellsOf(List> values) => [ + for (var y = 0; y < values.length; y++) + for (var x = 0; x < values[y].length; x++) + HeatmapCell(x: x, y: y, value: values[y][x]), + ]; diff --git a/screenshots/heatmap.png b/screenshots/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..5836dc489820f51c4fce6d94966afaa5c2ac2d2a GIT binary patch literal 141000 zcmeFZWmHzt_b&Ph(kdm=A>AP&ogy95-QC?OAxJ8XG)Q+N-AD`g(%tpaopC`NocK#r0#pbD@={VlR1pF}6oNqD$&eAjD_-qo zn&6-3P9l=Z$l&lsHV%bA$RLuU!piQc`wMRFN>D6t#X#A?MX$rR*<3=Ogr8r3 z2|&&+*l*!{hk&5)8kaUKG|b=sPfW|@;^*0M{&C8dHo>2Zo9om&ww2z3qZ3;@vIi~P zlChiVr|GAyG4*~9_@e*E@hLQ~f>7xHcp+{I5Av4$e;?W8AfG9V6SNO5cFnv3GDlfKXC*cO;!`*T#Z5D5#K# zK`gVy|MI;d$(*vg?~Se(Dg$J7ZL54;LN+uyxZj*H!t}rMKSt3B9VWItAc6Q7fYb7c z&{cwQzy*eX95??SV<_ZkNKSL~v{2lc6MHK=8}RDXk=4$mYvsKuh+A@PT8Y6@p zTn#P&B0Y>=cK6=}As2sId^Sq06LBwGDMIaq`IUnegzA|f$z7 zBV=`D=VhcAJTMt6-~X}tyqMVWfLFQ#zJD!U5N?-ap6fkAAQD=UDI~D@GL~%{)~WZbByxfB(RW2YXZ z$0%j?Geeb%d7h>l{qLXhWCbNS>j2VDWx(0Au`2M?Qm>Y2~@F8RyPNYgP<0CACj;#W(z)8l|%E%0nBIN$ZD|4cck)OsqK#eH$ zpGp7kuYx}Ykf8tL?=YhOPrqFyku#QQu$Bh`6w`hl1`a;dYEndB|8sgqVusq&@cwg* zubcjp|B+Z677%yY=}`RLMgt&@0GEsY@G?)@lklk3OQSr-Td1qDU@ zYHYvL7Rw}C3c9yThC>+_-WGE<{cYN<~-wECdp5tkoCa!dF;1)2GkkE)AWrsW8n-uO>q{^z7 zAqx!)>+O+FWOI8U-(RQ~oH#x6TJv+yI&~^g&*FoFyUQ9g*Js7E-#Xw=<#!`d${Xz+ zPN}b2XdM;M2`EybFSb3r@AW52J8Uaa=(_o9{_f2Y65?}K$Vn3NE9S3iUKe7eJT5D{ zyG3U>#u{RVhUBjfmO?W8w8O8iQXg6VFstF>Di>=cj$j zG?FTyQeZ>Rc#rr(5kb&c<7>xf_v)r9tM<&x&y6zpkoLfeTlG5QEX$0!dRvhMla1d3 z5#C8=(HZfhR{3VUIUa+m{u}3MY$k9K8tN~_KxTsn2M=Fiut1<(s3_@@k(g)}1y2@9 zFxmGtW0Dp-a2zbKKg937)hwRi;}H|JY}z**2DKUfkm!2O$?{v0S}W-1g{|G)Fw~8~ zERk!+?K5TZ2m)TrCEvCWgRs4YVkF(|yVQkSsRY{e9LOKs45p8{VK{NHO6)viy7rIC z>Yn$9FP*(_@S83rW1h>)%hw$K#e}81V->5Fc8?Ixp*BZ8Mb79da#Bd4ZuJ|nsN_rn z<+^;){uuS6W5*Y}OXBJmZMPY13bmRp{|ePe)ylPdR@~ZDg)|1 zNKKV!B0u`Kk(v(ckj>{$?bzQP3AlTD8sE6{q`f)a8W9RU*;xB zi`}@kU>p^N+K%X!h z9bQY!P-GquKMNf_sj74OA#r47SKx&TVcBEmW02a#}9n@p%>yifYx9r-I# zKL5R`vNs~dPdhvb|0e+m*6TP0vv%tbYYSiQgFCmL7I#sHm(6Fyd!z0ZamE`sGEf5) zs8Sf&-|TJ-O8G)haOgYdEZ-!b`|O0_vV2*kVmIy7YjVVQ(2!7B-rW334=rMtQ)AW< z6%m00$5^9|*K-7fwecRbE4M>ig9}dybME)%(|A2$iS5@;X7=lUpQ&iFc!9w7H`~N2 zj#dM;tjyN^Xjxz+mFJr@E(;eQHHhxHQu(>OF-l4fyXz?JRX_7oQe2PD&%5FW6YbCb zyzTDoM((@0Mar}`ryYndCz~h1!V2R#--U-Trwb-pI0$lba=y2igo74MwdaQ8+Hbc% zFmANHWL70|*@KD)hs7Tq8BmU-aYv%zj-VYzrxq!d3lu4re$C9(@9yhcTU_9sZn`CH z8l}4DC^5x`j9JzW?AhG>WN+k-P6L2WBihSzs=~>xNR^sxzkV#PEeQ!Pg z8i!sL?1W?oi@yW0`=VES&#hc9OI2GCwY7D!stHQ|YVe07ZJV!5?{Zkt!4sl)9;`jI zcuA#{?ggfDyI`4CYn;1-Qv@W|b3)odjpk%F3Q6|X9sC;9DM$wK^?m64Z8=pMa&_gN zBui~_uCPI`vU2d_LqV*iT+faY&Az~)RD5xJ*911?yCLiH-S28SJtdH_lvs{6Csz<( zEI$jwWk}dNRW12U^6=o>X;Xggi_QBu^Ae)|H6HKG)lVj!RqVH3`BaW$Zdil!by(L$ zPj_#&L%6Gy{n~OC1()9n`5Ts`;{BX4^UqDHFH^ZZW({sKOhlYnELEc-;W4P@7Q@xn;TPBlB69^}O7O$MA zmuJiDC|<#$ht)4nSvs%h7Z%1ERl;l5tft@~MBJW4UKjV_@JO#rH1S%kXWngtI7qKn z6uP~Qw=ZaqAy}f70o&555_M?4pG+xGE+oIZzq3Dl@FC)Nh07?{jEswWo!{5k*qH4y zxM@CVw0)xAI z*keiJw#&kL4ua9459^DrMN&qh!-6H%N=1|RHj7xMu_$d1C$U9stB0iiVzNK8Mf(*) zLy`Lm*ZS;lT`wj^IV{It<1nZQ3kg9;#KcxlHl(>6xBa{Boo01eSnU24Dd7TR^`Eis z?K#~7v8Rx)GHTdjnIgT&xQZ+^=Jy$;}>QNZKuq8Y)KOF_dqGh;a$St<=h=xf$Y) zF}SWHFccnQoA1N7tZGZJaz8>KYzjZFuUTEMudj{9s&ED_y8cMKAb$7fpw(y58x3R( z;}>3d-%P^UO&d7O|KWWUAj-0SY_?_co%=qCi7)8EL$6YnJ@0ltU?P*or8+Zd{{HIh z6l(9{qGFo@{FYglE79UstHv_&S>U2lUEAX(!^Ys$&kp_eJ8pJ|^Iek&B6eX~u|(Us z1i@q2l-{flkz@?3OYpd35Tnes`TkJ+mo>8 z%hh;|fLNe^we8?))d^__TmKOhH-pCE@H7y3Okq-gc%*Y?i| z-dmQ;F3qaxc_);5x7O}Wb}hgC7#ycL8AZw;@ac4mi?8)l@dx*u$2nIs-GQozmwQty zQ|E#x^?uhdbUCHrp5AW#KfHD`3y%XE(n%jIh#>lBSN$Ta=Fou+S2TLx<8y-C9JBWX z$Er)ZLev>k9^nb(T+`R>3QM{R&mhuj-p^RdBQB4-D=Abmo|USGkE;2V^PvZJ_}4G( z!_MwN;-cZQaVP2S;Q>-H@4J4~lA9ANB0$#-h08$IV+5|m`%LqHkX2CNyVc`x~g?_F{6&p&f1}9t7P5mX?ne5 zMp0_Nb-8?=`}*QP`)ON#kDkG(;lI30wo%8dqu28#Fr@k_;>&G4v)NCqdaFxaDV~zZ zJwKrd>d3fTUl8S#Y4u)lSQ)?gp2p+zM&5O|#QJi7?4^^LtW$#{6&o9-PGf7BQa%jb zmif;7gXhI|UL!vbH6p)f%NJQfKP**P4eaQ}h+ad%?Bn35U{7^gdeto`fAA^9qPs4w zre<0mb8&gs)`Cxo1VTd4bN=S;6^oFSknK2ox_jP|F@GRHaj3k$;9@Sb1+dCj0L|dV z#Gb$$h$>-7V8KvwLU@U|tY%9P5L+(4*w6jFL|j?viV$e9X|q|K{*lCL^7W{mM9?zn z2=B1@@+|?UP2SD^e1q>xFbARBXbH6S!~*URY249}QV`}0+cVu(RMw9Piy!t$G51c&UJ^J zVBv$i19_Pg4td%D0mp5Op`_CvyR{!uhLhNhin`d41qJgzfDLhmFIf0{d36*dNM$9P zdX;`U>jgG8apWZu`sdp6!ElzfT(!oz7P;>x_*QMV1X>SwAAb)|OkfWR4C3jrC(CRv z<>&8Cd%h%C4K&D!gAL-c=-=EFLKK8#E?~^}26stNP_i0Js1;EIF#$G0EFvkh|xlG6t@yx`#jD~{GSUImiw z*yz^mvxnI9ht0a|uKXThnf8&rySrnvxM5sr4FJBGE--g+I$>Fh$6=dYHQxC%KcB{Q zNN1V#>Y4QL2)@&nnI=0ui}6LPbDm6cRZ_iuVb?Me~{+>nC6l zYw0!r%i>iaZiTTIxPDC6t&>+XKZg}mtgU`Yp$_3^<5%vgU7+xOG?JwpCeMf~}L42^lJK$OcBuq*D^U!gUX|NL>(9lJa77pY4uD+Y=i z&o~$wf!r6lHx;zz;>n*k{2(E5xls~{PCb&H%_R!Ma9u>>ns=El($}ZiV@0Xbc0(tVpY_pGP&oO z@9%xrkJ}i=&e8>{ldCZbWOP3=?f3EYI+_~iab>`IuJosAS3K}uSd4bLCddSeMFxj= zf-3x}*y%L-Q&qwjg5B36j3o|o2J&Cq^m zZVXk}TB)y3yiLwnC?`_0k=xRKSXh`?cA9gxSS-r7Z{H+jWJIk?)^HGXb<^cWmmY^7 z3rD>6CT*Zrd1L0R#z#UcbszwkXdW$ebx}+}{v`eQIF@re*lBZojKbyi5MU1j^pt>J z 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%0Dd%EsP_$8sMpnq%1C+u+Ea|d+> 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[]; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 300, + height: 200, + child: HeatmapChart.matrix( + const [ + [1, 2, 3], + [4, 5, 6], + ], + xAxis: HeatmapAxis.hidden, + yAxis: HeatmapAxis.hidden, + onTouch: touched.add, + ), + ), + ), + ), + ); + + final chart = tester.getRect(find.byType(HeatmapChart)); + // The top-right square is the third column of the first row. + await tester.tapAt(chart.topRight + const Offset(-10, 10)); + await tester.pump(); + + expect(touched.first?.x, 2); + expect(touched.first?.y, 0); + expect(touched.first?.value, 3); + }); + + testWidgets('a square with no cell reports itself as empty', ( + tester, + ) async { + final touched = []; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 200, + height: 200, + child: HeatmapChart( + cells: const [HeatmapCell(x: 0, y: 0, value: 1)], + columns: 2, + rows: 2, + xAxis: HeatmapAxis.hidden, + yAxis: HeatmapAxis.hidden, + onTouch: touched.add, + ), + ), + ), + ), + ); + + final chart = tester.getRect(find.byType(HeatmapChart)); + await tester.tapAt(chart.bottomRight - const Offset(10, 10)); + await tester.pump(); + + expect(touched.first?.x, 1); + expect(touched.first?.cell, isNull); + expect(touched.first?.value, isNull); + }); + + testWidgets('square cells keep their shape in a box that is not', ( + tester, + ) async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 400, + height: 100, + child: HeatmapChart.matrix( + const [ + [1, 2], + [3, 4], + ], + squareCells: true, + xAxis: HeatmapAxis.hidden, + yAxis: HeatmapAxis.hidden, + ), + ), + ), + ), + ); + expect(tester.takeException(), isNull); + }); + + testWidgets('a tooltip is placed over the touched square', (tester) async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 300, + height: 200, + child: HeatmapChart.matrix( + const [ + [1, 2, 3], + ], + xAxis: HeatmapAxis.hidden, + yAxis: HeatmapAxis.hidden, + tooltipBuilder: (context, details) => Text('${details.value}'), + ), + ), + ), + ), + ); + + expect(find.text('2.0'), findsNothing); + // Held rather than tapped: letting go clears the touch again. + final gesture = await tester.startGesture( + tester.getCenter(find.byType(HeatmapChart)), + ); + await tester.pump(); + expect(find.text('2.0'), findsOneWidget); + + await gesture.up(); + await tester.pump(); + expect(find.text('2.0'), findsNothing); + }); + + testWidgets('the legend draws its scale', (tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: SizedBox( + width: 200, + child: HeatmapLegend( + scale: HeatmapGradientScale(colors: [Color(0xFF000000)]), + low: 'Less', + high: 'More', + ), + ), + ), + ), + ); + expect(tester.takeException(), isNull); + expect(find.text('Less'), findsOneWidget); + expect(find.text('More'), findsOneWidget); + }); + }); +} From f0a612fded2794f73992a236ac2621463317d0a7 Mon Sep 17 00:00:00 2001 From: Mohammad Zarif Date: Mon, 14 Sep 2026 13:47:11 +0330 Subject: [PATCH 10/10] chore: release 2.5.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One package for every chart an app draws. `SeriesChart` arrives for values rather than candles — lines, areas, bars that group, stack or float, scatter, error bars, a chart that can be turned on its side — and with it `PieChart`, `RadarChart` and `HeatmapChart`, the three shapes an axis cannot draw. The candlestick chart stops asking for two arguments most charts have no use for, and drops the `flutter_svg` dependency with the watermark that needed it. It runs on Flutter 3.27 and Dart 3.6 again, so an app a few releases behind is not shut out. The README now presents the whole package rather than a list: every screenshot in a three-column gallery, grouped by what it draws, each one linking to the page that covers it. CHANGELOG.md has the rest. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 129 +++++++++++++++++++++++++++++++++--- pubspec.yaml | 39 +++++------ 3 files changed, 324 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfe34a3..7f25aeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,186 @@ +## 2.5.0 + +One package for every chart an app draws. A balance over time, sign-ups per +month or profit per trade had nowhere to go in a candlestick package, so an app +carried `fl_chart` beside this one; and the candlestick chart itself asked for +three arguments most charts had no use for. + +### Series charts + +- **New `SeriesChart` draws values against numbers, not candles against + time.** A `LineSeries` or a `BarSeries` takes `SeriesPoint(x, y)` — or plain + values through `.values`, placed at `x = 0, 1, 2, …` — with `null` for a gap. + Several series share one chart, bottom layer first, and a line and bars can + sit together. + +- **Lines are joined four ways.** `LineCurve.linear`, `smooth`, `step`, and + `monotone`, a curve through every point that never swings past its + neighbours, so a peak on the line is a peak in the data. A line can be dashed, + stroked with a gradient, dotted per point through `dotBuilder`, and drawn in + `negativeColor` below its `baseline`, split exactly where it crosses rather + than at the nearest point. + +- **An area fades to its baseline and never paints across it.** `SeriesFill` + measures its gradient from the line's highest point to the baseline, so the + wash is gone exactly at zero, and the part below uses `negativeGradient` — or + the same gradient turned upside down — so both halves fade away from the line. + `toBaseline: false` fills to the bottom of the plot instead. + +- **Bars grow up or down from their baseline, rounded on the far end.** + `radius` goes on the top of a bar above the baseline and the bottom of one + below it; width is fixed or a share of the room between two x values, held + between `minWidth` and `maxWidth`; colour comes from `negativeColor` or a + `colorBuilder`, with an optional full-height `trackColor` behind. Bars of the + same colour are drawn in one call however many there are. + +- **Axes that are written or hidden, not rebuilt.** `SeriesXAxis` labels from a + list — a blank entry prints nothing, so month starts space themselves — or + from `ticks`, an `interval` or a `labelBuilder`, and drops a label that would + run into the one before. `SeriesYAxis` takes a `formatter`, a side and a + `width`, which is what lines stacked charts up. Either can be `hidden`, and + the room it held goes to the plot. `SeriesGrid` rules dashed or solid lines + at the labels, `border` draws round the plot, and `SeriesReferenceLine` and + `SeriesBand` mark fixed levels and stretches without widening the range + unless asked. + +- **The value range fits what is in view.** Set `minX` and `maxX` to show a + window of a longer series and the values rescale to that window. The fitted + range gets a little room and ends on round ticks, and that room never pushes + a series that stays above zero below it. `minY`, `maxY` and `includeZero` pin + it. + +- **Touch reads out every series at once.** The crosshair snaps to the nearest + point on a `press` (while held), a `longPress` (leaving a swipe free to + scroll the page), a `tap` (it stays) or a mouse hovering. The default tooltip + lists each series in its colour; `SeriesTooltip.builder` replaces it and the + chart still places the result beside the crosshair or above the point, kept + inside the chart. `onTouch` reports the x and every series' value there, and + `null` when the crosshair goes. + +- **New `SeriesChartController` shares one crosshair between charts.** Give a + balance panel and a profit panel under it the same controller, and holding + either marks the same x on both. + +- **New `SeriesRangeSelector` puts a window over long data.** It draws the + whole data set small; dragging inside the window moves it and dragging a + handle moves that edge, measured from where the drag began so the window + stays under the finger. + +- **Data changes animate.** With `animationDuration` set, values move from + where they were when the number of points is unchanged, and grow out of the + baseline otherwise — including on the first build, which `fl_chart` never + animated. + +- **New `ScatterSeries` places dots on both axes at once.** A dot per point, + sized, coloured or shaped per point through `dotBuilder` — a circle, a + square, a diamond or a cross — and labelled through `labelBuilder`. Pair it + with `SeriesTouch(snap: SeriesTouchSnap.nearestPoint)`, which reads out the + one dot under the finger instead of everything at that x. + +- **Bars stack, float and carry labels.** Bar series that share a `stack` pile + up at each x — upwards above the baseline, downwards below it — and only the + outermost bar is rounded. A `SeriesPoint` with a `low` draws a bar that + floats between two values, which is a range or a waterfall step. `border` + outlines each bar and `labelBuilder` writes past its far end. + +- **A chart can be turned on its side.** `orientation: + SeriesOrientation.horizontal` runs the x axis down the chart and grows the + values rightwards, which is the horizontal bar chart, and everything else — + curves, fills, gradients, the crosshair and the tooltip — turns with it. + +- **Error bars, fills between lines, step position and a line shadow.** + `SeriesPoint.xError` and `yError` draw a capped bar either side of a value, + styled by `SeriesErrorBars`. `SeriesBetweenFill` shades the gap between two + lines — a high and a low, a plan and what happened. `LineSeries.stepPosition` + says where along the way a step changes, and `shadow` drops a blurred copy + under the line. + +- **Axes get names and a side of their own.** `SeriesXAxis.title` and + `SeriesYAxis.title` write beyond the labels, turned to read up an axis that + runs down the chart, and `SeriesXAxis.side` puts the x labels over the plot + instead of under it. + +- **Two new pages.** [Series charts](doc/series-chart.md) covers the widget, + and [Migrating from fl_chart and candlesticks](doc/migrating-from-fl_chart.md) + maps both packages' APIs onto this one, with worked examples. + +### Pie, radar and heatmap charts + +- **New `PieChart` draws a pie, a doughnut or a ring gauge.** Each `PieSection` + is worth a share, not an angle: the values are added up and each section gets + the part of the circle it is worth. Sections take a colour or a gradient, a + label placed anywhere between the inner and outer edge, their own `radius` so + one can stand out, an `offset` that explodes it out of the circle, a border, + and a `badge` widget pinned to it. `centerSpaceRadius` opens the middle and + `centerChild` fills it with a total or a title; `sectionsSpace`, + `startDegreeOffset` and `clockwise` place them. A touch names the section + under it, which grows by `touchedSectionGrowth` while it is held. + +- **New `RadarChart` compares several things over the same features.** A + `RadarSeries` carries one value per feature and is drawn as an outline with a + fill, optionally dashed and dotted; `features` names the corners. The web is + drawn as a polygon or as rings, with `tickCount` rings between `minValue` and + `maxValue`, spokes out to each corner, and ring values when `showTicks` is + on. `onTouch` reports the corner nearest the finger. + +- **New `HeatmapChart` colours a grid of squares by their value.** It takes a + matrix — a list of rows, each a list of columns — or sparse `HeatmapCell`s + when the data has holes in it, and colours each square through a + `HeatmapGradientScale` that fades between colours or a `HeatmapStepScale` + that paints whole bands. `HeatmapAxis` names the columns and the rows on + either side; `labelBuilder` writes inside the squares, in black or white by + how dark each one is, and leaves out a label that would not fit. A touch + names the square under it — including an empty one, which reports itself + with no value rather than as no touch — marks it with `hoverBorder` and can + raise a card through `tooltipBuilder`. `squareCells` keeps the squares + square, which is what a contribution graph wants, and `HeatmapLegend` draws + the scale as a bar. [Heatmap](doc/heatmap-chart.md) covers it. + +- **All three animate and all three are pure geometry underneath.** + `layOutPie`, `pieSectionAt`, `radarCorner`, `RadarLayout` and `HeatmapLayout` + are public, so the placement a chart uses can be tested, or reused to put a + widget exactly where a section, a corner or a square is. + +### Candlestick chart + +- **`isTrendLine` and `timeFrame` are optional.** + `KChartWidget(candles, ChartColors())` is now a whole chart. The drawing + tools stay off unless `isTrendLine` is set, and with no `timeFrame` the + current-price tag reads just the price, without a countdown and without the + one-second timer that kept it ticking. `timeFrame` is now a `Duration?`, so + code that reads it back off the widget as non-null needs a fallback. + +- **The watermark is a widget, and `flutter_svg` is gone.** `watermarkAssetPath` + took only an SVG asset, which tied every app to `flutter_svg` whether it + showed a watermark or not. It is replaced by `watermark`, which takes any + widget — an `Image.asset`, an icon, a line of text, or an `SvgPicture` from + `flutter_svg` in an app that still wants one — sized and placed by + `watermarkScale` and `watermarkAlignment` as before, and painted in + `ChartColors.watermarkColor`. It now sits over the candle area, faint and + ignoring touches, rather than under the candles. This removes a parameter, + so a chart passing `watermarkAssetPath` has to change: drop it, or pass the + image as `watermark`. + +### Requirements + +- **Runs on Flutter 3.27 and Dart 3.6 and later.** The package asked for + Flutter 3.47 and Dart 3.13, which shut out every app a few releases behind. + Nothing it draws needed them: the two newer language features it used — null- + aware list elements and `_` wildcard parameters — are written the older way, + and the lowest Flutter left is the one that brought `Color.withValues`. + +- **Dependencies float.** `decimal` is accepted from 3.0.0 and `intl` from + 0.19.0 up to 0.21, instead of the latest of each, so the package resolves + beside the `intl` an app's own `flutter_localizations` pins. The test suite + passes on both the lowest and the newest versions. `flutter_svg` is no longer + a dependency at all. + +### Documentation + +- `theming.md` no longer counts the drawing kinds as seventeen, and + `indicators.md` counts the indicators that recompute in full as seventeen, + so the two groups add up to the 31 there are. + ## 2.4.1 Five changes, one for each point raised in diff --git a/README.md b/README.md index dd0b538..e701bce 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,10 @@ If it saves you some work, all I ask in return is: That is the whole price, and it is what keeps the weekly updates coming. -A candlestick (K-line) and market-depth chart for Flutter, drawn entirely with -`CustomPainter` — no WebView, no JavaScript bridge. +A candlestick (K-line) chart, a market-depth chart, and line, bar, scatter, +pie, radar and heatmap charts for Flutter, drawn entirely with `CustomPainter` +— no WebView, no JavaScript bridge. One package for the trading screen and for the balance, +growth and report charts around it. Named for the open-high-low-close-volume bars it renders. @@ -32,7 +34,9 @@ Named for the open-high-low-close-volume bars it renders. ## Features -- **Series charts for everything else** — `SeriesChart` draws plain values rather than candles: lines with four curves, areas that fade to a baseline and split colour where they cross it, rounded bars, several series at once, axes you write or hide, a tooltip of your own, one crosshair shared across charts, a range strip for long data and animated data changes. The [migration guide](doc/migrating-from-fl_chart.md) maps `fl_chart` and `candlesticks` onto it. +- **Series charts for everything else** — `SeriesChart` draws plain values rather than candles: lines with four curves, areas that fade to a baseline and split colour where they cross it, bars that group, stack or float, scatter plots, error bars, a band between two lines, axes you write, name or hide, a chart you can turn on its side, a tooltip of your own, one crosshair shared across charts, a range strip for long data and animated data changes. The [migration guide](doc/migrating-from-fl_chart.md) maps `fl_chart` and `candlesticks` onto it. +- **A pie chart and a radar chart** — `PieChart` for a pie, a doughnut with a widget in its hole or a ring gauge, with exploded slices and badges; `RadarChart` for a web of features with one outline per series. The two shapes an axis cannot draw, in the same package as the rest. +- **A heatmap** — `HeatmapChart` colours a grid of squares by their value, from a matrix or from sparse cells: a fading or a stepped colour scale, labels in the squares and down both sides, a legend, and a readout for the square under the pointer. A contribution graph, a correlation matrix or sales by weekday and hour. - **Eight chart types** — candles, OHLC bars, a line, a step line, a filled area, an HLC area, a baseline chart and columns — plus Heikin-Ashi, Renko, three-line break, Kagi, point & figure and range bars as transforms of the candles themselves. - **31 indicators**, each a configured instance rather than a flag — so `ATR(8)`, `ATR(14)` and `ATR(20)` are three panes, with their own settings and colours. - **Main-chart overlays** — `MA`, `EMA`, `BOLL`, `SAR`, `VWAP` in three flavours — whole-series, anchored to a candle, or restarted each session with standard-deviation bands — Supertrend, Keltner and Donchian channels, the Ichimoku Cloud, pivot points and a volume profile. @@ -75,17 +79,121 @@ Named for the open-high-low-close-volume bars it renders. - **Fully themeable** — `ChartStyle` for geometry, `ChartColors` for every colour, `DrawingStyle` for the drawing tools; `ChartTranslations` for every label. Filled or hollow candles, dashed or solid crosshair, pane separators, axis-label pills and a placed, tinted watermark. - **Fits its box** — the candles take whatever height the volume and indicator panes leave, so the chart works from a phone to a desktop window without arithmetic on your side. -![The overview strip under a chart, with the visible window lit on it](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/overview.png) +## The whole package in pictures -![Two linked charts sharing one crosshair](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/linked-charts.png) +Every widget, every chart type and every tool below is in this one package, and +each picture links to the page that covers it. -![Bar replay stepping the market forward a candle at a time](https://raw.githubusercontent.com/CtrlAltDevelop/ohlcv_chart/main/screenshots/bar-replay.gif) +### Series, pie, radar and heatmap charts + + + + + + + + + + + + + + + + + + + + + + +
Four business charts
Four business charts
A return split at zero, profit bars, flows with a tooltip and a sparkline.
Pie and radar
Pie and radar
A doughnut with its total in the hole, and a web scoring two strategies.
Heatmap
Heatmap
Six months of activity, and orders by hour and weekday, by value.
Scatter
Scatter
A dot per trade, shaped and coloured by the point, read out one at a time.
Stacked and turned
Stacked and turned
Bars piled on each other on a chart running rightwards, both axes named.
Floating bars and bands
Floating bars and bands
A waterfall, and a forecast inside its band with error bars.
A window over long data
A window over long data
Three series over five months, with the strip that moves the window.
One crosshair, two panels
One crosshair, two panels
A balance panel over a profit panel, marking the same day in both.
Depth chart
Depth chart
Cumulative bid and ask depth from the order book.
Depth, four ways
Depth, four ways
The curve, the per-rung bars, both at once, or a numeric ladder.
The bid/ask ratio bar
The bid/ask ratio bar
Which way the resting orders lean, under the depth chart.
+ +### Candles, and the ways to draw them + + + + + + + + + + + + +
Eight chart types
Eight chart types
Bars, baseline, area, step line, HLC area and columns.
Four bar transforms
Four bar transforms
Line break, Kagi, point & figure and range bars.
Heikin-Ashi and Renko
Heikin-Ashi and Renko
The same market re-aggregated before it is drawn.
A second instrument
A second instrument
Another series over the same window, rebased or at its own prices.
Dark and light
Dark and light
The same chart under both palettes, every colour yours.
+ +### 31 indicators + + + + + + + + + + + + +
Main-chart overlays
Main-chart overlays
The Ichimoku cloud and Supertrend, over Stochastic RSI and Awesome.
Profile and anchored VWAP
Profile and anchored VWAP
A volume profile and a VWAP anchored to a candle.
Swing readers
Swing readers
A zigzag, a Fibonacci retracement and Elliott wave labels.
Stacked panes
Stacked panes
Three ATRs at different periods, each in its own resizable pane.
Higher timeframes
Higher timeframes
A four-hour average and RSI over fifteen-minute candles.
Built from the catalogue
Built from the catalogue
The example app's add-indicator sheet, generated from it.
+ +### Drawing tools, orders and events + + + + + + + + + + + + +
29 drawing tools
29 drawing tools
Trend and horizontal lines with labels, snapped and persisted.
Rays, boxes and fibs
Rays, boxes and fibs
A ray, an arrow, a horizontal ray, a range box and a retracement.
The line editor
The line editor
Every control of a selected drawing, styled by DrawingStyle.
Orders and positions
Orders and positions
A working order and an open position, each tagged on the axis.
Planning a trade
Planning a trade
A planned position with its risk-to-reward, inside a channel.
Event marks
Event marks
Earnings, a dividend, a split and news under the candles.
+ +### Reading it, and driving it + + + + + + + + + + + + +
Legend and crosshair
Legend and crosshair
The OHLC row above the chart, reading from the crosshair.
The long-press readout
The long-press readout
The card over a held candle, or a builder of your own.
The overview strip
The overview strip
The whole series under the chart, with the visible window lit.
Linked charts
Linked charts
Two charts sharing one crosshair.
Bar replay
Bar replay
Rewind, then step or play the market forward.
Held mid-replay
Held mid-replay
The chart stopped at the 150th candle of 420, under a transport bar.
+ +### The axes, the session and the box + + + + + + + + + + + + + + + + + +
Four price axes
Four price axes
Linear, log, percentage or indexed to 100 — and invertible.
A log axis
A log axis
Stepping by ratio, so a decade of compounding reads evenly.
The date axis
The date axis
The round time values the chart picks, or your own formatter.
Sessions and time zones
Sessions and time zones
Pre-market and after-hours washed behind the candles.
Session VWAP
Session VWAP
A VWAP restarted each session, with its standard-deviation band.
Fits its box
Fits its box
The candle area filling the box, and pinned to a height.
A watermark of your own
A watermark of your own
Any widget, painted faintly over the candle area.
## Install ```yaml dependencies: - ohlcv_chart: ^2.4.1 + ohlcv_chart: ^2.5.0 ``` ## Quick start @@ -101,7 +209,6 @@ DataUtil.calculate(candles); KChartWidget( candles, ChartColors(), - isTrendLine: false, timeFrame: const Duration(minutes: 15), indicators: [MaIndicator(period: 20), MacdIndicator()], fixedLength: 2, @@ -119,6 +226,10 @@ One page per feature, in [`doc/`](doc/README.md): | | | | --- | --- | | [Candlestick chart](doc/candlestick-chart.md) | The candles, and the shape `KLineEntity` expects | +| [Series charts](doc/series-chart.md) | `SeriesChart` for values: lines, areas, bars, scatter, touch, a range strip, animation | +| [Pie chart](doc/pie-chart.md) | `PieChart`: sections, a doughnut hole, badges, touch | +| [Radar chart](doc/radar-chart.md) | `RadarChart`: a web of features with an outline per series | +| [Heatmap](doc/heatmap-chart.md) | `HeatmapChart`: a grid coloured by value, with a scale and a legend | | [Indicators](doc/indicators.md) | 31 of them as instances, the catalogue, pane scales, chaining, higher timeframes, alerts | | [Comparing a second instrument](doc/comparison.md) | Other series over the same window, rebased or at their own prices | | [Chart types](doc/chart-types.md) | Eight ways to draw a series, and six transforms of the candles | @@ -138,9 +249,11 @@ One page per feature, in [`doc/`](doc/README.md): | [Depth chart](doc/depth-chart.md) | The order-book widget: four modes, three axes | | [Theming](doc/theming.md) | `ChartStyle`, `ChartColors` and `ChartTranslations` | | [Migrating from 1.x](doc/migrating-from-1.x.md) | What changed, and what to use instead | +| [Migrating from fl_chart and candlesticks](doc/migrating-from-fl_chart.md) | Their APIs mapped onto this package's, with worked examples | ## Notes +- Needs Dart 3.6 and Flutter 3.27 or later. - The zoom slider renders only where there is no pinch gesture — web and desktop. - `watermark` takes any widget and paints it in `ChartColors.watermarkColor`, so a full-colour logo reads as a silhouette; the package no longer depends on diff --git a/pubspec.yaml b/pubspec.yaml index 91ad430..095d195 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,9 +1,9 @@ name: ohlcv_chart description: >- - The most complete candlestick chart for Flutter: eight chart types, 31 - indicators and 29 drawing tools, a market-depth chart, alerts and bar replay, - in pure CustomPainter. -version: 2.4.1 + The most complete candlestick chart for Flutter, plus depth, line, bar, + scatter, pie, radar and heatmap charts: 31 indicators, 29 drawing tools, + pure CustomPainter. +version: 2.5.0 homepage: https://github.com/CtrlAltDevelop repository: https://github.com/CtrlAltDevelop/ohlcv_chart issue_tracker: https://github.com/CtrlAltDevelop/ohlcv_chart/issues @@ -13,6 +13,7 @@ topics: - candlestick - trading - finance + - data-visualization # Shown on the pub.dev listing. Up to 10 entries; png, jpg, gif or webp; # 4 MiB each at most. Regenerate them with example/tool/screenshots.dart. @@ -21,30 +22,30 @@ screenshots: A candlestick chart with three moving averages, take-profit and stop-loss markers, the volume pane and a MACD sub-chart. path: screenshots/candles.png + - description: >- + Four charts a business screen asks for: a return split at zero, profit + bars, deposits and withdrawals with a tooltip, and a balance sparkline. + path: screenshots/series-charts.png + - description: >- + A doughnut of holdings with its total in the hole and a slice pulled + out, beside a radar web scoring two strategies over five measures. + path: screenshots/pie-radar.png + - description: >- + Six months of activity as a contribution graph, beside orders by hour + and weekday with the count written in each square. + path: screenshots/heatmap.png - description: >- The Ichimoku cloud and Supertrend over the candles, with Stochastic RSI and the Awesome oscillator in their own panes. path: screenshots/overlays.png - description: >- - A volume profile drawn back from the axis, its point of control and - value area picked out, under an anchored VWAP. - path: screenshots/profile.png - - description: >- - A second instrument overlaid on the candles, rebased to the left of the - visible window so the two say relative performance. - path: screenshots/comparison.png + Bars floating between two values as a waterfall, beside a forecast + inside its band with error bars every few points. + path: screenshots/series-ranges.png - description: >- A working order and an open position, each drawn the width of the chart and tagged on the axis with its size and unrealised P&L. path: screenshots/trading.png - - description: >- - Earnings, a dividend, a split and a news mark, badged under the candles - they fell on. - path: screenshots/events.png - - description: >- - Two charts of the same market held on one window and one crosshair, so - moving or pointing at either carries the other with it. - path: screenshots/linked-charts.png - description: >- The same market as line break, Kagi, point & figure and range bars. path: screenshots/bar-types.png