# GNU Solfege - free ear training software
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008 Tom Cato Amundsen
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import absolute_import
import gtk
from solfege import gu
from solfege import lessonfilegui
class MatrixTable(gtk.VBox):
def __init__(self, heading, st, seconds):
gtk.VBox.__init__(self)
label = gtk.Label(heading)
label.set_name("StatisticsH2")
label.set_alignment(0.0, 0.0)
self.pack_start(label, False)
hbox = gu.bHBox(self, False)
frame = gtk.Frame()
hbox.pack_start(frame, False)
t = gtk.Table()
frame.add(t)
st_data = st.get_statistics(seconds)
keys = st.get_keys(True)
for x in range(len(keys)):
t.attach(gtk.VSeparator(), x*2+1, x*2+2, 0, len(keys)*2)
for x in range(len(keys)-1):
t.attach(gtk.HSeparator(), 0, len(keys)*2+1, x*2+1, x*2+2)
for y in range(len(keys)):
l = lessonfilegui.new_labelobject(st.key_to_pretty_name(keys[y]))
l.set_alignment(0.0, 0.5)
t.attach(l, 0, 1, y*2, y*2+1, xpadding=gu.PAD)
for x in range(len(keys)):
try:
s = st_data[keys[x]][keys[y]]
except KeyError:
s = '-'
l = gtk.Label(s)
if x == y:
l.set_name('BoldText')
t.attach(l, x*2+2, x*2+3, y*2, y*2+1, xpadding=gu.PAD)
self.show_all()
class PercentagesTable(gtk.Frame):
def __init__(self, statistics):
gtk.Frame.__init__(self)
table = gtk.Table()
self.add(table)
self.boxdict = {}
for k, l, x in (('session', _("Session"), 2), ('today', _("Today"), 5),
('last7', _("Last 7 days"), 8), ('total', _("Total"), 11)):
table.attach(gtk.Label(l), x, x+2, 0, 1)
b = gtk.VBox()
table.attach(b, x, x+1, 4, 5)
self.boxdict[k+'percent'] = b
b = gtk.VBox()
table.attach(b, x+1, x+2, 4, 5)
self.boxdict[k+'count'] = b
for x in (2, 5, 8, 11):
table.attach(gtk.Label(_("Percent")), x, x+1, 2, 3)
table.attach(gtk.Label(_("Count")), x+1, x+2, 2, 3)
table.attach(gtk.HSeparator(), 0, 13, 1, 2)
table.attach(gtk.HSeparator(), 0, 13, 3, 4)
table.attach(gtk.VSeparator(), 1, 2, 0, 6)
table.attach(gtk.VSeparator(), 4, 5, 0, 6)
table.attach(gtk.VSeparator(), 7, 8, 0, 6)
table.attach(gtk.VSeparator(), 10, 11, 0, 6)
self.boxdict['keys'] = key_box = gtk.VBox()
table.attach(key_box, 0, 1, 4, 5)
for box in self.boxdict.values():
box.set_border_width(gu.PAD_SMALL)
self.update(statistics)
self.show_all()
def update(self, statistics):
for box in self.boxdict.values():
for o in box.get_children():
o.destroy()
for k in statistics.get_keys(True):
l = lessonfilegui.new_labelobject(statistics.key_to_pretty_name(k))
l.set_alignment(0.0, 0.5)
self.boxdict['keys'].pack_start(l)
for sk, seconds in (('session', 0),
('today', 60*60*24),
('last7', 60*60*24*7),
('total', -1)):
percentage = statistics.get_percentage_correct_for_key(seconds, k)
if percentage == 0.0:
self.boxdict[sk+'percent'].pack_start(gtk.Label("-"))
else:
self.boxdict[sk+'percent'].pack_start(
gtk.Label("%.0f" % percentage))
self.boxdict[sk+'count'].pack_start(
gtk.Label(str(statistics.get_num_guess_for_key(seconds, k))))
self.show_all()
class NewAbstractStatisticsViewer(gtk.ScrolledWindow):
def __init__(self, statistics, heading):
gtk.ScrolledWindow.__init__(self)
self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.vbox = gtk.VBox()
self.vbox.set_spacing(gu.PAD)
self.vbox.set_border_width(gu.PAD)
self.add_with_viewport(self.vbox)
self.g_heading = gtk.Label(heading)
self.g_heading.set_alignment(0.0, 0.5)
self.g_heading.set_name("StatisticsH1")
self.vbox.pack_start(self.g_heading, False)
self.m_statistics = statistics
self.g_tables = gtk.VBox()
self.g_tables.show()
self.vbox.pack_start(self.g_tables)
self.show_all()
class PercentagesStatisticsViewer(NewAbstractStatisticsViewer):
"""
A statistics viewer that will only display the Percentages table.
"""
def __init__(self, statistics, heading):
NewAbstractStatisticsViewer.__init__(self, statistics, heading)
#self.clear = self.g_p.clear
def clear(self):
#UGH why cant we just destroy the children of g_tables??!!
#for c in self.g_tables.children():
# c.destroy()
self.g_tables.destroy()
self.g_tables = gtk.VBox()
self.g_tables.show()
self.vbox.pack_start(self.g_tables)
def update(self):
self.clear()
self.g_p = PercentagesTable(self.m_statistics)
self.g_p.show_all()
self.g_tables.pack_start(self.g_p, False, False)
class StatisticsViewer(NewAbstractStatisticsViewer):
def __init__(self, statistics, heading):
NewAbstractStatisticsViewer.__init__(self, statistics, heading)
self.matrix_dict = {}
def clear(self):
#UGH why cant we just destroy the children of g_tables??!!
#for c in self.g_tables.children():
# c.destroy()
self.g_tables.destroy()
self.g_tables = gtk.VBox()
self.g_tables.show()
self.vbox.pack_start(self.g_tables)
def update(self):
self.clear()
self.g_p = PercentagesTable(self.m_statistics)
self.g_p.show_all()
self.g_tables.pack_start(self.g_p, False)
self.matrix_dict['session'] = MatrixTable(
_("Session"),
self.m_statistics,
0)
self.matrix_dict['today'] = MatrixTable(
_("Today"),
self.m_statistics,
60*60*24)
self.matrix_dict['last7'] = MatrixTable(
_("Last 7 days"),
self.m_statistics,
60*60*24*7)
self.matrix_dict['total'] = MatrixTable(
_("Total"),
self.m_statistics,
-1)
for k in ('session', 'today', 'last7', 'total'):
self.g_tables.pack_start(self.matrix_dict[k], False)
|