blob: 0ea0df6b11654168cb8cf270cae551952fc2f63b [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 AxisMarker implements ChartBehavior {
ChartArea _area;
Rect _rect;
Element _markerX;
Element _markerY;
bool _showMarkerX = true;
bool _showMarkerY = true;
bool _showing;
Element _lower;
Element _upper;
StreamSubscription _mouseMoveSubscription;
StreamSubscription _mouseInSubscription;
StreamSubscription _mouseOutSubscription;
void init(ChartArea area, Element upper, Element lower) {
_area = area;
_lower = lower;
_upper = upper;
if (_area.dimensionAxesCount != 0) {
_mouseInSubscription = _area.onMouseOver.listen(_show);
_mouseOutSubscription = _area.onMouseOut.listen(_hide);
}
}
void dispose() {
if (_mouseInSubscription != null) _mouseInSubscription.cancel();
if (_mouseOutSubscription != null) _mouseOutSubscription.cancel();
if (_mouseMoveSubscription != null) _mouseOutSubscription.cancel();
if (_markerX != null) _markerX.remove();
if (_markerY != null) _markerY.remove();
}
void _show(ChartEvent e) {
if (_mouseMoveSubscription != null) return;
_create();
_visibility(true);
_mouseMoveSubscription = _area.onMouseMove.listen(_update);
}
void _hide(ChartEvent e) {
if (_showing != true) return;
_visibility(false);
_mouseMoveSubscription.cancel();
_mouseMoveSubscription = null;
}
void _visibility(bool show) {
if (_showing == show) return;
var value = show ? 'visible' : 'hidden';
if (_markerX != null) {
_markerX.style.visibility = value;
}
if (_markerY != null) {
_markerY.style.visibility = value;
}
}
bool _isRenderArea(ChartEvent e) =>
_rect != null && _rect.contains(e.chartX, e.chartY);
void _create() {
if (_rect == null) {
var renderArea = _area.layout.renderArea;
_rect = new Rect(
renderArea.x, renderArea.y, renderArea.width, renderArea.height);
}
if (_showMarkerX && _markerX == null) {
_markerX = new LineElement();
_markerX.attributes
..['x1'] = '0'
..['y1'] = _rect.y.toString()
..['x2'] = '0'
..['y2'] = (_rect.y + _rect.height).toString()
..['class'] = 'axis-marker axis-marker-x';
_lower.append(_markerX);
}
if (_showMarkerY && _markerY == null) {
_markerY = new LineElement();
_markerY.attributes
..['x1'] = _rect.x.toString()
..['y1'] = '0'
..['x2'] = (_rect.x + _rect.width).toString()
..['y2'] = '0'
..['class'] = 'axis-marker axis-marker-y';
_lower.append(_markerY);
}
_visibility(false);
}
void _update(ChartEvent e) {
if (!_isRenderArea(e)) {
_visibility(false);
} else {
_visibility(true);
window.requestAnimationFrame((_) {
if (_showMarkerX) {
_markerX.attributes['transform'] = 'translate(${e.chartX},0)';
}
if (_showMarkerY) {
_markerY.attributes['transform'] = 'translate(0,${e.chartY})';
}
});
}
}
}