Index: packages/charted/lib/charts/src/chart_axis_impl.dart |
diff --git a/packages/charted/lib/charts/src/chart_axis_impl.dart b/packages/charted/lib/charts/src/chart_axis_impl.dart |
index 345d537d28bd8bec46a980ff09b6ae2e147edc75..4a684b3f97b7a8dbb5d140730b7b364857538dfb 100644 |
--- a/packages/charted/lib/charts/src/chart_axis_impl.dart |
+++ b/packages/charted/lib/charts/src/chart_axis_impl.dart |
@@ -83,17 +83,16 @@ class DefaultChartAxisImpl { |
: new MutableRect.size(layout.height, _theme.horizontalAxisHeight); |
// Handle auto re-sizing of horizontal axis. |
+ 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; |
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; |
@@ -105,8 +104,20 @@ class DefaultChartAxisImpl { |
size.width = |
width + _theme.axisTickPadding + math.max(_theme.axisTickSize, 0); |
} |
+ |
_axisTicksPlacement = |
new PrecomputedAxisTicks(ticks, formattedTicks, shortenedTicks); |
+ } else { |
+ // Precompute if extra room is needed for rotated label. |
+ var width = layout.width - |
+ _area.layout.axes[ORIENTATION_LEFT].width - |
+ _area.layout.axes[ORIENTATION_RIGHT].width; |
+ var allowedWidth = width ~/ ticks.length, |
+ maxLabelWidth = textMetrics.getLongestTextWidth(formattedTicks); |
+ if (!RotateHorizontalAxisTicks.needsLabelRotation( |
+ allowedWidth, maxLabelWidth)) { |
+ size.height = textMetrics.fontSize * 2; |
+ } |
} |
} |
@@ -151,7 +162,9 @@ class DefaultChartAxisImpl { |
Scale get scale => |
(_config != null && _config.scale != null) ? _config.scale : _scale; |
- set scale(Scale value) => _scale = value; |
+ set scale(Scale value) { |
+ _scale = value; |
+ } |
} |
class PrecomputedAxisTicks implements SvgAxisTicks { |
@@ -171,11 +184,14 @@ class RotateHorizontalAxisTicks implements SvgAxisTicks { |
int rotation = 0; |
Iterable ticks; |
- Iterable formattedTicks; |
+ Iterable<String> formattedTicks; |
Iterable shortenedTicks; |
RotateHorizontalAxisTicks(this.rect, this.ticksFont, this.tickLineLength); |
+ static bool needsLabelRotation(num allowedWidth, num maxLabelWidth) => |
+ 0.90 * allowedWidth < maxLabelWidth; |
+ |
void init(SvgAxis axis) { |
assert(axis.orientation == ORIENTATION_BOTTOM || |
axis.orientation == ORIENTATION_TOP); |
@@ -190,7 +206,7 @@ class RotateHorizontalAxisTicks implements SvgAxisTicks { |
maxLabelWidth = textMetrics.getLongestTextWidth(formattedTicks); |
// Check if we need rotation |
- if (0.90 * allowedWidth < maxLabelWidth) { |
+ if (needsLabelRotation(allowedWidth, maxLabelWidth)) { |
var rectHeight = |
tickLineLength > 0 ? rect.height - tickLineLength : rect.height; |
rotation = 45; |