Commit 16d34c04 authored by Srishti Sethi's avatar Srishti Sethi

Deleting all files for repushing

parent 9d49e5c9
# 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
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)
# 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
<?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>
<?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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