Browse Source

Toolips represent

pull/8/head
Florian Mounier 13 years ago
parent
commit
6bb34ae96d
  1. 4
      pygal/config.py
  2. 4
      pygal/css/graph.css
  3. 12
      pygal/graph/bar.py
  4. 8
      pygal/graph/line.py
  5. 20
      pygal/graph/pie.py
  6. 24
      pygal/js/graph.coffee
  7. 30
      pygal/js/graph.js

4
pygal/config.py

@ -84,6 +84,10 @@ class Config(object):
zero = 0
# Text to display when no data is given
no_data_text = "No data"
# Print values when graph is in non interactive mode
print_values = True
# Print zeroes when graph is in non interactive mode
print_zeroes = False
def __init__(self, **kwargs):
"""Can be instanciated with config kwargs"""

4
pygal/css/graph.css

@ -49,6 +49,10 @@ text.no_data {
fill-opacity: 0;
}
.centered {
text-anchor: middle;
}
.title {
fill: {{ style.foreground_light }};
font-size: {{ font_sizes.title }};

12
pygal/graph/bar.py

@ -74,17 +74,25 @@ class Bar(Graph):
width=bar_inner_width,
height=height,
class_='rect reactive tooltip-trigger')
self.svg.node(bar, 'desc').text = val
self.svg.node(bar, 'desc', class_="values").text = val
self.svg.node(bar, 'desc',
class_="x centered"
).text = str(x + bar_inner_width / 2.)
self.svg.node(bar, 'desc',
class_="y centered"
).text = str(y + height / 2.)
if self._horizontal:
x += .3 * self.value_font_size
y += height / 2
else:
y += height / 2 + .3 * self.value_font_size
if self.print_values:
self.svg.transposable_node(
serie_node['text_overlay'], 'text',
class_='centered',
x=x + bar_inner_width / 2,
y=y - shift
).text = val
).text = val if self.print_zeroes or val != '0' else ''
return stack_vals
def _compute(self):

8
pygal/graph/line.py

@ -50,8 +50,12 @@ class Line(Graph):
val = self._get_value(serie.points, i)
self.svg.node(dots, 'circle', cx=x, cy=y, r=2.5,
class_='dot reactive tooltip-trigger')
self.svg.node(dots, 'desc').text = val
self.svg.node(serie_node['text_overlay'], 'text',
self.svg.node(dots, 'desc', class_="value").text = val
self.svg.node(dots, 'desc', class_="x").text = str(x)
self.svg.node(dots, 'desc', class_="y").text = str(y)
if self.print_values:
self.svg.node(
serie_node['text_overlay'], 'text',
x=x + self.value_font_size,
y=y + self.value_font_size,
).text = val

20
pygal/graph/pie.py

@ -65,15 +65,17 @@ class Pie(Graph):
tooltip_position = map(
str, diff(center, project(
(r + small_r) / 2., start_angle + angle / 2.)))
self.svg.node(slice_, 'desc', class_="x").text = tooltip_position[0]
self.svg.node(slice_, 'desc', class_="y").text = tooltip_position[1]
text_angle = pi / 2. - (start_angle + angle / 2.)
text_r = r * .95
self.svg.node(serie_node['text_overlay'], 'text',
x=center[0] + text_r * cos(text_angle),
y=center[1] - text_r * sin(text_angle)
).text = val
self.svg.node(slice_, 'desc',
class_="x centered").text = tooltip_position[0]
self.svg.node(slice_, 'desc',
class_="y centered").text = tooltip_position[1]
if self.print_values:
self.svg.node(
serie_node['text_overlay'], 'text',
class_='centered',
x=tooltip_position[0],
y=tooltip_position[1]
).text = val if self.print_zeroes or val != '0%' else ''
def _compute(self):
for serie in self.series:

24
pygal/js/graph.coffee

@ -4,11 +4,18 @@ padding = 5
tooltip_timeout = 0
tooltip_font_size = parseInt("{{ font_sizes.tooltip }}")
has_class = (e, class_name) ->
return if not e
cn = e.getAttribute('class').split(' ')
for cls, i in cn
if cls == class_name
return true
false
add_class = (e, class_name) ->
return if not e
cn = e.getAttribute('class').split(' ')
if class_name not in cn
if not has_class(e, class_name)
cn.push(class_name)
e.setAttribute('class', cn.join(' '))
@ -52,8 +59,15 @@ tooltip = (elt) ->
_rect.setAttribute('height', h)
_text.setAttribute('x', padding)
_text.setAttribute('y', padding + tooltip_font_size)
x = value.nextElementSibling.textContent - w / 2
y = value.nextElementSibling.nextElementSibling.textContent - h / 2
x_elt = value.nextElementSibling
y_elt = x_elt.nextElementSibling
x = x_elt.textContent
if has_class(x_elt, 'centered')
x -= w / 2
y = y_elt.textContent
if has_class(y_elt, 'centered')
y -= h / 2
_tooltip.setAttribute('transform', "translate(#{x} #{y})")
untooltip = ->
@ -70,11 +84,11 @@ untooltip = ->
for element in _('.text-overlay .serie-' + num)
element.setAttribute('display', 'inline')
for element in _('.serie-' + num + ' .reactive')
activate(element, reactive(element))), (
activate(element)), (
->
num = this.id.replace('activate-serie-', '')
for element in _('.text-overlay .serie-' + num)
element.setAttribute('display', 'none')
for element in _('.serie-' + num + ' .reactive')
deactivate(element, reactive(element)))
deactivate(element))
hover _('.tooltip-trigger'), (-> tooltip(@)), (-> untooltip())

