Skip to content

Commit b44be91

Browse files
committed
5-median cpm interpolation in stat window
1 parent 4d9a33e commit b44be91

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

typetrainer/ui/stat.glade

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
<property name="spacing">15</property>
3838
<child>
3939
<object class="GtkComboBox" id="tutor_cb">
40+
<property name="width_request">200</property>
4041
<property name="visible">True</property>
4142
<property name="model">tutor_ls</property>
4243
<child>
@@ -47,6 +48,7 @@
4748
</child>
4849
</object>
4950
<packing>
51+
<property name="expand">False</property>
5052
<property name="position">0</property>
5153
</packing>
5254
</child>
@@ -80,6 +82,7 @@
8082
</object>
8183
<packing>
8284
<property name="expand">False</property>
85+
<property name="pack_type">end</property>
8386
<property name="position">1</property>
8487
</packing>
8588
</child>

typetrainer/ui/stat.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
from datetime import datetime
22

33
import gtk
4+
import math
45

56
from . import BuilderAware
67
from ..util import join_to_file_dir
78

9+
def median(values):
10+
values = sorted(values)
11+
a = int((len(values) + 1) / 2)
12+
b = a - len(values) % 2
13+
14+
return ( values[a-1] + values[b] ) / 2.0
15+
816
class StatDrawer(gtk.DrawingArea):
917
__gsignals__ = { "expose-event": "override" }
1018

@@ -50,23 +58,36 @@ def draw(self, cr, width, height):
5058

5159
self.draw_grid(cr, mindt, maxdt, mincpm, maxcpm, hfactor)
5260

53-
cr.set_source_rgb(0.2, 0.2, 0.2)
61+
data = sorted(self.data.iteritems(), key=lambda r: r[0])
62+
63+
cr.set_source_rgb(0.2, 0.4, 0.2)
5464
cr.set_line_width(0.1)
5565

56-
moved = False
57-
for dt in sorted(self.data):
58-
x, y = float(dt.toordinal()), float(self.data[dt][0]) * hfactor
59-
if not moved:
60-
cr.move_to(x, y)
61-
moved = True
62-
else:
63-
cr.line_to(x, y)
66+
data.insert(0, (None, (data[0][1][0], None)))
67+
data.insert(0, (None, (data[0][1][0], None)))
68+
data.append((None, (data[-1][1][0], None)))
69+
data.append((None, (data[-1][1][0], None)))
70+
cr.new_sub_path()
71+
for i in range(len(data)-4):
72+
x = float(data[i+2][0].toordinal())
73+
y = median([r[1][0] for r in data[i:i+5]])
74+
cr.line_to(x, y*hfactor)
6475

6576
cr.stroke()
6677

78+
cr.set_line_width(0.02)
79+
cr.new_sub_path()
80+
for dt, (cpm, cnt) in data[2:-2]:
81+
x, y = float(dt.toordinal()), cpm * hfactor
82+
cr.arc(x, y, 0.2, 0, math.pi*2)
83+
cr.set_source_rgb(0.88627, 0.68627, 0.88627)
84+
cr.fill_preserve()
85+
cr.set_source_rgb(0.2, 0.2, 0.2)
86+
cr.stroke()
87+
6788
def draw_grid(self, cr, mindt, maxdt, mincpm, maxcpm, hfactor):
6889
cr.set_source_rgb(0.8, 0.8, 0.8)
69-
cr.set_line_width(0.03)
90+
cr.set_line_width(0.02)
7091
for x in range(mindt, maxdt+1):
7192
cr.move_to(x, mincpm*hfactor)
7293
cr.line_to(x, maxcpm*hfactor)

0 commit comments

Comments
 (0)