blob: bb4364b7d7b01d43c8846203546c44e0b1c5ad67 [file] [log] [blame]
/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file or at
* https://developers.google.com/open-source/licenses/bsd
*/
part of charted.charts;
class _ChartConfig extends ChangeNotifier implements ChartConfig {
final Map<String,ChartAxisConfig> _measureAxisRegistry = {};
final Map<int,ChartAxisConfig> _dimensionAxisRegistry = {};
final SubscriptionsDisposer _disposer = new SubscriptionsDisposer();
Iterable<ChartSeries> _series;
Iterable<int> _dimensions;
StreamSubscription _dimensionsSubscription;
@override
Rect minimumSize = const Rect.size(400, 300);
@override
bool leftAxisIsPrimary = false;
@override
bool autoResizeAxis = true;
@override
ChartLegend legend;
@override
Iterable<String> displayedMeasureAxes;
@override
bool renderDimensionAxes = true;
_ChartConfig(Iterable<ChartSeries> series, Iterable<int> dimensions) {
this.series = series;
this.dimensions = dimensions;
}
@override
set series(Iterable<ChartSeries> values) {
assert(values != null && values.isNotEmpty);
_disposer.dispose();
_series = values;
notifyChange(const ChartConfigChangeRecord());
// Monitor each series for changes on them
values.forEach((item) => _disposer.add(item.changes.listen(
(_) => notifyChange(const ChartConfigChangeRecord())), item));
// Monitor series for changes. When the list changes, update
// subscriptions to ChartSeries changes.
if (_series is ObservableList) {
var observable = _series as ObservableList;
_disposer.add(observable.listChanges.listen((records) {
records.forEach((record) {
record.removed.forEach((value) => _disposer.unsubscribe(value));
for (int i = 0; i < record.addedCount; i++) {
var added = observable[i + record.index];
_disposer.add(added.changes.listen(
(_) => notifyChange(const ChartConfigChangeRecord())));
}
});
notifyChange(const ChartConfigChangeRecord());
}));
}
}
@override
Iterable<ChartSeries> get series => _series;
@override
set dimensions(Iterable<int> values) {
_dimensions = values;
if (_dimensionsSubscription != null) {
_dimensionsSubscription.cancel();
_dimensionsSubscription = null;
}
if (values == null || values.isEmpty) return;
if (_dimensions is ObservableList) {
_dimensionsSubscription =
(_dimensions as ObservableList).listChanges.listen(
(_) => notifyChange(const ChartConfigChangeRecord()));
}
}
@override
Iterable<int> get dimensions => _dimensions;
@override
void registerMeasureAxis(String id, ChartAxisConfig config) {
assert(config != null);
_measureAxisRegistry[id] = config;
}
@override
ChartAxisConfig getMeasureAxis(String id) => _measureAxisRegistry[id];
@override
void registerDimensionAxis(int column, ChartAxisConfig config) {
assert(config != null);
assert(dimensions.contains(column));
_dimensionAxisRegistry[column] = config;
}
@override
ChartAxisConfig getDimensionAxis(int column) =>
_dimensionAxisRegistry[column];
}