# gcompris - lang.py
#
# Copyright (C) 2010 Bruno Coudoin
#
# 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 .
#
# lang activity.
import gtk
import gtk.gdk
import gcompris
import gcompris.utils
import gcompris.skin
import gcompris.sound
import goocanvas
import pango
from gcompris import gcompris_gettext as _
from langLib import *
from langFindit import *
class MissingImage:
"""This is used to display a missing image"""
def __init__(self, rootitem, langActivity):
self.missingroot = goocanvas.Group( parent = rootitem )
width = 280
height = 240
item = goocanvas.Rect( parent = self.missingroot,
x = gcompris.BOARD_WIDTH / 2 - width / 2,
y = gcompris.BOARD_HEIGHT / 2 - height / 2,
width = width,
height = height,
radius_x = 5,
radius_y = 5,
stroke_color_rgba = 0x666666FFL,
fill_color_rgba = 0x33333366L,
line_width = 2.0 )
item.connect("button_press_event", langActivity.next_event, None)
self.missingtext = goocanvas.Text(
parent = self.missingroot,
x = gcompris.BOARD_WIDTH / 2,
y = gcompris.BOARD_HEIGHT / 2,
fill_color = "black",
font = gcompris.skin.get_font("gcompris/subtitle"),
text = _("Missing Image"),
anchor = gtk.ANCHOR_CENTER,
alignment = pango.ALIGN_CENTER
)
def hide(self):
self.missingroot.props.visibility = goocanvas.ITEM_INVISIBLE
def show(self, triplet):
self.missingroot.props.visibility = goocanvas.ITEM_VISIBLE
class Gcompris_lang:
"""Empty gcompris python class"""
def __init__(self, gcomprisBoard):
print "lang init"
# Save the gcomprisBoard, it defines everything we need
# to know from the core
self.gcomprisBoard = gcomprisBoard
# Needed to get key_press
gcomprisBoard.disable_im_context = True
def start(self):
print "lang start"
# init config to default values
self.config_dict = self.init_config()
print "init self.config_dict :", self.config_dict
# change configured values
print "gcompris.get_board_conf() : ", gcompris.get_board_conf()
self.config_dict.update(gcompris.get_board_conf())
print "self.config_dict final :", self.config_dict
if self.config_dict.has_key('locale_sound'):
gcompris.set_locale(self.config_dict['locale_sound'])
# Set the buttons we want in the bar
gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_REPEAT|gcompris.BAR_CONFIG)
gcompris.bar_location(gcompris.BOARD_WIDTH / 2 - 100, -1, 0.6)
# Set a background image
gcompris.set_default_background(self.gcomprisBoard.canvas.get_root_item())
# Create our rootitem. We put each canvas item in it so at the end we
# only have to kill it. The canvas deletes all the items it contains
# automaticaly.
self.rootitem = goocanvas.Group(parent =
self.gcomprisBoard.canvas.get_root_item())
self.langLib = LangLib(gcompris.DATA_DIR + "/lang/lang.xml")
self.chapters = self.langLib.getChapters()
# FIXME Do not manage Chapter yet
self.currentChapterId = 0
# Manage levels (a level is a lesson in the lang model)
self.gcomprisBoard.level = 1
self.gcomprisBoard.maxlevel = \
len ( self.chapters.getChapters()[self.currentChapterId].getLessons() )
gcompris.bar_set_level(self.gcomprisBoard)
self.currentExercise = None
self.currentLesson = self.langLib.getLesson(self.currentChapterId,
self.gcomprisBoard.level - 1)
self.displayLesson( self.currentLesson )
def end(self):
if self.currentExercise:
self.currentExercise.stop()
# Remove the root item removes all the others inside it
self.rootitem.remove()
def ok(self):
print("lang ok.")
def repeat(self):
self.playVoice( self.currentLesson.getTriplets()[self.currentTripletId] )
def init_config(self):
default_config = { 'locale_sound' : 'NULL' }
return default_config
#mandatory but unused yet
def config_stop(self):
pass
# Configuration function.
def config_start(self, profile):
# keep profile in mind
# profile can be Py_None
self.configuring_profile = profile
# init with default values
self.config_dict = self.init_config()
# get the configured values for that profile
self.config_dict.update(gcompris.get_conf(profile, self.gcomprisBoard))
bconf = gcompris.configuration_window ( \
_('Configuration\n for profile %s')
% ( (profile.name if profile else _("Default") ) ),
self.ok_callback
)
gcompris.combo_locales_asset(bconf, _("Select locale"),
self.config_dict['locale_sound'],
"voices/$LOCALE/colors/red.ogg")
# Callback when the "OK" button is clicked in configuration window
# this get all the _changed_ values
def ok_callback(self, table):
if (table == None):
return True
for key,value in table.iteritems():
gcompris.set_board_conf(self.configuring_profile,
self.gcomprisBoard, key, value)
return True;
def key_press(self, keyval, commit_str, preedit_str):
utf8char = gtk.gdk.keyval_to_unicode(keyval)
strn = u'%c' % utf8char
print("Gcompris_lang key press keyval=%i %s" % (keyval, strn))
def pause(self, pause):
print("lang pause. %i" % pause)
def next_level(self):
if self.gcomprisBoard.level < self.gcomprisBoard.maxlevel:
self.set_level(self.gcomprisBoard.level + 1)
else:
self.set_level(self.gcomprisBoard.level)
def set_level(self, level):
self.gcomprisBoard.level = level;
self.gcomprisBoard.sublevel = 1;
gcompris.bar_set_level(self.gcomprisBoard)
if self.currentExercise:
self.currentExercise.stop()
self.currentLesson = self.langLib.getLesson(self.currentChapterId,
self.gcomprisBoard.level - 1)
self.displayLesson( self.currentLesson )
# -------
def clearLesson(self):
self.lessonroot.remove()
def displayLesson(self, lesson):
# Keep the triplet shown to the user to know when
# we can move to the exercices
self.tripletSeen = set()
try:
self.lessonroot.remove()
except:
pass
self.currentTripletId = 0
self.lessonroot = goocanvas.Group( parent = self.rootitem )
goocanvas.Rect(
parent = self.lessonroot,
x = 20,
y = 10,
width = gcompris.BOARD_WIDTH - 40,
height = 65,
fill_color_rgba = 0x6666FF33L,
stroke_color_rgba = 0x1111FFAAL,
line_width = 2.0,
radius_x = 0.9,
radius_y = 0.9)
goocanvas.Text(
parent = self.lessonroot,
x = gcompris.BOARD_WIDTH / 2,
y = 25.0,
text = lesson.name,
fill_color = "black",
font = gcompris.skin.get_font("gcompris/title"),
anchor = gtk.ANCHOR_CENTER,
alignment = pango.ALIGN_CENTER,
width = 300
)
goocanvas.Text(
parent = self.lessonroot,
x = gcompris.BOARD_WIDTH / 2,
y = 55.0,
text = lesson.description,
fill_color = "black",
font = gcompris.skin.get_font("gcompris/subtitle"),
anchor = gtk.ANCHOR_CENTER,
alignment = pango.ALIGN_CENTER,
width = 600
)
# Previous Button
item = goocanvas.Svg( parent = self.lessonroot,
svg_handle = gcompris.skin.svg_get(),
svg_id = "#PREVIOUS",
)
gcompris.utils.item_absolute_move(item,
100,
gcompris.BOARD_HEIGHT / 2)
item.connect("button_press_event", self.previous_event, None)
gcompris.utils.item_focus_init(item, None)
# Next Button
item = goocanvas.Svg(parent = self.lessonroot,
svg_handle = gcompris.skin.svg_get(),
svg_id = "#NEXT",
)
gcompris.utils.item_absolute_move(item,
gcompris.BOARD_WIDTH - 130,
gcompris.BOARD_HEIGHT / 2)
item.connect("button_press_event", self.next_event, None)
gcompris.utils.item_focus_init(item, None)
self.counteritem = goocanvas.Text(
parent = self.lessonroot,
x = gcompris.BOARD_WIDTH - 40,
y = gcompris.BOARD_HEIGHT - 40,
fill_color = "black",
font = gcompris.skin.get_font("gcompris/board/tiny"),
anchor = gtk.ANCHOR_CENTER,
alignment = pango.ALIGN_CENTER
)
# The triplet area
self.missingImage = MissingImage(self.lessonroot, self)
self.imageitem = goocanvas.Image( parent = self.lessonroot )
self.imageitem.connect("button_press_event", self.next_event, None)
self.descriptionitem = goocanvas.Text(
parent = self.lessonroot,
x = gcompris.BOARD_WIDTH / 2,
y = gcompris.BOARD_HEIGHT - 100,
fill_color = "black",
font = gcompris.skin.get_font("gcompris/subtitle"),
anchor = gtk.ANCHOR_CENTER,
alignment = pango.ALIGN_CENTER,
width = 300
)
self.displayImage( lesson.getTriplets()[self.currentTripletId] )
def playVoice(self, triplet):
if triplet.voice:
gcompris.sound.play_ogg("voices/$LOCALE/" + triplet.voice)
def displayImage(self, triplet):
if len(self.tripletSeen) == len(self.currentLesson.getTriplets()):
self.clearLesson()
self.currentExercise = Findit(self, self.rootitem, self.currentLesson)
self.currentExercise.start()
return
self.tripletSeen.add(triplet)
self.playVoice( triplet )
self.descriptionitem.set_properties (
text = triplet.description,
)
self.counteritem.set_properties (
text = str(self.currentTripletId + 1) + "/" \
+ str( len( self.currentLesson.getTriplets() ) ),
)
if triplet.image:
self.missingImage.hide()
self.imageitem.props.visibility = goocanvas.ITEM_VISIBLE
pixbuf = gcompris.utils.load_pixmap(gcompris.DATA_DIR + "/lang/" +
triplet.image)
center_x = pixbuf.get_width()/2
center_y = pixbuf.get_height()/2
self.imageitem.set_properties(pixbuf = pixbuf,
x = gcompris.BOARD_WIDTH / 2 - center_x,
y = gcompris.BOARD_HEIGHT / 2 - center_y )
else:
self.imageitem.props.visibility = goocanvas.ITEM_INVISIBLE
self.missingImage.show(triplet)
def previous_event(self, event, target,item, dummy):
self.currentTripletId -= 1
if self.currentTripletId < 0:
self.currentTripletId = len( self.currentLesson.getTriplets() ) - 1
self.displayImage( self.currentLesson.getTriplets()[self.currentTripletId] )
def next_event(self, event, target, item, dummy):
self.currentTripletId += 1
if self.currentTripletId >= len( self.currentLesson.getTriplets() ):
self.currentTripletId = 0
self.displayImage( self.currentLesson.getTriplets()[self.currentTripletId] )