Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodrigo Perez <rodripf@gmail.com>2013-03-20 14:00:24 (GMT)
committer Rodrigo Perez <rodripf@gmail.com>2013-03-20 14:00:24 (GMT)
commit347a984231a15c5bff7e42652686f1c42cd13b7a (patch)
tree58d6781157d57d5411431999e293c37064c2880a
First commit
-rw-r--r--MANIFEST194
-rw-r--r--Readme.txt0
-rw-r--r--TInterpreter.py113
-rw-r--r--TInterpreterBoard.py131
-rw-r--r--TInterpreterProject.py329
-rw-r--r--Tixo.py123
-rw-r--r--activity/Activity-TicoTico.svg119
-rw-r--r--activity/activity.info9
-rw-r--r--activity/activity.info~9
-rw-r--r--components/TInterpreterAcumulatedCell.py52
-rw-r--r--components/TInterpreterCell.py124
-rw-r--r--components/TInterpreterCommonCell.py153
-rw-r--r--components/TInterpreterCommonCell.py~149
-rw-r--r--components/TInterpreterCommonControl.py47
-rw-r--r--components/TInterpreterConstants.py0
-rw-r--r--components/TInterpreterControlCell.py60
-rw-r--r--components/TInterpreterTextArea.py10
-rw-r--r--components/__init__.py2
-rw-r--r--components/rules/__init__.py2
-rw-r--r--dist/TIXO-1.xobin0 -> 1105837 bytes
-rw-r--r--dist/TIXO-2.xobin0 -> 1106440 bytes
-rw-r--r--generar.sh29
-rw-r--r--icons/barrido.svg210
-rw-r--r--icons/open.svg57
-rw-r--r--po/TIXO.pot163
-rw-r--r--proyectos/.empty0
-rw-r--r--proyectos/Muestra/image/2245.pngbin0 -> 28925 bytes
-rw-r--r--proyectos/Muestra/image/2300.pngbin0 -> 34207 bytes
-rw-r--r--proyectos/Muestra/image/2304_1.pngbin0 -> 53044 bytes
-rw-r--r--proyectos/Muestra/image/2314.pngbin0 -> 25502 bytes
-rw-r--r--proyectos/Muestra/image/2349.pngbin0 -> 33122 bytes
-rw-r--r--proyectos/Muestra/image/2367.pngbin0 -> 47258 bytes
-rw-r--r--proyectos/Muestra/image/2370.pngbin0 -> 47815 bytes
-rw-r--r--proyectos/Muestra/image/2374.pngbin0 -> 25835 bytes
-rw-r--r--proyectos/Muestra/image/2401.pngbin0 -> 43295 bytes
-rw-r--r--proyectos/Muestra/image/2430.pngbin0 -> 39646 bytes
-rw-r--r--proyectos/Muestra/image/24735.pngbin0 -> 39982 bytes
-rw-r--r--proyectos/Muestra/image/24795.pngbin0 -> 29069 bytes
-rw-r--r--proyectos/Muestra/image/2487.pngbin0 -> 65086 bytes
-rw-r--r--proyectos/Muestra/image/25191.pngbin0 -> 38814 bytes
-rw-r--r--proyectos/Muestra/image/2586.pngbin0 -> 52542 bytes
-rw-r--r--proyectos/Muestra/image/2587.pngbin0 -> 28915 bytes
-rw-r--r--proyectos/Muestra/image/2606.pngbin0 -> 26268 bytes
-rw-r--r--proyectos/Muestra/image/2684.pngbin0 -> 30455 bytes
-rw-r--r--proyectos/Muestra/image/3250.pngbin0 -> 25428 bytes
-rw-r--r--proyectos/Muestra/image/4962.pngbin0 -> 35369 bytes
-rw-r--r--proyectos/Muestra/image/5441.pngbin0 -> 29807 bytes
-rw-r--r--proyectos/Muestra/image/5957_1.pngbin0 -> 25455 bytes
-rw-r--r--proyectos/Muestra/image/6522.pngbin0 -> 27834 bytes
-rw-r--r--proyectos/Muestra/image/6537.pngbin0 -> 28979 bytes
-rw-r--r--proyectos/Muestra/image/6625_1.pngbin0 -> 27090 bytes
-rw-r--r--proyectos/Muestra/image/6632_1.pngbin0 -> 24118 bytes
-rw-r--r--proyectos/Muestra/image/7061.pngbin0 -> 24231 bytes
-rw-r--r--proyectos/Muestra/image/8662.pngbin0 -> 30446 bytes
-rw-r--r--proyectos/Muestra/image/controller-home.pngbin0 -> 15963 bytes
-rw-r--r--proyectos/Muestra/image/controller-home_1.pngbin0 -> 15963 bytes
-rw-r--r--proyectos/Muestra/image/teleton.pngbin0 -> 94861 bytes
-rw-r--r--proyectos/Muestra/project.xml888
-rw-r--r--setup.py3
-rw-r--r--speak/GoogleTTS.py33
-rw-r--r--speak/__init__.py2
-rw-r--r--speak/espeak_cmd.py64
-rw-r--r--speak/new_main.py15
-rw-r--r--speak/voice.py169
-rw-r--r--threads/TInterpreterPlaySound.py66
-rw-r--r--threads/__init__.py2
-rw-r--r--util/About.py28
-rw-r--r--util/About.py~28
-rw-r--r--util/ChooseProject.py116
-rw-r--r--util/ControlFactory.py82
-rw-r--r--util/OpenNewProject.py54
-rw-r--r--util/Singleton.py16
-rw-r--r--util/__init__.py2
73 files changed, 3653 insertions, 0 deletions
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..0855d41
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,194 @@
+setup.py
+
+
+TInterpreter.py
+TInterpreterBoard.py
+TInterpreterProject.py
+
+
+activity/activity.info
+components/TInterpreterAcumulatedCell.py
+components/TInterpreterCell.py
+components/TInterpreterCommonCell.py
+components/TInterpreterCommonControl.py
+components/TInterpreterConstants.py
+components/TInterpreterControlCell.py
+components/TInterpreterTextArea.py
+components/__init__.py
+components/rules/__init__.py
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+speak/espeak_cmd.py
+
+
+
+speak/voice.py
+speak/__init__.py
+threads/TInterpreterPlaySound.py
+threads/__init__.py
+util/ControlFactory.py
+
+util/OpenNewProject.py
+
+util/__init__.py
+
+
+
+
+
+
+
+util/ChooseProject.py
+po/TicoTico.pot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+icons/open.svg
+util/About.py
+activity/Activity-TicoTico.svg
+
+
+
+
+
+
+proyectos/.empty
+generar.sh
+util/Singleton.py
+
+icons/barrido.svg
+proyectos/Muestra/project.xml
+proyectos/Muestra/image/2314.png
+proyectos/Muestra/image/2304_1.png
+proyectos/Muestra/image/2374.png
+proyectos/Muestra/image/2586.png
+proyectos/Muestra/image/6632_1.png
+proyectos/Muestra/image/2487.png
+proyectos/Muestra/image/24795.png
+proyectos/Muestra/image/2430.png
+proyectos/Muestra/image/controller-home.png
+proyectos/Muestra/image/2401.png
+proyectos/Muestra/image/2300.png
+proyectos/Muestra/image/2245.png
+proyectos/Muestra/image/4962.png
+proyectos/Muestra/image/2349.png
+proyectos/Muestra/image/6522.png
+proyectos/Muestra/image/2606.png
+proyectos/Muestra/image/2587.png
+proyectos/Muestra/image/5957_1.png
+proyectos/Muestra/image/2370.png
+proyectos/Muestra/image/25191.png
+proyectos/Muestra/image/2684.png
+proyectos/Muestra/image/5441.png
+proyectos/Muestra/image/3250.png
+proyectos/Muestra/image/6625_1.png
+proyectos/Muestra/image/teleton.png
+proyectos/Muestra/image/2367.png
+proyectos/Muestra/image/6537.png
+proyectos/Muestra/image/8662.png
+proyectos/Muestra/image/7061.png
+proyectos/Muestra/image/controller-home_1.png
+proyectos/Muestra/image/24735.png
+speak/GoogleTTS.py
+speak/new_main.py
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Tixo.py
+
+po/TIXO.pot
diff --git a/Readme.txt b/Readme.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Readme.txt
diff --git a/TInterpreter.py b/TInterpreter.py
new file mode 100644
index 0000000..aef5706
--- /dev/null
+++ b/TInterpreter.py
@@ -0,0 +1,113 @@
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__ = "Rodrigo"
+__date__ = "$20-sep-2012 12:16:32$"
+
+from TInterpreterProject import TInterpreterProject
+from util.OpenNewProject import OpenNewProject
+from util.ChooseProject import ChooseProject
+import pygtk
+pygtk.require('2.0')
+import gtk
+import os
+import sys
+
+class TInterpreter:
+ PROYECTOS = "proyectos"
+
+ def __init__(self):
+ self.project = TInterpreterProject()
+
+ def load(self, xml):
+ self.project.XMLDecode(xml)
+ self.project.setCurrentBoard(self.project.getInitialBoard())
+ self.project.show_all()
+
+
+ def getContenedor(self):
+ return self.project
+
+ def exit(self, widget, data=None):
+ gtk.main_quit()
+ sys.exit
+
+ def barrido(self, otro=None):
+ self.project.barrido()
+
+ def cambiarVelocidad(self, value):
+ self.project.cambiarVelocidad(value)
+
+
+
+#PARA EL FUNCIONAMIENTO FUERA DE SUGAR
+ def mainPropio(self):
+ #self.project.XMLDecode("proyectos/Muestra/project.xml")
+ #self.project.setCurrentBoard(self.project.getInitialBoard())
+
+ self.win = gtk.Window()
+ w = self.win
+ w.connect("destroy", self.exit)
+
+ self.container = gtk.VBox();
+
+ self.toolbar = gtk.Toolbar()
+ self.toolbar.append_item("Agregar", "Agregar Proyecto", None, None, self.__agregar)
+ self.toolbar.append_item("Abrir", "Abrir Proyecto", None, None, self.__abrir)
+ self.toolbar.append_item("Barrido", "Barrido Automatico", None, None, self.barrido)
+ self.toolbar.show()
+ self.container.pack_start(self.toolbar)
+
+ self.container.pack_start(self.project)
+
+ w.add(self.container)
+
+ w.show_all()
+
+
+ gtk.main()
+
+ def __agregar(self, widget):
+ dialog = gtk.FileChooserDialog(title="Abrir", action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
+ response = dialog.run()
+ if response == gtk.RESPONSE_OK:
+ try:
+ onp = OpenNewProject(dialog.get_filename(), os.path.basename(dialog.get_filename()))
+ self.load(os.path.join(self.PROYECTOS, onp.getProjectName(), "project.xml"),)
+ except Exception, e:
+ print "Exception: ", e
+ elif response == gtk.RESPONSE_CANCEL:
+ print 'Closed, no files selected'
+
+ dialog.destroy()
+
+ def __abrir(self, widget):
+ abr = ChooseProject(self.PROYECTOS)
+ abr.addOnAbrirListener(self.__abierto)
+ abr.show()
+
+ def __abierto(self, proyName):
+ self.load(os.path.join(self.PROYECTOS, proyName, "project.xml"),)
+
+
+
+if __name__ == "__main__":
+ b = TInterpreter()
+ b.mainPropio()
diff --git a/TInterpreterBoard.py b/TInterpreterBoard.py
new file mode 100644
index 0000000..876f898
--- /dev/null
+++ b/TInterpreterBoard.py
@@ -0,0 +1,131 @@
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+
+__author__ = "Rodrigo"
+__date__ = "$20-sep-2012 10:15:25$"
+
+from threading import Thread
+import gobject
+gobject.threads_init()
+import time
+import pygtk
+pygtk.require('2.0')
+import gtk
+
+
+class TInterpreterBoard(gtk.EventBox):
+ def __init__(self):
+ self.cellList = {}
+ super(TInterpreterBoard, self).__init__()
+ self.f = gtk.Fixed()
+ self.add(self.f)
+
+ self.cellResaltada = None
+
+ self._backgroundColor = None
+ self.barriendo = False
+ self.velocidadBarrido = 2.0
+
+
+#========SETUP FUNCTIONS========================================================
+ def setNombre(self, value):
+ self._nombre = value
+
+ def setOrderedCellList(self, list):
+ self._orderedCellList = list
+
+ def setOriginalSize(self, value):
+ self._originalSize = value
+
+ def addCell(self, cell):
+ self.cellList[cell.getId()] = cell
+
+ def setBackgroundColor(self, color):
+ self._backgroundColor = color
+
+
+#======GET FUNCTIONS============================================================
+ def getNombre(self):
+ return self._nombre
+
+#======INITIALIZATION
+
+ def initialize(self):
+ if self._backgroundColor:
+ color = self.get_colormap().alloc_color("#" + self._backgroundColor.upper()[2:])
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+ for cell in self.cellList.itervalues():
+ cell.initialize()
+ cell.set_size_request(cell.getWidth(), cell.getHeight())
+ self.f.put(cell, cell.getX(), cell.getY())
+
+ self.show_all()
+
+
+#======BARRIDO AUTOMATICO=======================================================
+ def barrer(self):
+ while self.barriendo:
+ if self.cellResaltada != None:
+ gobject.idle_add(self.cellList[self.cellResaltada].desResaltar)
+
+ self.cellResaltada = self._orderedCellList[self.barridoActual]
+ gobject.idle_add(self.cellList[self.cellResaltada].resaltar)
+
+ if self.barridoActual < len(self._orderedCellList) - 1:
+ self.barridoActual += 1
+ else:
+ self.barridoActual = 0
+
+ time.sleep(self.velocidadBarrido)
+
+ def accionarSeleccionado(self, widget, data):
+ self.cellList[self.cellResaltada].onClick(None)
+
+
+
+
+ def iniciarBarrido(self):
+ self.barriendo = True
+ # And bind an action to it
+ #self.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+ self._handl_id = self.connect("button_press_event", self.accionarSeleccionado)
+ self.barridoActual = 0
+ #self.t = Timer(2.0, self.barrerSiguiente)
+ self.t = Thread(target= self.barrer)
+
+ self.t.start()
+
+ def detenerBarrido(self):
+ self.barriendo = False
+ self.disconnect(self._handl_id)
+
+ def setVelocidadBarrido(self, value):
+ self.velocidadBarrido = value
+
+ def getVelocidadBarrido():
+ return self.velocidadBarrido
+
+
+if __name__ == "__main__":
+ print "Hello World"
diff --git a/TInterpreterProject.py b/TInterpreterProject.py
new file mode 100644
index 0000000..2975504
--- /dev/null
+++ b/TInterpreterProject.py
@@ -0,0 +1,329 @@
+# -*- coding: utf-8 -*-
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__ = "Rodrigo"
+__date__ = "$18-sep-2012 12:35:06$"
+
+from components.TInterpreterTextArea import TInterpreterTextArea
+from components.TInterpreterControlCell import TInterpreterControlCell
+from components.TInterpreterAcumulatedCell import TInterpreterAcumulatedCell
+from TInterpreterBoard import TInterpreterBoard
+from components.TInterpreterCell import TInterpreterCell
+import xml.etree.ElementTree as ET
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+import os
+
+import string
+
+class TInterpreterProject(gtk.VBox):
+ PROYECTOS = "proyectos"
+
+
+ def __init__(self):
+ super(TInterpreterProject, self).__init__()
+ self.currentBoard = None
+ self.boardList = {}
+ self.acumuladas = []
+ self.acumuladasContainer = gtk.HBox(False, 0)
+ self.pack_end(self.acumuladasContainer)
+ self.show_all()
+
+ self.barriendo = False
+ self.velActual = 2.0
+
+ def __getRealPath(self, path):
+ path = string.replace(path, "\\", os.sep)
+ path = string.replace(path, "/", os.sep)
+
+
+ salida = os.path.join(self.PROYECTOS, self.projectName, path)
+ return salida
+
+
+
+
+
+ def XMLDecode(self, file):
+ tree = ET.parse(file)
+ root = tree.getroot()
+
+ self.projectName = root.attrib["name"]
+ TInterpreterCell.projectName = self.projectName
+ self.initialBoard = root.find("initial_board").text
+
+ for boardXML in root.findall("board"):
+ board = TInterpreterBoard()
+ board.setNombre(boardXML.attrib["name"])
+
+ model = boardXML.find("model")
+
+ for attrXML in model.find("attributes").findall("attribute"):
+ key = attrXML.get("key")
+
+ if key == "imageResizeStyle":
+ pass
+ elif key == "orderedCellList":
+ orderedCellList = []
+ for cell in attrXML.findall("element"):
+ orderedCellList.append(cell.text)
+ board.setOrderedCellList(orderedCellList)
+ elif key == "size":
+ width = int(float(attrXML.find("width").text))
+ height = int(float(attrXML.find("height").text))
+ board.setOriginalSize((width, height))
+ elif key == "soundFile":
+ pass
+ elif key == "icon":
+ pass
+ elif key == "backgroundColor":
+ board.setBackgroundColor(attrXML.text)
+ elif key == "gradientColor":
+ pass
+
+ for compXML in model.findall("component"):
+ type = compXML.get("type")
+
+ if type == "cell":
+ cell = TInterpreterCell()
+
+ for attrXML in compXML.find("attributes").findall("attribute"):
+ key = attrXML.get("key")
+
+ if key == "followingBoard":
+ cell.setFollowingBoard(attrXML.text, self.setCurrentBoard)
+
+ elif key == "backgroundColor":
+ cell.setBackgroundColor(attrXML.text)
+
+ elif key == "gradientColor":
+ pass
+
+ elif key == "bordercolor":
+ cell.setBorderColor(attrXML.text)
+
+ elif key == "linewidth":
+ cell.setBorderWidth(int(float(attrXML.text)))
+
+ elif key=="environmentAction":
+ pass
+
+ elif key=="alternativeBorderColor":
+ cell.setAlternativeBorderColor(attrXML.text)
+
+ elif key=="alternativeLinewidth":
+ cell.setAlternativeBorderWidth(attrXML.text)
+
+ elif key=="accumulated":
+ acumulable = True if attrXML.text == "true" else False
+ cell.setAcumulable(acumulable, self.acumular)
+
+ elif key=="sendTextTimer":
+ pass
+
+ elif key=="sendTextTarget":
+ cell.setSendTextTarget(attrXML.text)
+
+ elif key=="sendText":
+ cell.setSendText(attrXML.text)
+
+ elif key=="alternativeIcon":
+ cell.setAlternativeIcon(self.__getRealPath(attrXML.text))
+ elif key=="verticalTextPosition":
+ cell.setVerticalTextPosition(attrXML.text)
+
+ elif key=="soundFile":
+ cell.setSoundFile(self.__getRealPath(attrXML.text))
+
+ elif key=="alternativeSoundFile":
+ cell.setAlternativeSoundFile(self.__getRealPath(attrXML.text))
+
+ elif key=="voiceName":
+ pass
+ elif key=="voiceText":
+ cell.setVoiceText(attrXML.text)
+ elif key=="videoFile":
+ pass
+ elif key=="videoURL":
+ pass
+
+ elif type == "controllerCell":
+ cell = TInterpreterControlCell()
+
+ for attrXML in compXML.find("attributes").findall("attribute"):
+ key = attrXML.get("key")
+
+ if key=="actionCode":
+ code = int(attrXML.text)
+
+ if code == TInterpreterControlCell.EXIT_ACTION_CODE:
+ cell.setActionCode(code)
+ elif code == TInterpreterControlCell.UNDO_ACTION_CODE:
+ cell.setActionCode(code, self.desAcumular)
+ elif code == TInterpreterControlCell.UNDO_ALL_ACTION_CODE:
+ cell.setActionCode(code, self.desAcumularTodas)
+ elif code == TInterpreterControlCell.HOME_ACTION_CODE:
+ cell.setActionCode(code, self.irAInicial)
+ elif code==TInterpreterControlCell.READ_ACTION_CODE:
+ cell.setActionCode(code, self.readAcumuladas)
+
+
+ elif type == "line":
+ pass
+
+ elif type == "oval":
+ pass
+
+ elif type == "rectangle":
+ pass
+
+ elif type == "textArea":
+ cell = TInterpreterTextArea()
+
+ for attrXML in compXML.find("attributes").findall("attribute"):
+
+ if key=="horizontalAlignment":
+ pass
+ elif key == "verticalAlignment":
+ pass
+ elif type == "roundRect":
+ pass
+ elif type=="label":
+ pass
+
+
+ #common attributes
+ if type == "cell" or type == "controllerCell":
+ for attrXML in compXML.find("attributes").findall("attribute"):
+ key = attrXML.get("key")
+
+ if key == "font":
+ cell.setFontFamily(attrXML.find("family").text)
+ cell.setFontSize(int(attrXML.find("size").text))
+
+ bold = False if attrXML.find("bold") == None else True
+ cell.setFontBold(bold)
+
+ italic = False if attrXML.find("italic") == None else True
+ cell.setFontBold(italic)
+
+ elif key == "id":
+ cell.setId(attrXML.text)
+
+ elif key=="foregroundColor":
+ cell.setForegroundColor(attrXML.text)
+
+ elif key == "bounds":
+ x = int(float(attrXML.find("x").text))
+ y = int(float(attrXML.find("y").text))
+ width = int(float(attrXML.find("width").text))
+ height = int(float(attrXML.find("height").text))
+
+ cell.setOriginalRect((x, y, width, height))
+
+ elif key == "text":
+ cell.setText(attrXML.text)
+
+ elif key=="icon":
+ cell.setIcon(self.__getRealPath(attrXML.text))
+
+
+
+
+ #agregar al tablero
+ if type == "cell" or type == "controllerCell":
+ board.addCell(cell)
+
+
+
+ self.boardList[board.getNombre()] = board
+
+
+
+#========PROJECT ACTIONS========================================================
+
+ def setCurrentBoard(self, nombre):
+ if self.currentBoard != None:
+ if self.barriendo:
+ self.currentBoard.detenerBarrido()
+ self.remove(self.currentBoard)
+
+ board = self.boardList[nombre]
+ board.initialize()
+ self.pack_start(board)
+ self.currentBoard = board
+
+ if self.barriendo:
+ self.currentBoard.iniciarBarrido()
+
+
+ def acumular(self, cell):
+ acu = TInterpreterAcumulatedCell(cell)
+ self.acumuladasContainer.pack_start(acu, False, False, 0)
+ acu.set_size_request(acu.getWidth(), acu.getHeight())
+ acu.show_all()
+ self.acumuladas.append(acu)
+
+ def desAcumular(self):
+ if len(self.acumuladas) > 0:
+ self.acumuladasContainer.remove(self.acumuladas.pop())
+
+ def desAcumularTodas(self):
+ for acu in self.acumuladas:
+ self.acumuladasContainer.remove(acu)
+ self.acumuladas = []
+
+ def irAInicial(self):
+ self.setCurrentBoard(self.getInitialBoard())
+
+ def readAcumuladas(self):
+ for acu in self.acumuladas:
+ acu.leer()
+
+ def barrido(self):
+ if not self.barriendo:
+ self.cambiarVelocidad(self.velActual)
+ self.currentBoard.iniciarBarrido()
+ self.barriendo = True
+ else:
+ self.currentBoard.detenerBarrido()
+ self.barriendo = False
+
+ def cambiarVelocidad(self, value):
+ self.velActual = value
+ self.currentBoard.setVelocidadBarrido(value)
+
+
+
+#=========GET===================================================================
+
+ def getInitialBoard(self):
+ return self.initialBoard
+
+ def getProjectName(self):
+ return self.projectName
+
+
+if __name__ == "__main__":
+ x = TInterpreterProject()
+ x.XMLDecode("proyectos/Muestra/project.xml")
diff --git a/Tixo.py b/Tixo.py
new file mode 100644
index 0000000..97dc8be
--- /dev/null
+++ b/Tixo.py
@@ -0,0 +1,123 @@
+
+# -*- coding: utf-8 -*-
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__ = "rodripf"
+__date__ = "$28/09/2012 01:24:15 PM$"
+
+from TInterpreter import TInterpreter
+from util.OpenNewProject import OpenNewProject
+from util.ChooseProject import ChooseProject
+import util.ControlFactory as ControlFactory
+
+from sugar.activity import activity
+
+import os
+import pygtk
+pygtk.require('2.0')
+import gtk
+import sugar
+
+from gettext import gettext as _
+
+class Tixo(activity.Activity):
+ PROYECTOS = "proyectos"
+
+ _NEW_TOOLBAR_SUPPORT = True
+ try:
+ from sugar.graphics.toolbarbox import ToolbarBox
+ from sugar.graphics.toolbarbox import ToolbarButton
+ from sugar.activity.widgets import StopButton
+ except:
+ _NEW_TOOLBAR_SUPPORT = False
+
+ def __init__(self, handle, create_jobject=True):
+ activity.Activity.__init__(self, handle, False)
+
+ def activityToolbar(toolbar):
+ ControlFactory.buttonFactory('open', toolbar, self.__abrir, tooltip=_('Abrir'))
+ ControlFactory.buttonFactory('barrido', toolbar, self.__barrer, tooltip=_('Barrido Automatico'))
+ ControlFactory.spinFactory(2.0, 0.5, 8.0, self.__cambioVelocidad, toolbar)
+
+
+ if self._NEW_TOOLBAR_SUPPORT: #toolbar nuevo
+ self.toolbar_box = sugar.graphics.toolbarbox.ToolbarBox()
+
+ activityToolbar(self.toolbar_box.toolbar)
+
+ stop_button = sugar.activity.widgets.StopButton(self)
+ stop_button.props.accelerator = '<Ctrl><Shift>Q'
+ self.toolbar_box.toolbar.insert(stop_button, -1)
+ stop_button.show()
+
+ self.set_toolbar_box(self.toolbar_box)
+ self.toolbar_box.show()
+
+ else: #old toolbar
+ toolbox = activity.ActivityToolbox(self)
+
+ self.activity_tb = toolbox.get_activity_toolbar()
+ self.activity_tb.share.props.visible = False
+ self.activity_tb.keep.props.visible = False
+
+ activityToolbar(self.activity_tb)
+
+ self.activity_tb.show_all()
+
+ self.set_toolbox(toolbox)
+ toolbox.show()
+
+ self.activity = TInterpreter()
+
+ self.set_canvas(self.activity.getContenedor())
+
+ def __abrir(self, widget):
+ abr = ChooseProject(self.PROYECTOS)
+ abr.addOnAbrirListener(self.__abierto)
+ abr.show()
+
+ def __barrer(self, widget):
+ self.activity.barrido()
+
+ def __abierto(self, proyName):
+ self.activity.load(os.path.join(self.PROYECTOS, proyName, "project.xml"),)
+
+ def __cambioVelocidad(self, widget):
+ self.activity.cambiarVelocidad(widget.get_value())
+ print widget.get_value()
+
+ def close(self, skip_save=False):
+ activity.Activity.close(self, True)
+
+
+ def write_file(self, file_path):
+ self.metadata["hola"] = "hola"
+ print "hola"
+
+
+ def read_file(self, file_path):
+ try:
+ onp = OpenNewProject(file_path, self.metadata['title'])
+ self.__abierto(onp.getProjectName())
+ except Exception, e:
+ print "Exception: ", e
+
+
diff --git a/activity/Activity-TicoTico.svg b/activity/Activity-TicoTico.svg
new file mode 100644
index 0000000..5800b75
--- /dev/null
+++ b/activity/Activity-TicoTico.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#000000">
+]>
+<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="256"
+ height="256"
+ id="svg2907"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="tico-interpreter-icon.svg">
+ <defs
+ id="defs2909">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2915" />
+ <inkscape:perspective
+ id="perspective2892"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="&fill_color;"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="116.85055"
+ inkscape:cy="215.44777"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1366"
+ inkscape:window-height="737"
+ inkscape:window-x="0"
+ inkscape:window-y="1"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2912">
+ <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"
+ transform="translate(-103.42857,-161.50504)">
+ <path
+ sodipodi:type="arc"
+ style="fill:&fill_color;;fill-opacity:1;stroke:none"
+ id="path4157-9"
+ sodipodi:cx="508.39285"
+ sodipodi:cy="328.61218"
+ sodipodi:rx="10.535714"
+ sodipodi:ry="19.107143"
+ d="m 518.92857,328.61218 a 10.535714,19.107143 0 1 1 -21.07143,0 10.535714,19.107143 0 1 1 21.07143,0 z"
+ transform="matrix(1.9661017,0,0,1.0654206,-819.01116,-93.24012)" />
+ <path
+ style="fill:&fill_color;"
+ d="m 141.98731,191.37394 c -0.81742,0.0409 -1.60969,0.29244 -2.40625,0.71875 -3.3902,1.81438 -5.8658,7.16637 -4.6875,10.1875 1.05374,2.70175 6.49285,8.02054 10.125,9.90625 1.375,0.71386 4.975,2.10923 8,3.09375 6.50691,2.11776 10.53102,2.03095 10.375,-0.21875 -0.0599,-0.86347 -3.33657,-5.94019 -7.28125,-11.28125 -6.61013,-8.95006 -10.58284,-12.5833 -14.125,-12.40625 z m 34,2.8125 c -1.798,0.10531 -3.59751,0.94415 -4.71875,2.65625 -2.22314,3.39467 -2.4343,16.16213 -0.3125,18.71875 1.1241,1.35445 1.60595,1.40732 2.625,0.34375 2.07435,-2.16497 8.4375,-14.80743 8.4375,-16.78125 0,-3.25088 -3.03458,-5.11301 -6.03125,-4.9375 z m 38.0625,96.84375 c -8.95222,-0.0784 -14.92675,4.45663 -16.5625,13.28125 -0.98775,5.32874 0.96755,10.05852 6.125,14.8125 3.69372,3.40475 4.7686,3.93354 5.96875,2.9375 0.83167,-0.69021 1.21004,-2.03813 0.875,-3.09375 -0.79781,-2.51368 1.09107,-2.38608 7.6875,0.5 7.78321,3.40532 10.41473,3.87811 11.84375,2.15625 0.97271,-1.17204 0.77923,-2.14046 -0.96875,-4.96875 -1.19933,-1.94053 -1.73748,-3.53125 -1.21875,-3.53125 0.51872,0 4.69886,1.755 9.3125,3.90625 4.61363,2.15125 10.27947,4.41755 12.59375,5.03125 2.31428,0.61369 4.47074,1.52883 4.78125,2.03125 0.76109,1.23147 6.39575,-2.06136 7.0625,-4.125 0.29228,-0.90463 -0.24523,-3.24279 -1.1875,-5.21875 -1.88794,-3.95906 -1.19063,-5.87812 1.25,-3.4375 0.91334,0.91334 1.75793,3.99213 2.03125,7.4375 0.55794,7.033 -1.09489,10.98885 -4.4375,10.625 -2.72655,-0.29679 -2.79747,1.14003 -0.1875,3.75 2.50243,2.50239 4.07368,2.51183 7.1875,0.0625 4.46057,-3.50869 6.30048,-15.52292 3.4375,-22.375 -2.91835,-6.98461 -7.13627,-8.51791 -11.65625,-4.1875 l -2.625,2.53125 -6.5,-4.28125 c -3.57433,-2.34758 -10.68152,-6.2328 -15.78125,-8.65625 -7.21945,-3.43077 -13.65992,-5.14044 -19.03125,-5.1875 z m 96.59375,13.09375 c -3.0181,0.0661 -5.9397,3.02256 -7.15625,8.5 l -0.6875,3 2.53125,-3 c 2.39715,-2.84205 2.62129,-2.91042 4.28125,-1.28125 1.15623,1.13479 1.88891,3.68577 2.125,7.5 0.42911,6.93266 -1.27101,10.88613 -4.53125,10.53125 -2.72655,-0.29679 -2.79747,1.14003 -0.1875,3.75 2.4262,2.4262 3.8302,2.50766 6.875,0.375 5.19956,-3.64192 6.81942,-16.02453 3.15625,-24.09375 -1.65441,-3.64432 -4.05884,-5.33268 -6.40625,-5.28125 z m -24.3125,0.125 c -0.73569,-0.0125 -1.40096,0.0608 -1.8125,0.21875 -1.90376,0.73054 -5.495,6.59673 -5.5,8.96875 -0.003,1.46625 0.45864,1.27823 2.4375,-1 2.30775,-2.65686 2.50204,-2.7222 4.15625,-1.09375 1.14959,1.13169 1.88956,3.69618 2.125,7.5 0.42911,6.93266 -1.27101,10.88613 -4.53125,10.53125 -2.72655,-0.29679 -2.79747,1.14003 -0.1875,3.75 2.52768,2.52767 4.05342,2.50109 7.3125,-0.0625 6.98984,-5.4982 5.69531,-26.63134 -1.75,-28.5 -0.70468,-0.17687 -1.51431,-0.30001 -2.25,-0.3125 z m -0.125,34.15625 c -3.03055,0.15935 -5.82658,3.1957 -6.75,8.78125 l -0.5625,3.4375 1.59375,-2.75 c 3.2943,-5.70708 7.53125,-1.91269 7.53125,6.75 0,6.26471 -1.81011,9.77478 -4.71875,9.21875 -2.70704,-0.51748 -2.94735,0.87134 -0.625,3.4375 1.83061,2.0228 4.51284,2.35661 7.28125,0.875 4.3946,-2.35191 6.61423,-16.39767 3.6875,-23.3125 -1.89701,-4.48196 -4.76348,-6.5781 -7.4375,-6.4375 z m 24,0 c -3.03055,0.15935 -5.82658,3.1957 -6.75,8.78125 l -0.5625,3.4375 1.59375,-2.75 c 3.2943,-5.70708 7.53125,-1.91269 7.53125,6.75 0,6.26471 -1.81011,9.77478 -4.71875,9.21875 -2.70704,-0.51748 -2.94735,0.87134 -0.625,3.4375 1.83061,2.0228 4.51284,2.35661 7.28125,0.875 4.3946,-2.35191 6.61423,-16.39767 3.6875,-23.3125 -1.89701,-4.48196 -4.76348,-6.5781 -7.4375,-6.4375 z m -47.8125,0.0312 c -0.61663,0.0372 -1.23819,0.19561 -1.90625,0.5 -2.57591,1.17366 -5.5133,6.53239 -5.4375,9.90625 0.0289,1.28699 0.46202,0.99878 1.5625,-1.03125 2.88008,-5.31275 7.375,-1.16313 7.375,6.8125 0,5.32909 -1.98516,9.00718 -4.78125,8.90625 -2.61901,-0.0945 -2.79994,1.24313 -0.53125,3.75 2.07891,2.29717 5.6736,2.35765 7.90625,0.125 7.78427,-7.78427 4.2383,-28.39573 -3.5625,-28.96875 -0.20175,-0.0148 -0.41946,-0.0124 -0.625,0 z"
+ id="path4073"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:&fill_color;"
+ d="m 234.202,214.60022 c -17.19552,0.0258 -36.72906,2.10435 -36.72906,4.6281 0,0.50588 2.29292,2.40582 5.09537,4.20461 14.38019,9.23015 22.29846,25.07755 20.68473,41.41088 -0.37435,3.78903 -0.26146,6.74885 0.27297,7.07827 0.5045,0.31097 2.65002,-0.063 4.79206,-0.81673 14.89927,-5.2428 43.93519,-5.7619 61.84191,-1.11921 18.94967,4.9131 34.34562,14.63173 41.97607,26.52837 3.11026,4.8492 3.45858,5.11109 4.94371,3.62988 1.29501,-1.29157 1.60747,-3.64166 1.60747,-12.43234 0,-13.91025 -2.241,-20.92851 -10.09973,-31.4892 -16.83711,-22.62598 -44.36226,-36.89154 -78.79612,-40.89665 -4.39995,-0.51177 -9.85753,-0.73457 -15.58938,-0.72598 z"
+ id="path2979-3"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#fc8a20"
+ d="m 233.6257,217.56591 c -13.79863,-0.0208 -28.70803,1.45973 -31.78125,3.15625 -0.99015,0.5466 -0.17385,1.52848 2.96875,3.6875 5.60811,3.85287 12.92442,11.72916 15.375,16.53125 3.637,7.12696 5.17016,14.20739 5,22.90625 -0.12859,6.5733 0.12054,8.30115 1.1875,8.15625 0.74331,-0.10095 5.79001,-1.15511 11.1875,-2.34375 11.75549,-2.58883 33.9737,-3.0788 45.625,-1 10.17619,1.81563 23.87301,6.38842 30.90625,10.34375 5.00376,2.814 13.7556,10.84723 18.875,17.0625 0.19523,0.0542 0.35163,0.19974 0.375,0.40625 0.70162,0.86858 1.31689,1.69921 1.84375,2.46875 3.10522,4.53557 4.35312,2.81613 4.78125,-6.59375 0.62736,-13.78929 -2.7158,-23.58092 -11.96875,-35.15625 -9.48033,-11.85977 -18.59127,-19.1089 -32.875,-26.15625 -18.51307,-9.13404 -38.15671,-13.43355 -61.5,-13.46875 z"
+ id="path2975-8"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:&fill_color;"
+ d="m 178.34445,226.69091 c -3.2819,0.0617 -6.38779,0.72773 -9.09375,2.09375 -9.11094,4.59939 -21.20556,13.25692 -27.5625,19.75 -12.05918,12.31744 -17.20974,23.62458 -17.9375,39.3125 -0.7756,16.71884 4.27481,29.089 17.625,43.0625 16.75983,17.54231 42.44006,29.2191 72.65625,33.0625 5.77072,0.73398 25.5,0.68896 25.5,-0.0625 0,-0.41708 -3.94269,-1.78851 -8.75,-3.03125 -27.46278,-7.09941 -47.23224,-25.13897 -47.5,-43.34375 -0.18108,-12.31151 4.99917,-21.61489 17.84375,-32.03125 9.08948,-7.37114 11.752,-12.77399 11.6875,-23.84375 -0.051,-8.75813 -1.8378,-14.25436 -6.8125,-21.03125 -6.45323,-8.79107 -17.81054,-14.12276 -27.65625,-13.9375 z m 2.96875,12.96875 c 5.95141,-0.002 9.48821,1.49045 13.34375,5.65625 3.97218,4.29183 5.15625,7.23617 5.15625,12.8125 0,7.68822 -4.7743,14.89219 -11.59375,17.46875 -4.36567,1.64947 -11.83833,1.28309 -15.6875,-0.78125 -1.90264,-1.02039 -4.80497,-3.53809 -6.46875,-5.59375 -2.75036,-3.39816 -3.03125,-4.41233 -3.03125,-11.0625 0,-6.66384 0.26453,-7.6552 3.0625,-11.15625 4.07987,-5.10508 8.7048,-7.34175 15.21875,-7.34375 z m 11,19.0625 c -2.74851,0.13827 -4.90837,3.89933 -2.75,6.5 0.66276,0.79858 2.00344,1.4375 2.96875,1.4375 3.97883,0 5.21233,-5.19459 1.75,-7.375 -0.64967,-0.40913 -1.33448,-0.59441 -1.96875,-0.5625 z m 139.3125,2.9375 c -2.55111,0 -7.37044,9.9745 -9.03125,18.6875 -0.77692,4.07592 -0.66824,4.29584 4.15625,9 2.71994,2.6521 6.3066,6.76924 7.96875,9.15625 2.25379,3.23669 3.31007,4.03368 4.15625,3.1875 1.6062,-1.6062 2.06545,-15.73172 0.71875,-22.21875 -1.28219,-6.17627 -6.49377,-17.8125 -7.96875,-17.8125 z m -115.3125,27.8125 -1.34375,0.90625 c 0.62514,-0.26161 1.26204,-0.49891 1.90625,-0.75 l -0.5625,-0.15625 z"
+ id="path2971-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000"
+ d="m 174.78195,226.25341 c -3.13158,0.0528 -4.92609,0.83064 -9.78125,3.40625 -20.45772,10.85261 -34.73643,26.09738 -40.03125,42.78125 -9.11155,28.71028 7.15634,58.42004 41.375,75.625 11.74671,5.90618 30.49861,11.27847 46.65625,13.375 4.3574,0.56539 18.5,0.78543 18.5,0.28125 0,-0.23597 -2.5875,-1.17838 -5.75,-2.09375 -8.49195,-2.45795 -19.58511,-7.83369 -26.78125,-12.96875 -17.59128,-12.55288 -23.49422,-30.70843 -15.25,-46.9375 2.45377,-4.83033 10.81435,-13.8095 16.53125,-17.75 7.21092,-4.97028 11.06278,-16.24141 9.28125,-27.1875 -2.54542,-15.63971 -15.28007,-27.31109 -31,-28.40625 -1.50651,-0.10495 -2.70614,-0.1426 -3.75,-0.125 z m 4.09375,10.59375 c 9.52418,0 17.12099,5.99995 19.6875,15.53125 2.02463,7.51889 -1.69909,16.30131 -8.8125,20.8125 -3.74434,2.37459 -5.71421,2.93775 -10.1875,2.90625 -6.70276,-0.0472 -10.51475,-1.62049 -14.75,-6.09375 -3.9758,-4.19926 -5.3125,-7.66866 -5.3125,-13.78125 0,-10.66685 8.70967,-19.375 19.375,-19.375 z m 11.4375,21.4375 c -2.17427,-0.0424 -3.33969,2.005 -2.40625,4.4375 0.3614,0.9418 1.49147,1.44202 2.84375,1.25 1.65273,-0.23469 2.25,-1.01102 2.25,-2.84375 0,-1.83273 -0.59727,-2.57781 -2.25,-2.8125 -0.15357,-0.0218 -0.29255,-0.0284 -0.4375,-0.0312 z m 138.8125,1.625 -2.3125,2.875 c -2.5541,3.19839 -6.3125,13.4316 -6.3125,17.1875 0,1.66098 2.04226,4.42905 6.4375,8.78125 3.53631,3.50168 6.71174,7.26985 7.0625,8.375 0.88425,2.78601 2.34692,2.50639 3.125,-0.59375 1.97456,-7.86724 -1.59512,-26.74577 -6.46875,-34.25 l -1.53125,-2.375 z"
+ id="path2969-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000"
+ d="m 190.3132,257.78466 c -2.17427,-0.0424 -3.33969,2.005 -2.40625,4.4375 0.3614,0.9418 1.49147,1.44202 2.84375,1.25 1.65273,-0.23469 2.25,-1.01102 2.25,-2.84375 0,-1.83273 -0.59727,-2.57781 -2.25,-2.8125 -0.15357,-0.0218 -0.29255,-0.0284 -0.4375,-0.0312 z m 139.0625,1.34375 -2.4375,3 c -2.71571,3.36528 -6.4375,13.50595 -6.4375,17.53125 0,1.88484 1.17624,3.59292 4.09375,5.9375 2.24622,1.80511 5.70424,5.5207 7.6875,8.28125 3.09611,4.30956 3.70859,4.77375 4.34375,3.15625 1.13949,-2.90182 0.99767,-13.69629 -0.25,-19.59375 -0.61661,-2.91457 -2.44095,-8.2375 -4.0625,-11.8125 l -2.9375,-6.5 z"
+ id="path2967-8"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000"
+ d="m 142.2507,191.90965 c -1.14166,0.0928 -2.23011,0.77953 -3.5625,2.03125 -3.36207,3.1585 -3.16049,8.65369 0.4375,12 4.18468,3.89196 7.63908,5.85192 13.96875,7.875 6.35406,2.03087 8.90881,2.34632 9.625,1.1875 0.66729,-1.0797 -11.31804,-17.19147 -15.25,-20.5 -2.21751,-1.86591 -3.75091,-2.71309 -5.21875,-2.59375 z m 34.6875,2.90625 c -1.36653,-0.003 -2.77934,0.51626 -3.8125,1.6875 -2.19434,2.48758 -3.04183,7.55521 -2.25,13.3125 0.3784,2.75128 1.19072,4.9375 1.84375,4.9375 1.31128,0 8.65725,-13.59615 8.65625,-16.03125 -0.001,-2.41239 -2.15995,-3.90078 -4.4375,-3.90625 z m 35.5,97.46875 c -5.6838,0.0559 -6.46316,0.47916 -9.03125,2.9375 -6.51339,6.23503 -6.28777,15.16452 0.53125,22.28125 4.22392,4.40833 7.1112,4.98397 5.90625,1.1875 -1.04268,-3.28518 0.33614,-4.03392 4.3125,-2.3125 15.40508,6.66906 18.71275,6.20414 12.84375,-1.84375 -1.09808,-1.50574 -1.70905,-3.04094 -1.34375,-3.40625 0.36531,-0.36531 4.61688,1.14813 9.4375,3.375 16.17932,7.47399 22.08724,8.85202 25.09375,5.84375 1.54765,-1.54857 1.50871,-1.93061 -0.5625,-5.53125 -1.97295,-3.42983 -2.04308,-3.99997 -0.6875,-5.125 1.26433,-1.0493 1.90097,-0.88027 3.71875,0.9375 1.84593,1.84593 2.21875,3.31503 2.21875,9.25 0,6.40799 -0.26524,7.26021 -2.6875,9.34375 -1.96698,1.69192 -2.35561,2.61314 -1.53125,3.4375 2.57563,2.57563 6.09061,0.24803 8.25,-5.40625 2.18856,-5.73067 1.52513,-15.58778 -1.3125,-19.40625 -2.69642,-3.62845 -6.64093,-3.9228 -8.78125,-0.65625 -0.9227,1.40821 -2.06165,2.5625 -2.53125,2.5625 -0.46959,0 -4.05094,-2.05933 -7.96875,-4.59375 -3.9178,-2.53441 -11.0194,-6.48031 -15.78125,-8.75 -8.07026,-3.84662 -9.25125,-4.1108 -17.34375,-4.125 -1.03272,-0.002 -1.93803,-0.008 -2.75,0 z m 73.71875,12.625 c -0.853,0.0472 -1.65972,0.33856 -2.34375,0.90625 -1.97491,1.63902 -1.82781,2.31499 0.78125,3.46875 2.96578,1.31151 4.7319,5.07229 4.75,10.09375 0.0199,5.53738 -1.73355,10.17848 -4.125,10.9375 -1.56895,0.49796 -1.71757,0.90306 -0.78125,2.03125 2.507,3.02075 6.23841,0.8088 8.46875,-5.03125 2.25068,-5.89331 1.63715,-15.47306 -1.21875,-19.3125 -1.56256,-2.10069 -3.65464,-3.1977 -5.53125,-3.09375 z m 24.34375,0 c -1.01073,0.0655 -2.09146,0.41158 -2.6875,0.90625 -1.8052,1.49818 -1.89838,4.0555 -0.125,3.375 2.26277,-0.86831 4.9438,3.2995 5.4375,8.4375 0.57755,6.01067 -1.19738,11.80641 -3.875,12.65625 -1.58731,0.50379 -1.7494,0.9336 -0.8125,2.0625 1.70029,2.04872 3.68704,1.75046 6.40625,-0.96875 6.27431,-6.27431 3.83941,-25.36825 -3.375,-26.4375 -0.30315,-0.0449 -0.63184,-0.0531 -0.96875,-0.0312 z m -23.90625,33.9375 c -0.64518,0.0502 -1.21166,0.48892 -2.15625,1.34375 -2.60008,2.35306 -2.63173,3.5625 -0.0937,3.5625 2.70076,0 5.03125,4.85738 5.03125,10.5 0,5.1693 -2.30319,10.5 -4.53125,10.5 -1.56441,0 -1.96627,1.18999 -0.78125,2.375 1.4708,1.47081 5.67695,0.0377 7.65625,-2.625 1.40735,-1.89329 2.17956,-4.72125 2.4375,-9 0.47171,-7.82458 -1.38161,-13.64662 -4.96875,-15.65625 -1.22468,-0.6861 -1.94857,-1.05018 -2.59375,-1 z m -23.65625,0.0312 c -1.00591,0.0136 -2.02672,0.49547 -3,1.46875 -2.14975,2.14975 -1.98172,3.40625 0.46875,3.40625 2.48135,0 4.96875,5.23543 4.96875,10.5 0,4.64915 -2.49885,10.5 -4.46875,10.5 -1.63044,0 -2.04934,1.16942 -0.84375,2.375 1.43579,1.4358 5.65337,0.0582 7.53125,-2.46875 2.83763,-3.81847 3.50106,-13.67558 1.3125,-19.40625 -1.60143,-4.19328 -3.75574,-6.40483 -5.96875,-6.375 z m 48.25,0.25 c -0.98726,-0.0258 -1.94029,0.33566 -2.8125,1.125 -2.58811,2.34221 -2.53351,3.29222 0.21875,3.6875 3.39153,0.48709 4.89619,4.42862 4.5,11.71875 -0.30111,5.54051 -0.70469,6.68245 -3.0625,8.5625 -1.49555,1.19251 -2.37467,2.50033 -1.96875,2.90625 1.49784,1.49783 5.64895,0.044 7.65625,-2.65625 2.76871,-3.72457 3.47458,-14.75063 1.28125,-20 -1.40183,-3.35507 -3.64053,-5.28704 -5.8125,-5.34375 z m -79.53125,23.6875 c -0.0258,0.15731 -0.0614,0.31245 -0.0937,0.46875 0.32684,-0.10113 0.42049,-0.22253 0.25,-0.375 -0.0292,-0.0261 -0.10799,-0.0621 -0.15625,-0.0937 z"
+ id="path4071"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644
index 0000000..a0c07d6
--- /dev/null
+++ b/activity/activity.info
@@ -0,0 +1,9 @@
+[Activity]
+name = TIXO
+service_name = org.teleton.ingenieria.TIXO
+exec = sugar-activity Tixo.Tixo
+icon = Activity-TicoTico
+activity_version = 1
+license = GPLv3+
+show_launcher = yes
+mime_types = application/octet-stream
diff --git a/activity/activity.info~ b/activity/activity.info~
new file mode 100644
index 0000000..a00caae
--- /dev/null
+++ b/activity/activity.info~
@@ -0,0 +1,9 @@
+[Activity]
+name = TIXO
+service_name = org.teleton.ingenieria.TIXO
+exec = sugar-activity Tixo.Tixo
+icon = Activity-TicoTico
+activity_version = 2
+license = GPLv3+
+show_launcher = yes
+mime_types = application/octet-stream
diff --git a/components/TInterpreterAcumulatedCell.py b/components/TInterpreterAcumulatedCell.py
new file mode 100644
index 0000000..6420278
--- /dev/null
+++ b/components/TInterpreterAcumulatedCell.py
@@ -0,0 +1,52 @@
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__="Rodrigo"
+__date__ ="$21-sep-2012 12:21:37$"
+
+from components.TInterpreterCommonCell import TInterpreterCommonCell
+import pygtk
+pygtk.require('2.0')
+import gtk
+
+class TInterpreterAcumulatedCell(TInterpreterCommonCell):
+
+ def __init__(self, original):
+ self._original = original
+ super(TInterpreterAcumulatedCell, self).__init__()
+ self.setText(original.getText())
+ self.setIcon(original.getIcon())
+ self.initialize()
+
+ def getOriginal(self):
+ return self._original
+
+ def getHeight(self):
+ return 100
+
+ def getWidth(self):
+ return 80
+
+ def getId(self):
+ return self._original.getId()
+
+
+if __name__ == "__main__":
+ print "Hello World"
diff --git a/components/TInterpreterCell.py b/components/TInterpreterCell.py
new file mode 100644
index 0000000..fdb1a4a
--- /dev/null
+++ b/components/TInterpreterCell.py
@@ -0,0 +1,124 @@
+import TInterpreterProject
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__="Rodrigo"
+__date__ ="$20-sep-2012 11:11:29$"
+
+import speak.espeak_cmd as espeak_cmd
+import speak.GoogleTTS as GoogleTTS
+
+from components.TInterpreterCommonCell import TInterpreterCommonCell
+from threads.TInterpreterPlaySound import TInterpreterPlaySound
+import pygtk
+pygtk.require('2.0')
+import gtk
+
+
+
+class TInterpreterCell(TInterpreterCommonCell):
+ projectName = ""
+
+
+ def __init__(self):
+ super(TInterpreterCell, self).__init__()
+ self.connect("clicked", self.onClick)
+# self.connect("enter", self.onMouseOver)
+# self.connect("enter", self.onMouseOut(widget))
+
+ self._FollowingBoard = None
+ self._Acumulable = False
+ self._AlternativeIcon = None
+ self._SoundFile = None
+ self._VoiceText = None
+
+
+#========SETUP FUNCTIONS========================================================
+
+ def setSendTextTarget(self, value):
+ self._SendTextTarget = value
+
+ def setSendText(self, value):
+ self._SendText = value
+
+ def setAlternativeIcon(self, value):
+ self._AlternativeIcon = value
+
+
+ def setSoundFile(self, value):
+ self._SoundFile = value
+
+ def setAlternativeSoundFile(self, value):
+ self._AlternativeSoundFile = value
+
+ def setVoiceText(self, value):
+ self._VoiceText = value
+
+
+#=======ADD LISTENERS===========================================================
+
+ def setFollowingBoard(self, value, action):
+ self._FollowingBoard = value
+ self._actionChangeBoard = action
+
+
+ def setAcumulable(self, value, action):
+ self._Acumulable = value
+ self._actionAcumulable = action
+
+
+
+
+
+
+#=======ON EVENTS==========================================================
+
+ def sonido(self):
+ t = TInterpreterPlaySound((self._SoundFile,))
+ t.start()
+
+ def sintetizar(self):
+ funciono = GoogleTTS.intentar(TInterpreterCell.projectName, self._VoiceText)
+ if not funciono:
+ espeak_cmd.hablar(self._VoiceText)
+
+ def onMouseOver(self, widget):
+ if self._AlternativeIcon:
+ self.deInitialize()
+ self.add(self.loadImage(img = self._AlternativeIcon))
+
+ def onMouseOut(self, widget):
+ self.initialize()
+
+ def onClick(self, widget):
+ if self._Acumulable:
+ self._actionAcumulable(self)
+
+ if self._SoundFile:
+ self.sonido()
+
+ if self._VoiceText:
+ self.sintetizar()
+
+ if self._FollowingBoard != None:
+ self._actionChangeBoard(self._FollowingBoard)
+
+if __name__ == "__main__":
+ print "Hello World"
diff --git a/components/TInterpreterCommonCell.py b/components/TInterpreterCommonCell.py
new file mode 100644
index 0000000..538f7b8
--- /dev/null
+++ b/components/TInterpreterCommonCell.py
@@ -0,0 +1,153 @@
+__author__="Rodrigo"
+__date__ ="$21-sep-2012 12:25:32$"
+
+from components.TInterpreterCommonControl import TInterpreterCommonControl
+import pygtk
+pygtk.require('2.0')
+import gtk
+import pango
+
+class TInterpreterCommonCell(gtk.Button, TInterpreterCommonControl):
+#=======SETUP==========================================================
+
+ def __init__(self):
+ super(TInterpreterCommonCell, self).__init__()
+ self._VerticalTextPosition = 0
+ self._Icon = None
+ self._Text = None
+ self.BackgroundColor = None;
+
+
+ def setIcon(self, value):
+ self._Icon = value
+
+ def getIcon(self):
+ return self._Icon
+
+ def setAlternativeBorderColor(self, value):
+ self._AlternativeBorderColor = value
+
+ def setAlternativeBorderWidth(self, value):
+ self._AlternativeBorderWidth = value
+
+ def setVerticalTextPosition(self, value):
+ self._VerticalTextPosition = value
+
+ def setId(self, value):
+ #self.set_label(value)
+ self._Id = value
+
+#========GET FUNCTIONS========================================================
+ def getId(self):
+ return self._Id
+
+ def getX(self):
+ return self._OriginalRect[0]
+
+ def getY(self):
+ return self._OriginalRect[1]
+
+ def getWidth(self):
+ return self._OriginalRect[2]
+
+ def getHeight(self):
+ return self._OriginalRect[3]
+
+
+#=======COLORIZE================================================================
+
+ def resaltar(self):
+ color = self.get_colormap().alloc_color("#ff0000")
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_ACTIVE, color)
+ self.modify_base(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+ self.grab_focus()
+
+ def desResaltar(self):
+ color = self.get_colormap().alloc_color("#" + self.BackgroundColor.upper()[2:])
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+
+#=======Events Handlers=========================================================
+ def onMouseOver(self, widget):
+ pass
+
+ def onMouseOut(self, widget):
+ pass
+
+ def onClick(self, widget):
+ pass
+
+
+
+#=======INITIALIZATION==========================================================
+ def initialize(self):
+ #bacground color
+ #make a gdk.color for red
+
+ if self.BackgroundColor:
+ color = self.get_colormap().alloc_color("#" + self.BackgroundColor.upper()[2:])
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+
+
+
+ if self._Text != None and self._Icon != None:
+ vbox = gtk.VBox(False, 0)
+ lbl = gtk.Label(self._Text)
+ if self._VerticalTextPosition == 3: #bottom
+ vbox.pack_start(self.loadImage(True))
+ vbox.pack_end(lbl)
+ else: #top or center = top
+ vbox.pack_start(lbl, False, False, 0)
+ vbox.pack_end(self.loadImage(True), False, False, 0)
+
+ self.add(vbox)
+ text = lbl
+
+ elif self._Text!=None:
+ self.set_label(self._Text)
+ text = self
+ elif self._Icon != None:
+ self.add(self.loadImage())
+ text = self
+
+ if self._ForegroundColor:
+ color = self.get_colormap().alloc_color("#" + self._ForegroundColor.upper()[2:])
+ text.modify_fg(gtk.STATE_NORMAL, color)
+ text.modify_fg(gtk.STATE_PRELIGHT, color)
+ else:
+ color = self.get_colormap().alloc_color("black")
+ text.modify_fg(gtk.STATE_NORMAL, color)
+ text.modify_fg(gtk.STATE_PRELIGHT, color)
+
+ if self._FontSize:
+ text.modify_font(pango.FontDescription("sans " + str(self._FontSize)))
+
+ def deInitialize(self):
+ children = self.get_children()
+ for child in children:
+ self.remove(child)
+
+ def loadImage(self, texto = False, img = None):
+ image = gtk.Image()
+ if img==None:
+ img = self._Icon
+ pixbuf = gtk.gdk.pixbuf_new_from_file(img)
+
+ maxW = float(self.getWidth())
+ maxH = float(self.getHeight() if not texto else self.getHeight() - self._FontSize * 4)
+
+ im = pixbuf.scale_simple(int(maxW - 10), int(maxH - 10), gtk.gdk.INTERP_BILINEAR)
+ image.set_from_pixbuf(im)
+ return image
+
+if __name__ == "__main__":
+ print "Hello World"
diff --git a/components/TInterpreterCommonCell.py~ b/components/TInterpreterCommonCell.py~
new file mode 100644
index 0000000..78809ef
--- /dev/null
+++ b/components/TInterpreterCommonCell.py~
@@ -0,0 +1,149 @@
+__author__="Rodrigo"
+__date__ ="$21-sep-2012 12:25:32$"
+
+from components.TInterpreterCommonControl import TInterpreterCommonControl
+import pygtk
+pygtk.require('2.0')
+import gtk
+import pango
+
+class TInterpreterCommonCell(gtk.Button, TInterpreterCommonControl):
+#=======SETUP==========================================================
+
+ def __init__(self):
+ super(TInterpreterCommonCell, self).__init__()
+ self._VerticalTextPosition = 0
+ self._Icon = None
+ self._Text = None
+ self.BackgroundColor = None;
+
+
+ def setIcon(self, value):
+ self._Icon = value
+
+ def getIcon(self):
+ return self._Icon
+
+ def setAlternativeBorderColor(self, value):
+ self._AlternativeBorderColor = value
+
+ def setAlternativeBorderWidth(self, value):
+ self._AlternativeBorderWidth = value
+
+ def setVerticalTextPosition(self, value):
+ self._VerticalTextPosition = value
+
+ def setId(self, value):
+ #self.set_label(value)
+ self._Id = value
+
+#========GET FUNCTIONS========================================================
+ def getId(self):
+ return self._Id
+
+ def getX(self):
+ return self._OriginalRect[0]
+
+ def getY(self):
+ return self._OriginalRect[1]
+
+ def getWidth(self):
+ return self._OriginalRect[2]
+
+ def getHeight(self):
+ return self._OriginalRect[3]
+
+
+#=======COLORIZE================================================================
+
+ def resaltar(self):
+ color = self.get_colormap().alloc_color("#ff0000")
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+ def desResaltar(self):
+ color = self.get_colormap().alloc_color("#" + self.BackgroundColor.upper()[2:])
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+
+#=======Events Handlers=========================================================
+ def onMouseOver(self, widget):
+ pass
+
+ def onMouseOut(self, widget):
+ pass
+
+ def onClick(self, widget):
+ pass
+
+
+
+#=======INITIALIZATION==========================================================
+ def initialize(self):
+ #bacground color
+ #make a gdk.color for red
+
+ if self.BackgroundColor:
+ color = self.get_colormap().alloc_color("#" + self.BackgroundColor.upper()[2:])
+
+ self.modify_bg(gtk.STATE_NORMAL, color)
+ self.modify_bg(gtk.STATE_PRELIGHT, color)
+
+
+
+
+ if self._Text != None and self._Icon != None:
+ vbox = gtk.VBox(False, 0)
+ lbl = gtk.Label(self._Text)
+ if self._VerticalTextPosition == 3: #bottom
+ vbox.pack_start(self.loadImage(True))
+ vbox.pack_end(lbl)
+ else: #top or center = top
+ vbox.pack_start(lbl, False, False, 0)
+ vbox.pack_end(self.loadImage(True), False, False, 0)
+
+ self.add(vbox)
+ text = lbl
+
+ elif self._Text!=None:
+ self.set_label(self._Text)
+ text = self
+ elif self._Icon != None:
+ self.add(self.loadImage())
+ text = self
+
+ if self._ForegroundColor:
+ color = self.get_colormap().alloc_color("#" + self._ForegroundColor.upper()[2:])
+ text.modify_fg(gtk.STATE_NORMAL, color)
+ text.modify_fg(gtk.STATE_PRELIGHT, color)
+ else:
+ color = self.get_colormap().alloc_color("black")
+ text.modify_fg(gtk.STATE_NORMAL, color)
+ text.modify_fg(gtk.STATE_PRELIGHT, color)
+
+ if self._FontSize:
+ text.modify_font(pango.FontDescription("sans " + str(self._FontSize)))
+
+ def deInitialize(self):
+ children = self.get_children()
+ for child in children:
+ self.remove(child)
+
+ def loadImage(self, texto = False, img = None):
+ image = gtk.Image()
+ if img==None:
+ img = self._Icon
+ pixbuf = gtk.gdk.pixbuf_new_from_file(img)
+
+ maxW = float(self.getWidth())
+ maxH = float(self.getHeight() if not texto else self.getHeight() - self._FontSize * 4)
+
+ im = pixbuf.scale_simple(int(maxW - 10), int(maxH - 10), gtk.gdk.INTERP_BILINEAR)
+ image.set_from_pixbuf(im)
+ return image
+
+if __name__ == "__main__":
+ print "Hello World"
diff --git a/components/TInterpreterCommonControl.py b/components/TInterpreterCommonControl.py
new file mode 100644
index 0000000..7e2e57e
--- /dev/null
+++ b/components/TInterpreterCommonControl.py
@@ -0,0 +1,47 @@
+__author__="Rodrigo"
+__date__ ="$25-sep-2012 14:47:44$"
+
+class TInterpreterCommonControl:
+ def __init__(self):
+ self._ForegroundColor = None
+ self.BackgroundColor = None
+ self._FontFamily = None
+ self._FontSize = None
+ pass
+
+ def setBackgroundColor(self, value):
+ self.BackgroundColor = value
+
+
+ def setOriginalRect(self, value):
+ self._OriginalRect = value
+
+ def setFontFamily(self, value):
+ self._FontFamily = value
+
+ def setFontSize(self, value):
+ self._FontSize = value
+
+ def setFontBold(self, value):
+ self._FontBold = value
+
+ def setFontItalic(self, value):
+ self._FontItalic = value
+
+ def setForegroundColor(self, value):
+ self._ForegroundColor=value
+
+ def setText(self, value):
+ self._Text = value
+
+ def setBorderWidth(self, value):
+ self._BorderWidth = value
+
+ def setBorderColor(self, value):
+ self._BorderColor = value
+
+ def getText(self):
+ return self._Text
+
+if __name__ == "__main__":
+ print "Hello World";
diff --git a/components/TInterpreterConstants.py b/components/TInterpreterConstants.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/components/TInterpreterConstants.py
diff --git a/components/TInterpreterControlCell.py b/components/TInterpreterControlCell.py
new file mode 100644
index 0000000..4067257
--- /dev/null
+++ b/components/TInterpreterControlCell.py
@@ -0,0 +1,60 @@
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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 components.TInterpreterCommonCell import TInterpreterCommonCell
+__author__="Rodrigo"
+__date__ ="$25-sep-2012 14:28:49$"
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+
+
+class TInterpreterControlCell(TInterpreterCommonCell):
+ EXIT_ACTION_CODE = 1
+ UNDO_ACTION_CODE = 2
+ UNDO_ALL_ACTION_CODE = 3
+ READ_ACTION_CODE = 4
+ RETURN_ACTION_CODE = 5
+ STOP_ACTION_CODE = 6
+ HOME_ACTION_CODE = 7
+ COPY_ACTION_CODE = 8
+
+ def __init__(self):
+ super(TInterpreterControlCell, self).__init__()
+ self.connect("clicked", self.onClick)
+
+ def setActionCode(self, value, action = None):
+ self._ActionCode = value
+
+ if action!= None:
+ self._action = action
+
+
+
+#=======ON EVENTS==========================================================
+
+ def onClick(self, widget):
+ if self._ActionCode == self.EXIT_ACTION_CODE:
+ gtk.main_quit()
+ else:
+ self._action()
+
+
diff --git a/components/TInterpreterTextArea.py b/components/TInterpreterTextArea.py
new file mode 100644
index 0000000..6b81c28
--- /dev/null
+++ b/components/TInterpreterTextArea.py
@@ -0,0 +1,10 @@
+from components.TInterpreterCommonControl import TInterpreterCommonControl
+import pygtk
+pygtk.require('2.0')
+import gtk
+__author__="Rodrigo"
+__date__ ="$26-sep-2012 10:50:05$"
+
+class TInterpreterTextArea(TInterpreterCommonControl, gtk.Entry):
+ def __init__(self):
+ super(TInterpreterTextArea, self).__init__() \ No newline at end of file
diff --git a/components/__init__.py b/components/__init__.py
new file mode 100644
index 0000000..a5fb98d
--- /dev/null
+++ b/components/__init__.py
@@ -0,0 +1,2 @@
+__author__="Rodrigo"
+__date__ ="$20-sep-2012 11:27:27$" \ No newline at end of file
diff --git a/components/rules/__init__.py b/components/rules/__init__.py
new file mode 100644
index 0000000..a5fb98d
--- /dev/null
+++ b/components/rules/__init__.py
@@ -0,0 +1,2 @@
+__author__="Rodrigo"
+__date__ ="$20-sep-2012 11:27:27$" \ No newline at end of file
diff --git a/dist/TIXO-1.xo b/dist/TIXO-1.xo
new file mode 100644
index 0000000..7f18892
--- /dev/null
+++ b/dist/TIXO-1.xo
Binary files differ
diff --git a/dist/TIXO-2.xo b/dist/TIXO-2.xo
new file mode 100644
index 0000000..ae0f27d
--- /dev/null
+++ b/dist/TIXO-2.xo
Binary files differ
diff --git a/generar.sh b/generar.sh
new file mode 100644
index 0000000..47a95ac
--- /dev/null
+++ b/generar.sh
@@ -0,0 +1,29 @@
+if ! 'rm -r */*.pyc'; then
+ echo 'No hay pyc para borrar'
+else
+ echo 'Se borraron los pyc'
+fi 2>/dev/null
+
+if ! 'rm -r ./proyectos/*'; then
+ echo 'No hay proyectos para borrar'
+else
+ echo 'Se borraron los proyectos'
+fi 2>/dev/null
+
+if ! './setup.py' 'genpot'; then
+ echo 'No se pudo generar pot'
+else
+ echo 'Se genero pot'
+fi 2>/dev/null
+
+if ! './setup.py' 'fix_manifest'; then
+ echo 'No se pudo arreglar el manifest'
+else
+ echo 'Se arreglo el manifest'
+fi 2>/dev/null
+
+if ! './setup.py' 'dist_xo'; then
+ echo 'Hubo un error al generar el .XO'
+else
+ echo 'Se genero el .XO en la carpeta ./dist/'
+fi 2>/dev/null
diff --git a/icons/barrido.svg b/icons/barrido.svg
new file mode 100644
index 0000000..78afad8
--- /dev/null
+++ b/icons/barrido.svg
@@ -0,0 +1,210 @@
+<?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="55"
+ height="55"
+ id="svg4502"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.0 r9654"
+ version="1.0"
+ sodipodi:docname="Icon_template.inkscape.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4504" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7.919596"
+ inkscape:cx="31.466786"
+ inkscape:cy="34.248989"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ width="55px"
+ height="55px"
+ inkscape:window-width="1366"
+ inkscape:window-height="737"
+ inkscape:window-x="0"
+ inkscape:window-y="1"
+ showgrid="false"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0px"
+ originy="0px"
+ spacingx="15px"
+ spacingy="15px"
+ color="#0000ff"
+ empcolor="#0000ff"
+ opacity="0.2"
+ empopacity="0.4"
+ empspacing="5" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4507">
+ <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="_guide"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <g
+ id="_x5F_guide">
+ <rect
+ x="0"
+ width="55"
+ height="55"
+ id="rect2336"
+ y="0"
+ style="fill:#282828;fill-opacity:1" />
+ <rect
+ x="5"
+ y="5"
+ width="45"
+ height="45"
+ id="rect2338"
+ style="fill:none;stroke:#000000;stroke-opacity:1" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot4579"><flowRegion
+ id="flowRegion4581"><rect
+ id="rect4583"
+ width="47.72971"
+ height="44.194176"
+ x="62.124382"
+ y="-15.710678" /></flowRegion><flowPara
+ id="flowPara4585">r2r2r23r23r23r23r23r</flowPara></flowRoot> </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="_swatches"
+ style="display:inline">
+ <g
+ id="_x5F_swatches">
+ <rect
+ x="55"
+ width="55"
+ height="55"
+ id="rect2318"
+ y="0"
+ style="fill:#000000;fill-opacity:1" />
+ <rect
+ x="84.695"
+ y="16.556999"
+ width="8.783"
+ height="8.7799997"
+ id="rect2320"
+ style="fill:#666666;stroke:#ffffff;stroke-width:3.5" />
+ <rect
+ x="84.695"
+ y="29.729"
+ width="8.783"
+ height="8.7819996"
+ id="rect2322"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.5" />
+ <rect
+ x="97.867996"
+ y="16.556"
+ width="8.7819996"
+ height="8.7810001"
+ id="rect2324"
+ style="fill:#666666" />
+ <rect
+ x="71.521004"
+ y="16.556999"
+ width="8.783"
+ height="8.7799997"
+ id="rect2326"
+ style="fill:#666666;stroke:#666666;stroke-width:3.5" />
+ <rect
+ x="84.695"
+ y="3.3840001"
+ width="8.783"
+ height="8.7799997"
+ id="rect2328"
+ style="fill:none;stroke:#ffffff;stroke-width:3.5" />
+ <rect
+ x="58.349998"
+ y="29.729"
+ width="8.783"
+ height="8.7819996"
+ id="rect2330"
+ style="fill:#ffffff" />
+ <rect
+ x="71.521004"
+ y="42.900002"
+ width="8.783"
+ height="8.7810001"
+ id="rect2332"
+ style="fill:none;stroke:#666666;stroke-width:3.5" />
+ <rect
+ x="71.521004"
+ y="29.729"
+ width="8.783"
+ height="8.7819996"
+ id="rect2334"
+ style="fill:#ffffff;stroke:#666666;stroke-width:3.5" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="icon"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#666666;stroke-width:2.43559003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path2165"
+ sodipodi:cx="29.546961"
+ sodipodi:cy="27.725882"
+ sodipodi:rx="15.657364"
+ sodipodi:ry="15.657364"
+ d="M 45.204325 27.725882 A 15.657364 15.657364 0 1 1 13.889597,27.725882 A 15.657364 15.657364 0 1 1 45.204325 27.725882 z"
+ transform="matrix(1.4370235,0,0,1.4370235,-14.959677,-12.342744)" />
+ <rect
+ style="fill:#666666;fill-opacity:1;stroke:none"
+ id="rect3006"
+ width="10.354064"
+ height="18.687822"
+ x="13.384521"
+ y="17.644661" />
+ <rect
+ style="fill:#666666;fill-opacity:1;stroke:none;display:inline"
+ id="rect3006-2"
+ width="10.354064"
+ height="18.687822"
+ x="31.188459"
+ y="17.518394" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 16.28871,29.387685 13.384521,-0.505077 -1.010152,4.04061 5.177031,-5.808377 -7.576144,-4.545686 2.525382,4.04061 -10.985409,0.378807 z"
+ id="path3028"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/icons/open.svg b/icons/open.svg
new file mode 100644
index 0000000..64ce481
--- /dev/null
+++ b/icons/open.svg
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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"
+ enable-background="new 0 0 55 55"
+ height="55px"
+ version="1.1"
+ viewBox="0 0 55 55"
+ width="55px"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="document-open.svg"><metadata
+ id="metadata15"><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="defs13" /><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="namedview11"
+ showgrid="false"
+ inkscape:zoom="5.2545455"
+ inkscape:cx="27.5"
+ inkscape:cy="24.969954"
+ inkscape:window-x="0"
+ inkscape:window-y="1"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><g
+ display="block"
+ id="activity-start">
+ <g
+ id="g5">
+ <polygon
+ fill="#FFFFFF"
+ points="22.277,19.683 36.071,27.501 22.277,35.317 "
+ id="polygon7" />
+ <path
+ d="M27.5,5C15.073,5,5,15.074,5,27.5S15.073,50,27.5,50S50,39.926,50,27.5S39.927,5,27.5,5z M41,38.333H14 V16.667h27V38.333z"
+ fill="#FFFFFF"
+ id="path9" />
+ </g>
+</g></svg> \ No newline at end of file
diff --git a/po/TIXO.pot b/po/TIXO.pot
new file mode 100644
index 0000000..57df67e
--- /dev/null
+++ b/po/TIXO.pot
@@ -0,0 +1,163 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-17 12:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2
+msgid "TIXO"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/Tixo.py:54
+msgid "Abrir"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/Tixo.py:55
+msgid "Barrido Automatico"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:35
+msgid "Brazil"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:36
+msgid "Swedish"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:37
+msgid "Icelandic"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:38
+msgid "Romanian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:39
+msgid "Swahili"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:40
+msgid "Hindi"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:41
+msgid "Dutch"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:42
+msgid "Latin"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:43
+msgid "Hungarian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:44
+msgid "Macedonian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:45
+msgid "Welsh"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:46
+msgid "French"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:47
+msgid "Norwegian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:48
+msgid "Russian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:49
+msgid "Afrikaans"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:50
+msgid "Finnish"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:51
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:154
+msgid "Default"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:52
+msgid "Cantonese"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:53
+msgid "Scottish"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:54
+msgid "Greek"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:55
+msgid "Vietnam"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:56
+msgid "English"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:57
+msgid "Lancashire"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:58
+msgid "Italian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:59
+msgid "Portugal"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:60
+msgid "German"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:61
+msgid "Whisper"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:62
+msgid "Croatian"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:63
+msgid "Czech"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:64
+msgid "Slovak"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:65
+msgid "Spanish"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:66
+msgid "Polish"
+msgstr ""
+
+#: /home/rodripf/Programacion/TicoPython/src/speak/voice.py:67
+msgid "Esperanto"
+msgstr ""
diff --git a/proyectos/.empty b/proyectos/.empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/proyectos/.empty
diff --git a/proyectos/Muestra/image/2245.png b/proyectos/Muestra/image/2245.png
new file mode 100644
index 0000000..ca8be16
--- /dev/null
+++ b/proyectos/Muestra/image/2245.png
Binary files differ
diff --git a/proyectos/Muestra/image/2300.png b/proyectos/Muestra/image/2300.png
new file mode 100644
index 0000000..de87812
--- /dev/null
+++ b/proyectos/Muestra/image/2300.png
Binary files differ
diff --git a/proyectos/Muestra/image/2304_1.png b/proyectos/Muestra/image/2304_1.png
new file mode 100644
index 0000000..483589f
--- /dev/null
+++ b/proyectos/Muestra/image/2304_1.png
Binary files differ
diff --git a/proyectos/Muestra/image/2314.png b/proyectos/Muestra/image/2314.png
new file mode 100644
index 0000000..b302727
--- /dev/null
+++ b/proyectos/Muestra/image/2314.png
Binary files differ
diff --git a/proyectos/Muestra/image/2349.png b/proyectos/Muestra/image/2349.png
new file mode 100644
index 0000000..0315d67
--- /dev/null
+++ b/proyectos/Muestra/image/2349.png
Binary files differ
diff --git a/proyectos/Muestra/image/2367.png b/proyectos/Muestra/image/2367.png
new file mode 100644
index 0000000..ecd0e0d
--- /dev/null
+++ b/proyectos/Muestra/image/2367.png
Binary files differ
diff --git a/proyectos/Muestra/image/2370.png b/proyectos/Muestra/image/2370.png
new file mode 100644
index 0000000..06ac16f
--- /dev/null
+++ b/proyectos/Muestra/image/2370.png
Binary files differ
diff --git a/proyectos/Muestra/image/2374.png b/proyectos/Muestra/image/2374.png
new file mode 100644
index 0000000..1a2ed1b
--- /dev/null
+++ b/proyectos/Muestra/image/2374.png
Binary files differ
diff --git a/proyectos/Muestra/image/2401.png b/proyectos/Muestra/image/2401.png
new file mode 100644
index 0000000..519b232
--- /dev/null
+++ b/proyectos/Muestra/image/2401.png
Binary files differ
diff --git a/proyectos/Muestra/image/2430.png b/proyectos/Muestra/image/2430.png
new file mode 100644
index 0000000..dd722ef
--- /dev/null
+++ b/proyectos/Muestra/image/2430.png
Binary files differ
diff --git a/proyectos/Muestra/image/24735.png b/proyectos/Muestra/image/24735.png
new file mode 100644
index 0000000..50c3ff9
--- /dev/null
+++ b/proyectos/Muestra/image/24735.png
Binary files differ
diff --git a/proyectos/Muestra/image/24795.png b/proyectos/Muestra/image/24795.png
new file mode 100644
index 0000000..0646d6d
--- /dev/null
+++ b/proyectos/Muestra/image/24795.png
Binary files differ
diff --git a/proyectos/Muestra/image/2487.png b/proyectos/Muestra/image/2487.png
new file mode 100644
index 0000000..67c6a4f
--- /dev/null
+++ b/proyectos/Muestra/image/2487.png
Binary files differ
diff --git a/proyectos/Muestra/image/25191.png b/proyectos/Muestra/image/25191.png
new file mode 100644
index 0000000..f700492
--- /dev/null
+++ b/proyectos/Muestra/image/25191.png
Binary files differ
diff --git a/proyectos/Muestra/image/2586.png b/proyectos/Muestra/image/2586.png
new file mode 100644
index 0000000..0204c17
--- /dev/null
+++ b/proyectos/Muestra/image/2586.png
Binary files differ
diff --git a/proyectos/Muestra/image/2587.png b/proyectos/Muestra/image/2587.png
new file mode 100644
index 0000000..d2e52d3
--- /dev/null
+++ b/proyectos/Muestra/image/2587.png
Binary files differ
diff --git a/proyectos/Muestra/image/2606.png b/proyectos/Muestra/image/2606.png
new file mode 100644
index 0000000..963b8ad
--- /dev/null
+++ b/proyectos/Muestra/image/2606.png
Binary files differ
diff --git a/proyectos/Muestra/image/2684.png b/proyectos/Muestra/image/2684.png
new file mode 100644
index 0000000..f7f2665
--- /dev/null
+++ b/proyectos/Muestra/image/2684.png
Binary files differ
diff --git a/proyectos/Muestra/image/3250.png b/proyectos/Muestra/image/3250.png
new file mode 100644
index 0000000..e7c9562
--- /dev/null
+++ b/proyectos/Muestra/image/3250.png
Binary files differ
diff --git a/proyectos/Muestra/image/4962.png b/proyectos/Muestra/image/4962.png
new file mode 100644
index 0000000..58126c1
--- /dev/null
+++ b/proyectos/Muestra/image/4962.png
Binary files differ
diff --git a/proyectos/Muestra/image/5441.png b/proyectos/Muestra/image/5441.png
new file mode 100644
index 0000000..46930f5
--- /dev/null
+++ b/proyectos/Muestra/image/5441.png
Binary files differ
diff --git a/proyectos/Muestra/image/5957_1.png b/proyectos/Muestra/image/5957_1.png
new file mode 100644
index 0000000..e012fac
--- /dev/null
+++ b/proyectos/Muestra/image/5957_1.png
Binary files differ
diff --git a/proyectos/Muestra/image/6522.png b/proyectos/Muestra/image/6522.png
new file mode 100644
index 0000000..c5991f1
--- /dev/null
+++ b/proyectos/Muestra/image/6522.png
Binary files differ
diff --git a/proyectos/Muestra/image/6537.png b/proyectos/Muestra/image/6537.png
new file mode 100644
index 0000000..70a0509
--- /dev/null
+++ b/proyectos/Muestra/image/6537.png
Binary files differ
diff --git a/proyectos/Muestra/image/6625_1.png b/proyectos/Muestra/image/6625_1.png
new file mode 100644
index 0000000..bbef981
--- /dev/null
+++ b/proyectos/Muestra/image/6625_1.png
Binary files differ
diff --git a/proyectos/Muestra/image/6632_1.png b/proyectos/Muestra/image/6632_1.png
new file mode 100644
index 0000000..f20147b
--- /dev/null
+++ b/proyectos/Muestra/image/6632_1.png
Binary files differ
diff --git a/proyectos/Muestra/image/7061.png b/proyectos/Muestra/image/7061.png
new file mode 100644
index 0000000..3e7400d
--- /dev/null
+++ b/proyectos/Muestra/image/7061.png
Binary files differ
diff --git a/proyectos/Muestra/image/8662.png b/proyectos/Muestra/image/8662.png
new file mode 100644
index 0000000..47920c6
--- /dev/null
+++ b/proyectos/Muestra/image/8662.png
Binary files differ
diff --git a/proyectos/Muestra/image/controller-home.png b/proyectos/Muestra/image/controller-home.png
new file mode 100644
index 0000000..5c12451
--- /dev/null
+++ b/proyectos/Muestra/image/controller-home.png
Binary files differ
diff --git a/proyectos/Muestra/image/controller-home_1.png b/proyectos/Muestra/image/controller-home_1.png
new file mode 100644
index 0000000..5c12451
--- /dev/null
+++ b/proyectos/Muestra/image/controller-home_1.png
Binary files differ
diff --git a/proyectos/Muestra/image/teleton.png b/proyectos/Muestra/image/teleton.png
new file mode 100644
index 0000000..f2fc1a2
--- /dev/null
+++ b/proyectos/Muestra/image/teleton.png
Binary files differ
diff --git a/proyectos/Muestra/project.xml b/proyectos/Muestra/project.xml
new file mode 100644
index 0000000..ae26f0b
--- /dev/null
+++ b/proyectos/Muestra/project.xml
@@ -0,0 +1,888 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project name="Muestra">
+ <voice defaultVoiceName=""/>
+ <initial_board>board_0</initial_board>
+ <board name="board_0">
+ <model>
+ <attributes>
+ <attribute key="orderedCellList" type="list">
+ <element>cell_0</element>
+ <element>cell_1</element>
+ <element>cell_16</element>
+ <element>cell_17</element>
+ <element>cell_2</element>
+ <element>cell_3</element>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ff3465a4</attribute>
+ <attribute key="unorderedCellList" type="list">
+ <element>cell_19</element>
+ </attribute>
+ <attribute key="imageResizeStyle" type="integer">0</attribute>
+ <attribute key="size" type="size">
+ <width>1024.0</width>
+ <height>600.0</height>
+ </attribute>
+ </attributes>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_0</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\6522.png</attribute>
+ <attribute key="text" type="string">HOLA</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Hola</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>11.0</x>
+ <y>28.0</y>
+ <width>190.0</width>
+ <height>192.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_1</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\6625_1.png</attribute>
+ <attribute key="text" type="string">¿CÓMO ESTÁS?</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">¿Cómo estás?</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>271.0</x>
+ <y>28.0</y>
+ <width>190.0</width>
+ <height>192.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="followingBoard" type="string">board_1</attribute>
+ <attribute key="id" type="string">cell_2</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2684.png</attribute>
+ <attribute key="text" type="string">ESTOY...</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Yo estoy</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>519.0</x>
+ <y>305.0</y>
+ <width>202.0</width>
+ <height>185.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ff73d216</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="followingBoard" type="string">board_2</attribute>
+ <attribute key="id" type="string">cell_3</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\5441.png</attribute>
+ <attribute key="text" type="string">QUIERO...</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Quiero</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>779.0</x>
+ <y>305.0</y>
+ <width>202.0</width>
+ <height>186.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">fffcaf3e</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_16</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\6632_1.png</attribute>
+ <attribute key="text" type="string">ME LLAMO...</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Me llamo ántony</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>531.0</x>
+ <y>28.0</y>
+ <width>190.0</width>
+ <height>192.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_17</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\7061.png</attribute>
+ <attribute key="text" type="string">¿CÓMO TE LLAMAS?</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">¿Cómo te llamas?</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>791.0</x>
+ <y>28.0</y>
+ <width>190.0</width>
+ <height>192.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_19</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\teleton.png</attribute>
+ <attribute key="text" type="string"/>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Teletón Uruguay</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>86.0</x>
+ <y>304.0</y>
+ <width>237.0</width>
+ <height>237.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ </model>
+ </board>
+ <board name="board_1">
+ <model>
+ <attributes>
+ <attribute key="orderedCellList" type="list">
+ <element>cell_4</element>
+ <element>cell_5</element>
+ <element>cell_12</element>
+ <element>cell_11</element>
+ <element>cell_6</element>
+ <element>cell_7</element>
+ <element>cell_13</element>
+ <element>cell_14</element>
+ <element>cell_8</element>
+ <element>cell_9</element>
+ <element>cell_10</element>
+ <element>controller_cell_0</element>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ff73d216</attribute>
+ <attribute key="unorderedCellList" type="list"/>
+ <attribute key="imageResizeStyle" type="integer">0</attribute>
+ <attribute key="size" type="size">
+ <width>1024.0</width>
+ <height>600.0</height>
+ </attribute>
+ </attributes>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_4</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\3250.png</attribute>
+ <attribute key="text" type="string">FELIZ</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">feliz</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>19.0</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_5</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2606.png</attribute>
+ <attribute key="text" type="string">TRISTE</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">triste</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>291.3333333333333</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_6</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\24735.png</attribute>
+ <attribute key="text" type="string">DIVERTIDO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Divertido</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>19.0</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_7</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2245.png</attribute>
+ <attribute key="text" type="string">ABURRIDO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">Aburrido</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>291.3333333333333</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_8</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2401.png</attribute>
+ <attribute key="text" type="string">CON FRÍO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">con frío</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>19.0</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_9</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2300.png</attribute>
+ <attribute key="text" type="string">CALOR</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">con calor</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>291.3333333333333</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_10</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2314.png</attribute>
+ <attribute key="text" type="string">SUEÑO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">con sueño</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>563.6666666666666</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_11</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2367.png</attribute>
+ <attribute key="text" type="string">DOLOR</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">con dolor</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>836.0</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_12</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2374.png</attribute>
+ <attribute key="text" type="string">ENOJADO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">enojado</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>563.6666666666666</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_13</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\4962.png</attribute>
+ <attribute key="text" type="string">HAMBRE</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">con hambre</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>563.6666666666666</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_14</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\8662.png</attribute>
+ <attribute key="text" type="string">PREOCUPADO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">preocupado</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>836.0</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="controllerCell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">controller_cell_0</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\controller-home.png</attribute>
+ <attribute key="text" type="string">Inicio</attribute>
+ <attribute key="actionCode" type="integer">7</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>836.0</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ </attributes>
+ </component>
+ </model>
+ </board>
+ <board name="board_2">
+ <model>
+ <attributes>
+ <attribute key="orderedCellList" type="list">
+ <element>cell_4</element>
+ <element>cell_5</element>
+ <element>cell_12</element>
+ <element>cell_11</element>
+ <element>cell_6</element>
+ <element>cell_7</element>
+ <element>cell_13</element>
+ <element>cell_14</element>
+ <element>cell_8</element>
+ <element>cell_9</element>
+ <element>cell_10</element>
+ <element>controller_cell_0</element>
+ </attribute>
+ <attribute key="backgroundColor" type="color">fffcaf3e</attribute>
+ <attribute key="unorderedCellList" type="list"/>
+ <attribute key="imageResizeStyle" type="integer">0</attribute>
+ <attribute key="size" type="size">
+ <width>1024.0</width>
+ <height>600.0</height>
+ </attribute>
+ </attributes>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_4</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2349.png</attribute>
+ <attribute key="text" type="string">COMER</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">comer</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>19.0</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_5</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2430.png</attribute>
+ <attribute key="text" type="string">IR AL BAÑO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">ir al baño</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>291.3333333333333</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_6</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\6537.png</attribute>
+ <attribute key="text" type="string">JUGAR</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">jugar</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>19.0</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_7</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2587.png</attribute>
+ <attribute key="text" type="string">VER TELE</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">ver tele</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>291.3333333333333</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_8</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2586.png</attribute>
+ <attribute key="text" type="string">USAR EL TELÉFONO</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">usar el teléfono</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>19.0</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_9</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\5957_1.png</attribute>
+ <attribute key="text" type="string">ir a casa</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">ir a casa</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>291.3333333333333</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_10</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\25191.png</attribute>
+ <attribute key="text" type="string">LEER</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">leer</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>563.6666666666666</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_11</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2304_1.png</attribute>
+ <attribute key="text" type="string">DORMIR</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">dormir</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>836.0</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_12</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2370.png</attribute>
+ <attribute key="text" type="string">BAÑARME</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">bañarme</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>563.6666666666666</x>
+ <y>15.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_13</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\24795.png</attribute>
+ <attribute key="text" type="string">ESCUCHAR MUSICA</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">escuchar música</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>563.6666666666666</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="cell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">cell_14</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\2487.png</attribute>
+ <attribute key="text" type="string">COMPUTADORA</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="voiceText" type="string">usar la computadora</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>836.0</x>
+ <y>215.5</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ <attribute key="accumulated" type="boolean">false</attribute>
+ </attributes>
+ </component>
+ <component type="controllerCell">
+ <attributes>
+ <attribute key="font" type="font">
+ <family>Arial</family>
+ <size>12</size>
+ </attribute>
+ <attribute key="alternativeBorderColor" type="color">ffff0000</attribute>
+ <attribute key="id" type="string">controller_cell_0</attribute>
+ <attribute key="verticalTextPosition" type="integer">3</attribute>
+ <attribute key="alternativeLinewidth" type="integer">4</attribute>
+ <attribute key="linewidth" type="float">1.0</attribute>
+ <attribute key="icon" type="icon">image\controller-home_1.png</attribute>
+ <attribute key="text" type="string">Inicio</attribute>
+ <attribute key="actionCode" type="integer">7</attribute>
+ <attribute key="foregroundColor" type="color">ff000000</attribute>
+ <attribute key="bordercolor" type="color">ff000000</attribute>
+ <attribute key="bounds" type="rectangle">
+ <x>836.0</x>
+ <y>416.0</y>
+ <width>168.0</width>
+ <height>158.0</height>
+ </attribute>
+ <attribute key="backgroundColor" type="color">ffffffff</attribute>
+ </attributes>
+ </component>
+ </model>
+ </board>
+</project> \ No newline at end of file
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..6ea61a6
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,3 @@
+#!/usr/bin/python
+from sugar.activity import bundlebuilder
+bundlebuilder.start()
diff --git a/speak/GoogleTTS.py b/speak/GoogleTTS.py
new file mode 100644
index 0000000..79a0ae0
--- /dev/null
+++ b/speak/GoogleTTS.py
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+import os
+import os.path
+import string
+import urllib2
+from threads.TInterpreterPlaySound import TInterpreterPlaySound
+
+
+def __internetOn():
+ try:
+ urllib2.urlopen('http://www.google.com',timeout=1)
+ return True
+ except urllib2.URLError as err:
+ pass
+ return False
+
+def intentar(projectName, texto):
+ texto = texto.split(" ")
+ texto = string.join(texto, "+")
+
+ destino = os.path.join("proyectos", projectName, texto + ".mp3")
+ if os.path.exists(destino): #ya lo tengo, lo reproduzco
+ t = TInterpreterPlaySound([destino, ])
+ t.start()
+ return True
+ else: #no lo tengo
+ if __internetOn(): #hay internet
+ os.system("wget -q -U Mozilla -O \"" + destino + "\" \"http://translate.google.com/translate_tts?ie=UTF-8&tl=es&q=" + texto + "\"")
+ t = TInterpreterPlaySound([destino, ])
+ t.start()
+ return True
+ else: #no hay internet y no lo tengo
+ return False
diff --git a/speak/__init__.py b/speak/__init__.py
new file mode 100644
index 0000000..431e730
--- /dev/null
+++ b/speak/__init__.py
@@ -0,0 +1,2 @@
+__author__="rodripf"
+__date__ ="$28/09/2012 12:37:08 PM$" \ No newline at end of file
diff --git a/speak/espeak_cmd.py b/speak/espeak_cmd.py
new file mode 100644
index 0000000..26116dd
--- /dev/null
+++ b/speak/espeak_cmd.py
@@ -0,0 +1,64 @@
+# Adapted from the activity Speak http://activities.sugarlabs.org/es-ES/sugar/addon/4038
+# Copyright (C) 2009, Aleksey Lim
+#
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import re
+import subprocess
+
+PITCH_MAX = 99
+RATE_MAX = 99
+PITCH_DEFAULT = PITCH_MAX/2
+RATE_DEFAULT = RATE_MAX/3
+
+import voice
+
+def speak(text, rate=RATE_DEFAULT, pitch=PITCH_DEFAULT,
+ voice="default"):
+
+ # espeak uses 80 to 370
+ rate = 80 + (370-80) * int(rate) / 100
+
+ subprocess.call(["espeak", "-p", str(pitch),
+ "-s", str(rate), "-v", voice, text],
+ stdout=subprocess.PIPE)
+
+def voices():
+ out = []
+ result = subprocess.Popen(["espeak", "--voices"],
+ stdout=subprocess.PIPE).communicate()[0]
+
+ for line in result.split('\n'):
+ m = re.match(
+ r'\s*\d+\s+([\w-]+)\s+([MF])\s+([\w_-]+)\s+(.+)',
+ line)
+ if not m:
+ continue
+ language, gender, name, stuff = m.groups()
+ if stuff.startswith('mb/') or \
+ name in ('en-rhotic','english_rp',
+ 'english_wmids'):
+ # these voices don't produce sound
+ continue
+ out.append((language, name))
+
+ return out
+
+def hablar(texto):
+ speak(texto, voice = voice.defaultVoice().name)
+
+
+if __name__ == "__main__":
+ hablar("hola") \ No newline at end of file
diff --git a/speak/new_main.py b/speak/new_main.py
new file mode 100644
index 0000000..f46cac7
--- /dev/null
+++ b/speak/new_main.py
@@ -0,0 +1,15 @@
+#! /usr/bin/python
+
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+import urllib2
+
+def internet_on():
+ try:
+ response=urllib2.urlopen('http://74.125.113.99',timeout=1)
+ return True
+ except urllib2.URLError as err: pass
+ return False
+
+print internet_on() \ No newline at end of file
diff --git a/speak/voice.py b/speak/voice.py
new file mode 100644
index 0000000..0cf2b8d
--- /dev/null
+++ b/speak/voice.py
@@ -0,0 +1,169 @@
+# Adapted from the activity Speak http://activities.sugarlabs.org/es-ES/sugar/addon/4038
+# Copyright (C) 2008 Joshua Minor
+#
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import re
+import os
+from gettext import gettext as _
+
+import espeak_cmd as espeak
+
+import logging
+logger = logging.getLogger('speak')
+
+
+
+# Lets trick gettext into generating entries
+# for the voice names we expect espeak to have
+# If espeak actually has new or different names
+# then they won't get translated, but they
+# should still show up in the interface.
+expectedVoiceNames = [
+ _("Brazil"),
+ _("Swedish"),
+ _("Icelandic"),
+ _("Romanian"),
+ _("Swahili"),
+ _("Hindi"),
+ _("Dutch"),
+ _("Latin"),
+ _("Hungarian"),
+ _("Macedonian"),
+ _("Welsh"),
+ _("French"),
+ _("Norwegian"),
+ _("Russian"),
+ _("Afrikaans"),
+ _("Finnish"),
+ _("Default"),
+ _("Cantonese"),
+ _("Scottish"),
+ _("Greek"),
+ _("Vietnam"),
+ _("English"),
+ _("Lancashire"),
+ _("Italian"),
+ _("Portugal"),
+ _("German"),
+ _("Whisper"),
+ _("Croatian"),
+ _("Czech"),
+ _("Slovak"),
+ _("Spanish"),
+ _("Polish"),
+ _("Esperanto")
+]
+
+_allVoices = {}
+_defaultVoice = None
+
+
+class Voice:
+ def __init__(self, language, name):
+ self.language = language
+ self.name = name
+ friendlyname = name
+ friendlyname = friendlyname.replace('-test', '')
+ friendlyname = friendlyname.replace('_test', '')
+ friendlyname = friendlyname.replace('en-', '')
+ friendlyname = friendlyname.replace('english-wisper', 'whisper')
+ friendlyname = friendlyname.replace('english-us', 'us')
+
+ friendlynameRP = name # friendlyname for RP
+ friendlynameRP = friendlynameRP.replace('english_rp', 'rp')
+ friendlynameRP = friendlynameRP.replace('english_wmids', 'wmids')
+
+ parts = re.split('[ _-]', friendlyname)
+ partsRP = re.split('[ _]', friendlynameRP) # RE for english_RP
+ self.short_name = _(parts[0].capitalize())
+ self.friendlyname = ' '.join([self.short_name] + parts[1:])
+
+ friendlynameRP1 = None
+ if friendlynameRP == 'rp':
+
+ friendlynameRP1 = 'English (Received Pronunciation)'
+ self.friendlyname = 'English (Received Pronunciation)'
+
+ friendlynameUS = None
+ if friendlyname == 'us':
+ friendlynameUS = 'English (USA)'
+ self.friendlyname = 'English (USA)'
+
+ friendlynameWMIDS = None
+ if friendlynameRP == 'wmids':
+ friendlynameWMIDS = 'English (West Midlands)'
+ self.friendlyname = 'English (West Midlands)'
+
+ def __cmp__(self, other):
+ return cmp(self.friendlyname, other.friendlyname if other else '')
+
+
+def allVoices():
+ if _allVoices:
+ return _allVoices
+
+ for language, name in espeak.voices():
+ voice = Voice(language, name)
+ _allVoices[voice.friendlyname] = voice
+
+ return _allVoices
+
+
+def by_name(name):
+ return allVoices().get(name, defaultVoice())
+
+
+def defaultVoice():
+ """Try to figure out the default voice, from the current locale ($LANG).
+ Fall back to espeak's voice called Default."""
+
+ global _defaultVoice
+
+ if _defaultVoice:
+ return _defaultVoice
+
+ voices = allVoices()
+
+ def fit(a, b):
+ "Compare two language ids to see if they are similar."
+ as_ = re.split(r'[^a-z]+', a.lower())
+ bs = re.split(r'[^a-z]+', b.lower())
+ for count in range(0, min(len(as_), len(bs))):
+ if as_[count] != bs[count]:
+ count -= 1
+ break
+ return count
+ try:
+ lang = os.environ["LANG"]
+ except:
+ lang = ""
+
+ best = voices[_("Default")]
+ for voice in voices.values():
+ voiceMetric = fit(voice.language, lang)
+ bestMetric = fit(best.language, lang)
+ if lang == 'en_AU.UTF-8':
+ if voice.friendlyname == 'English (Received Pronunciation)':
+ best = voice
+ break
+ if voiceMetric > bestMetric:
+ best = voice
+
+ print "Best voice for LANG %s seems to be %s %s" % (lang,
+ best.language,
+ best.friendlyname)
+ _defaultVoice = best
+ return best
diff --git a/threads/TInterpreterPlaySound.py b/threads/TInterpreterPlaySound.py
new file mode 100644
index 0000000..f3edf58
--- /dev/null
+++ b/threads/TInterpreterPlaySound.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+import os
+if os.name != "nt":
+ import pygst
+ pygst.require("0.10")
+ import gst
+
+import threading
+import os
+
+class TInterpreterPlaySound (threading.Thread):
+ player = None
+ def __init__(self, sounds):
+ super(TInterpreterPlaySound, self).__init__()
+ self.sounds = []
+ for s in sounds:
+ self.sounds.append("file://" + os.path.abspath(s))
+
+ if TInterpreterPlaySound.player == None:
+ TInterpreterPlaySound.player = gst.element_factory_make("playbin", "player")
+
+ bus = TInterpreterPlaySound.player.get_bus()
+ bus.add_signal_watch()
+ bus.connect("message", self.onMessage)
+
+ def onMessage(self, bus, message):
+ t = message.type
+ if t == gst.MESSAGE_EOS:
+ self.player.set_state(gst.STATE_NULL)
+ elif t == gst.MESSAGE_ERROR:
+ self.player.set_state(gst.STATE_NULL)
+ err, debug = message.parse_error()
+ print "Error: %s" % err, debug
+
+
+ def run (self):
+ #set the uri
+ print self.sounds[0]
+ TInterpreterPlaySound.player.set_property('uri', self.sounds[0])
+ #start playing
+ TInterpreterPlaySound.player.set_state(gst.STATE_PLAYING)
+
+# #listen for tags on the message bus; tag event might be called more than once
+# bus = player.get_bus()
+# bus.enable_sync_message_emission()
+# bus.add_signal_watch()
+# bus.connect('message::tag', on_tag)
diff --git a/threads/__init__.py b/threads/__init__.py
new file mode 100644
index 0000000..dbaa255
--- /dev/null
+++ b/threads/__init__.py
@@ -0,0 +1,2 @@
+__author__="rodripf"
+__date__ ="$24/09/2012 11:56:25 AM$" \ No newline at end of file
diff --git a/util/About.py b/util/About.py
new file mode 100644
index 0000000..122067b
--- /dev/null
+++ b/util/About.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+import gtk
+
+class About:
+
+
+ def show(self):
+ #base this on a message dialog
+ dialog = gtk.MessageDialog(
+ None,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+ gtk.MESSAGE_QUESTION,
+ gtk.BUTTONS_OK,
+ None)
+ dialog.set_markup("<b><big>TIXO</big></b>\n\nDepartamento de Ingenieria - rodripf\nFundacion Teleton - 2011")
+
+ dialog.show_all()
+ #go go go
+ dialog.run()
+ dialog.destroy()
+
+
+
+if __name__ == '__main__':
+ d = About()
+ print d.show()
+ gtk.main()
diff --git a/util/About.py~ b/util/About.py~
new file mode 100644
index 0000000..78d47b8
--- /dev/null
+++ b/util/About.py~
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+import gtk
+
+class About:
+
+
+ def show(self):
+ #base this on a message dialog
+ dialog = gtk.MessageDialog(
+ None,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+ gtk.MESSAGE_QUESTION,
+ gtk.BUTTONS_OK,
+ None)
+ dialog.set_markup("<b><big>Mateton</big></b>\n\nDepartamento de Ingenieria - rodripf\nFundacion Teleton - 2011")
+
+ dialog.show_all()
+ #go go go
+ dialog.run()
+ dialog.destroy()
+
+
+
+if __name__ == '__main__':
+ d = About()
+ print d.show()
+ gtk.main() \ No newline at end of file
diff --git a/util/ChooseProject.py b/util/ChooseProject.py
new file mode 100644
index 0000000..20469b5
--- /dev/null
+++ b/util/ChooseProject.py
@@ -0,0 +1,116 @@
+import os.path
+# -*- coding: utf-8 -*-
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__ = "rodripf"
+__date__ = "$01/02/2012 10:45:52 AM$"
+
+import os
+import pygtk
+pygtk.require('2.0')
+import gtk
+import string
+
+class ChooseProject:
+ def limpiarNombres(self, text):
+ tmp = string.replace(text, "_", " ")
+ return string.replace(tmp, ".jpg", "")
+
+ def __init__(self, dir):
+ self.onAbrir = []
+ # Create a new window
+ self.window = gtk.Dialog("Abrir")
+
+ self.window.set_size_request(400, 500)
+
+ self.window.connect("delete_event", self.deleteEvent)
+ self.window.set_position(gtk.WIN_POS_CENTER)
+
+ self.treestore = gtk.TreeStore(str, str)
+
+ #dir = "./"
+ car = os.listdir(dir)
+ print car
+ for e in car:
+ if(os.path.isdir(os.path.join(dir, e))):
+ self.treestore.append(None, [e,e])
+
+
+ self.treeview = gtk.TreeView(self.treestore)
+ self.tvcolumn = gtk.TreeViewColumn()
+ self.treeview.append_column(self.tvcolumn)
+ self.cell = gtk.CellRendererText()
+ self.tvcolumn.pack_start(self.cell, True)
+
+ # set the cell "text" attribute to column 0 - retrieve text
+ # from that column in treestore
+ self.tvcolumn.add_attribute(self.cell, 'text', 0)
+
+ # make it searchable
+ self.treeview.set_search_column(0)
+
+ # Allow sorting on the column
+ self.tvcolumn.set_sort_column_id(0)
+
+ self.window.vbox.add(self.treeview)
+
+ abrir = gtk.Button("Abrir")
+ abrir.connect("clicked", self.abrirCB)
+ self.window.action_area.pack_start(abrir, True, True, 0)
+
+
+ cancelar = gtk.Button("Cancelar")
+ cancelar.connect("clicked", self.cancelarCB)
+ self.window.action_area.pack_start(cancelar, True, True, 0)
+
+ def addOnAbrirListener(self, action):
+ self.onAbrir.append(action)
+
+ def show(self):
+ self.window.show_all()
+
+ def abrirCB(self, b):
+ treeselection = self.treeview.get_selection()
+ treeselection.set_mode(gtk.SELECTION_SINGLE)
+ (model, iter) = treeselection.get_selected()
+
+ d = self.treestore.get_value(iter, 1)
+
+ self.window.destroy()
+ for f in self.onAbrir:
+ f(d)
+
+ return d
+
+
+ def cancelarCB(self, b):
+ self.window.destroy()
+
+ def deleteEvent(self, widget, event, data=None):
+ self.window.destroy()
+def main():
+ gtk.main()
+
+if __name__ == "__main__":
+ tvexample = ChooseProject("../proyectos")
+ tvexample.show()
+ main()
+ \ No newline at end of file
diff --git a/util/ControlFactory.py b/util/ControlFactory.py
new file mode 100644
index 0000000..8818925
--- /dev/null
+++ b/util/ControlFactory.py
@@ -0,0 +1,82 @@
+##########################Control Factory########################################
+# Control Factory extracted from Abacus, an activity by Walter Bender published #
+# under the GNU General Public License v3 #
+# Copyright (c) 2010-11, Walter Bender #
+# http://activities.sugarlabs.org/es-ES/sugar/addon/4293 #
+#################################################################################
+
+import gtk
+from sugar.graphics.toolbutton import ToolButton
+
+def buttonFactory(icon_name, toolbar, callback, cb_arg=None, tooltip=None,
+ accelerator=None):
+ '''Factory for making toolbar buttons'''
+ button = ToolButton(icon_name)
+ if tooltip is not None:
+ button.set_tooltip(tooltip)
+ button.props.sensitive = True
+ if accelerator is not None:
+ button.props.accelerator = accelerator
+ if cb_arg is None:
+ button.connect('clicked', callback)
+ else:
+ button.connect('clicked', cb_arg)
+ if hasattr(toolbar, 'insert'): # the main toolbar
+ toolbar.insert(button, -1)
+ else: # or a secondary toolbar
+ toolbar.props.page.insert(button, -1)
+ button.show()
+ return button
+
+
+def radioFactory(icon_name, toolbar, callback, cb_arg=None,
+ tooltip=None, group=None):
+ ''' Add a radio button to a toolbar '''
+ button = RadioToolButton(group=group)
+ button.set_named_icon(icon_name)
+ if tooltip is not None:
+ button.set_tooltip(tooltip)
+ if cb_arg is None:
+ button.connect('clicked', callback)
+ else:
+ button.connect('clicked', callback, cb_arg)
+ if hasattr(toolbar, 'insert'): # the main toolbar
+ toolbar.insert(button, -1)
+ else: # or a secondary toolbar
+ toolbar.props.page.insert(button, -1)
+ button.show()
+ return button
+
+
+def labelFactory(label_text, toolbar):
+ ''' Factory for adding a label to a toolbar '''
+ label = gtk.Label(label_text)
+ label.set_line_wrap(True)
+ label.show()
+ toolitem = gtk.ToolItem()
+ toolitem.add(label)
+ toolbar.insert(toolitem, -1)
+ toolitem.show()
+ return label
+
+
+def spinFactory(default, min, max, callback, toolbar):
+ spin_adj = gtk.Adjustment(default, min, max, 1, 32, 0)
+ spin = gtk.SpinButton(spin_adj, 0, 0)
+ spin_id = spin.connect('value-changed', callback)
+ spin.set_numeric(True)
+ spin.show()
+ toolitem = gtk.ToolItem()
+ toolitem.add(spin)
+ toolbar.insert(toolitem, -1)
+ toolitem.show()
+ return spin
+
+
+def separatorFactory(toolbar, expand=False, visible=True):
+ ''' add a separator to a toolbar '''
+ separator = gtk.SeparatorToolItem()
+ separator.props.draw = visible
+ separator.set_expand(expand)
+ toolbar.insert(separator, -1)
+ separator.show() \ No newline at end of file
diff --git a/util/OpenNewProject.py b/util/OpenNewProject.py
new file mode 100644
index 0000000..c80bb1c
--- /dev/null
+++ b/util/OpenNewProject.py
@@ -0,0 +1,54 @@
+import os
+# Tixo - A Sugar interpreter for TICO projects
+# Copyright (C) 2012 Rodrigo Perez Fulloni
+# Fundacion Teleton Uruguay - Departamento de Ingenieria
+#
+# Based on TICO Project: http://www.proyectotico.com/
+#
+#
+# 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/>.
+
+__author__="Rodrigo"
+__date__ ="$27-sep-2012 12:59:02$"
+
+
+from zipfile import *
+import os.path
+
+
+class OpenNewProject:
+ PROYECTOS = "proyectos"
+
+ def __init__(self, file, proyName):
+ proyName = os.path.splitext(proyName)[0]
+ destFolder = os.path.join(self.PROYECTOS, proyName)
+ if os.path.exists(destFolder):
+ raise Exception("El proyecto ya existe.")
+ else:
+ if is_zipfile(file):
+ os.makedirs(destFolder)
+ zip = ZipFile(file, 'r')
+ zip.extractall(destFolder)
+ self.carpeta = proyName
+ else:
+ raise Exception("El archivo no es valido o esta corrupto.")
+
+ def getProjectName(self):
+ return self.carpeta
+
+if __name__ == "__main__":
+ try:
+ o = OpenNewProject("pruebaControl.tco", "pruebaControl")
+ except Exception as ex:
+ print ex
diff --git a/util/Singleton.py b/util/Singleton.py
new file mode 100644
index 0000000..c161866
--- /dev/null
+++ b/util/Singleton.py
@@ -0,0 +1,16 @@
+class Singleton(object):
+ _instance = None
+ def __new__(cls, * args, ** kwargs):
+ if not cls._instance:
+ cls._instance = super(Singleton, cls).__new__(
+ cls, * args, ** kwargs)
+ return cls._instance
+
+
+if __name__ == '__main__':
+ s1 = Singleton()
+ s2 = Singleton()
+ if s1 == s2:
+ print "Same"
+ else:
+ print "Different" \ No newline at end of file
diff --git a/util/__init__.py b/util/__init__.py
new file mode 100644
index 0000000..102ba58
--- /dev/null
+++ b/util/__init__.py
@@ -0,0 +1,2 @@
+__author__="Rodrigo"
+__date__ ="$27-sep-2012 12:58:29$" \ No newline at end of file