Index: packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart |
diff --git a/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart b/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart |
index 4806d2d8c45c52ef70795607bf0a4c83c8c2a6c7..b904327b1c59322d5a71f1211a5a658cb93150c9 100644 |
--- a/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart |
+++ b/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart |
@@ -1,4 +1,3 @@ |
-// |
// Copyright 2014 Google Inc. All rights reserved. |
// |
// Use of this source code is governed by a BSD-style |
@@ -12,6 +11,7 @@ class LineChartRenderer extends CartesianRendererBase { |
final Iterable<int> dimensionsUsingBand = const []; |
final bool alwaysAnimate; |
+ final bool showHoverCardOnTrackedDataPoints; |
final bool trackDataPoints; |
final bool trackOnDimensionAxis; |
final int quantitativeScaleProximity; |
@@ -30,6 +30,7 @@ class LineChartRenderer extends CartesianRendererBase { |
LineChartRenderer( |
{this.alwaysAnimate: false, |
+ this.showHoverCardOnTrackedDataPoints: false, |
this.trackDataPoints: true, |
this.trackOnDimensionAxis: false, |
this.quantitativeScaleProximity: 5}); |
@@ -114,10 +115,10 @@ class LineChartRenderer extends CartesianRendererBase { |
@override |
void dispose() { |
+ _disposer.dispose(); |
if (root == null) return; |
root.selectAll('.line-rdr-line').remove(); |
root.selectAll('.line-rdr-point').remove(); |
- _disposer.dispose(); |
} |
@override |
@@ -166,7 +167,7 @@ class LineChartRenderer extends CartesianRendererBase { |
_trackingPointsCreated = true; |
} |
- void _showTrackingCircles(int row) { |
+ void _showTrackingCircles(ChartEvent event, int row) { |
if (_trackingPointsCreated == false) { |
_createTrackingCircles(); |
} |
@@ -197,19 +198,31 @@ class LineChartRenderer extends CartesianRendererBase { |
..setProperty('visibility', 'hidden'); |
} |
}); |
+ |
+ if (showHoverCardOnTrackedDataPoints) { |
+ var firstMeasureColumn = series.measures.first; |
+ mouseOverController.add(new DefaultChartEventImpl( |
+ event.source, area, series, row, firstMeasureColumn, 0)); |
+ _savedOverRow = row; |
+ _savedOverColumn = firstMeasureColumn; |
+ } |
} |
- void _hideTrackingCircles() { |
+ void _hideTrackingCircles(ChartEvent event) { |
root.selectAll('.line-rdr-point') |
..style('opacity', '0.0') |
..style('visibility', 'hidden'); |
+ if (showHoverCardOnTrackedDataPoints) { |
+ mouseOutController.add(new DefaultChartEventImpl( |
+ event.source, area, series, _savedOverRow, _savedOverColumn, 0)); |
+ } |
} |
int _getNearestRowIndex(num x) { |
- var lastSmallerValue = 0; |
+ double lastSmallerValue = 0.0; |
var chartX = x - area.layout.renderArea.x; |
for (var i = 0; i < _xPositions.length; i++) { |
- var pos = _xPositions[i]; |
+ double pos = _xPositions[i].toDouble(); |
if (pos < chartX) { |
lastSmallerValue = pos; |
} else { |
@@ -226,19 +239,24 @@ class LineChartRenderer extends CartesianRendererBase { |
_disposer.add(area.onMouseMove.listen((ChartEvent event) { |
if (area.layout.renderArea.contains(event.chartX, event.chartY)) { |
var row = _getNearestRowIndex(event.chartX); |
- window.animationFrame.then((_) => _showTrackingCircles(row)); |
+ window.animationFrame.then((_) { |
+ _showTrackingCircles(event, row); |
+ }); |
} else { |
- _hideTrackingCircles(); |
+ _hideTrackingCircles(event); |
} |
})); |
_disposer.add(area.onMouseOut.listen((ChartEvent event) { |
- _hideTrackingCircles(); |
+ _hideTrackingCircles(event); |
})); |
} |
void _mouseClickHandler(d, int i, Element e) { |
if (area.state != null) { |
- area.state.select(int.parse(e.dataset['column'])); |
+ var selectedColumn = int.parse(e.dataset['column']); |
+ area.state.isSelected(selectedColumn) |
+ ? area.state.unselect(selectedColumn) |
+ : area.state.select(selectedColumn); |
} |
if (mouseClickController != null && e.tagName == 'circle') { |
var row = int.parse(e.dataset['row']), |