From 77da1cb4fde39ac452b257329ff89bff6f1fbdf8 Mon Sep 17 00:00:00 2001 From: Adam Kuczynski Date: Thu, 1 Dec 2022 19:15:03 +0100 Subject: [PATCH] add hover event --- example/pubspec.lock | 46 ++++++++--------------- lib/src/chart.dart | 8 +++- lib/src/models/enum/chart_touch_type.dart | 4 ++ lib/src/touch/chart_touch_detector.dart | 23 ++++++++++++ 4 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 lib/src/models/enum/chart_touch_type.dart diff --git a/example/pubspec.lock b/example/pubspec.lock index c9872d7..dd9d33a 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" boolean_selector: dependency: transitive description: @@ -21,28 +21,21 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +49,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -94,35 +87,35 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mrx_charts: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.1.2" + version: "0.1.3" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" sky_engine: dependency: transitive description: flutter @@ -134,7 +127,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -155,35 +148,28 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.12" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.16.1 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=1.17.0" diff --git a/lib/src/chart.dart b/lib/src/chart.dart index d79fb77..db64b32 100644 --- a/lib/src/chart.dart +++ b/lib/src/chart.dart @@ -1,5 +1,6 @@ import 'package:mrx_charts/src/models/chart_data_item.dart'; import 'package:mrx_charts/src/models/chart_layer.dart'; +import 'package:mrx_charts/src/models/enum/chart_touch_type.dart'; import 'package:mrx_charts/src/models/touchable/touchable_shape.dart'; import 'package:mrx_charts/src/painter/chart_painter.dart'; import 'package:mrx_charts/src/touch/chart_touch_detector.dart'; @@ -21,12 +22,16 @@ class Chart extends StatefulWidget { /// Defaults to EdgeInsets.zero final EdgeInsets padding; + // The type of method click. + final ChartTouchType type; + const Chart({ this.duration = const Duration( milliseconds: 300, ), this.layers = const [], this.padding = EdgeInsets.zero, + this.type = ChartTouchType.click, Key? key, }) : super(key: key); @@ -101,8 +106,7 @@ class _ChartState extends State with TickerProviderStateMixin { controller: _controller, layers: widget.layers, oldLayers: oldLayers, - onUpdateTouchableShapes: (shapes) => - _touchableShapes = shapes, + onUpdateTouchableShapes: (shapes) => _touchableShapes = shapes, padding: widget.padding, touchedData: _touchedData, ), diff --git a/lib/src/models/enum/chart_touch_type.dart b/lib/src/models/enum/chart_touch_type.dart new file mode 100644 index 0000000..d8b2f23 --- /dev/null +++ b/lib/src/models/enum/chart_touch_type.dart @@ -0,0 +1,4 @@ +enum ChartTouchType { + click, + hover, +} diff --git a/lib/src/touch/chart_touch_detector.dart b/lib/src/touch/chart_touch_detector.dart index 90321da..74f6bda 100644 --- a/lib/src/touch/chart_touch_detector.dart +++ b/lib/src/touch/chart_touch_detector.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:mrx_charts/src/models/enum/chart_touch_type.dart'; import 'package:mrx_charts/src/models/touchable/touchable_shape.dart'; import 'package:flutter/widgets.dart'; @@ -14,8 +16,12 @@ class ChartTouchDetector extends StatelessWidget { /// The function return list of shapes. final List> Function() onShapes; + // The type of method click. + final ChartTouchType type; + const ChartTouchDetector({ required this.onShapes, + this.type = ChartTouchType.click, this.child, this.onTap, this.shapes, @@ -24,6 +30,23 @@ class ChartTouchDetector extends StatelessWidget { @override Widget build(BuildContext context) { + if (type == ChartTouchType.hover) { + return MouseRegion( + onHover: (event) { + if (onTap == null) { + return; + } + for (final TouchableShape shape in onShapes()) { + if (shape.isHit(event.localPosition)) { + onTap?.call(event.localPosition, shape.data); + return; + } + } + onTap?.call(event.localPosition, null); + }, + child: child, + ); + } return GestureDetector( onTapUp: (TapUpDetails tapUpDetails) { if (onTap == null) {