30
pygal/js/graph.js

@ -1,7 +1,6 @@
// Generated by CoffeeScript 1.2.1-pre
(function() {
var activate, add_class, deactivate, hover, padding, rm_class, svg, tooltip, tooltip_font_size, tooltip_timeout, untooltip, _, __,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
var activate, add_class, deactivate, has_class, hover, padding, rm_class, svg, tooltip, tooltip_font_size, tooltip_timeout, untooltip, _, __,
__slice = [].slice;
_ = function(x) {
@ -18,11 +17,22 @@
tooltip_font_size = parseInt("{{ font_sizes.tooltip }}");
has_class = function(e, class_name) {
var cls, cn, i, _i, _len;
if (!e) return;
cn = e.getAttribute('class').split(' ');
for (i = _i = 0, _len = cn.length; _i < _len; i = ++_i) {
cls = cn[i];
if (cls === class_name) return true;
}
return false;
};
add_class = function(e, class_name) {
var cn;
if (!e) return;
cn = e.getAttribute('class').split(' ');
if (__indexOf.call(cn, class_name) < 0) cn.push(class_name);
if (!has_class(e, class_name)) cn.push(class_name);
return e.setAttribute('class', cn.join(' '));
};
@ -83,7 +93,7 @@
};
tooltip = function(elt) {
var h, value, w, x, y, _rect, _text, _tooltip;
var h, value, w, x, x_elt, y, y_elt, _rect, _text, _tooltip;
clearTimeout(tooltip_timeout);
_tooltip = __('tooltip');
_text = _tooltip.getElementsByTagName('text')[0];
@ -96,8 +106,12 @@
_rect.setAttribute('height', h);
_text.setAttribute('x', padding);
_text.setAttribute('y', padding + tooltip_font_size);
x = value.nextElementSibling.textContent - w / 2;
y = value.nextElementSibling.nextElementSibling.textContent - h / 2;
x_elt = value.nextElementSibling;
y_elt = x_elt.nextElementSibling;
x = x_elt.textContent;
if (has_class(x_elt, 'centered')) x -= w / 2;
y = y_elt.textContent;
if (has_class(y_elt, 'centered')) y -= h / 2;
return _tooltip.setAttribute('transform', "translate(" + x + " " + y + ")");
};
@ -131,7 +145,7 @@
_results = [];
for (_k = 0, _len3 = _ref3.length; _k < _len3; _k++) {
element = _ref3[_k];
_results.push(activate(element, reactive(element)));
_results.push(activate(element));
}
return _results;
}), (function() {
@ -146,7 +160,7 @@
_results = [];
for (_k = 0, _len3 = _ref3.length; _k < _len3; _k++) {
element = _ref3[_k];
_results.push(deactivate(element, reactive(element)));
_results.push(deactivate(element));
}
return _results;
}));

Loading…
Cancel
Save