| Index: charted/lib/charts/src/chart_axis_impl.dart
|
| diff --git a/charted/lib/charts/src/chart_axis_impl.dart b/charted/lib/charts/src/chart_axis_impl.dart
|
| deleted file mode 100644
|
| index 3f5d12d8259d3c6207a1cfe920b4c39bfdb7b682..0000000000000000000000000000000000000000
|
| --- a/charted/lib/charts/src/chart_axis_impl.dart
|
| +++ /dev/null
|
| @@ -1,206 +0,0 @@
|
| -//
|
| -// 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 DefaultChartAxisImpl {
|
| - CartesianArea _area;
|
| - ChartAxisConfig _config;
|
| - ChartAxisTheme _theme;
|
| - SvgAxisTicks _axisTicksPlacement;
|
| -
|
| - int _column;
|
| - bool _isDimension;
|
| - ChartColumnSpec _columnSpec;
|
| -
|
| - bool _isVertical;
|
| - String _orientation;
|
| - Scale _scale;
|
| - SelectionScope _scope;
|
| -
|
| - MutableRect size;
|
| -
|
| - DefaultChartAxisImpl.withAxisConfig(this._area, this._config);
|
| - DefaultChartAxisImpl(this._area);
|
| -
|
| - void initAxisDomain(int column, bool isDimension, Iterable domain) {
|
| - _columnSpec = _area.data.columns.elementAt(column);
|
| - _column = column;
|
| - _isDimension = isDimension;
|
| -
|
| - // If we don't have a scale yet, create one.
|
| - if (scale == null) {
|
| - _scale = _columnSpec.createDefaultScale();
|
| - }
|
| -
|
| - // We have the scale, get theme.
|
| - _theme = isDimension
|
| - ? _area.theme.getDimensionAxisTheme(scale)
|
| - : _area.theme.getMeasureAxisTheme(scale);
|
| -
|
| - // Sets the domain if not using a custom scale.
|
| - if (_config == null || (_config != null && _config.scale == null)) {
|
| - scale.domain = domain;
|
| - scale.nice = !_isDimension;
|
| - }
|
| - }
|
| -
|
| - void initAxisScale(Iterable range) {
|
| - assert(scale != null);
|
| - if (scale is OrdinalScale) {
|
| - var usingBands = _area.dimensionsUsingBands.contains(_column),
|
| - innerPadding = usingBands ? _theme.axisBandInnerPadding : 1.0,
|
| - outerPadding = usingBands ?
|
| - _theme.axisBandOuterPadding : _theme.axisOuterPadding;
|
| -
|
| - // This is because when left axis is primary the first data row should
|
| - // appear on top of the y-axis instead of on bottom.
|
| - if (_area.config.isLeftAxisPrimary) {
|
| - range = range.toList().reversed;
|
| - }
|
| - (scale as OrdinalScale).
|
| - rangeRoundBands(range, innerPadding, outerPadding);
|
| - } else {
|
| - scale.range = range;
|
| - scale.ticksCount = _theme.axisTickCount;
|
| - }
|
| - }
|
| -
|
| - void prepareToDraw(String orientation) {
|
| - if (orientation == null) orientation = ORIENTATION_BOTTOM;
|
| - _orientation = orientation;
|
| - _isVertical =
|
| - _orientation == ORIENTATION_LEFT || _orientation == ORIENTATION_RIGHT;
|
| -
|
| - var layout = _area.layout.chartArea;
|
| - size = _isVertical
|
| - ? new MutableRect.size(_theme.verticalAxisWidth, layout.width)
|
| - : new MutableRect.size(layout.height, _theme.horizontalAxisHeight);
|
| -
|
| - // Handle auto re-sizing of horizontal axis.
|
| - if (_isVertical) {
|
| - var ticks = (_config != null && !isNullOrEmpty(_config.tickValues))
|
| - ? _config.tickValues
|
| - : scale.ticks,
|
| - formatter = _columnSpec.formatter == null
|
| - ? scale.createTickFormatter()
|
| - : _columnSpec.formatter,
|
| - textMetrics = new TextMetrics(fontStyle: _theme.ticksFont),
|
| - formattedTicks = ticks.map((x) => formatter(x)).toList(),
|
| - shortenedTicks = formattedTicks;
|
| -
|
| - var width = textMetrics.getLongestTextWidth(formattedTicks).ceil();
|
| - if (width > _theme.verticalAxisWidth) {
|
| - width = _theme.verticalAxisWidth;
|
| - shortenedTicks = formattedTicks.map(
|
| - (x) => textMetrics.ellipsizeText(x, width)).toList();
|
| - }
|
| - if (_theme.verticalAxisAutoResize) {
|
| - size.width =
|
| - width + _theme.axisTickPadding + math.max(_theme.axisTickSize, 0);
|
| - }
|
| - _axisTicksPlacement =
|
| - new PrecomputedAxisTicks(ticks, formattedTicks, shortenedTicks);
|
| - }
|
| - }
|
| -
|
| - void draw(Element element, SelectionScope scope, {bool preRender: false}) {
|
| - assert(element != null && element is GElement);
|
| - assert(scale != null);
|
| -
|
| - var rect = _area.layout.axes[_orientation],
|
| - renderAreaRect = _area.layout.renderArea,
|
| - range = _isVertical ? [rect.height, 0] : [0, rect.width],
|
| - innerTickSize = _theme.axisTickSize <= ChartAxisTheme.FILL_RENDER_AREA
|
| - ? 0 - (_isVertical ? renderAreaRect.width : renderAreaRect.height)
|
| - : _theme.axisTickSize,
|
| - tickValues = _config != null && !isNullOrEmpty(_config.tickValues)
|
| - ? _config.tickValues
|
| - : null;
|
| -
|
| - element.attributes['transform'] = 'translate(${rect.x}, ${rect.y})';
|
| -
|
| - if (!_isVertical) {
|
| - _axisTicksPlacement =
|
| - new RotateHorizontalAxisTicks(rect,
|
| - _theme.ticksFont, _theme.axisTickSize + _theme.axisTickPadding);
|
| - }
|
| -
|
| - initAxisScale(range);
|
| - var axis = new SvgAxis(orientation: _orientation,
|
| - innerTickSize: innerTickSize, outerTickSize: 0,
|
| - tickPadding: _theme.axisTickPadding,
|
| - tickFormat: _columnSpec.formatter, tickValues: tickValues,
|
| - scale: scale);
|
| -
|
| - axis.create(element, scope,
|
| - axisTicksBuilder: _axisTicksPlacement, isRTL: _area.config.isRTL);
|
| - }
|
| -
|
| - void clear() {
|
| - }
|
| -
|
| - // Scale passed through configuration takes precedence
|
| - Scale get scale =>
|
| - (_config != null && _config.scale != null) ? _config.scale : _scale;
|
| -
|
| - set scale(Scale value) => _scale = value;
|
| -}
|
| -
|
| -class PrecomputedAxisTicks implements SvgAxisTicks {
|
| - final int rotation = 0;
|
| - final Iterable ticks;
|
| - final Iterable formattedTicks;
|
| - final Iterable shortenedTicks;
|
| - const PrecomputedAxisTicks(
|
| - this.ticks, this.formattedTicks, this.shortenedTicks);
|
| - void init(SvgAxis axis) {}
|
| -}
|
| -
|
| -class RotateHorizontalAxisTicks implements SvgAxisTicks {
|
| - final Rect rect;
|
| - final String ticksFont;
|
| - final int tickLineLength;
|
| -
|
| - int rotation = 0;
|
| - Iterable ticks;
|
| - Iterable formattedTicks;
|
| - Iterable shortenedTicks;
|
| -
|
| - RotateHorizontalAxisTicks(this.rect, this.ticksFont, this.tickLineLength);
|
| -
|
| - void init(SvgAxis axis) {
|
| - assert(
|
| - axis.orientation == ORIENTATION_BOTTOM ||
|
| - axis.orientation == ORIENTATION_TOP);
|
| - assert(ticksFont != null);
|
| - ticks = axis.tickValues;
|
| - formattedTicks = ticks.map((x) => axis.tickFormat(x)).toList();
|
| - shortenedTicks = formattedTicks;
|
| -
|
| - var range = axis.scale.rangeExtent,
|
| - textMetrics = new TextMetrics(fontStyle: ticksFont),
|
| - allowedWidth = (range.max - range.min) ~/ ticks.length,
|
| - maxLabelWidth = textMetrics.getLongestTextWidth(formattedTicks);
|
| -
|
| - // Check if we need rotation
|
| - if (0.90 * allowedWidth < maxLabelWidth) {
|
| - var rectHeight = tickLineLength > 0
|
| - ? rect.height - tickLineLength
|
| - : rect.height;
|
| - rotation = 45;
|
| -
|
| - // Check if we have enough space to render full chart
|
| - allowedWidth = (1.4142 * (rectHeight)) - (textMetrics.fontSize / 1.4142);
|
| - if (maxLabelWidth > allowedWidth) {
|
| - shortenedTicks = formattedTicks.map(
|
| - (x) => textMetrics.ellipsizeText(x, allowedWidth)).toList();
|
| - }
|
| - }
|
| - }
|
| -}
|
|
|