# Copyright 2008 by Kate Scheppke and Wade Brainerd.
# This file is part of Typing Turtle.
#
# Typing Turtle 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.
#
# Typing Turtle 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 Typing Turtle. If not, see .
# Import standard Python modules.
import logging, os, math, time, copy, json, locale, datetime, random, re
from gettext import gettext as _
# Import PyGTK.
import gobject, pygtk, gtk, pango
# Import Sugar UI modules.
import sugar.activity.activity
from sugar.graphics import *
# Import activity modules.
import lessonscreen, medalscreen
class MainScreen(gtk.VBox):
def __init__(self, activity):
gtk.VBox.__init__(self)
self.activity = activity
# Build background.
title = gtk.Label()
title.set_markup("" + _('Typing Turtle') + "")
subtitle = gtk.Label()
subtitle.set_markup(_('Welcome to Typing Turtle! To begin, select a lesson from the list below.'))
spacer = gtk.HBox()
# Lessons header.
headerbox = gtk.VBox()
label = gtk.Label()
label.set_alignment(0.0, 0.5)
label.set_markup(""+_('Available Lessons')+"")
headerbox.pack_start(label, False)
headerbox.pack_start(gtk.HSeparator(), False)
# Build lessons list.
self.lessonbox = gtk.VBox()
self.lessonbox.set_spacing(10)
bundle_path = sugar.activity.activity.get_bundle_path()
code = locale.getlocale(locale.LC_ALL)[0]
path = bundle_path + '/lessons/' + code + '/'
# Find all .lesson files in ./lessons/en_US/ for example.
lessons = []
for f in os.listdir(path):
fd = open(path + f, 'r')
try:
lesson = json.read(fd.read())
lessons.append(lesson)
finally:
fd.close()
lessons.sort(lambda x, y: x['level'] - y['level'])
for l in lessons:
label = gtk.Label()
label.set_alignment(0.0, 0.5)
label.set_markup("" + l['name'] + "\n" + l['description'])
btn = gtk.Button()
btn.lesson = l
btn.add(label)
btn.connect('clicked', self.lesson_clicked_cb)
medalimage = gtk.Image()
medalbtn = gtk.Button()
medalbtn.lesson = l
medalbtn.add(medalimage)
medalbtn.connect('clicked', self.medal_clicked_cb)
hbox = gtk.HBox()
hbox.pack_start(btn, True, True, 10)
hbox.pack_end(medalbtn, False, False)
hbox.button = btn
hbox.medalbutton = medalbtn
hbox.lesson = l
hbox.medalimage = medalimage
self.lessonbox.pack_start(hbox, False)
self.lessonscroll = gtk.ScrolledWindow()
self.lessonscroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
self.lessonscroll.add_with_viewport(self.lessonbox)
self.pack_start(title, False, True, 10)
self.pack_start(subtitle, False)
self.pack_start(spacer, False, False, 50)
self.pack_start(headerbox, False)
self.pack_start(self.lessonscroll, True)
self.update_medals()
def update_medals(self):
for l in self.lessonbox:
# Disable the lesson button unless available.
lesson_available = self.activity.data['level'] >= l.lesson['requiredlevel']
l.button.set_sensitive(lesson_available)
l.medalbutton.set_sensitive(lesson_available)
# Update the medal image.
medal_type = 'none'
if self.activity.data['medals'].has_key(l.lesson['name']):
medal_type = self.activity.data['medals'][l.lesson['name']]['type']
bundle = sugar.activity.activity.get_bundle_path()
images = {
'none': bundle+'/images/no-medal.jpg',
'bronze': bundle+'/images/bronze-medal.jpg',
'silver': bundle+'/images/silver-medal.jpg',
'gold': bundle+'/images/gold-medal.jpg'
}
l.medalimage.set_from_file(images[medal_type])
def lesson_clicked_cb(self, widget):
self.activity.push_screen(lessonscreen.LessonScreen(widget.lesson, self.activity))
def medal_clicked_cb(self, widget):
if self.activity.data['medals'].has_key(widget.lesson['name']):
medal = self.activity.data['medals'][widget.lesson['name']]
self.activity.push_screen(medalscreen.MedalScreen(medal, self.activity))