[gcompris/gcompbraille: 1/2] First Activity : Braille Alphabet



commit 1e01c0d3b820127ac43c4d58c35c7dd1d8b2738b
Author: Srishti Sethi <srishakatux gmail com>
Date:   Tue Jun 14 01:01:00 2011 +0530

    First Activity : Braille Alphabet

 src/braille_alphabets-activity/.gitignore          |    1 +
 src/braille_alphabets-activity/BrailleChar.py      |  153 +++++++
 src/braille_alphabets-activity/Makefile.am         |   32 ++
 .../braille_alphabets.py                           |  339 ++++++++++++++
 .../braille_alphabets.xml                          |   23 +
 .../braille_alphabets.xml.in                       |   23 +
 src/braille_alphabets-activity/braillebug.svg      |  199 ++++++++
 src/braille_alphabets-activity/dicey_dicey.py      |  475 ++++++++++++++++++++
 src/braille_alphabets-activity/gcompris            |    1 +
 src/braille_alphabets-activity/init_path.sh        |    8 +
 src/braille_alphabets-activity/resources/back.png  |  Bin 0 -> 1573 bytes
 .../resources/braille_tux.svgz                     |  Bin 0 -> 14786 bytes
 .../resources/drawing.svg                          |   67 +++
 .../resources/mosaic.svgz                          |  Bin 0 -> 4491 bytes
 .../resources/mosaic_bg.svgz                       |  Bin 0 -> 4475 bytes
 .../resources/target.svg                           |  148 ++++++
 16 files changed, 1469 insertions(+), 0 deletions(-)
