OLD | NEW |
1 // | 1 // |
2 // Copyright 2014 Google Inc. All rights reserved. | 2 // Copyright 2014 Google Inc. All rights reserved. |
3 // | 3 // |
4 // Use of this source code is governed by a BSD-style | 4 // Use of this source code is governed by a BSD-style |
5 // license that can be found in the LICENSE file or at | 5 // license that can be found in the LICENSE file or at |
6 // https://developers.google.com/open-source/licenses/bsd | 6 // https://developers.google.com/open-source/licenses/bsd |
7 // | 7 // |
8 | 8 |
9 part of charted.charts; | 9 part of charted.charts; |
10 | 10 |
(...skipping 20 matching lines...) Expand all Loading... |
31 } | 31 } |
32 | 32 |
33 void dispose() { | 33 void dispose() { |
34 _disposer.dispose(); | 34 _disposer.dispose(); |
35 if (_tooltipRoot != null) _tooltipRoot.remove(); | 35 if (_tooltipRoot != null) _tooltipRoot.remove(); |
36 } | 36 } |
37 | 37 |
38 void _subscribe() { | 38 void _subscribe() { |
39 var elements = _area.host.querySelectorAll(_AXIS_SELECTOR); | 39 var elements = _area.host.querySelectorAll(_AXIS_SELECTOR); |
40 _disposer.dispose(); | 40 _disposer.dispose(); |
41 _disposer.addAll( | 41 _disposer |
42 elements.map((x) => x.onMouseOver.listen(_handleMouseOver))); | 42 .addAll(elements.map((x) => x.onMouseOver.listen(_handleMouseOver))); |
43 _disposer.addAll( | 43 _disposer.addAll(elements.map((x) => x.onMouseOut.listen(_handleMouseOut))); |
44 elements.map((x) => x.onMouseOut.listen(_handleMouseOut))); | |
45 } | 44 } |
46 | 45 |
47 void _handleMouseOver(MouseEvent e) { | 46 void _handleMouseOver(MouseEvent e) { |
48 Element target = e.target; | 47 Element target = e.target; |
49 if (!target.dataset.containsKey('detail')) return; | 48 if (!target.dataset.containsKey('detail')) return; |
50 ensureTooltipRoot(); | 49 ensureTooltipRoot(); |
51 ensureRenderAreaRect(); | 50 ensureRenderAreaRect(); |
52 | 51 |
53 _tooltipRoot.text = target.dataset['detail']; | 52 _tooltipRoot.text = target.dataset['detail']; |
54 var position = computeTooltipPosition( | 53 var position = computeTooltipPosition(target.getBoundingClientRect(), |
55 target.getBoundingClientRect(), | 54 _tooltipRoot.getBoundingClientRect(), _renderAreaRect); |
56 _tooltipRoot.getBoundingClientRect(), | |
57 _renderAreaRect); | |
58 | 55 |
59 _tooltipRoot.style | 56 _tooltipRoot.style |
60 ..left = '${position.x}px' | 57 ..left = '${position.x}px' |
61 ..top = '${position.y}px' | 58 ..top = '${position.y}px' |
62 ..opacity = '1' | 59 ..opacity = '1' |
63 ..visibility = 'visible'; | 60 ..visibility = 'visible'; |
64 } | 61 } |
65 | 62 |
66 void _handleMouseOut(MouseEvent e) { | 63 void _handleMouseOut(MouseEvent e) { |
67 Element target = e.target; | 64 Element target = e.target; |
(...skipping 19 matching lines...) Expand all Loading... |
87 _area.host.append(_tooltipRoot); | 84 _area.host.append(_tooltipRoot); |
88 } | 85 } |
89 } | 86 } |
90 | 87 |
91 void ensureRenderAreaRect() { | 88 void ensureRenderAreaRect() { |
92 var layout = _area.layout; | 89 var layout = _area.layout; |
93 _hostAreaRect = _area.host.getBoundingClientRect(); | 90 _hostAreaRect = _area.host.getBoundingClientRect(); |
94 _renderAreaRect = new math.Rectangle( | 91 _renderAreaRect = new math.Rectangle( |
95 _hostAreaRect.left + layout.chartArea.x + layout.renderArea.x, | 92 _hostAreaRect.left + layout.chartArea.x + layout.renderArea.x, |
96 _hostAreaRect.top + layout.chartArea.y + layout.renderArea.y, | 93 _hostAreaRect.top + layout.chartArea.y + layout.renderArea.y, |
97 layout.renderArea.width, layout.renderArea.height); | 94 layout.renderArea.width, |
| 95 layout.renderArea.height); |
98 } | 96 } |
99 | 97 |
100 /// Computes the ideal tooltip position based on orientation. | 98 /// Computes the ideal tooltip position based on orientation. |
101 math.Point computeTooltipPosition(math.Rectangle label, | 99 math.Point computeTooltipPosition( |
102 math.Rectangle tooltip, math.Rectangle renderArea) { | 100 math.Rectangle label, math.Rectangle tooltip, math.Rectangle renderArea) { |
103 var x = label.left + (label.width - tooltip.width) / 2, | 101 var x = label.left + (label.width - tooltip.width) / 2, |
104 y = label.top + (label.height - tooltip.height) / 2; | 102 y = label.top + (label.height - tooltip.height) / 2; |
105 | 103 |
106 if (x + tooltip.width > renderArea.right) { | 104 if (x + tooltip.width > renderArea.right) { |
107 x = renderArea.right - tooltip.width; | 105 x = renderArea.right - tooltip.width; |
108 } else if (x < renderArea.left) { | 106 } else if (x < renderArea.left) { |
109 x = renderArea.left; | 107 x = renderArea.left; |
110 } | 108 } |
111 | 109 |
112 if (y + tooltip.height > renderArea.bottom) { | 110 if (y + tooltip.height > renderArea.bottom) { |
113 y = renderArea.bottom - tooltip.height; | 111 y = renderArea.bottom - tooltip.height; |
114 } else if (y < renderArea.top) { | 112 } else if (y < renderArea.top) { |
115 y = renderArea.top; | 113 y = renderArea.top; |
116 } | 114 } |
117 | 115 |
118 return new math.Point(x - _hostAreaRect.left, y - _hostAreaRect.top); | 116 return new math.Point(x - _hostAreaRect.left, y - _hostAreaRect.top); |
119 } | 117 } |
120 } | 118 } |
OLD | NEW |