Index: packages/charted/lib/charts/src/cartesian_area_impl.dart |
diff --git a/packages/charted/lib/charts/src/cartesian_area_impl.dart b/packages/charted/lib/charts/src/cartesian_area_impl.dart |
index 2769f7ecb3a6dc464e1dacc2f5021e4aed215a87..81388733a919eda40c38c2d141693e2358a395f8 100644 |
--- a/packages/charted/lib/charts/src/cartesian_area_impl.dart |
+++ b/packages/charted/lib/charts/src/cartesian_area_impl.dart |
@@ -13,22 +13,22 @@ part of charted.charts; |
/// which contain two dimension axes. |
class DefaultCartesianAreaImpl implements CartesianArea { |
/// Default identifiers used by the measure axes |
- static const MEASURE_AXIS_IDS = const['_default']; |
+ static const MEASURE_AXIS_IDS = const ['_default']; |
/// Orientations used by measure axes. First, when "x" axis is the primary |
/// and the only dimension. Second, when "y" axis is the primary and the only |
/// dimension. |
- static const MEASURE_AXIS_ORIENTATIONS = const[ |
- const[ORIENTATION_LEFT, ORIENTATION_RIGHT], |
- const[ORIENTATION_BOTTOM, ORIENTATION_TOP] |
+ static const MEASURE_AXIS_ORIENTATIONS = const [ |
+ const [ORIENTATION_LEFT, ORIENTATION_RIGHT], |
+ const [ORIENTATION_BOTTOM, ORIENTATION_TOP] |
]; |
/// Orientations used by the dimension axes. First, when "x" is the |
/// primary dimension and the last one for cases where "y" axis is primary |
/// dimension. |
- static const DIMENSION_AXIS_ORIENTATIONS = const[ |
- const[ORIENTATION_BOTTOM, ORIENTATION_LEFT], |
- const[ORIENTATION_LEFT, ORIENTATION_BOTTOM] |
+ static const DIMENSION_AXIS_ORIENTATIONS = const [ |
+ const [ORIENTATION_BOTTOM, ORIENTATION_LEFT], |
+ const [ORIENTATION_LEFT, ORIENTATION_BOTTOM] |
]; |
/// Mapping of measure axis Id to it's axis. |
@@ -99,7 +99,8 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
bool autoUpdate, |
this.useTwoDimensionAxes, |
this.useRowColoring, |
- this.state) : _autoUpdate = autoUpdate { |
+ this.state) |
+ : _autoUpdate = autoUpdate { |
assert(host != null); |
assert(isNotInline(host)); |
@@ -194,9 +195,9 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
DefaultChartAxisImpl _getMeasureAxis(String axisId) { |
_measureAxes.putIfAbsent(axisId, () { |
var axisConf = config.getMeasureAxis(axisId), |
- axis = axisConf != null ? |
- new DefaultChartAxisImpl.withAxisConfig(this, axisConf) : |
- new DefaultChartAxisImpl(this); |
+ axis = axisConf != null |
+ ? new DefaultChartAxisImpl.withAxisConfig(this, axisConf) |
+ : new DefaultChartAxisImpl(this); |
return axis; |
}); |
return _measureAxes[axisId]; |
@@ -207,9 +208,9 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
DefaultChartAxisImpl _getDimensionAxis(int column) { |
_dimensionAxes.putIfAbsent(column, () { |
var axisConf = config.getDimensionAxis(column), |
- axis = axisConf != null ? |
- new DefaultChartAxisImpl.withAxisConfig(this, axisConf) : |
- new DefaultChartAxisImpl(this); |
+ axis = axisConf != null |
+ ? new DefaultChartAxisImpl.withAxisConfig(this, axisConf) |
+ : new DefaultChartAxisImpl(this); |
return axis; |
}); |
return _dimensionAxes[column]; |
@@ -237,8 +238,7 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
/// Computes the size of chart and if changed from the previous time |
/// size was computed, sets attributes on svg element |
Rect _computeChartSize() { |
- int width = host.clientWidth, |
- height = host.clientHeight; |
+ int width = host.clientWidth, height = host.clientHeight; |
if (config.minimumSize != null) { |
width = max([width, config.minimumSize.width]); |
@@ -247,7 +247,9 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
AbsoluteRect padding = theme.padding; |
num paddingLeft = config.isRTL ? padding.end : padding.start; |
- Rect current = new Rect(paddingLeft, padding.top, |
+ Rect current = new Rect( |
+ paddingLeft, |
+ padding.top, |
width - (padding.start + padding.end), |
height - (padding.top + padding.bottom)); |
if (layout.chartArea == null || layout.chartArea != current) { |
@@ -264,7 +266,7 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
} |
@override |
- draw({bool preRender:false, Future schedulePostRender}) { |
+ draw({bool preRender: false, Future schedulePostRender}) { |
assert(data != null && config != null); |
assert(config.series != null && config.series.isNotEmpty); |
@@ -275,9 +277,9 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
_svg = _scope.append('svg:svg')..classed('chart-canvas'); |
if (!isNullOrEmpty(theme.filters)) { |
var element = _svg.first, |
- defs = Namespace.createChildElement('defs', element) |
- ..append(new SvgElement.svg( |
- theme.filters, treeSanitizer: new NullTreeSanitizer())); |
+ defs = Namespace.createChildElement('defs', element) |
+ ..append(new SvgElement.svg(theme.filters, |
+ treeSanitizer: new NullTreeSanitizer())); |
_svg.first.append(defs); |
} |
@@ -286,17 +288,18 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
upperBehaviorPane = _svg.append('g')..classed('upper-render-pane'); |
if (_behaviors.isNotEmpty) { |
- _behaviors.forEach( |
- (b) => b.init(this, upperBehaviorPane, lowerBehaviorPane)); |
+ _behaviors |
+ .forEach((b) => b.init(this, upperBehaviorPane, lowerBehaviorPane)); |
} |
} |
// Compute chart sizes and filter out unsupported series |
_computeChartSize(); |
- var series = config.series.where((s) => |
- _isSeriesValid(s) && s.renderer.prepare(this, s)), |
- selection = visualization.selectAll('.series-group'). |
- data(series, (x) => x.hashCode), |
+ var series = config.series |
+ .where((s) => _isSeriesValid(s) && s.renderer.prepare(this, s)), |
+ selection = visualization |
+ .selectAll('.series-group') |
+ .data(series, (x) => x.hashCode), |
axesDomainCompleter = new Completer(); |
// Wait till the axes are rendered before rendering series. |
@@ -314,7 +317,7 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
info.check(); |
group.attributes['transform'] = transform; |
(s.renderer as CartesianRenderer) |
- .draw(group, schedulePostRender:schedulePostRender); |
+ .draw(group, schedulePostRender: schedulePostRender); |
}); |
// A series that was rendered earlier isn't there anymore, remove it |
@@ -350,16 +353,15 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
/// Initialize the axes - required even if the axes are not being displayed. |
_initAxes({bool preRender: false}) { |
- Map measureAxisUsers = <String,Iterable<ChartSeries>>{}; |
+ Map measureAxisUsers = <String, Iterable<ChartSeries>>{}; |
// Create necessary measures axes. |
// If measure axes were not configured on the series, default is used. |
_series.forEach((ChartSeries s) { |
- var measureAxisIds = isNullOrEmpty(s.measureAxisIds) |
- ? MEASURE_AXIS_IDS |
- : s.measureAxisIds; |
+ var measureAxisIds = |
+ isNullOrEmpty(s.measureAxisIds) ? MEASURE_AXIS_IDS : s.measureAxisIds; |
measureAxisIds.forEach((axisId) { |
- _getMeasureAxis(axisId); // Creates axis if required |
+ _getMeasureAxis(axisId); // Creates axis if required |
var users = measureAxisUsers[axisId]; |
if (users == null) { |
measureAxisUsers[axisId] = [s]; |
@@ -402,18 +404,18 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
// Configure dimension axes. |
int dimensionAxesCount = useTwoDimensionAxes ? 2 : 1; |
config.dimensions.take(dimensionAxesCount).forEach((int column) { |
- var axis = _getDimensionAxis(column), |
- sampleColumnSpec = data.columns.elementAt(column), |
- values = data.rows.map((row) => row.elementAt(column)), |
- domain; |
- |
- if (sampleColumnSpec.useOrdinalScale) { |
- domain = values.map((e) => e.toString()).toList(); |
- } else { |
- var extent = new Extent.items(values); |
- domain = [extent.min, extent.max]; |
- } |
- axis.initAxisDomain(column, true, domain); |
+ var axis = _getDimensionAxis(column), |
+ sampleColumnSpec = data.columns.elementAt(column), |
+ values = data.rows.map((row) => row.elementAt(column)), |
+ domain; |
+ |
+ if (sampleColumnSpec.useOrdinalScale) { |
+ domain = values.map((e) => e.toString()).toList(); |
+ } else { |
+ var extent = new Extent.items(values); |
+ domain = [extent.min, extent.max]; |
+ } |
+ axis.initAxisDomain(column, true, domain); |
}); |
// See if any dimensions need "band" on the axis. |
@@ -421,23 +423,22 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
List<bool> usingBands = [false, false]; |
_series.forEach((ChartSeries s) => |
(s.renderer as CartesianRenderer).dimensionsUsingBand.forEach((x) { |
- if (x <= 1 && !(usingBands[x])) { |
- usingBands[x] = true; |
- dimensionsUsingBands.add(config.dimensions.elementAt(x)); |
- } |
- })); |
+ if (x <= 1 && !(usingBands[x])) { |
+ usingBands[x] = true; |
+ dimensionsUsingBands.add(config.dimensions.elementAt(x)); |
+ } |
+ })); |
// List of measure and dimension axes that are displayed |
- assert( |
- isNullOrEmpty(config.displayedMeasureAxes) || |
+ assert(isNullOrEmpty(config.displayedMeasureAxes) || |
config.displayedMeasureAxes.length < 2); |
var measureAxesCount = dimensionAxesCount == 1 ? 2 : 0, |
displayedMeasureAxes = (isNullOrEmpty(config.displayedMeasureAxes) |
- ? _measureAxes.keys.take(measureAxesCount) |
- : config.displayedMeasureAxes.take(measureAxesCount)). |
- toList(growable: false), |
+ ? _measureAxes.keys.take(measureAxesCount) |
+ : config.displayedMeasureAxes.take(measureAxesCount)) |
+ .toList(growable: false), |
displayedDimensionAxes = |
- config.dimensions.take(dimensionAxesCount).toList(growable: false); |
+ config.dimensions.take(dimensionAxesCount).toList(growable: false); |
// Compute size of the dimension axes |
if (config.renderDimensionAxes != false) { |
@@ -481,8 +482,9 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
// Draw the visible measure axes, if any. |
if (displayedMeasureAxes.isNotEmpty) { |
- var axisGroups = visualization. |
- selectAll('.measure-axis-group').data(displayedMeasureAxes); |
+ var axisGroups = visualization |
+ .selectAll('.measure-axis-group') |
+ .data(displayedMeasureAxes); |
// Update measure axis (add/remove/update) |
axisGroups.enter.append('svg:g'); |
axisGroups.each((axisId, index, group) { |
@@ -494,8 +496,9 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
// Draw the dimension axes, unless asked not to. |
if (config.renderDimensionAxes != false) { |
- var dimAxisGroups = visualization. |
- selectAll('.dimension-axis-group').data(displayedDimensionAxes); |
+ var dimAxisGroups = visualization |
+ .selectAll('.dimension-axis-group') |
+ .data(displayedDimensionAxes); |
// Update dimension axes (add/remove/update) |
dimAxisGroups.enter.append('svg:g'); |
dimAxisGroups.each((column, index, group) { |
@@ -505,15 +508,18 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
dimAxisGroups.exit.remove(); |
} else { |
// Initialize scale on invisible axis |
- var dimensionAxisOrientations = config.isLeftAxisPrimary ? |
- DIMENSION_AXIS_ORIENTATIONS.last : DIMENSION_AXIS_ORIENTATIONS.first; |
+ var dimensionAxisOrientations = config.isLeftAxisPrimary |
+ ? DIMENSION_AXIS_ORIENTATIONS.last |
+ : DIMENSION_AXIS_ORIENTATIONS.first; |
for (int i = 0; i < dimensionAxesCount; ++i) { |
var column = config.dimensions.elementAt(i), |
axis = _dimensionAxes[column], |
orientation = dimensionAxisOrientations[i]; |
- axis.initAxisScale(orientation == ORIENTATION_LEFT ? |
- [layout.renderArea.height, 0] : [0, layout.renderArea.width]); |
- }; |
+ axis.initAxisScale(orientation == ORIENTATION_LEFT |
+ ? [layout.renderArea.height, 0] |
+ : [0, layout.renderArea.width]); |
+ } |
+ ; |
} |
} |
@@ -535,21 +541,17 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
renderAreaWidth = layout.chartArea.width - |
(left.width + layout.axes[ORIENTATION_RIGHT].width); |
- layout.renderArea = new Rect( |
- left.width, top.height, renderAreaWidth, renderAreaHeight); |
+ layout.renderArea = |
+ new Rect(left.width, top.height, renderAreaWidth, renderAreaHeight); |
layout._axes |
- ..[ORIENTATION_TOP] = |
- new Rect(left.width, 0, renderAreaWidth, top.height) |
- ..[ORIENTATION_RIGHT] = |
- new Rect(left.width + renderAreaWidth, top.y, |
- right.width, renderAreaHeight) |
- ..[ORIENTATION_BOTTOM] = |
- new Rect(left.width, top.height + renderAreaHeight, |
- renderAreaWidth, bottom.height) |
+ ..[ORIENTATION_TOP] = new Rect(left.width, 0, renderAreaWidth, top.height) |
+ ..[ORIENTATION_RIGHT] = new Rect( |
+ left.width + renderAreaWidth, top.y, right.width, renderAreaHeight) |
+ ..[ORIENTATION_BOTTOM] = new Rect(left.width, |
+ top.height + renderAreaHeight, renderAreaWidth, bottom.height) |
..[ORIENTATION_LEFT] = |
- new Rect( |
- left.width, top.height, left.width, renderAreaHeight); |
+ new Rect(left.width, top.height, left.width, renderAreaHeight); |
} |
// Updates the legend, if configuration changed since the last |
@@ -562,14 +564,15 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
List seriesByColumn = |
new List.generate(data.columns.length, (_) => new List()); |
- _series.forEach((s) => |
- s.measures.forEach((m) => seriesByColumn[m].add(s))); |
+ _series.forEach((s) => s.measures.forEach((m) => seriesByColumn[m].add(s))); |
seriesByColumn.asMap().forEach((int i, List s) { |
if (s.length == 0) return; |
legend.add(new ChartLegendItem( |
- index:i, label:data.columns.elementAt(i).label, series:s, |
- color:theme.getColorForKey(i))); |
+ index: i, |
+ label: data.columns.elementAt(i).label, |
+ series: s, |
+ color: theme.getColorForKey(i))); |
}); |
_config.legend.update(legend, this); |
@@ -578,28 +581,23 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
@override |
Stream<ChartEvent> get onMouseUp => |
- host.onMouseUp |
- .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
+ host.onMouseUp.map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
@override |
- Stream<ChartEvent> get onMouseDown => |
- host.onMouseDown |
- .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
+ Stream<ChartEvent> get onMouseDown => host.onMouseDown |
+ .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
@override |
- Stream<ChartEvent> get onMouseOver => |
- host.onMouseOver |
- .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
+ Stream<ChartEvent> get onMouseOver => host.onMouseOver |
+ .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
@override |
Stream<ChartEvent> get onMouseOut => |
- host.onMouseOut |
- .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
+ host.onMouseOut.map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
@override |
- Stream<ChartEvent> get onMouseMove => |
- host.onMouseMove |
- .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
+ Stream<ChartEvent> get onMouseMove => host.onMouseMove |
+ .map((MouseEvent e) => new DefaultChartEventImpl(e, this)); |
@override |
Stream<ChartEvent> get onValueClick { |
@@ -654,11 +652,11 @@ class DefaultCartesianAreaImpl implements CartesianArea { |
class _ChartAreaLayout implements ChartAreaLayout { |
final _axes = <String, Rect>{ |
- ORIENTATION_LEFT: const Rect(), |
- ORIENTATION_RIGHT: const Rect(), |
- ORIENTATION_TOP: const Rect(), |
- ORIENTATION_BOTTOM: const Rect() |
- }; |
+ ORIENTATION_LEFT: const Rect(), |
+ ORIENTATION_RIGHT: const Rect(), |
+ ORIENTATION_TOP: const Rect(), |
+ ORIENTATION_BOTTOM: const Rect() |
+ }; |
UnmodifiableMapView<String, Rect> _axesView; |
@@ -713,7 +711,8 @@ class _ChartSeriesInfo { |
if (state != null) { |
var current = state.hovered; |
if (current != null && |
- current.first == e.column && current.last == e.row) { |
+ current.first == e.column && |
+ current.last == e.row) { |
state.hovered = null; |
} |
} |
@@ -725,7 +724,7 @@ class _ChartSeriesInfo { |
check() { |
if (_renderer != _series.renderer) { |
dispose(); |
- if (_series.renderer is ChartRendererBehaviorSource){ |
+ if (_series.renderer is ChartRendererBehaviorSource) { |
_disposer.addAll([ |
_series.renderer.onValueClick.listen(_click), |
_series.renderer.onValueMouseOver.listen(_mouseOver), |
@@ -736,5 +735,8 @@ class _ChartSeriesInfo { |
_renderer = _series.renderer; |
} |
- dispose() => _disposer.dispose(); |
+ dispose() { |
+ _renderer?.dispose(); |
+ _disposer.dispose(); |
+ } |
} |