---
diff --git a/src/braille_alphabets-activity/.gitignore b/src/braille_alphabets-activity/.gitignore
new file mode 100755
index 0000000..b828112
--- /dev/null
+++ b/src/braille_alphabets-activity/.gitignore
@@ -0,0 +1 @@
+braille_alphabets.xml
diff --git a/src/braille_alphabets-activity/BrailleChar.py b/src/braille_alphabets-activity/BrailleChar.py
new file mode 100644
index 0000000..6fa86df
--- /dev/null
+++ b/src/braille_alphabets-activity/BrailleChar.py
@@ -0,0 +1,153 @@
+#  gcompris - BrailleChar.py
+#
+# Copyright (C) 2011 xxxx
+#
+#   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/>.
+#
+# This class display a braille char to a given location
+# The char may be static of dynamic. It maintains the value
+# of the dots and the char it represents in real time.
+#
+import gtk
+import gtk.gdk
+import gcompris
+import gcompris.utils
+import gcompris.skin
+import goocanvas
+import pango
+import gcompris.sound
+import string
+from gcompris import gcompris_gettext as _
+
+BRAILLE_LETTERS = {
+    "A": [1], "B": [1, 2], "C": [1, 4], "D": [1, 4, 5], "E": [1, 5],
+    "F": [1, 2, 4], "G": [1, 2, 4, 5], "H": [1, 2, 5], "I": [2, 4],
+    "J": [2, 4, 5], "K": [1, 3], "L": [1, 2, 3], "M": [1, 3, 4],
+    "N": [1, 3, 4, 5], "O": [1, 3, 5], "P": [1, 2, 3, 4], "Q": [1, 2, 3, 4, 5],
+    "R": [1, 2, 3, 5], "S": [2, 3, 4], "T": [2, 3, 4, 5], "U": [1, 3, 6],
+    "V": [1, 2, 3, 6], "W": [2, 4, 5, 6], "X": [1, 3, 4, 6], "Y": [1, 3, 4, 5, 6],
+    "Z": [1, 3, 5, 6], 1: [2],2 :[2,3], 3 : [2,5], 4: [2,5,6],5 : [2,6],
+    6 : [2,3,5],7 : [2,3,5,6],8 : [2,3,6], 9 : [3,5],0 :[3,5,6]
+}
+
+class BrailleChar:
+  """Braille Char"""
+  def __init__(self, rootitem,
+               x, y, width, letter,DOT_ON,
+               DOT_OFF,fill,stroke,display_letter, clickable,
+               rectangle,callback):
+
+    self.letter = letter
+    self.callback = callback
+    self.display_letter = display_letter
+    self.clickable = clickable
+    self.DOT_ON = DOT_ON
+    self.DOT_OFF = DOT_OFF
+    self.fill = fill
+    self.stroke = stroke
+    self.rectangle = rectangle
+
+    height = width * 1.33
+    cell_radius = (width / 7.5)
+    self.rootitem = goocanvas.Group(parent=rootitem)
+    if(letter == '' or rectangle == False):
+        """no rect"""
+    else :
+        self.item = goocanvas.Rect(parent=self.rootitem,
+                          x=x,
+                          y=y,
+                          width=width,
+                          height=height,
+                          stroke_color="blue",
+                          fill_color="#DfDfDf",
+                          line_width=2.0)
+
+
+    self.text = goocanvas.Text(parent=self.rootitem,
+                               x=x + (width / 2.0),
+                               y=y + height + 15,
+                               text=str(letter),
+                               fill_color="blue",
+                               alignment=pango.ALIGN_CENTER,
+                               anchor = gtk.ANCHOR_CENTER,
+                               font = 'Sans BOLD')
+    if not display_letter:
+        self.text.props.visibility = goocanvas.ITEM_INVISIBLE
+
+    dot = 1
+    self.dot_items = []
+    for u in range(2):
+        for v in range(3):
+            cell = goocanvas.Ellipse(parent=self.rootitem,
+                                     center_x=x + width / 3.0 * ( u + 1 ),
+                                     center_y=y + height / 4.0 * ( v + 1 ),
+                                     radius_x=cell_radius,
+                                     radius_y=cell_radius,
+                                     stroke_color=self.stroke,
+                                     fill_color=self.fill,
+                                     line_width=width/25)
+            # To fill the circles in lower board with red color
+            if (clickable == True):
+                cell.connect("button_press_event", self.dot_event)
+                gcompris.utils.item_focus_init(cell, None)
+
+            if isinstance(letter,int):
+                fillings = BRAILLE_LETTERS.get(letter)
+            else :
+                fillings = BRAILLE_LETTERS.get(letter.upper())
+
+            if fillings == None:
+                """only braille cell"""
+            elif dot in fillings:
+                cell.set_property("fill_color_rgba", self.DOT_ON)
+            else :
+                cell.set_property("fill_color_rgba", self.DOT_OFF)
+
+            self.dot_items.append(cell)
+            dot += 1
+
+  def get_letter(self):
+      """Return the letter represented by this braille item"""
+      return self.letter
+
+  def calculate_char(self):
+      """Calculate the represented char"""
+      cells = []
+
+      # Create the dot list
+      for l in range(6):
+          if(self.dot_items[l].get_property("fill_color_rgba") == self.DOT_ON):
+              cells.append(l+1)
+
+      self.letter = ''
+      for k,v in BRAILLE_LETTERS.items():
+          if v == cells:
+              self.letter = k
+
+      if isinstance(self.letter,int):
+          self.text.set_property("text",self.letter)
+      else :
+          self.text.set_property("text", str.upper(self.letter))
+
+      if self.callback:
+          self.callback(self.letter)
+
+
+  def dot_event(self, event, target, item):
+      """A dot has been clicked, change its state and calculate our new letter value"""
+      if target.get_property("fill_color_rgba") == self.DOT_ON:
+          target.set_property("fill_color_rgba", self.DOT_OFF)
+      else:
+          target.set_property("fill_color_rgba", self.DOT_ON)
+      self.calculate_char()
\ No newline at end of file
diff --git a/src/braille_alphabets-activity/Makefile.am b/src/braille_alphabets-activity/Makefile.am
new file mode 100755
index 0000000..d9b62a1
--- /dev/null
+++ b/src/braille_alphabets-activity/Makefile.am
@@ -0,0 +1,32 @@
+SUBDIRS =
+
+pythondir = $(PYTHON_PLUGIN_DIR)
+
+dist_python_DATA= 	braille_alphabets.py
+
+
+
+xmldir = $(pkgdatadir)/@PACKAGE_DATA_DIR@
+
+xml_in_files = \
+	braille_alphabets.xml.in
+
+
+xml_DATA = $(xml_in_files:.xml.in=.xml)
+
+# Do not use the INTLTOOL_XML_RULE, we don't need to embed the translations
+# in the file themselves. GCompris pick the translations from the po file at
+# runtime.
+#
+$(xml_DATA): %.xml: %.xml.in
+	sed -e "s/\(<\{1\}\/*\)_/\1/g" $< > $@
+
+# Use this directive and instead of the one above to embed the translations
+# in the xml files directly, this is needed for the tool gcompris2spip
+# INTLTOOL_XML_RULE@
+
+icondir = $(pkgdatadir)/@PACKAGE_DATA_DIR@
+icon_DATA = braille_alphabets.svg
+
+EXTRA_DIST = $(icon_DATA) ${xml_in_files} init_path.sh
+CLEANFILES = $(xml_DATA)
diff --git a/src/braille_alphabets-activity/braille_alphabets.py b/src/braille_alphabets-activity/braille_alphabets.py
new file mode 100755
index 0000000..57cd77e
--- /dev/null
+++ b/src/braille_alphabets-activity/braille_alphabets.py
@@ -0,0 +1,339 @@
+#  gcompris - braille_alphabets.py
+#
+# Copyright (C) 2003, 2008 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 <http://www.gnu.org/licenses/>.
+#
+# braille_alphabets activity.
+import gtk
+import gtk.gdk
+import gcompris
+import gcompris.utils
+import gcompris.skin
+import gcompris.bonus
+import goocanvas
+import pango
+import gcompris.sound
+import string
+import random
+from gcompris import gcompris_gettext as _
+from BrailleChar import *
+
+cell_width = 40
+on = 0xFF0000FFL
+off = 0X00000000L
+circle_fill = "#DfDfDf"
+circle_stroke = "blue"
+
+braille_desc = {'intro' : "A system of writing for the blinds that \n"
+                "uses characters made of raised dots. \n\n"
+                "The braille Cell is composed of 6 dot \n"
+                "cells organized in form of two vertical\n"
+                "columns with 3 dots {1,2,3} side\n"
+                "by side on left and 3 dots side by\n"
+                "on right {4,5,6}"}
+
+#Array Declaration
+letter_arr_one = ['A','B','C','D','E','F','G']
+random.shuffle(letter_arr_one)
+letter_arr_two = ['H','I','J','K','L','M','N']
+random.shuffle(letter_arr_two)
+letter_arr_three = ['O','P','Q','R','S','T','U']
+random.shuffle(letter_arr_three)
+letter_arr_four = ['V','W','V','X','Y','Z']
+random.shuffle(letter_arr_four)
+letter_arr_five = [0,1,2,3,4,5,6,7,8,9]
+random.shuffle(letter_arr_five)
+
+class Gcompris_braille_alphabets:
+  """Empty gcompris python class"""
+
+
+  def __init__(self, gcomprisBoard):
+    # Save the gcomprisBoard, it defines everything we need
+    # to know from the core
+    #defining the number of levels in activity
+    self.counter = 0
+    self.gcomprisBoard = gcomprisBoard
+    self.gcomprisBoard.level = 1
+    self.gcomprisBoard.maxlevel=6
+    self.gcomprisBoard.sublevel=1
+    self.gcomprisBoard.number_of_sublevel=1
+
+    #Boolean variable decaration
+    self.mapActive = False
+
+    # Needed to get key_press
+    gcomprisBoard.disable_im_context = True
+
+  def start(self):
+    # Set the buttons we want in the bar
+    gcompris.bar_set(gcompris.BAR_LEVEL)
+    gcompris.bar_set_level(self.gcomprisBoard)
+
+    pixmap = gcompris.utils.load_svg("target.svg")
+    gcompris.bar_set_repeat_icon(pixmap)
+    gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_REPEAT_ICON)
+    gcompris.bar_location(300,-1,0.6)
+
+    # 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.board_upper(self.gcomprisBoard.level)
+
+  def end(self):
+    # Remove the root item removes all the others inside it
+    self.rootitem.remove()
+
+  def ok(self):
+    print("learnbraille ok.")
+
+  def repeat(self):
+      if(self.mapActive):
+          self.end()
+          self.start()
+          self.mapActive = False
+      else :
+          self.rootitem.props.visibility = goocanvas.ITEM_INVISIBLE
+          self.rootitem = goocanvas.Group(parent=
+                                   self.gcomprisBoard.canvas.get_root_item())
+          gcompris.set_default_background(self.gcomprisBoard.canvas.get_root_item())
+
+          #Place alphabets & numbers in array format
+          for i, letter in enumerate(string.ascii_uppercase[:10]):
+              tile = BrailleChar(self.rootitem, i*(cell_width+30)+60,
+                              60, 50, letter ,on,off,circle_fill,
+                              circle_stroke,True ,False,True,None)
+          for i, letter in enumerate(string.ascii_uppercase[10:20]):
+              tile = BrailleChar(self.rootitem, i*(cell_width+30)+60,
+                              150, 50, letter ,on, off, circle_fill,
+                              circle_stroke, True ,False,True,None)
+          for i, letter in enumerate(string.ascii_uppercase[20:25]):
+              tile = BrailleChar(self.rootitem, i*(cell_width+30)+60,
+                              250, 50, letter ,on ,off ,circle_fill,
+                              circle_stroke, True ,False,True, None)
+          for letter in range(0,10):
+              tile = BrailleChar(self.rootitem,letter *(cell_width+30)+60,
+                             350, 50, letter ,on ,off ,circle_fill,
+                             circle_stroke, True ,False ,True, None)
+          #Move back item
+          self.backitem = goocanvas.Image(parent = self.rootitem,
+                    pixbuf = gcompris.utils.load_pixmap("back.png"),
+                    x = 600,
+                    y = 450,
+                    tooltip = "Move Back"
+                    )
+          self.backitem.connect("button_press_event", self.move_back)
+          gcompris.utils.item_focus_init(self.backitem, None)
+
+          self.mapActive = True
+
+
+  def move_back(self,event,target,item):
+      self.end()
+      self.start()
+
+  def config(self):
+    print("learnbraille config.")
+
+  def key_press(self, keyval, commit_str, preedit_str):
+    utf8char = gtk.gdk.keyval_to_unicode(keyval)
+    strn = u'%c' % utf8char
+    print("Gcompris_learnbraille key press keyval=%i %s" % (keyval, strn))
+
+  def pause(self,pause):
+    if(pause == 0):
+        self.counter +=1
+        if (self.counter == self.sublevel):
+            self.increment_level()
+        self.end()
+        self.start()
+
+  def set_level(self,level):
+    gcompris.sound.play_ogg("sounds/receive.wav")
+    self.gcomprisBoard.level = level
+    self.gcomprisBoard.sublevel = 1
+    gcompris.bar_set_level(self.gcomprisBoard)
+    self.end()
+    self.start()
+
+  def increment_level(self):
+    self.counter = 0
+    gcompris.sound.play_ogg("sounds/bleep.wav")
+    self.gcomprisBoard.sublevel += 1
+
+    if(self.gcomprisBoard.sublevel>self.gcomprisBoard.number_of_sublevel):
+        self.gcomprisBoard.sublevel=1
+        self.gcomprisBoard.level += 1
+        if(self.gcomprisBoard.level > self.gcomprisBoard.maxlevel):
+            self.gcomprisBoard.level = 1
+
+
+  def board_upper(self,level):
+    if(level == 1):
+        gcompris.set_background(self.gcomprisBoard.canvas.get_root_item(),
+                            "braille_tux.svgz")
+        goocanvas.Text(parent=self.rootitem,
+                                 x=390,
+                                 y=100,
+                                 fill_color="dark blue",
+                                 font="Sans 15",
+                                 anchor=gtk.ANCHOR_CENTER,
+                                 text="Braille : Unlocking the Code")
+        #Braille Description
+        goocanvas.Text(parent=self.rootitem,
+                                 x=520,
+                                 y=260,
+                                 fill_color="dark blue",
+                                 font="Sans 15",
+                                 anchor=gtk.ANCHOR_CENTER,
+                                 text=braille_desc.get('intro'))
+
+        #TUX svghandle
+        svghandle = gcompris.utils.load_svg("braille_tux.svgz")
+        self.tuxitem = goocanvas.Svg(
+                                     parent = self.rootitem,
+                                     svg_handle = svghandle,
+                                     svg_id = "#TUX-5",
+                                     tooltip = "I am braille TUX"
+                                     )
+        self.tuxitem.connect("button_press_event", self.next_level)
+        gcompris.utils.item_focus_init(self.tuxitem, None)
+
+        goocanvas.Text(parent = self.rootitem,
+                        x = 410,
+                        y= 430,
+                        fill_color ="black",
+                        font = "Sans 10",
+                        anchor= gtk.ANCHOR_CENTER,
+                        text = "Finished reading braille ! Now click \n"
+                        "me and try reproducing braille characters")
+    elif(level ==2):
+        range_lower= 0
+        range_upper= 7
+        self.sublevel = range_upper - range_lower
+        self.board_tile(range_lower,range_upper)
+        self.random_letter = letter_arr_one[self.counter]
+        self.braille_cell()
+
+    elif(level == 3) :
+        range_lower= 7
+        range_upper= 14
+        self.sublevel = range_upper - range_lower
+        self.board_tile(range_lower,range_upper)
+        self.random_letter = letter_arr_two[self.counter]
+        self.braille_cell()
+
+    elif(level == 4):
+        range_lower= 14
+        range_upper= 21
+        self.sublevel = range_upper - range_lower
+        self.board_tile(range_lower,range_upper)
+        self.random_letter = letter_arr_three[self.counter]
+        self.braille_cell()
+
+    elif(level == 5):
+        range_lower= 21
+        range_upper= 26
+        self.sublevel = range_upper - range_lower
+        self.board_tile(range_lower,range_upper)
+        self.random_letter = letter_arr_four[self.counter]
+        self.braille_cell()
+
+    elif(level == 6):
+        range_lower= 0
+        range_upper= 10
+        self.sublevel = range_upper - range_lower
+        self.board_number(range_lower,range_upper)
+        self.random_letter = letter_arr_five[self.counter]
+        self.braille_cell()
+
+
+  def next_level(self,event,target,item):
+      self.increment_level()
+      self.end()
+      self.start()
+
+  def board_tile(self,range_x,range_y):
+      for i, letter in enumerate(string.ascii_uppercase[range_x:range_y]):
+          tile = BrailleChar(self.rootitem, i*(cell_width+60)+60,
+                              80, 50, letter ,on ,off ,circle_fill,
+                              circle_stroke, True ,False ,True, None)
+  def board_number(self,num_1,num_2):
+      for letter in range(num_1,num_2):
+          tile = BrailleChar(self.rootitem,letter *(cell_width+30)+60,
+                             80, 50, letter ,on ,off ,circle_fill,
+                             circle_stroke, True,False ,True, None)
+
+  def display_letter(self,letter):
+      goocanvas.Text(parent=self.rootitem,
+                                 x=600,
+                                 y=370,
+                                 fill_color="blue",
+                                 font="Sans 78",
+                                 anchor=gtk.ANCHOR_CENTER,
+                                 text=str(letter))
+
+  def braille_cell(self):
+      gcompris.set_background(self.gcomprisBoard.canvas.get_root_item(),
+                            "mosaic.svgz")
+
+      goocanvas.Text(parent = self.rootitem,
+                     x = 100,
+                     y = 200,
+                     text="Click on the dots in braille cell area to produce letter"
+                      + ' '+str(self.random_letter),
+                     fill_color="blue",
+                     font='SANS 15')
+
+      goocanvas.Text(parent=self.rootitem,
+                      x=160.0, y=250.0,
+                     text=_("Braille Cell"),
+                     fill_color="blue",
+                     font='Sans BOLD')
+      BrailleChar(self.rootitem, 150, 270, 120, '',on ,off,circle_fill,circle_stroke,
+                   False,True,False,callback = self.letter_change)
+      for i in range(2):
+          for j in range(3):
+                  goocanvas.Text(parent=self.rootitem,
+                                 text=(str(j + 1 + i * 3)),
+                                 font='Sans 20',
+                                 fill_color="blue",
+                                 x=i * 120 + 140,
+                                 y=j * 45 + 290)
+
+      #OK Button
+      ok = goocanvas.Svg(parent = self.rootitem,
+                         svg_handle = gcompris.skin.svg_get(),
+                         svg_id = "#OK",
+                         tooltip = "Click to confirm your selection of dots"
+                         )
+      ok.translate(30,-185)
+
+      ok.connect("button_press_event", self.ok_event)
+      gcompris.utils.item_focus_init(ok, None)
+
+  def ok_event(self,item,target,event):
+      if(self.random_letter == self.correct_letter):
+          self.display_letter(self.correct_letter)
+          gcompris.bonus.display(gcompris.bonus.WIN,gcompris.bonus.SMILEY)
+      else :
+          gcompris.bonus.display(gcompris.bonus.LOOSE,gcompris.bonus.SMILEY)
+
+
+  def letter_change(self,letter):
+      self.correct_letter = letter
\ No newline at end of file
diff --git a/src/braille_alphabets-activity/braille_alphabets.xml b/src/braille_alphabets-activity/braille_alphabets.xml
new file mode 100755
index 0000000..3f6fd2d
--- /dev/null
+++ b/src/braille_alphabets-activity/braille_alphabets.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<GCompris>
+  <Board
+        name="braille_alphabets"
+        type="python:braille_alphabets"
+        section="/experimental"
+        icon="braille_bug.svg"
+        difficulty="1"
+        author="Srishti Sethi (srishakatux gmail com)"
+        boarddir=""
+        demo="1">
+        <title>Braille Alphabets Activity</title>
+        <description>Learn and memorize the braille code for alphabets</description>
+        <prerequisite></prerequisite>
+        <goal>To let the kids discover braille codes for alphabets</goal>
+        <manual>The GCompris board shows three sections : braille cell,alphabet name and lower board
+        containing 13 letters.Click on each letter in the lower board to know its corresponding braille
+        code in the braille cell section.Click on the increment level button to jump to the
+        next 13 letters of the english alphabets.</manual>
+        <credit></credit>
+  </Board>
+  <Data directory=""/>
+</GCompris>
\ No newline at end of file
diff --git a/src/braille_alphabets-activity/braille_alphabets.xml.in b/src/braille_alphabets-activity/braille_alphabets.xml.in
new file mode 100755
index 0000000..3ea17a6
--- /dev/null
+++ b/src/braille_alphabets-activity/braille_alphabets.xml.in
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<GCompris>
+  <Board
+        name="braille_alphabets"
+        type="python:braille_alphabets"
+        section="/experimental"
+        icon="braille_bug.svg"
+        difficulty="1"
+        author="Srishti Sethi (srishakatux gmail com)"
+        boarddir=""
+        demo="1">
+        <_title>Braille Alphabets Activity</_title>
+        <_description>Learn and memorize the braille code for alphabets</_description>
+        <_prerequisite></_prerequisite>
+        <_goal>To let the kids discover braille codes for alphabets</_goal>
+        <_manual>The GCompris board shows three sections : braille cell,alphabet name and lower board
+        containing 13 letters.Click on each letter in the lower board to know its corresponding braille
+        code in the braille cell section.Click on the increment level button to jump to the
+        next 13 letters of the english alphabets.</_manual>
+        <_credit></_credit>
+  </Board>
+  <Data directory=""/>
+</GCompris>
\ No newline at end of file
diff --git a/src/braille_alphabets-activity/braillebug.svg b/src/braille_alphabets-activity/braillebug.svg
new file mode 100755
index 0000000..b3a61ac
--- /dev/null
+++ b/src/braille_alphabets-activity/braillebug.svg
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   width="50"
+   height="50"
+   sodipodi:docname="braillebug.gif">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="640"
+     inkscape:window-height="480"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="3.2948718"
+     inkscape:cx="41.5"
+     inkscape:cy="39"
+     inkscape:window-x="0"
+     inkscape:window-y="37"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <image
+     width="50"
+     height="50"
+     xlink:href="data:image/png;base64,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
+"
+     id="image10"
+     x="0"
+     y="0" />
+</svg>
diff --git a/src/braille_alphabets-activity/dicey_dicey.py b/src/braille_alphabets-activity/dicey_dicey.py
new file mode 100644
index 0000000..d8dfe6d
--- /dev/null
+++ b/src/braille_alphabets-activity/dicey_dicey.py
@@ -0,0 +1,475 @@
+#  gcompris - dicey_dicey.py
+#
+# Copyright (C) 2003, 2008 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 <http://www.gnu.org/licenses/>.
+#
+# dicey_dicey activity.
+import gtk
+import gtk.gdk
+import gcompris
+import gcompris.utils
+import gcompris.skin
+import gcompris.score
+import goocanvas
+import pango
+import random
+import gcompris.bonus
+from BrailleChar import *
+from gcompris import gcompris_gettext as _
+
+
+on = 0XFFFFFFFFL
+off = 0X00000000L
+circle_stroke = "black"
+circle_fill = "#660066"
+symbol_operators = {1 : "dicey_dicey/plus.svg",2 : "dicey_dicey/minus.svg",
+                    3 : "dicey_dicey/multiply.svg" ,4 : "dicey_dicey/divide.svg"}
+
+sign = ['+','_','X','/']
+random.shuffle(sign)
+x1 = 100
+x2 = 300
+x3 = 340
+x4 = 120
+x5 = 360
+x6 = 400
+class Gcompris_dicey_dicey:
+  """Empty gcompris python class"""
+
+  def __init__(self, gcomprisBoard):
+    # Save the gcomprisBoard, it defines everything we need
+    # to know from the core
+    self.gcomprisBoard = gcomprisBoard
+
+    self.gcomprisBoard.level=1
+    self.gcomprisBoard.sublevel=1
+    self.gcomprisBoard.number_of_sublevel=2
+    self.gcomprisBoard.maxlevel = 6
+
+    self.counter = 0
+    # Needed to get key_press
+    gcomprisBoard.disable_im_context = True
+
+  def start(self):
+
+    # Set the buttons we want in the bar
+    gcompris.bar_set(gcompris.BAR_LEVEL)
+    gcompris.bar_location(300,-1,0.8)
+    # 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())
+
+    gcompris.score.start(gcompris.score.STYLE_NOTE, 70, 470,
+                         self.gcomprisBoard.number_of_sublevel)
+    gcompris.bar_set_level(self.gcomprisBoard)
+    gcompris.score.set(self.gcomprisBoard.sublevel)
+
+    self.display_function(self.gcomprisBoard.level)
+
+  def display_function(self,level):
+      if(level == 1 or level == 4):
+          """Taking two random numbers to be displayed on the dice"""
+          plus_arr_a = [0,1,2]
+          plus_arr_b = [0,1,2]
+          minus_arr_a = [2]
+          minus_arr_b = [0,1,2]
+          mult_arr_a = [0,1,2]
+          mult_arr_b = [0,1,2]
+          div_arr_a = [0,1,2]
+          div_arr_b = [1,2]
+          self.dicey_dicey()
+          if(level == 1):
+              self.dicey_dicey1()
+          elif(level == 4):
+              self.dicey_dicey1()
+              self.dicey_dicey4()
+          self.calculate(plus_arr_a,plus_arr_b,minus_arr_a,minus_arr_b,
+                mult_arr_a,mult_arr_b,div_arr_a,div_arr_b,level)
+
+      if(level == 2 or level == 5):
+          plus_arr_a = [3,4,5]
+          plus_arr_b = [3,4]
+          minus_arr_a = [5]
+          minus_arr_b = [3,4,5]
+          mult_arr_a = [3,4]
+          mult_arr_b = [1,2]
+          div_arr_a = [2,4,6]
+          div_arr_b = [2]
+          self.dicey_dicey()
+          if(level == 2):
+              self.dicey_dicey1()
+          elif(level == 5):
+              self.dicey_dicey1()
+              self.dicey_dicey4()
+          self.calculate(plus_arr_a,plus_arr_b,minus_arr_a,minus_arr_b,
+                mult_arr_a,mult_arr_b,div_arr_a,div_arr_b,level)
+
+      if(level == 3 or level == 6):
+          self.dicey_dicey()
+          plus_arr_a = [6,7,8,9]
+          plus_arr_b = [6,7,8,9]
+          minus_arr_a = [9]
+          minus_arr_b = [6,7,8,9]
+          mult_arr_a = [6,7,8,9]
+          mult_arr_b = [6,7,8,9]
+          div_arr_a = [3,6,9]
+          div_arr_b = [3]
+          self.dicey_dicey()
+          if((self.random_sign == '+') or (self.random_sign == 'X')):
+              if(level == 3):
+                  self.dicey_dicey2()
+              elif(level == 6):
+                  self.dicey_dicey2()
+                  self.dicey_dicey4()
+          else :
+              if(level == 3):
+                  self.dicey_dicey1()
+              elif(level == 6):
+                  self.dicey_dicey1()
+                  self.dicey_dicey4()
+
+          self.calculate(plus_arr_a,plus_arr_b,minus_arr_a,minus_arr_b,
+                mult_arr_a,mult_arr_b,div_arr_a,div_arr_b,level)
+
+      if(level == 1 or level == 2 or level == 3):
+          gcompris.set_background(self.gcomprisBoard.canvas.get_root_item(),
+                            "dicey_dicey/dice.svg")
+          ok = goocanvas.Svg(parent = self.rootitem,
+                         svg_handle = gcompris.skin.svg_get(),
+                         svg_id = "#OK",
+                         tooltip = "Click to confirm your selection of dots"
+                         )
+          ok.translate(40,-30)
+          ok.connect("button_press_event", self.ok_event,level)
+          gcompris.utils.item_focus_init(ok, None)
+
+
+  def calculate(self,plus_arr_a,plus_arr_b,minus_arr_a,minus_arr_b,
+                mult_arr_a,mult_arr_b,div_arr_a,div_arr_b,level):
+      if(self.random_sign == '+'):
+              i =  random.choice(plus_arr_a)
+              j =  random.choice(plus_arr_b)
+              self.result = i + j
+      elif(self.random_sign == '_'):
+              i = random.choice(minus_arr_a)
+              j = random.choice(minus_arr_b)
+              self.result = i - j
+      elif(self.random_sign == 'X'):
+              i = random.choice(mult_arr_a)
+              j = random.choice(mult_arr_b)
+              self.result = i * j
+      elif(self.random_sign == '/'):
+              i = random.choice(div_arr_a)
+              j = random.choice(div_arr_b)
+              self.result = i / j
+
+
+      if(level ==1 or level == 2):
+          goocanvas.Text(parent = self.rootitem,
+                     x=280.0,
+                     y=200.0,
+                     text=self.random_sign,
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+          self.braille_display(x4,x5,x6,i,j)
+          self.single_cell()
+      if(level == 4 or level == 5):
+          self.braille_display(x4,x5,x6,i,j)
+          goocanvas.Text(parent = self.rootitem,
+                     x=280.0,
+                     y=200.0,
+                     text='?',
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+          braille_cell = BrailleChar(self.rootitem,600,160,70,
+                                 self.result,on,off,circle_fill,circle_stroke,
+                                 False,False,False,None)
+          self.text_display()
+
+      if(level == 3):
+          if(self.random_sign == '+' or self.random_sign == 'X'):
+              self.braille_display(x1, x2, x3 ,i, j)
+              goocanvas.Text(parent = self.rootitem,
+                     x=240.0,
+                     y=200.0,
+                     text=self.random_sign,
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+              braille_cell1 = BrailleChar(self.rootitem,490,160,70,
+                                 '',on,off,circle_fill,circle_stroke,
+                                 False,True,False,callback = self.letter_change1)
+              braille_cell2 = BrailleChar(self.rootitem,630,160,70,
+                                 '',on,off,circle_fill,circle_stroke,
+                                 False,True,False,callback = self.letter_change2)
+          else :
+              self.braille_display(x4, x5, x6, i, j)
+              goocanvas.Text(parent = self.rootitem,
+                     x=280.0,
+                     y=200.0,
+                     text=self.random_sign,
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+              self.single_cell()
+
+      elif(level == 6):
+          if(self.random_sign == '+' or self.random_sign == 'X'):
+                goocanvas.Text(parent = self.rootitem,
+                     x=240.0,
+                     y=200.0,
+                     text='?',
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+                self.braille_display(x1, x2, x3, i, j)
+                self.two_cells()
+                self.text_display()
+
+          else :
+                goocanvas.Text(parent = self.rootitem,
+                     x=280.0,
+                     y=200.0,
+                     text='?',
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+                self.braille_display(x4, x5, x6, i, j)
+                self.result_display()
+                self.text_display()
+
+  def result_display(self):
+      braille_cell = BrailleChar(self.rootitem,600,160,70,
+                                 self.result,on,off,circle_fill,circle_stroke,
+                                 False,False,False,None)
+
+  def single_cell(self):
+      braille_cell = BrailleChar(self.rootitem,600,160,70,
+                                 '',on,off,circle_fill,circle_stroke,
+                                 False,True,False,callback = self.letter_change1)
+  def text_display(self):
+      goocanvas.Text(parent = self.rootitem, x=640.0,y=330.0,
+                     text="%i" % self.result,anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+  def two_cells(self):
+      self.a1 = self.result / 10
+      self.a2 = self.result % 10
+      braille_cell1 = BrailleChar(self.rootitem,490,160,70,
+                                 self.a1,on,off,circle_fill,circle_stroke,
+                                 False,False,False,callback = self.letter_change1)
+      braille_cell2 = BrailleChar(self.rootitem,630,160,70,
+                                 self.a2,on,off,circle_fill,circle_stroke,
+                                 False,False,False,callback = self.letter_change2)
+  def braille_display(self,x4,x5,x6,i,j):
+      BrailleChar(self.rootitem,x4,160,70, i ,on ,off ,circle_fill,
+                              circle_stroke,False,False ,False,None)
+      BrailleChar(self.rootitem,x5,160,70,j,on,off,circle_fill,
+                              circle_stroke,False, False, False, None)
+      goocanvas.Text(parent = self.rootitem, x=140.0,y=330.0,
+                     text="%i" % i,anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+      goocanvas.Text(parent = self.rootitem,
+                     x=x6,y=330.0,
+                     text="%i" % j,
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+
+  def dicey_dicey(self):
+    #Display title of activity
+    goocanvas.Text(parent = self.rootitem,
+                   x=400.0,
+                   y=100.0,
+                   text="Dicey - Dicey",
+                   fill_color="black",
+                   anchor = gtk.ANCHOR_CENTER,
+                   alignment = pango.ALIGN_CENTER,
+                   font = 'SANS 20'
+                   )
+
+    self.random_sign = sign[self.counter]
+
+  def dicey_dicey1(self):
+      for l in range(3):
+          item = goocanvas.Image(parent = self.rootitem,
+                                 pixbuf = gcompris.utils.load_pixmap("dicey_dicey/diceyo.svg"),
+                                 x = 80 *(3*l+1),
+                                 y = 150,
+                                 )
+
+      goocanvas.Text(parent = self.rootitem,
+                   x=280.0,
+                   y=230.0,
+                   text="___",
+                   anchor = gtk.ANCHOR_CENTER,
+                   font='SANS 25')
+      goocanvas.Text(parent = self.rootitem,
+                   x=520.0,y=230.0,
+                   text="=",
+                   anchor = gtk.ANCHOR_CENTER,
+                   font='SANS 25')
+      goocanvas.Text(parent = self.rootitem,
+                   x=650.0,y=330.0,
+                   text="___",
+                   anchor = gtk.ANCHOR_CENTER,
+                       font='SANS 25')
+
+
+  def dicey_dicey2(self):
+      for l in range(3):
+                item1 = goocanvas.Image(parent = self.rootitem,
+                                 pixbuf = gcompris.utils.load_pixmap("dicey_dicey/diceyo.svg"),
+                                 x = 65 *(3*l+1),
+                                 y = 150,
+                                 )
+      item2 = goocanvas.Image(parent = self.rootitem,
+                                    pixbuf = gcompris.utils.load_pixmap("dicey_dicey/diceyo.svg"),
+                                    x = 600,
+                                    y = 150,
+                                    )
+      goocanvas.Text(parent = self.rootitem,
+                   x=240.0,
+                   y=230.0,
+                   text="___",
+                   anchor = gtk.ANCHOR_CENTER,
+                   font='SANS 25')
+      goocanvas.Text(parent = self.rootitem,
+                   x=430.0,y=230.0,
+                   text="=",
+                   anchor = gtk.ANCHOR_CENTER,
+                   font='SANS 25')
+      goocanvas.Text(parent = self.rootitem,
+                   x=620.0,y=330.0,
+                   text="___",
+                   anchor = gtk.ANCHOR_CENTER,
+                   font='SANS 25')
+
+  def dicey_dicey4(self):
+      gcompris.set_background(self.gcomprisBoard.canvas.get_root_item(),
+                            "dicey_dicey/dice_area.svg")
+      goocanvas.Text(parent = self.rootitem,
+                     x=300.0,
+                     y=358.0,
+                     text="Choose an operator to indicate the question mark",
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 12')
+
+      #Display operator images
+      self.c = []
+      for operator_number in range(4):
+          self.I = goocanvas.Image(parent = self.rootitem,
+                         pixbuf = gcompris.utils.load_pixmap
+                         (symbol_operators.get(operator_number+1)),
+                         x= 150 * (operator_number + 1),
+                         y=375
+                         )
+          self.c.append(self.I)
+
+          gcompris.utils.item_focus_init(self.I,None)
+      for l in range(4):
+          self.c[l].connect("button_press_event",self.symbol_identify,l)
+
+  def symbol_identify(self,event,target,item,index):
+      if((index == 0 and self.random_sign == '+') or
+         (index == 1 and self.random_sign == '_') or
+          (index == 2 and self.random_sign == 'X')
+        or (index == 3 and self.random_sign == '/')):
+          gcompris.bonus.display(gcompris.bonus.WIN,gcompris.bonus.FLOWER)
+      else :
+          gcompris.bonus.display(gcompris.bonus.LOOSE,gcompris.bonus.FLOWER)
+
+  def ok_event(self,item,target,event,level):
+      if(level == 1 or level == 2 or level == 3):
+            if(level == 3 and (self.random_sign == '+' or
+                                self.random_sign == 'X')):
+                if((self.a1 == self.correct_letter1) and
+                   (self.a2 == self.correct_letter2)):
+                  goocanvas.Text(parent = self.rootitem,
+                         x = 630,
+                         y = 330,
+                         text = str(self.correct_letter1) + ''
+                          +str(self.correct_letter2),
+                         anchor = gtk.ANCHOR_CENTER,
+                         font = 'SANS 25'
+                         )
+                  gcompris.bonus.display(gcompris.bonus.WIN,gcompris.bonus.FLOWER)
+                else :
+                  gcompris.bonus.display(gcompris.bonus.LOOSE,gcompris.bonus.FLOWER)
+            else :
+                if(self.result == self.correct_letter1):
+                    goocanvas.Text(parent = self.rootitem,
+                     x=650.0,
+                     y=330.0,
+                     text=self.result,
+                     anchor = gtk.ANCHOR_CENTER,
+                     font='SANS 25')
+                    gcompris.bonus.display(gcompris.bonus.WIN,gcompris.bonus.FLOWER)
+                else :
+                    gcompris.bonus.display(gcompris.bonus.LOOSE,gcompris.bonus.FLOWER)
+
+  def letter_change1(self,letter):
+      self.correct_letter1 = letter
+
+  def letter_change2(self,letter):
+      self.correct_letter2 = letter
+
+  def end(self):
+    # Remove the root item removes all the others inside it
+    self.rootitem.remove()
+
+
+  def ok(self):
+    print("dicey_dicey ok.")
+
+
+  def repeat(self):
+    print("dicey_dicey repeat.")
+
+
+  def config(self):
+    print("dicey_dicey config.")
+
+
+  def key_press(self, keyval, commit_str, preedit_str):
+    utf8char = gtk.gdk.keyval_to_unicode(keyval)
+    strn = u'%c' % utf8char
+
+    print("Gcompris_dicey_dicey key press keyval=%i %s" % (keyval, strn))
+
+  def pause(self, pause):
+    if(pause == 0):
+        self.counter +=1
+        if (self.counter == 4):
+            self.increment_level()
+        self.end()
+        self.start()
+
+  def set_level(self, level):
+    gcompris.sound.play_ogg("sounds/receive.wav")
+    self.gcomprisBoard.level = level
+    self.gcomprisBoard.sublevel = 1
+    gcompris.bar_set_level(self.gcomprisBoard)
+    self.end()
+    self.start()
+
+  def increment_level(self):
+    self.counter = 0
+    gcompris.sound.play_ogg("sounds/bleep.wav")
+    self.gcomprisBoard.sublevel += 1
+    if(self.gcomprisBoard.sublevel>self.gcomprisBoard.number_of_sublevel):
+        self.gcomprisBoard.sublevel=1
+        self.gcomprisBoard.level += 1
+        if(self.gcomprisBoard.level > self.gcomprisBoard.maxlevel):
+            self.gcomprisBoard.level = 1
\ No newline at end of file
diff --git a/src/braille_alphabets-activity/gcompris b/src/braille_alphabets-activity/gcompris
new file mode 120000
index 0000000..6a7dc8a
--- /dev/null
+++ b/src/braille_alphabets-activity/gcompris
@@ -0,0 +1 @@
+../boards/python/gcompris
\ No newline at end of file
diff --git a/src/braille_alphabets-activity/init_path.sh b/src/braille_alphabets-activity/init_path.sh
new file mode 100755
index 0000000..d4f78d7
--- /dev/null
+++ b/src/braille_alphabets-activity/init_path.sh
@@ -0,0 +1,8 @@
+# Set the different path for this activity
+# This is sourced by runit.sh
+path=$1
+activity=braille_alphabets
+plugindir=$path/../boards/.libs
+pythonplugindir=$path 
+resourcedir=$path/resources
+section="/experimental"
diff --git a/src/braille_alphabets-activity/resources/back.png b/src/braille_alphabets-activity/resources/back.png
new file mode 100644
index 0000000..2701f21
Binary files /dev/null and b/src/braille_alphabets-activity/resources/back.png differ
diff --git a/src/braille_alphabets-activity/resources/braille_tux.svgz b/src/braille_alphabets-activity/resources/braille_tux.svgz
new file mode 100644
index 0000000..a374d91
Binary files /dev/null and b/src/braille_alphabets-activity/resources/braille_tux.svgz differ
diff --git a/src/braille_alphabets-activity/resources/drawing.svg b/src/braille_alphabets-activity/resources/drawing.svg
new file mode 100644
index 0000000..e94971c
--- /dev/null
+++ b/src/braille_alphabets-activity/resources/drawing.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="drawing.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="366.55"
+     inkscape:cy="492.31103"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="701"
+     inkscape:window-x="0"
+     inkscape:window-y="37"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       rx="37.158844"
+       ry="73.351807"
+       y="0.62713188"
+       x="-0.52573889"
+       height="1054.8987"
+       width="743.90857"
+       id="rect1393"
+       style="fill:#e8e7e2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.875;marker:none;visibility:visible;display:inline;overflow:visible"
+       inkscape:export-filename="/home/bruno/Projets/gcompris/gcompris/boards/images/mosaic_bg.png"
+       inkscape:export-xdpi="71.968178"
+       inkscape:export-ydpi="71.968178" />
+  </g>
+</svg>
diff --git a/src/braille_alphabets-activity/resources/mosaic.svgz b/src/braille_alphabets-activity/resources/mosaic.svgz
new file mode 100644
index 0000000..29292ca
Binary files /dev/null and b/src/braille_alphabets-activity/resources/mosaic.svgz differ
diff --git a/src/braille_alphabets-activity/resources/mosaic_bg.svgz b/src/braille_alphabets-activity/resources/mosaic_bg.svgz
new file mode 100755
index 0000000..86f5da0
Binary files /dev/null and b/src/braille_alphabets-activity/resources/mosaic_bg.svgz differ
diff --git a/src/braille_alphabets-activity/resources/target.svg b/src/braille_alphabets-activity/resources/target.svg
new file mode 100644
index 0000000..9c2ea1a
--- /dev/null
+++ b/src/braille_alphabets-activity/resources/target.svg
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="64px"
+   height="64px"
+   id="svg3211"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="target.svg">
+  <defs
+     id="defs3213" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.5"
+     inkscape:cx="32"
+     inkscape:cy="32"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="701"
+     inkscape:window-x="0"
+     inkscape:window-y="37"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata3216">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g34218"
+       transform="matrix(0.74091789,-0.00895527,0.00790171,0.72102019,-4.4493366,-4.3813411)">
+      <path
+         id="path2941"
+         d="m 41.876434,78.550846 -1.099019,2.060663 -0.274755,4.415703 1.373774,2.649422 1.64853,2.649422 5.495097,0.29438 3.846569,-3.238183 -0.274755,-2.943802 -0.54951,-2.649422 -1.373774,-3.238183 -7.418382,-0.29438 -1.373775,0.29438 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         inkscape:connector-curvature="0" />
+      <g
+         transform="translate(-0.639516,-2.131719)"
+         id="g34199">
+        <path
+           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 41.142176,9.6151159 c 0,0 15.987893,1.2790311 17.266924,1.2790311 1.279031,0 14.282517,5.116126 14.282517,5.116126 l 11.724454,12.790314 c 0,0 2.558063,10.019079 2.771235,11.084938 0.213172,1.06586 -1.918547,15.348377 -1.918547,16.84058 0,1.492203 -5.755642,13.42983 -5.755642,13.42983 l -9.166391,10.23225 c 0,0 -10.658595,2.558064 -14.282517,2.558064 -3.623922,0 -13.003486,0.639515 -15.774721,0.639515 -2.771234,0 -15.348376,-3.837094 -16.627408,-4.902954 C 22.383049,77.616951 10.445423,69.090075 10.658595,67.811044 10.871767,66.532012 5.7556412,56.512934 6.6083288,54.381215 7.4610164,52.249496 7.4610163,38.819666 7.4610163,38.819666 c 0,0 4.2634377,-9.805908 5.7556417,-12.363971 1.492203,-2.558062 4.902953,-6.181984 6.395156,-7.887359 1.492204,-1.705376 9.805908,-5.54247 9.805908,-5.54247 L 41.142176,9.6151159 z"
+           id="path2935"
+           sodipodi:nodetypes="csccssccssssscsscc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#2165cd;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 42.273349,15.051 c 0,0 14.129427,1.091047 15.259781,1.091047 1.130353,0 12.622287,4.364188 12.622287,4.364188 l 10.36158,10.910469 c 0,0 2.260708,8.546535 2.4491,9.45574 0.188393,0.909206 -1.695531,13.092564 -1.695531,14.365452 0,1.272887 -5.086594,11.455993 -5.086594,11.455993 l -8.100871,8.728374 c 0,0 -9.419618,2.182095 -12.622287,2.182095 -3.20267,0 -11.491934,0.545523 -13.941035,0.545523 -2.4491,0 -13.564249,-3.27314 -14.694604,-4.182347 -1.130354,-0.909205 -11.680325,-8.182851 -11.491933,-9.273898 0.188392,-1.091047 -4.333024,-9.637581 -3.579455,-11.455992 0.75357,-1.818412 0.75357,-13.274405 0.75357,-13.274405 0,0 3.767846,-8.364694 5.086593,-10.546788 1.318747,-2.182094 4.333024,-5.273393 5.65177,-6.728122 1.318747,-1.45473 8.666049,-4.727871 8.666049,-4.727871 L 42.273349,15.051 z"
+           id="path34196"
+           sodipodi:nodetypes="csccssccssssscsscc"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="translate(-87.61365,-33.04165)"
+         id="g34189">
+        <path
+           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 111.27573,66.958356 11.51128,-10.871767 c 0,0 10.44542,-0.426344 13.643,-0.639516 3.19758,-0.213172 11.29811,2.558063 11.29811,2.558063 0,0 6.8215,5.329297 7.03468,6.821501 0.21317,1.492203 3.83709,10.871766 3.41075,13.429829 -0.42635,2.558063 -1.49221,9.166392 -1.91855,10.445423 -0.42634,1.279031 -9.37956,9.592736 -10.87177,10.445423 C 143.89103,100 131.52706,101.06586 127.26362,100 c -4.26344,-1.06586 -13.643,-5.116126 -13.643,-6.395157 0,-1.279032 -3.19758,-11.298111 -3.83709,-14.495689 -0.63952,-3.197579 1.27903,-12.150798 1.4922,-12.150798 z"
+           id="path2933"
+           sodipodi:nodetypes="ccscsssssssc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#ffcc00;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 114.80451,87.049609 9.74244,8.915227 c 0,0 8.84036,0.349616 11.54659,0.524425 2.70624,0.174809 9.56202,-2.097701 9.56202,-2.097701 0,0 5.7733,-4.370209 5.95372,-5.593867 0.18041,-1.223659 3.24747,-8.915227 2.88664,-11.012927 -0.36083,-2.0977 -1.2629,-7.51676 -1.62373,-8.56561 -0.36084,-1.04885 -7.93829,-7.866377 -9.2012,-8.56561 -1.2629,-0.699234 -11.727,-1.573276 -15.33531,-0.699234 -3.60831,0.874043 -11.54659,4.195401 -11.54659,5.244251 0,1.048851 -2.70624,9.264844 -3.24748,11.886969 -0.54125,2.622126 1.08249,9.964077 1.2629,9.964077 z"
+           id="path34187"
+           sodipodi:nodetypes="ccscsssssssc"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g34181"
+           transform="translate(86.72317,32.58648)">
+          <path
+             sodipodi:nodetypes="cscscscssc"
+             id="path34183"
+             d="m 35.546664,49.58198 c 0,0 -0.415835,-6.958638 -0.151997,-8.0605 0.263839,-1.101861 4.901081,-7.365561 4.901081,-7.365561 0,0 5.10562,-1.865964 9.854703,-1.039569 4.749084,0.826397 6.992246,2.104826 8.086283,4.345154 0.690182,1.413329 2.63838,6.335704 1.846867,9.365822 -0.791514,3.03012 -2.902218,6.61117 -2.902218,6.61117 0,0 -5.27676,4.682911 -6.595951,4.958376 -1.31919,0.275466 -7.459145,-1.003565 -9.306012,-2.105427 -1.846865,-1.101861 -5.996594,-6.433999 -5.732756,-6.709465 z"
+             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="cscscscssc"
+             id="path34185"
+             d="m 48.337813,54.969999 c 0,0 -4.852783,-0.938451 -5.556353,-1.313515 -0.703569,-0.375065 -4.086051,-4.662326 -4.086051,-4.662326 0,0 -0.275176,-3.835394 1.225465,-6.952261 1.500643,-3.116867 2.818346,-4.432852 4.569539,-4.79027 1.104754,-0.225481 4.862815,-0.69784 6.784657,0.378894 1.921843,1.076735 3.961959,3.156563 3.961959,3.156563 0,0 2.172878,4.448483 2.102286,5.403119 -0.07059,0.954635 -2.155127,4.947296 -3.273829,6.022116 -1.1187,1.07482 -5.590699,2.987372 -5.727673,2.75768 z"
+             style="fill:#ff140e;fill-opacity:1;fill-rule:evenodd;stroke:none"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+      <g
+         transform="translate(-0.639516,-2.131719)"
+         id="g34206">
+        <path
+           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 21.337915,74.632545 -5.344101,5.651787 -4.500296,5.394889 -1.6876106,5.908688 0.2812686,2.312095 8.156786,0.770699 5.344101,-4.110392 -1.125075,-4.62419 1.968879,-4.110391 5.62537,-3.596593 -8.719322,-3.596592 z"
+           id="path2937"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#85c751;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 22.369847,76.385351 -3.743079,5.020853 -3.748481,3.828822 -1.405762,2.350884 -0.133982,2.903916 3.316201,0.692412 3.734239,-1.680492 -0.769628,-2.447263 0.493096,-4.326456 5.77782,-4.87644 -3.520424,-1.466236 z"
+           id="path34204"
+           sodipodi:nodetypes="ccccccccccc"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="matrix(-1,0,0,1,92.62318,-1.279032)"
+         id="g34210">
+        <path
+           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 21.337915,74.632545 -5.344101,5.651787 -4.500296,5.394889 -1.6876106,5.908688 0.2812686,2.312095 8.156786,0.770699 5.344101,-4.110392 -1.125075,-4.62419 1.968879,-4.110391 5.62537,-3.596593 -8.719322,-3.596592 z"
+           id="path34212"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#85c751;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 22.583019,75.959008 -3.956251,5.447196 -3.748481,3.828822 -1.405762,2.350884 -0.133982,2.903916 3.316201,0.692412 3.734239,-1.680492 -0.769628,-2.447263 0.493096,-4.326456 5.351476,-4.87644 -2.880908,-1.892579 z"
+           id="path34214"
+           sodipodi:nodetypes="ccccccccccc"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         id="path34216"
+         d="m 49.337452,81.606312 0.606355,1.06586 0.151589,2.283984 -0.757944,1.370391 -0.909534,1.37039 -3.031778,0.152266 -2.122245,-1.674922 0.151589,-1.522657 0.303178,-1.37039 0.757944,-1.674922 4.092901,-0.152266 0.757945,0.152266 z"
+         style="fill:#85c751;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
\ No newline at end of file



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]