From d99a48e5d8690826d90594d5956a42e3fcb16802 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 1 Nov 2010 18:24:08 +0100 Subject: [PATCH sugar 29/74] accessibility_0006_virtualkeyboard.patch --- bin/sugar.in | 2 + extensions/deviceicon/Makefile.am | 1 + extensions/deviceicon/virtualkeyboard.py | 72 ++ extensions/globalkey/Makefile.am | 3 +- extensions/globalkey/virtualkeyboard.py | 9 + src/jarabe/model/Makefile.am | 3 +- src/jarabe/model/virtualkeyboard.py | 185 +++ src/jarabe/view/Makefile.am | 3 +- src/jarabe/view/virtualkeyboard.py | 1883 ++++++++++++++++++++++++++++++ 9 files changed, 2158 insertions(+), 3 deletions(-) create mode 100644 extensions/deviceicon/virtualkeyboard.py create mode 100644 extensions/globalkey/virtualkeyboard.py create mode 100644 src/jarabe/model/virtualkeyboard.py create mode 100644 src/jarabe/view/virtualkeyboard.py diff --git a/bin/sugar.in b/bin/sugar.in index 90fbf8f..de3cfbd 100644 --- a/bin/sugar.in +++ b/bin/sugar.in @@ -98,4 +98,6 @@ fi echo Xcursor.theme: $CURSOR_THEME | xrdb -merge metacity --no-force-fullscreen -d $DISPLAY & +[ -x /usr/bin/pulseaudio ] && /usr/bin/pulseaudio & + exec sugar-session diff --git a/extensions/deviceicon/Makefile.am b/extensions/deviceicon/Makefile.am index 0d15c38..3a74053 100644 --- a/extensions/deviceicon/Makefile.am +++ b/extensions/deviceicon/Makefile.am @@ -7,4 +7,5 @@ sugar_PYTHON = \ resources.py \ speaker.py \ touchpad.py \ + virtualkeyboard.py \ volume.py diff --git a/extensions/deviceicon/virtualkeyboard.py b/extensions/deviceicon/virtualkeyboard.py new file mode 100644 index 0000000..955f79b --- /dev/null +++ b/extensions/deviceicon/virtualkeyboard.py @@ -0,0 +1,72 @@ +from gettext import gettext as _ + +import logging +import gobject +import gtk +import gconf +import os + +from sugar.graphics.tray import TrayIcon +from sugar.graphics.xocolor import XoColor +from sugar.graphics.palette import Palette +from sugar.graphics import style +from jarabe.frame.frameinvoker import FrameWidgetInvoker + +import jarabe.view.virtualkeyboard + +class DeviceView(TrayIcon): + + FRAME_POSITION_RELATIVE = 500 + + def __init__(self): + icon_name = 'virtualkeyboard' + + client = gconf.client_get_default() + color = XoColor(client.get_string('/desktop/sugar/user/color')) + TrayIcon.__init__(self, icon_name=icon_name, xo_color=color) + self.set_palette_invoker(FrameWidgetInvoker(self)) + + def create_palette(self): + palette = VirtualkeyboardPalette(_('Teclado Virtual')) + palette.set_group_id('frame') + return palette + +class VirtualkeyboardPalette(Palette): + + def __init__(self, primary_text): + Palette.__init__(self, label=primary_text) + + self.connect('popup', self._popup_cb) + self.connect('popdown', self._popdown_cb) + + self._popped_up = False + + self._open_item = gtk.MenuItem(_('Open')) + self._open_item.connect('activate', self._open_activate_cb) + self.menu.append(self._open_item) + self._open_item.show() + + self._close_item = gtk.MenuItem(_('Close')) + self._close_item.connect('activate', self._close_activate_cb) + self.menu.append(self._close_item) + self._close_item.show() + + def _popup_cb(self, gobject_ref): + self._popped_up = True + + def _popdown_cb(self, gobject_ref): + self._popped_up = False + + def _open_activate_cb(self, gobject_ref): + self.v = jarabe.view.virtualkeyboard.Teclado() + + def _close_activate_cb(self, gobject_ref): + try: + self.v.close() + except: + pass + + +def setup(tray): + tray.add_device(DeviceView()) + diff --git a/extensions/globalkey/Makefile.am b/extensions/globalkey/Makefile.am index 49a8dd7..b44626e 100644 --- a/extensions/globalkey/Makefile.am +++ b/extensions/globalkey/Makefile.am @@ -4,4 +4,5 @@ sugar_PYTHON = \ __init__.py \ magnifier.py \ screenshot.py \ - viewsource.py + viewsource.py \ + virtualkeyboard.py diff --git a/extensions/globalkey/virtualkeyboard.py b/extensions/globalkey/virtualkeyboard.py new file mode 100644 index 0000000..bba0877 --- /dev/null +++ b/extensions/globalkey/virtualkeyboard.py @@ -0,0 +1,9 @@ +import logging + +import jarabe.view.virtualkeyboard + +BOUND_KEYS = ['k'] + +def handle_key_press(key): + logging.debug('load virtual keyboard') + jarabe.view.virtualkeyboard.Teclado() diff --git a/src/jarabe/model/Makefile.am b/src/jarabe/model/Makefile.am index ee8b865..040b099 100644 --- a/src/jarabe/model/Makefile.am +++ b/src/jarabe/model/Makefile.am @@ -18,4 +18,5 @@ sugar_PYTHON = \ screen.py \ session.py \ sound.py \ - telepathyclient.py + telepathyclient.py \ + virtualkeyboard.py diff --git a/src/jarabe/model/virtualkeyboard.py b/src/jarabe/model/virtualkeyboard.py new file mode 100644 index 0000000..b3e3659 --- /dev/null +++ b/src/jarabe/model/virtualkeyboard.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# VirtualKeyboard +# Copyright (C) 2010 Plan Ceibal +# pykey - http://shallowsky.com/software/crikey +# +# Author: Esteban Arias +# Contact information: comunidad@plan.ceibal.edu.uy +# Plan Ceibal http://www.ceibal.edu.uy +# +# 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 . + +import subprocess +import sys, os +import time +import Xlib.display +import Xlib.X +import Xlib.XK +import Xlib.protocol.event + +class Teclado: + special_X_keysyms = { + ' ' : "space", + '\t' : "Tab", + '\n' : "Return", + '\r' : "BackSpace", + '\e' : "Escape", + '!' : "exclam", + '#' : "numbersign", + '%' : "percent", + '$' : "dollar", + '&' : "ampersand", + '"' : "quotedbl", + '\'' : "apostrophe", + '(' : "parenleft", + ')' : "parenright", + '*' : "asterisk", + '=' : "equal", + '+' : "plus", + ',' : "comma", + '-' : "minus", + '.' : "period", + '/' : "slash", + ':' : "colon", + ';' : "semicolon", + '<' : "less", + '>' : "greater", + '?' : "question", + '@' : "at", + '[' : "bracketleft", + ']' : "bracketright", + '\\' : "backslash", + '^' : "asciicircum", + '_' : "underscore", + '`' : "grave", + '{' : "braceleft", + '|' : "bar", + '}' : "braceright", + '~' : "asciitilde", + 'ñ' : "ntilde", + 'Ñ' : "Ntilde" + }; + + def __init__(self): + self.display = Xlib.display.Display() + self.window = self.display.get_input_focus()._data["focus"]; + + def get_keysym(self, ch) : + keysym = Xlib.XK.string_to_keysym(ch) + if keysym == 0: + keysym = Xlib.XK.string_to_keysym(self.special_X_keysyms[ch]) + return keysym + + def is_shifted(self, ch) : + if ch.isupper() : + return True + if "/=~!@#$%^&()_*{}|:;\">?Ñ".find(ch) >= 0 : + return True + return False + + def char_to_keycode(self, ch) : + keysym = self.get_keysym(ch) + keycode = self.display.keysym_to_keycode(keysym) + if keycode == 0 : + print "Sorry, can't map", ch + + if (self.is_shifted(ch)) : + shift_mask = Xlib.X.ShiftMask + else : + shift_mask = 0 + + return keycode, shift_mask + + + def send_string(self, ch): + keycode, shift_mask = self.char_to_keycode(ch) + self.escribir(keycode, shift_mask) + + def escribir(self, keycode, shift_mask): + event = Xlib.protocol.event.KeyPress( + time = int(time.time()), + root = self.display.screen().root, + window = self.window, + same_screen = 0, child = Xlib.X.NONE, + root_x = 0, root_y = 0, event_x = 0, event_y = 0, + state = shift_mask, + detail = keycode + ) + self.window.send_event(event, propagate = True) + event = Xlib.protocol.event.KeyRelease( + time = int(time.time()), + root = self.display.screen().root, + window = self.window, + same_screen = 0, child = Xlib.X.NONE, + root_x = 0, root_y = 0, event_x = 0, event_y = 0, + state = shift_mask, + detail = keycode + ) + self.window.send_event(event, propagate = True) + + + def escribir_txt(self, txt): + self.display = Xlib.display.Display() + self.window = self.display.get_input_focus()._data["focus"]; + + if (txt == "ü"): + self.escribir(34, 1) + self.send_string("u") + elif (txt == "Ü"): + self.escribir(34, 1) + self.send_string("U") + elif (txt == "|"): + self.escribir(10, Xlib.X.Mod5Mask) + elif (txt == "@"): + self.escribir(11, Xlib.X.Mod5Mask) + elif (txt == "#"): + self.escribir(12, Xlib.X.Mod5Mask) + elif (txt == "º"): + self.escribir(49, 0) + elif (txt == "ª"): + self.escribir(49, 1) + elif (txt == "'"): + self.escribir(20, 0) + elif (txt == "¿"): + self.escribir(21, 1) + elif (txt == "¡"): + self.escribir(21, 0) + elif (txt == "'"): + self.escribir(34, 0) + elif (self.tieneTilde(txt)): + self.escribir(34, 0) + self.escribirVocal(txt) + else: + self.send_string(txt) + + self.display.sync() + + def tieneTilde(self, txt): + return "ÁÉÍÓÚáéíóú".find(txt) >= 0 + + def escribirVocal(self, txt): + if txt=="Á": self.send_string("A") + if txt=="É": self.send_string("E") + if txt=="Í": self.send_string("I") + if txt=="Ó": self.send_string("O") + if txt=="Ú": self.send_string("U") + if txt=="á": self.send_string("a") + if txt=="é": self.send_string("e") + if txt=="í": self.send_string("i") + if txt=="ó": self.send_string("o") + if txt=="ú": self.send_string("u") + + def hablar(self, texto, s): + subprocess.call(["espeak", "-p", "30", "-s", s, "-v", "spanish", texto], stdout=subprocess.PIPE) diff --git a/src/jarabe/view/Makefile.am b/src/jarabe/view/Makefile.am index 630f184..0b7d886 100644 --- a/src/jarabe/view/Makefile.am +++ b/src/jarabe/view/Makefile.am @@ -10,4 +10,5 @@ sugar_PYTHON = \ pulsingicon.py \ service.py \ tabbinghandler.py \ - viewsource.py + viewsource.py \ + virtualkeyboard.py diff --git a/src/jarabe/view/virtualkeyboard.py b/src/jarabe/view/virtualkeyboard.py new file mode 100644 index 0000000..b873ae4 --- /dev/null +++ b/src/jarabe/view/virtualkeyboard.py @@ -0,0 +1,1883 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# Virtualkeyboard +# Copyright (C) 2010 Plan Ceibal +# +# Author: Esteban Arias +# Contact information: comunidad@plan.ceibal.edu.uy +# Plan Ceibal http://www.ceibal.edu.uy +# +# 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 . + +import pygtk +pygtk.require('2.0') +import gtk +import sys, os +import time +import pango +import gconf +import logging +import threading +import gobject + +import jarabe.model.virtualkeyboard +from sugar.graphics.icon import Icon, get_icon_file_name + +gobject.threads_init() + +velocidades = {'lenta': 4500, 'media': 3000, 'rapida':1500} +hablar = {'lenta': "170", 'media': "180", 'rapida':"275"} + +class Teclado: + + def __init__(self): + self.BOTONESxBARRIDO = False; + self.BOTONESxBARRIDOxFILA = False; + self.MAYUSCULA = True; + self.fila_1 = []; + self.fila_2 = []; + self.fila_3 = []; + self.fila_4 = []; + self.fila_5 = []; + self.losBotones = []; + self.fila_actual = None; + self.btn_actual = None; + self.fila_actual_nro = -1; + + self.seg = velocidades['media']; + self.hablar_al = "NUNCA"; + self.size = "CHICO" + self.teclado_tipo = "COMPLETO"; + self.inicilizar_config() + +# self.desplegar() + if os.environ.has_key('virtualkeyboard'): + self.visible = os.environ['virtualkeyboard'] + if self.visible == 'True': + return + else: + if self.visible == 'False': + self.desplegar() + else: + self.desplegar() + + + def delete_event(self, widget, event=None): + self.close() + + def close(self): + self.BOTONESxBARRIDOxFILA = False + self.BOTONESxBARRIDO = False + os.environ['virtualkeyboard'] = 'False' + logging.debug('close virtual keyboard') + self.dialog.destroy() + try: + self.hilo_type._Thread__stop() + self.hilo_size._Thread__stop() + self.hilo_bloquear._Thread__stop() + self.hilo_hablar._Thread__stop() + except: + pass + return False + + + def desplegar(self): + self._mTeclado=jarabe.model.virtualkeyboard.Teclado() + + self.dialog = gtk.Dialog() + self.dialog.set_title("TECLADO VIRTUAL") + self.dialog.set_keep_above(True) + self.dialog.grab_focus() + try: + self.dialog.set_icon_from_file(get_icon_file_name('virtualkeyboard')) + except: + logging.debug('dont show virtual keyboard icon') + + self.dialog.set_accept_focus(False) + self.dialog.connect("delete_event", self.delete_event) + + #tipo de teclado: + try: + self.teclado_tipo = self.get_tipo_teclado() + except: + logging.error("init - error al leer teclado_tipo") + self.teclado_tipo = "COMPLETO" + + self.vbox_teclado = self.mostrar_teclado() + + #sizes: + try: + self.size = self.get_size_botones() + except: + logging.error("init - error al leer size_botones") + self.size = "CHICO" + + x, y = self.get_size_dialog(self.size, self.teclado_tipo) + font_desc = self.get_font_desc(self.size, self.teclado_tipo) + self.dialog.set_size_request(x, y) + self.sizeBotones(font_desc) + + self.event_box = gtk.EventBox() + self.event_box.add(self.vbox_teclado) + self.event_box.set_events(gtk.gdk.BUTTON_PRESS) + self.event_box.show() + self.ebc = self.event_box.connect("button_press_event", self.mouse_boton) + self.dialog.vbox.pack_start(self.event_box, False, False, 5) + + self.vbox_teclado.show_all() + + self.posicionar_dialog(self.dialog) + + self.dialog.show() + + try: + self.hablar_al = self.get_opciones_hablar() + except: + logging.debug('init - Error al cargar opciones.') + self.hablar_al = "NUNCA" + + barriendo="" + try: + barriendo = self.leer_barrido() + except: + logging.error("init - Error al leer barrido.") + barriendo = "NO" + + if barriendo == "SI": + try: + seg =self.get_time_barrido_botones() + except: + logging.error("init - error al leer time_barrido_botones") + seg = velocidades['media'] + + self.seg = seg + self.BOTONESxBARRIDOxFILA = True + self.botonesXbarridoXfila() + + os.environ['virtualkeyboard'] = 'True' + + + def mostrar_teclado(self): + if (self.teclado_tipo == "COMPLETO"): + return self.mostrar_teclado_completo() + elif (self.teclado_tipo == "NUMERICO"): + return self.mostrar_teclado_numerico() + elif (self.teclado_tipo == "LETRAS"): + return self.mostrar_teclado_letras() + + def mostrar_teclado_completo(self): + child = gtk.VBox(False, 2) + + # defino botones + self.btn_BACK_SPACE = self.new_button_borrar() + self.losBotones.append(self.btn_BACK_SPACE) + + self.btn_SPACE = self.new_button_espacio() + self.losBotones.append(self.btn_SPACE) + + self.btn_CAPS_LOCK = self.new_button_mayuscula() + self.fila_3.append(self.btn_CAPS_LOCK) + self.losBotones.append(self.btn_CAPS_LOCK) + + self.btn_ENTER = self.new_button_enter() + self.losBotones.append(self.btn_ENTER) + self.fila_2.append(self.btn_ENTER) + + self.btn_TAB = self.new_button_tab() + self.losBotones.append(self.btn_TAB) + self.fila_2.append(self.btn_TAB) + + self.btn_do = self.new_button_escribir("º") + self.btn_do.set_text_desc("o superíndice") + self.losBotones.append(self.btn_do) + self.fila_1.append(self.btn_do) + + self.btn_1 = self.new_button_escribir("1") + self.losBotones.append(self.btn_1) + self.fila_1.append(self.btn_1) + + self.btn_2 = self.new_button_escribir("2") + self.losBotones.append(self.btn_2) + self.fila_1.append(self.btn_2) + + self.btn_3 = self.new_button_escribir("3") + self.losBotones.append(self.btn_3) + self.fila_1.append(self.btn_3) + + self.btn_4 = self.new_button_escribir("4") + self.losBotones.append(self.btn_4) + self.fila_1.append(self.btn_4) + + self.btn_5 = self.new_button_escribir("5") + self.losBotones.append(self.btn_5) + self.fila_1.append(self.btn_5) + + self.btn_6 = self.new_button_escribir("6") + self.losBotones.append(self.btn_6) + self.fila_1.append(self.btn_6) + + self.btn_7 = self.new_button_escribir("7") + self.losBotones.append(self.btn_7) + self.fila_1.append(self.btn_7) + + self.btn_8 = self.new_button_escribir("8") + self.losBotones.append(self.btn_8) + self.fila_1.append(self.btn_8) + + self.btn_9 = self.new_button_escribir("9") + self.losBotones.append(self.btn_9) + self.fila_1.append(self.btn_9) + + self.btn_0 = self.new_button_escribir("0") + self.losBotones.append(self.btn_0) + self.fila_1.append(self.btn_0) + + self.btn_finPreg = self.new_button_escribir("'") + self.btn_finPreg.set_text_desc("comilla simple") + self.losBotones.append(self.btn_finPreg) + self.fila_1.append(self.btn_finPreg) + + self.btn_inicioPreg = self.new_button_escribir("¡") + self.btn_inicioPreg.set_text_desc("abro exclamación") + self.losBotones.append(self.btn_inicioPreg) + self.fila_1.append(self.btn_inicioPreg) + + self.btn_Q = self.new_button_escribir("Q") + self.losBotones.append(self.btn_Q) + self.fila_2.append(self.btn_Q) + + self.btn_W = self.new_button_escribir("W") + self.losBotones.append(self.btn_W) + self.fila_2.append(self.btn_W) + + self.btn_E = self.new_button_escribir("E") + self.losBotones.append(self.btn_E) + self.fila_2.append(self.btn_E) + + self.btn_R = self.new_button_escribir("R") + self.losBotones.append(self.btn_R) + self.fila_2.append(self.btn_R) + + self.btn_T = self.new_button_escribir("T") + self.losBotones.append(self.btn_T) + self.fila_2.append(self.btn_T) + + self.btn_Y = self.new_button_escribir("Y") + self.losBotones.append(self.btn_Y) + self.fila_2.append(self.btn_Y) + + self.btn_U = self.new_button_escribir("U") + self.losBotones.append(self.btn_U) + self.fila_2.append(self.btn_U) + + self.btn_I = self.new_button_escribir("I") + self.losBotones.append(self.btn_I) + self.fila_2.append(self.btn_I) + + self.btn_O = self.new_button_escribir("O") + self.losBotones.append(self.btn_O) + self.fila_2.append(self.btn_O) + + self.btn_P = self.new_button_escribir("P") + self.losBotones.append(self.btn_P) + self.fila_2.append(self.btn_P) + + self.btn_asterisco = self.new_button_escribir("*") + self.losBotones.append(self.btn_asterisco) + self.fila_2.append(self.btn_asterisco) + + self.btn_cierra_llave = self.new_button_escribir("]") + self.btn_cierra_llave.set_text_desc("cierro paréntesis recto") + self.losBotones.append(self.btn_cierra_llave) + + self.btn_A = self.new_button_escribir("A") + self.losBotones.append(self.btn_A) + self.fila_3.append(self.btn_A) + + self.btn_S = self.new_button_escribir("S") + self.losBotones.append(self.btn_S) + self.fila_3.append(self.btn_S) + + self.btn_D = self.new_button_escribir("D") + self.losBotones.append(self.btn_D) + self.fila_3.append(self.btn_D) + + self.btn_F = self.new_button_escribir("F") + self.losBotones.append(self.btn_F) + self.fila_3.append(self.btn_F) + + self.btn_G = self.new_button_escribir("G") + self.losBotones.append(self.btn_G) + self.fila_3.append(self.btn_G) + + self.btn_H = self.new_button_escribir("H") + self.losBotones.append(self.btn_H) + self.fila_3.append(self.btn_H) + + self.btn_J = self.new_button_escribir("J") + self.losBotones.append(self.btn_J) + self.fila_3.append(self.btn_J) + + self.btn_K = self.new_button_escribir("K") + self.losBotones.append(self.btn_K) + self.fila_3.append(self.btn_K) + + self.btn_L = self.new_button_escribir("L") + self.losBotones.append(self.btn_L) + self.fila_3.append(self.btn_L) + + self.btn_enie = self.new_button_escribir("Ñ") + self.losBotones.append(self.btn_enie) + self.fila_3.append(self.btn_enie) + + self.btn_mas = self.new_button_escribir("+") + self.btn_mas.set_text_desc("más") + self.losBotones.append(self.btn_mas) + self.fila_3.append(self.btn_mas) + + self.fila_3.append(self.btn_cierra_llave) + + self.btn_abre_llave = self.new_button_escribir("[") + self.btn_abre_llave.set_text_desc("abro paréntesis recto") + self.losBotones.append(self.btn_abre_llave) + self.fila_2.append(self.btn_abre_llave) + + self.btn_Z = self.new_button_escribir("Z") + self.losBotones.append(self.btn_Z) + self.fila_4.append(self.btn_Z) + + self.btn_X = self.new_button_escribir("X") + self.losBotones.append(self.btn_X) + self.fila_4.append(self.btn_X) + + self.btn_C = self.new_button_escribir("C") + self.losBotones.append(self.btn_C) + self.fila_4.append(self.btn_C) + + self.btn_V = self.new_button_escribir("V") + self.losBotones.append(self.btn_V) + self.fila_4.append(self.btn_V) + + self.btn_B = self.new_button_escribir("B") + self.losBotones.append(self.btn_B) + self.fila_4.append(self.btn_B) + + self.btn_N = self.new_button_escribir("N") + self.losBotones.append(self.btn_N) + self.fila_4.append(self.btn_N) + + self.btn_M = self.new_button_escribir("M") + self.losBotones.append(self.btn_M) + self.fila_4.append(self.btn_M) + + self.btn_coma = self.new_button_escribir(",") + self.btn_coma.set_text_desc("coma") + self.losBotones.append(self.btn_coma) + self.fila_4.append(self.btn_coma) + + self.btn_punto = self.new_button_escribir(".") + self.btn_punto.set_text_desc("punto") + self.losBotones.append(self.btn_punto) + self.fila_4.append(self.btn_punto) + + self.btn_guion = self.new_button_escribir("-") + self.btn_guion.set_text_desc("guión") + self.losBotones.append(self.btn_guion) + self.fila_4.append(self.btn_guion) + + self.btn_A_tilde = self.new_button_escribir("Á") + self.btn_A_tilde.set_text_desc("Á tilde") + self.losBotones.append(self.btn_A_tilde) + self.fila_5.append(self.btn_A_tilde) + + self.btn_E_tilde = self.new_button_escribir("É") + self.btn_E_tilde.set_text_desc("É tilde") + self.losBotones.append(self.btn_E_tilde) + self.fila_5.append(self.btn_E_tilde) + + self.btn_I_tilde = self.new_button_escribir("Í") + self.btn_I_tilde.set_text_desc("Í tilde") + self.losBotones.append(self.btn_I_tilde) + self.fila_5.append(self.btn_I_tilde) + + self.btn_O_tilde = self.new_button_escribir("Ó") + self.btn_O_tilde.set_text_desc("Ó tilde") + self.losBotones.append(self.btn_O_tilde) + self.fila_5.append(self.btn_O_tilde) + + self.btn_U_tilde = self.new_button_escribir("Ú") + self.btn_U_tilde.set_text_desc("Ú tilde") + self.losBotones.append(self.btn_U_tilde) + self.fila_5.append(self.btn_U_tilde) + + self.btn_U_puntos = self.new_button_escribir("Ü") + self.btn_U_puntos.set_text_desc("u diéresis") + self.losBotones.append(self.btn_U_puntos) + self.fila_5.append(self.btn_U_puntos) + + self.btn_pite = self.new_button_escribir("|") + self.btn_pite.set_text_desc("pait") + self.losBotones.append(self.btn_pite) + self.fila_5.append(self.btn_pite) + + self.btn_arroba = self.new_button_escribir("@") + self.losBotones.append(self.btn_arroba) + self.fila_5.append(self.btn_arroba) + + self.btn_menor = self.new_button_escribir("<") + self.btn_menor.set_text_desc("menor") + self.losBotones.append(self.btn_menor) + self.fila_5.append(self.btn_menor) + + self.btn_opciones = self.new_button(gtk.STOCK_PREFERENCES, " ", self.desplegar_opciones) + + #dibujo tabla + table = gtk.Table(7, 19, True) + + table.set_row_spacing(0, 15) + table.set_row_spacing(1, 3) + table.set_row_spacing(2, 3) + table.set_row_spacing(3, 15) + table.set_row_spacing(4, 10) + table.set_row_spacing(5, 3) + table.set_row_spacing(6, 3) + + table.set_col_spacing(0, 3) + table.set_col_spacing(1, 3) + table.set_col_spacing(2, 3) + table.set_col_spacing(3, 3) + table.set_col_spacing(4, 3) + table.set_col_spacing(5, 3) + table.set_col_spacing(6, 3) + table.set_col_spacing(7, 3) + table.set_col_spacing(8, 3) + table.set_col_spacing(9, 3) + table.set_col_spacing(10, 3) + table.set_col_spacing(11, 3) + table.set_col_spacing(12, 3) + table.set_col_spacing(13, 15) + + + table.attach(self.btn_do, 1, 2, 0, 1) + table.attach(self.btn_1, 2, 3, 0, 1) + table.attach(self.btn_2, 3, 4, 0, 1) + table.attach(self.btn_3, 4, 5, 0, 1) + table.attach(self.btn_4, 5, 6, 0, 1) + table.attach(self.btn_5, 6, 7, 0, 1) + table.attach(self.btn_6, 7, 8, 0, 1) + table.attach(self.btn_7, 8, 9, 0, 1) + table.attach(self.btn_8, 9, 10, 0, 1) + table.attach(self.btn_9, 10, 11, 0, 1) + table.attach(self.btn_0, 11, 12, 0, 1) + table.attach(self.btn_finPreg, 12 ,13, 0, 1) + table.attach(self.btn_inicioPreg, 13, 14, 0, 1) + table.attach(self.btn_TAB, 0, 2, 1, 2) + table.attach(self.btn_Q, 2, 3, 1, 2) + table.attach(self.btn_W, 3, 4, 1, 2) + table.attach(self.btn_E, 4, 5, 1, 2) + table.attach(self.btn_R, 5, 6, 1, 2) + table.attach(self.btn_T, 6, 7, 1, 2) + table.attach(self.btn_Y, 7, 8, 1, 2) + table.attach(self.btn_U, 8, 9, 1, 2) + table.attach(self.btn_I, 9, 10, 1, 2) + table.attach(self.btn_O, 10, 11, 1, 2) + table.attach(self.btn_P, 11, 12, 1, 2) + table.attach(self.btn_asterisco, 12, 13, 1, 2) + table.attach(self.btn_abre_llave, 13, 14, 1, 2) + table.attach(self.btn_A, 2, 3, 2, 3) + table.attach(self.btn_S, 3, 4, 2, 3) + table.attach(self.btn_D, 4, 5, 2, 3) + table.attach(self.btn_F, 5, 6, 2, 3) + table.attach(self.btn_G, 6, 7, 2, 3) + table.attach(self.btn_H, 7, 8, 2, 3) + table.attach(self.btn_J, 8, 9, 2, 3) + table.attach(self.btn_K, 9, 10, 2, 3) + table.attach(self.btn_L, 10, 11, 2, 3) + table.attach(self.btn_enie, 11, 12, 2, 3) + table.attach(self.btn_mas, 12, 13, 2, 3) + table.attach(self.btn_cierra_llave, 13, 14, 2, 3) + table.attach(self.btn_Z, 2, 3, 3, 4) + table.attach(self.btn_X, 3, 4, 3, 4) + table.attach(self.btn_C, 4, 5, 3, 4) + table.attach(self.btn_V, 5, 6, 3, 4) + table.attach(self.btn_B, 6, 7, 3, 4) + table.attach(self.btn_N, 7, 8, 3, 4) + table.attach(self.btn_M, 8, 9, 3, 4) + table.attach(self.btn_coma, 9, 10, 3, 4) + table.attach(self.btn_punto, 10, 11, 3, 4) + table.attach(self.btn_guion, 11, 12, 3, 4) + + table.attach(self.btn_BACK_SPACE, 14, 19, 0, 1) + table.attach(self.btn_ENTER, 14, 19, 1, 2) + table.attach(self.btn_CAPS_LOCK, 14, 19, 2, 3) + table.attach(self.btn_SPACE, 2, 14, 5, 6) + table.attach(self.btn_opciones, 18, 19, 5, 6) + + table.attach(self.btn_A_tilde, 2, 3, 4, 5) + table.attach(self.btn_E_tilde, 3, 4, 4, 5) + table.attach(self.btn_I_tilde, 4, 5, 4, 5) + table.attach(self.btn_O_tilde, 5, 6, 4, 5) + table.attach(self.btn_U_tilde, 6, 7, 4, 5) + table.attach(self.btn_U_puntos, 9, 10, 4, 5) + table.attach(self.btn_pite, 10, 11, 4, 5) + table.attach(self.btn_arroba, 11, 12, 4, 5) + table.attach(self.btn_menor, 12, 13, 4, 5) + + child.pack_end(table, True, True, 0) + + return child + +#################################################################################### + def escribir(self, widget, *arg): + txt = widget.get_text() + + self._mTeclado.escribir_txt(txt) + if (self.hablar_al == "ESCRIBIR"): + self.btn_actual=widget + self.hablar() + + def espacio(self, *arg): + self._mTeclado.escribir_txt(" ") + if (self.hablar_al == "ESCRIBIR"): + self.btn_actual = self.btn_SPACE + self.hablar() + + def tab(self, *arg): + self._mTeclado.escribir_txt("\t") + if (self.hablar_al == "ESCRIBIR"): + self.btn_actual = self.btn_TAB + self.hablar() + + def enter(self, *arg): + self._mTeclado.escribir_txt("\n") + if (self.hablar_al == "ESCRIBIR"): + self.btn_actual = self.btn_ENTER + self.hablar() + + def borrar(self, *arg): + self._mTeclado.escribir_txt("\r") + if (self.hablar_al == "ESCRIBIR"): + self.btn_actual = self.btn_BACK_SPACE + self.hablar() + + def new_button_escribir(self, plabel): + btn = Boton(plabel) + btn.connect("pressed", self.escribir, plabel) + btn.connect("activate", self.escribir, plabel) + return btn + + + def new_button_enter(self): + btn = Boton("ENTER") + btn.set_text_desc("énter") + btn.set_font_desc("sans bold 11") + btn.connect("pressed", self.enter) + btn.connect("activate", self.enter) + return btn + + def new_button_espacio(self): + btn = Boton("ESPACIO") + btn.set_font_desc("sans bold 11") + btn.connect("pressed", self.espacio) + btn.connect("activate", self.espacio) + return btn + + def new_button_borrar(self): + btn = Boton("BORRAR") + btn.set_font_desc("sans bold 11") + btn.connect("pressed", self.borrar) + btn.connect("activate", self.borrar) + return btn + + def new_button_tab(self): + btn = Boton("TAB") + btn.set_font_desc("sans bold 11") + btn.connect("pressed", self.tab) + btn.connect("activate", self.tab) + return btn + + def new_button_mayuscula(self): + btn = Boton("MINÚSCULA") + btn.set_font_desc("sans bold 11") + btn.connect("pressed", self.set_mayuscula) + btn.connect("activate", self.set_mayuscula) + return btn + + def new_button_cambiar_tipo(self, titulo): + btn = Boton(titulo) + btn.set_font_desc("sans 9") + btn.connect("pressed", self.cambiar_tipo) + btn.connect("activate", self.cambiar_tipo) + return btn + + + def set_mayuscula(self, *arg): + if (self.MAYUSCULA): + self.btn_do.set_text("ª") + self.btn_do.set_text_desc("a superíndice") + self.btn_1.set_text("!") + self.btn_1.set_text_desc("cierro exclamación") + self.btn_2.set_text("\"") + self.btn_2.set_text_desc("comilla doble") + self.btn_3.set_text("#") + self.btn_3.set_text_desc("numeral") + self.btn_4.set_text("$") + self.btn_4.set_text_desc("peso") + self.btn_5.set_text("%") + self.btn_5.set_text_desc("porcentaje") + self.btn_6.set_text("&") + self.btn_6.set_text_desc("ámpersand") + self.btn_7.set_text("/") + self.btn_7.set_text_desc("barra") + self.btn_8.set_text("(") + self.btn_8.set_text_desc("abro paréntesis") + self.btn_9.set_text(")") + self.btn_9.set_text_desc("cierro paréntesis") + self.btn_0.set_text("=") + self.btn_0.set_text_desc("igual") + self.btn_finPreg.set_text("?") + self.btn_finPreg.set_text_desc("cierro pregunta") + self.btn_inicioPreg.set_text("¿") + self.btn_inicioPreg.set_text_desc("abro pregunta") + self.btn_Q.set_text("q") + self.btn_W.set_text("w") + self.btn_E.set_text("e") + self.btn_R.set_text("r") + self.btn_T.set_text("t") + self.btn_Y.set_text("y") + self.btn_U.set_text("u") + self.btn_I.set_text("i") + self.btn_O.set_text("o") + self.btn_P.set_text("p") + self.btn_A.set_text("a") + self.btn_S.set_text("s") + self.btn_D.set_text("d") + self.btn_F.set_text("f") + self.btn_G.set_text("g") + self.btn_H.set_text("h") + self.btn_J.set_text("j") + self.btn_K.set_text("k") + self.btn_L.set_text("l") + self.btn_enie.set_text("ñ") + self.btn_menor.set_text(">") + self.btn_menor.set_text_desc("mayor") + self.btn_Z.set_text("z") + self.btn_X.set_text("x") + self.btn_C.set_text("c") + self.btn_V.set_text("v") + self.btn_B.set_text("b") + self.btn_N.set_text("n") + self.btn_M.set_text("m") + self.btn_coma.set_text(";") + self.btn_coma.set_text_desc("punto y coma") + self.btn_punto.set_text(":") + self.btn_punto.set_text_desc("dos puntos") + self.btn_guion.set_text("_") + self.btn_guion.set_text_desc("guión bajo") + self.btn_A_tilde.set_text("á") + self.btn_A_tilde.set_text_desc("á tilde") + self.btn_E_tilde.set_text("é") + self.btn_E_tilde.set_text_desc("é tilde") + self.btn_I_tilde.set_text("í") + self.btn_I_tilde.set_text_desc("í tilde") + self.btn_O_tilde.set_text("ó") + self.btn_O_tilde.set_text_desc("ó tilde") + self.btn_U_tilde.set_text("ú") + self.btn_U_tilde.set_text_desc("ú tilde") + self.btn_U_puntos.set_text("ü") + self.btn_U_puntos.set_text_desc("u diéresis") + self.btn_abre_llave.set_text("{") + self.btn_abre_llave.set_text_desc("abro llave") + self.btn_cierra_llave.set_text("}") + self.btn_cierra_llave.set_text_desc("cierro llave") + + self.MAYUSCULA = False + self.btn_CAPS_LOCK.set_text("MAYÚSCULA") + self.btn_CAPS_LOCK.set_text_desc("MAYÚSCULA") + else: + self.btn_do.set_text("º") + self.btn_do.set_text_desc("o superíndice") + self.btn_1.set_text("1") + self.btn_1.set_text_desc("1") + self.btn_2.set_text("2") + self.btn_2.set_text_desc("2") + self.btn_3.set_text("3") + self.btn_3.set_text_desc("3") + self.btn_4.set_text("4") + self.btn_4.set_text_desc("4") + self.btn_5.set_text("5") + self.btn_5.set_text_desc("5") + self.btn_6.set_text("6") + self.btn_6.set_text_desc("6") + self.btn_7.set_text("7") + self.btn_7.set_text_desc("7") + self.btn_8.set_text("8") + self.btn_8.set_text_desc("8") + self.btn_9.set_text("9") + self.btn_9.set_text_desc("9") + self.btn_0.set_text("0") + self.btn_0.set_text_desc("0") + self.btn_finPreg.set_text("'") + self.btn_finPreg.set_text_desc("comilla simple") + self.btn_inicioPreg.set_text("¡") + self.btn_inicioPreg.set_text_desc("abro exclamación") + self.btn_Q.set_text("Q") + self.btn_W.set_text("W") + self.btn_E.set_text("E") + self.btn_R.set_text("R") + self.btn_T.set_text("T") + self.btn_Y.set_text("Y") + self.btn_U.set_text("U") + self.btn_I.set_text("I") + self.btn_O.set_text("O") + self.btn_P.set_text("P") + self.btn_A.set_text("A") + self.btn_S.set_text("S") + self.btn_D.set_text("D") + self.btn_F.set_text("F") + self.btn_G.set_text("G") + self.btn_H.set_text("H") + self.btn_J.set_text("J") + self.btn_K.set_text("K") + self.btn_L.set_text("L") + self.btn_enie.set_text("Ñ") + self.btn_menor.set_text("<") + self.btn_menor.set_text_desc("menor") + self.btn_Z.set_text("Z") + self.btn_X.set_text("X") + self.btn_C.set_text("C") + self.btn_V.set_text("V") + self.btn_B.set_text("B") + self.btn_N.set_text("N") + self.btn_M.set_text("M") + self.btn_coma.set_text(",") + self.btn_coma.set_text_desc("coma") + self.btn_punto.set_text(".") + self.btn_punto.set_text_desc("punto") + self.btn_guion.set_text("-") + self.btn_guion.set_text_desc("guión") + self.btn_A_tilde.set_text("Á") + self.btn_A_tilde.set_text_desc("Á tilde") + self.btn_E_tilde.set_text("É") + self.btn_E_tilde.set_text_desc("É tilde") + self.btn_I_tilde.set_text("Í") + self.btn_I_tilde.set_text_desc("Í tilde") + self.btn_O_tilde.set_text("Ó") + self.btn_O_tilde.set_text_desc("Ó tilde") + self.btn_U_tilde.set_text("Ú") + self.btn_U_tilde.set_text_desc("Ú tilde") + self.btn_U_puntos.set_text("Ü") + self.btn_U_puntos.set_text_desc("u diéresis") + self.btn_abre_llave.set_text("[") + self.btn_abre_llave.set_text_desc("abro paréntesis recto") + self.btn_cierra_llave.set_text("]") + self.btn_cierra_llave.set_text_desc("abro paréntesis recto") + + + self.MAYUSCULA = True + self.btn_CAPS_LOCK.set_text("MINÚSCULA") + self.btn_CAPS_LOCK.set_text_desc("MINÚSCULA") + if (self.hablar_al == "ESCRIBIR"): + self.btn_actual = self.btn_CAPS_LOCK + self.hablar() + +######################################################################## + + def set_botonesXbarridoXfila(self, widget): + state = widget.get_active() + if state: + self.BOTONESxBARRIDOxFILA = True + self.grabar_barrido("SI") + self.BOTONESxBARRIDO = False #nuevo + self.botonesXbarridoXfila() + else: + if (self.BOTONESxBARRIDOxFILA): + self.BOTONESxBARRIDOxFILA = False + self.iluminarFila(self.fila_actual_nro, "white") + self.iluminarBoton(self.btn_actual, "white") + self.BOTONESxBARRIDO = False + self.grabar_barrido("NO") + + def botonesXbarridoXfila(self): + gobject.timeout_add(self.seg, self.barrerFocusXfila1) + + def barrerFocusXfila1(self, *arg): + if not self.BOTONESxBARRIDOxFILA: + return False + self.fila_actual_nro = 1 + self.fila_actual = self.fila_1 + self.iluminarBoton(self.btn_actual, "white") #nuevo, sacarlo + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarFila(1, "Yellow") + if not self.BOTONESxBARRIDOxFILA: + return False + if self.BOTONESxBARRIDOxFILA: + if (not self.fila_2 == []): + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE,1, 2) + else: + gobject.timeout_add(self.seg, self.barrerFocusXfila1) + + def barrer_el_boton(self, btn , fila_anterior, fila_a_seguir): + if not self.BOTONESxBARRIDOxFILA: + return False + + self.fila_actual_nro = -1 + self.fila_actual = None + self.btn_actual = btn + self.iluminarFila(fila_anterior, "white") + + if (self.hablar_al == "BARRER"): + self.hablar() + + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarBoton(self.btn_actual, "Yellow") + if not self.BOTONESxBARRIDOxFILA: + return False + if self.BOTONESxBARRIDOxFILA: + if fila_a_seguir==1: + gobject.timeout_add(self.seg, self.barrerFocusXfila1) + if fila_a_seguir==2: + gobject.timeout_add(self.seg, self.barrerFocusXfila2) + if fila_a_seguir==3: + gobject.timeout_add(self.seg, self.barrerFocusXfila3) + if fila_a_seguir==4: + gobject.timeout_add(self.seg, self.barrerFocusXfila4) + if fila_a_seguir==5: + gobject.timeout_add(self.seg, self.barrerFocusXfila5) + + + + def barrerFocusXfila2(self, *arg): + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarBoton(self.btn_actual, "white") + self.fila_actual_nro = 2 + self.fila_actual = self.fila_2 + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarFila(2, "Yellow") + if not self.BOTONESxBARRIDOxFILA: + return False + if self.BOTONESxBARRIDOxFILA: + if (not self.fila_3 == []): + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE,2, 3) + else: + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE,2, 1) + + + def barrerFocusXfila3(self, *arg): + if not self.BOTONESxBARRIDOxFILA: + return False + self.fila_actual_nro = 3 + self.fila_actual = self.fila_3 + self.iluminarBoton(self.btn_actual, "white") + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarFila(3, "Yellow") + if not self.BOTONESxBARRIDOxFILA: + return False + if self.BOTONESxBARRIDOxFILA: + if (not self.fila_4 == []): + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 3, 4) + else: + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 3, 1) + + + def barrerFocusXfila4(self, *arg): + if not self.BOTONESxBARRIDOxFILA: + return False + self.fila_actual_nro = 4 + self.fila_actual = self.fila_4 + self.iluminarBoton(self.btn_actual, "white") + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarFila(4, "Yellow") + if not self.BOTONESxBARRIDOxFILA: + return False + if self.BOTONESxBARRIDOxFILA: + if (not self.fila_5 == []): + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 4, 5) + else: + if (self.teclado_tipo=="LETRAS" or self.teclado_tipo=="COMPLETO"): + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_SPACE, 4, 1) + else: + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_BACK_SPACE, 4, 1) + + + def barrerFocusXfila5(self, *arg): + if not self.BOTONESxBARRIDOxFILA: + return False + self.fila_actual_nro = 5 + self.fila_actual = self.fila_5 + self.iluminarBoton(self.btn_actual, "white") + if not self.BOTONESxBARRIDOxFILA: + return False + self.iluminarFila(5, "Yellow") + if not self.BOTONESxBARRIDOxFILA: + return False + if self.BOTONESxBARRIDOxFILA: + gobject.timeout_add(self.seg, self.barrer_el_boton, self.btn_SPACE, 5, 1) + + + def iluminarFila(self, fila, color): + if fila == 1: + for f in range(0,len(self.fila_1)): + gobject.idle_add(self.pintarControl,self.fila_1[f], color) + if fila == 2: + for f in range(0,len(self.fila_2)): + gobject.idle_add(self.pintarControl,self.fila_2[f], color) + if fila == 3: + for f in range(0,len(self.fila_3)): + gobject.idle_add(self.pintarControl,self.fila_3[f], color) + if fila == 4: + for f in range(0,len(self.fila_4)): + gobject.idle_add(self.pintarControl,self.fila_4[f], color) + if fila == 5: + for f in range(0,len(self.fila_5)): + gobject.idle_add(self.pintarControl,self.fila_5[f], color) + + def pintarControl(self, w, color): + if not w == None: + w.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse(color)) + + def mouse_boton(self, widget, event): + #evita repetición + self.bloquearHandler() + + if self.BOTONESxBARRIDO: + self.BOTONESxBARRIDO=False + self.btn_actual.emit("pressed") + #voler a empezar... + self.iluminarBoton(self.btn_actual, "white") + self.BOTONESxBARRIDOxFILA = True + self.botonesXbarridoXfila() + return + if self.BOTONESxBARRIDOxFILA: + if self.fila_actual_nro==-1: #es un boton + self.btn_actual.emit("pressed") + self.iluminarBoton(self.btn_actual, "white") #nuevo + else: + self.BOTONESxBARRIDOxFILA = False; + self.iluminarFila(self.fila_actual_nro, "white") + self.BOTONESxBARRIDO = True; + self.botonesXbarridoEnFila() + + + + def iluminarBoton(self, btn, color): + gobject.idle_add(self.pintarControl,btn, color) + + def bloquearHandler(self): + self.hilo_bloquear = threading.Thread(target = self.bloquearHandler_aux_obj) + self.hilo_bloquear.start() + self.hilo_bloquear.quit = True + + def bloquearHandler_aux_obj(self): + self.event_box.handler_block(self.ebc) + try: + seg=self.get_time_barrido_botones() + except: + seg = velocidades['media'] + + s = seg/1000 + if self.BOTONESxBARRIDOxFILA: + if self.fila_actual_nro==-1: #es un boton + if seg == velocidades['rapida']: + s = s - 0.5 + else: + s = s - 1 + time.sleep(s) + self.event_box.handler_unblock(self.ebc) + + + def botonesXbarridoEnFila(self): + gobject.idle_add(self.barrerEnFila) + + def barrerEnFila(self): + if self.BOTONESxBARRIDO: + i=0 + gobject.timeout_add(self.seg, self.barrerEnFila_aux, i) + + def barrerEnFila_aux(self, i): + if not self.BOTONESxBARRIDO: + return False + try: + self.btn_ant = self.fila_actual[i-1] + except: + return False + try: + self.btn_actual = self.fila_actual[i] + except: + self.BOTONESxBARRIDO = False + self.BOTONESxBARRIDOxFILA = True + self.botonesXbarridoXfila() + return False + if not self.BOTONESxBARRIDO: + return False + self.iluminarBoton(self.btn_ant, "white") + if not self.BOTONESxBARRIDO: + return False + self.iluminarBoton(self.btn_actual, "Yellow") + + if (self.hablar_al == "BARRER"): + self.hablar() + + if not self.BOTONESxBARRIDO: + return False + else: + gobject.timeout_add(self.seg, self.barrerEnFila_aux, i+1) + + + def combo_tiempos_botones(self): + cb = gtk.combo_box_new_text() + cb.append_text("RÁPIDO") + cb.append_text("MEDIO") + cb.append_text("LENTO") + seg = velocidades['media'] + try: + seg = self.get_time_barrido_botones() + logging.debug('seg : ' + seg) + except: + logging.debug("ERROR al leer velocidad de barrido de botones") + + if seg==velocidades['rapida']: + cb.set_active(0) + if seg==velocidades['media']: + cb.set_active(1) + if seg==velocidades['lenta']: + cb.set_active(2) + + cb.connect("changed", self.on_changed_cbo_time_btn) + return cb + + + def combo_size_botones(self): + cb = gtk.combo_box_new_text() + cb.append_text("CHICO") + cb.append_text("MEDIANO") + cb.append_text("GRANDE") + size="CHICO" + try: + size = self.get_size_botones() + except: + logging.debug("ERROR, al leer size de botones") + + if size=="CHICO": + cb.set_active(0) + if size=="MEDIANO": + cb.set_active(1) + if size=="GRANDE": + cb.set_active(2) + + cb.connect("changed", self.on_changed_cbo_size_btn) + return cb + + def combo_tipo_teclados(self): + cb = gtk.combo_box_new_text() + cb.append_text("COMPLETO") + cb.append_text("NUMÉRICO") + cb.append_text("LETRAS") + tipo="COMPLETO" + try: + tipo = self.get_tipo_teclado() + except: + logging.debug("ERROR, al leer tipo de teclado") + + if tipo=="COMPLETO": + cb.set_active(0) + if tipo=="NUMERICO": + cb.set_active(1) + if tipo=="LETRAS": + cb.set_active(2) + + cb.connect("changed", self.on_changed_cbo_tipo_teclados) + return cb + + def on_changed_cbo_tipo_teclados(self, widget): + s = widget.get_active() + + if s==0: + tipo = "COMPLETO" + if s==1: + tipo = "NUMERICO" + if s==2: + tipo = "LETRAS" + + self.set_tipo_teclado(tipo) + + self.hilo_type = threading.Thread(target = self.reset) + self.hilo_type.start() + self.hilo_type.quit = True + + self.dialog_opciones.destroy() + self.close() + + + def on_changed_cbo_size_btn(self, widget): + s = widget.get_active() + + if s==0: + size = "CHICO" + if s==1: + size = "MEDIANO" + if s==2: + size = "GRANDE" + + self.set_size_botones(size) + + self.hilo_size = threading.Thread(target = self.reset) + self.hilo_size.start() + self.hilo_size.quit = True + + self.dialog_opciones.destroy() + self.close() + + + def on_changed_cbo_time_btn(self, widget): + s = widget.get_active() + + if s==0: + seg = velocidades['rapida'] + if s==1: + seg = velocidades['media'] + if s==2: + seg = velocidades['lenta'] + + self.set_time_barrido_botones(seg) + self.seg=seg + + + + def get_time_barrido_botones(self): + client = gconf.client_get_default() + return client.get_int("/desktop/sugar/virtualkeyboard/time") + + def set_time_barrido_botones(self, seg): + client = gconf.client_get_default() + client.set_int("/desktop/sugar/virtualkeyboard/time", seg) + + def get_size_botones(self): + client = gconf.client_get_default() + return client.get_string("/desktop/sugar/virtualkeyboard/size") + + def set_size_botones(self, size): + client = gconf.client_get_default() + client.set_string("/desktop/sugar/virtualkeyboard/size", size) + + def set_hablar(self, hablar): + client = gconf.client_get_default() + client.set_string("/desktop/sugar/virtualkeyboard/hablar", hablar) + self.hablar_al = hablar + + def get_tipo_teclado(self): + client = gconf.client_get_default() + return client.get_string("/desktop/sugar/virtualkeyboard/tipo") + + def set_tipo_teclado(self, tipo): + client = gconf.client_get_default() + client.set_string("/desktop/sugar/virtualkeyboard/tipo", tipo) + + def leer_barrido(self): + client = gconf.client_get_default() + return client.get_string("/desktop/sugar/virtualkeyboard/barrido") + + + def grabar_barrido(self, barrido): + client = gconf.client_get_default() + client.set_string("/desktop/sugar/virtualkeyboard/barrido", barrido) + + def get_opciones_hablar(self): + client = gconf.client_get_default() + return client.get_string("/desktop/sugar/virtualkeyboard/hablar") + + def set_opciones_hablar(self, widget, data=None): + if (widget.get_active()): + self.set_hablar(data) + + def inicilizar_config(self): + client = gconf.client_get_default() + if not client.dir_exists("/desktop/sugar/virtualkeyboard"): + self.set_time_barrido_botones(self.seg) + self.set_size_botones(self.size) + self.set_hablar(self.hablar_al) + self.set_tipo_teclado(self.teclado_tipo) + if self.BOTONESxBARRIDOxFILA: + self.grabar_barrido("SI") + else: + self.grabar_barrido("NO") + + def new_button(self, icon, label, callbackstr): + btn = Boton(label) + btn.set_font_desc("sans 9") + btn.connect("pressed", callbackstr) + if (not icon == None): + btn.set_icon(icon) + return btn + + + def sizeBotones(self, desc): + for btn in self.losBotones: + btn.set_font_desc(desc) + + def reset(self): + self.close() + Teclado() + + def hablar(self): + self.hilo_hablar = threading.Thread(target=self.hablar_aux) + self.hilo_hablar.start() + self.hilo_hablar.quit=True + + def hablar_aux(self): + texto = "" + v = "" + try: + texto = self.btn_actual.get_text_desc() + except: + return + if (not texto == ""): + try: + seg=self.get_time_barrido_botones() + except: + seg = velocidades['media'] + if seg == velocidades['rapida']: + v = hablar['rapida'] + if seg == velocidades['media']: + v = hablar['media'] + if seg == velocidades['lenta']: + v = hablar['lenta'] + self._mTeclado.hablar(texto, v) + + def desplegar_opciones(self, *arg): + try: + if (self.dialog_opciones.get_property('visible')): + return + except: + pass + + self.dialog_opciones = gtk.Dialog() + self.dialog_opciones.set_title("OPCIONES") + self.dialog_opciones.set_keep_above(True) + + #opciones hablar + box_hablar = gtk.VBox(False, 10) + box_hablar.set_border_width(20) + + button = gtk.RadioButton(None, "HABLAR AL BARRER BOTONES.") + button.connect("toggled", self.set_opciones_hablar, "BARRER") + if (self.get_opciones_hablar()=="BARRER"): + button.set_active(True) + box_hablar.pack_start(button, True, True, 0) + button = gtk.RadioButton(button, "HABLAR AL ESCRIBIR.") + button.connect("toggled", self.set_opciones_hablar, "ESCRIBIR") + if (self.get_opciones_hablar()=="ESCRIBIR"): + button.set_active(True) + box_hablar.pack_start(button, True, True, 0) + button = gtk.RadioButton(button, "NO HABLAR.") + button.connect("toggled", self.set_opciones_hablar, "NUNCA") + if (self.get_opciones_hablar()=="NUNCA"): + button.set_active(True) + box_hablar.pack_start(button, True, True, 0) + self.dialog_opciones.vbox.pack_start(box_hablar, True, True, 0) + + separator_hablar = gtk.HSeparator() + self.dialog_opciones.vbox.pack_start(separator_hablar, expand=False) + separator_hablar.show() + + #opciones de barrido + box_barrido = gtk.VBox(False, 10) + box_barrido.set_border_width(20) + + lbl_op_botones = gtk.Label("Barrer:") + lbl_op_botones.show() + box_barrido.pack_start(lbl_op_botones, True, True, 0) + + self.chk_activarBarrido_botones = gtk.CheckButton("_BOTONES") + + barriendo= "" + try: + barriendo = self.leer_barrido() + except: + barriendo == "NO" + if barriendo == "SI": + self.BOTONESxBARRIDOxFILA = True + elif barriendo == "NO": + self.BOTONESxBARRIDOxFILA = False + else: + logging.error("Error al leer barrido." + str(barriendo)) + + + self.chk_activarBarrido_botones.set_active(self.BOTONESxBARRIDOxFILA or self.BOTONESxBARRIDO) + self.chk_activarBarrido_botones.connect("toggled", self.set_botonesXbarridoXfila) + box_barrido.pack_start(self.chk_activarBarrido_botones, True, True, 0) + + lbl_op_velocidad = gtk.Label("Velocidad:") + lbl_op_velocidad.show() + box_barrido.pack_start(lbl_op_velocidad, True, True, 0) + + self.cbo_time_btn = self.combo_tiempos_botones() + box_barrido.pack_start(self.cbo_time_btn, True, True, 0) + self.dialog_opciones.vbox.pack_start(box_barrido, True, True, 0) + + separator_barrido = gtk.HSeparator() + self.dialog_opciones.vbox.pack_start(separator_barrido, expand=False) + separator_barrido.show() + + #opciones de tamaño + box_size = gtk.VBox(False, 10) + box_size.set_border_width(20) + + lbl_op_size = gtk.Label("Tamaño:") + lbl_op_size.show() + box_size.pack_start(lbl_op_size, True, True, 0) + + self.cbo_size_btn = self.combo_size_botones() + box_size.pack_start(self.cbo_size_btn, True, True, 0) + self.dialog_opciones.vbox.pack_start(box_size, True, True, 0) + + separator_size = gtk.HSeparator() + self.dialog_opciones.vbox.pack_start(separator_size, expand=False) + separator_size.show() + + #tipo + box_teclado = gtk.VBox(False, 10) + box_teclado.set_border_width(20) + + lbl_op_tipo = gtk.Label("Tipo:") + lbl_op_tipo.show() + box_teclado.pack_start(lbl_op_tipo, True, True, 0) + + self.cbo_tipo_teclado = self.combo_tipo_teclados() + box_teclado.pack_start(self.cbo_tipo_teclado, True, True, 0) + self.dialog_opciones.vbox.pack_start(box_teclado, True, True, 0) + + separator_tipo = gtk.HSeparator() + self.dialog_opciones.vbox.pack_start(separator_tipo, expand=False) + separator_tipo.show() + + self.dialog_opciones.show_all() + + + + def set_opciones_hablar(self, widget, data=None): + if (widget.get_active()): + self.set_hablar(data) +################################################################################################################ + def mostrar_teclado_numerico(self): + child = gtk.VBox(False, 2) + + self.fila_1 = [] + self.fila_2 = [] + self.fila_3 = [] + self.fila_4 = [] + self.fila_5 = [] + self.losBotones = [] + + # defino botones + self.btn_BACK_SPACE = self.new_button_borrar() + self.losBotones.append(self.btn_BACK_SPACE) + + self.btn_1 = self.new_button_escribir("1") + self.losBotones.append(self.btn_1) + self.fila_3.append(self.btn_1) + + self.btn_2 = self.new_button_escribir("2") + self.losBotones.append(self.btn_2) + self.fila_3.append(self.btn_2) + + self.btn_3 = self.new_button_escribir("3") + self.losBotones.append(self.btn_3) + self.fila_3.append(self.btn_3) + + self.btn_4 = self.new_button_escribir("4") + self.losBotones.append(self.btn_4) + self.fila_2.append(self.btn_4) + + self.btn_5 = self.new_button_escribir("5") + self.losBotones.append(self.btn_5) + self.fila_2.append(self.btn_5) + + self.btn_6 = self.new_button_escribir("6") + self.losBotones.append(self.btn_6) + self.fila_2.append(self.btn_6) + + self.btn_7 = self.new_button_escribir("7") + self.losBotones.append(self.btn_7) + self.fila_1.append(self.btn_7) + + self.btn_8 = self.new_button_escribir("8") + self.losBotones.append(self.btn_8) + self.fila_1.append(self.btn_8) + + self.btn_9 = self.new_button_escribir("9") + self.losBotones.append(self.btn_9) + self.fila_1.append(self.btn_9) + + self.btn_0 = self.new_button_escribir("0") + self.losBotones.append(self.btn_0) + self.fila_4.append(self.btn_0) + + self.btn_asterisco = self.new_button_escribir("*") + self.btn_asterisco.set_text_desc("por") + self.losBotones.append(self.btn_asterisco) + self.fila_3.append(self.btn_asterisco) + + self.btn_barra = self.new_button_escribir("/") + self.btn_barra.set_text_desc("dividido") + self.losBotones.append(self.btn_barra) + self.fila_3.append(self.btn_barra) + + self.btn_mas = self.new_button_escribir("+") + self.btn_mas.set_text_desc("más") + self.losBotones.append(self.btn_mas) + self.fila_2.append(self.btn_mas) + + self.btn_punto = self.new_button_escribir(".") + self.btn_punto.set_text_desc("punto") + self.losBotones.append(self.btn_punto) + self.fila_4.append(self.btn_punto) + + self.btn_guion = self.new_button_escribir("-") + self.btn_guion.set_text_desc("menos") + self.losBotones.append(self.btn_guion) + self.fila_2.append(self.btn_guion) + + self.btn_ENTER = self.new_button_enter() + self.losBotones.append(self.btn_ENTER) + self.fila_4.append(self.btn_ENTER) + + self.btn_opciones = self.new_button(gtk.STOCK_PREFERENCES, None ,self.desplegar_opciones) + self.btn_cambiar_tipo = self.new_button_cambiar_tipo("ABC") + self.fila_4.append(self.btn_cambiar_tipo) + + table = gtk.Table(6, 11, True) + + table.set_row_spacing(0, 3) + table.set_row_spacing(1, 3) + table.set_row_spacing(2, 3) + table.set_row_spacing(3, 3) + table.set_row_spacing(4, 3) + table.set_row_spacing(5, 3) + + table.set_col_spacing(0, 3) + table.set_col_spacing(1, 3) + table.set_col_spacing(2, 3) + table.set_col_spacing(3, 3) + table.set_col_spacing(4, 3) + table.set_col_spacing(5, 15) + table.set_col_spacing(6, 3) + table.set_col_spacing(7, 3) + table.set_col_spacing(8, 3) + table.set_col_spacing(9, 3) + table.set_col_spacing(10, 15) + + table.attach(self.btn_7, 0, 2, 0, 2) + table.attach(self.btn_8, 2, 4, 0, 2) + table.attach(self.btn_9, 4, 6, 0, 2) + table.attach(self.btn_BACK_SPACE, 6, 10, 0, 2) + + table.attach(self.btn_4, 0, 2, 2, 4) + table.attach(self.btn_5, 2, 4, 2, 4) + table.attach(self.btn_6, 4, 6, 2, 4) + table.attach(self.btn_mas, 6, 8, 2, 4) + table.attach(self.btn_guion, 8, 10, 2, 4) + + table.attach(self.btn_1, 0, 2, 4, 6) + table.attach(self.btn_2, 2, 4, 4, 6) + table.attach(self.btn_3, 4, 6, 4, 6) + table.attach(self.btn_asterisco, 6, 8, 4, 6) + table.attach(self.btn_barra, 8, 10, 4, 6) + + table.attach(self.btn_0, 0, 2, 6, 8) + table.attach(self.btn_punto, 2, 4, 6, 8) + table.attach(self.btn_ENTER, 6, 10, 6, 8) + + table.attach(self.btn_opciones, 10, 11, 6, 7) + table.attach(self.btn_cambiar_tipo, 10, 11, 7, 8) + + + child.pack_end(table, True, True, 0) + + return child + + def posicionar_dialog(self, dialog): + dialog.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST) + width, height = dialog.get_size() + dialog.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height) + + def mostrar_teclado_letras(self): + self.fila_1 = [] + self.fila_2 = [] + self.fila_3 = [] + self.fila_4 = [] + self.fila_5 = [] + self.losBotones = [] + + child = gtk.VBox(False, 2) + + # defino botones + self.btn_BACK_SPACE = self.new_button_borrar() + self.losBotones.append(self.btn_BACK_SPACE) + + self.btn_SPACE = self.new_button_espacio() + self.losBotones.append(self.btn_SPACE) + + self.btn_ENTER = self.new_button_enter() + self.losBotones.append(self.btn_ENTER) + self.fila_2.append(self.btn_ENTER) + + self.btn_Q = self.new_button_escribir("Q") + self.losBotones.append(self.btn_Q) + self.fila_1.append(self.btn_Q) + + self.btn_W = self.new_button_escribir("W") + self.losBotones.append(self.btn_W) + self.fila_1.append(self.btn_W) + + self.btn_E = self.new_button_escribir("E") + self.losBotones.append(self.btn_E) + self.fila_1.append(self.btn_E) + + self.btn_R = self.new_button_escribir("R") + self.losBotones.append(self.btn_R) + self.fila_1.append(self.btn_R) + + self.btn_T = self.new_button_escribir("T") + self.losBotones.append(self.btn_T) + self.fila_1.append(self.btn_T) + + self.btn_Y = self.new_button_escribir("Y") + self.losBotones.append(self.btn_Y) + self.fila_1.append(self.btn_Y) + + self.btn_U = self.new_button_escribir("U") + self.losBotones.append(self.btn_U) + self.fila_1.append(self.btn_U) + + self.btn_I = self.new_button_escribir("I") + self.losBotones.append(self.btn_I) + self.fila_1.append(self.btn_I) + + self.btn_O = self.new_button_escribir("O") + self.losBotones.append(self.btn_O) + self.fila_1.append(self.btn_O) + + self.btn_P = self.new_button_escribir("P") + self.losBotones.append(self.btn_P) + self.fila_1.append(self.btn_P) + + self.btn_A = self.new_button_escribir("A") + self.losBotones.append(self.btn_A) + self.fila_2.append(self.btn_A) + + self.btn_S = self.new_button_escribir("S") + self.losBotones.append(self.btn_S) + self.fila_2.append(self.btn_S) + + self.btn_D = self.new_button_escribir("D") + self.losBotones.append(self.btn_D) + self.fila_2.append(self.btn_D) + + self.btn_F = self.new_button_escribir("F") + self.losBotones.append(self.btn_F) + self.fila_2.append(self.btn_F) + + self.btn_G = self.new_button_escribir("G") + self.losBotones.append(self.btn_G) + self.fila_2.append(self.btn_G) + + self.btn_H = self.new_button_escribir("H") + self.losBotones.append(self.btn_H) + self.fila_2.append(self.btn_H) + + self.btn_J = self.new_button_escribir("J") + self.losBotones.append(self.btn_J) + self.fila_2.append(self.btn_J) + + self.btn_K = self.new_button_escribir("K") + self.losBotones.append(self.btn_K) + self.fila_2.append(self.btn_K) + + self.btn_L = self.new_button_escribir("L") + self.losBotones.append(self.btn_L) + self.fila_2.append(self.btn_L) + + self.btn_enie = self.new_button_escribir("Ñ") + self.losBotones.append(self.btn_enie) + self.fila_2.append(self.btn_enie) + + self.btn_Z = self.new_button_escribir("Z") + self.losBotones.append(self.btn_Z) + self.fila_3.append(self.btn_Z) + + self.btn_X = self.new_button_escribir("X") + self.losBotones.append(self.btn_X) + self.fila_3.append(self.btn_X) + + self.btn_C = self.new_button_escribir("C") + self.losBotones.append(self.btn_C) + self.fila_3.append(self.btn_C) + + self.btn_V = self.new_button_escribir("V") + self.losBotones.append(self.btn_V) + self.fila_3.append(self.btn_V) + + self.btn_B = self.new_button_escribir("B") + self.losBotones.append(self.btn_B) + self.fila_3.append(self.btn_B) + + self.btn_N = self.new_button_escribir("N") + self.losBotones.append(self.btn_N) + self.fila_3.append(self.btn_N) + + self.btn_M = self.new_button_escribir("M") + self.losBotones.append(self.btn_M) + self.fila_3.append(self.btn_M) + + self.btn_A_tilde = self.new_button_escribir("Á") + self.btn_A_tilde.set_text_desc("Á tilde") + self.losBotones.append(self.btn_A_tilde) + self.fila_4.append(self.btn_A_tilde) + + self.btn_E_tilde = self.new_button_escribir("É") + self.btn_E_tilde.set_text_desc("É tilde") + self.losBotones.append(self.btn_E_tilde) + self.fila_4.append(self.btn_E_tilde) + + self.btn_I_tilde = self.new_button_escribir("Í") + self.btn_I_tilde.set_text_desc("Í tilde") + self.losBotones.append(self.btn_I_tilde) + self.fila_4.append(self.btn_I_tilde) + + self.btn_O_tilde = self.new_button_escribir("Ó") + self.btn_O_tilde.set_text_desc("Ó tilde") + self.losBotones.append(self.btn_O_tilde) + self.fila_4.append(self.btn_O_tilde) + + self.btn_U_tilde = self.new_button_escribir("Ú") + self.btn_U_tilde.set_text_desc("Ú tilde") + self.losBotones.append(self.btn_U_tilde) + self.fila_4.append(self.btn_U_tilde) + + self.btn_opciones = self.new_button(gtk.STOCK_PREFERENCES, " ", self.desplegar_opciones) + self.btn_cambiar_tipo = self.new_button_cambiar_tipo("123") + self.fila_4.append(self.btn_cambiar_tipo) + + #dibujo tabla + table = gtk.Table(7, 13, True) + + table.set_row_spacing(0, 3) + table.set_row_spacing(1, 3) + table.set_row_spacing(2, 13) + table.set_row_spacing(3, 10) + table.set_row_spacing(4, 3) + table.set_row_spacing(5, 3) + table.set_row_spacing(6, 3) + + table.set_col_spacing(0, 3) + table.set_col_spacing(1, 3) + table.set_col_spacing(2, 3) + table.set_col_spacing(3, 3) + table.set_col_spacing(4, 3) + table.set_col_spacing(5, 3) + table.set_col_spacing(6, 3) + table.set_col_spacing(7, 3) + table.set_col_spacing(8, 3) + table.set_col_spacing(9, 3) + table.set_col_spacing(10, 3) + table.set_col_spacing(11, 13) + table.set_col_spacing(12, 3) + + + table.attach(self.btn_Q, 0, 1, 0, 1) + table.attach(self.btn_W, 1, 2, 0, 1) + table.attach(self.btn_E, 2, 3, 0, 1) + table.attach(self.btn_R, 3, 4, 0, 1) + table.attach(self.btn_T, 4, 5, 0, 1) + table.attach(self.btn_Y, 5, 6, 0, 1) + table.attach(self.btn_U, 6, 7, 0, 1) + table.attach(self.btn_I, 7, 8, 0, 1) + table.attach(self.btn_O, 8, 9, 0, 1) + table.attach(self.btn_P, 9, 10, 0, 1) + table.attach(self.btn_A, 0, 1, 1, 2) + table.attach(self.btn_S, 1, 2, 1, 2) + table.attach(self.btn_D, 2, 3, 1, 2) + table.attach(self.btn_F, 3, 4, 1, 2) + table.attach(self.btn_G, 4, 5, 1, 2) + table.attach(self.btn_H, 5, 6, 1, 2) + table.attach(self.btn_J, 6, 7, 1, 2) + table.attach(self.btn_K, 7, 8, 1, 2) + table.attach(self.btn_L, 8, 9, 1, 2) + table.attach(self.btn_Z, 0, 1, 2, 3) + table.attach(self.btn_X, 1, 2, 2, 3) + table.attach(self.btn_C, 2, 3, 2, 3) + table.attach(self.btn_V, 3, 4, 2, 3) + table.attach(self.btn_B, 4, 5, 2, 3) + table.attach(self.btn_N, 5, 6, 2, 3) + table.attach(self.btn_M, 6, 7, 2, 3) + + table.attach(self.btn_BACK_SPACE, 10, 13, 0, 1) + table.attach(self.btn_ENTER, 10, 13, 1, 2) + table.attach(self.btn_SPACE, 1, 9, 4, 5) + table.attach(self.btn_opciones, 12, 13, 4, 5) + table.attach(self.btn_cambiar_tipo, 12, 13, 3, 4) + + + table.attach(self.btn_A_tilde, 1, 2, 3, 4) + table.attach(self.btn_E_tilde, 2, 3, 3, 4) + table.attach(self.btn_I_tilde, 3, 4, 3, 4) + table.attach(self.btn_O_tilde, 4, 5, 3, 4) + table.attach(self.btn_U_tilde, 5, 6, 3, 4) + + child.pack_end(table, True, True, 0) + + return child + + def get_size_dialog(self, size, teclado_tipo): + if teclado_tipo == "COMPLETO": + if size == "CHICO": + return 700, 335 + if size == "MEDIANO": + return 1000, 400 + if size == "GRANDE": + return 1200, 475 + + if teclado_tipo == "NUMERICO": + if size == "CHICO": + return 700, 400 + if size == "MEDIANO": + return 900, 400 + if size == "GRANDE": + return 1200, 500 + + if teclado_tipo == "LETRAS": + if size == "CHICO": + return 830, 290 + if size == "MEDIANO": + return 1000, 330 + if size == "GRANDE": + return 1200, 550 + + def get_font_desc(self, size, teclado_tipo): + if teclado_tipo == "COMPLETO": + if size == "CHICO": + return "sans 7" + if size == "MEDIANO": + return "sans bold 13" + if size == "GRANDE": + return "sans bold 15" + + if teclado_tipo == "NUMERICO": + if size == "CHICO": + return "sans bold 7" + if size == "MEDIANO": + return "sans bold 13" + if size == "GRANDE": + return "sans bold 28" + + if teclado_tipo == "LETRAS": + if size == "CHICO": + return "sans 7" + if size == "MEDIANO": + return "sans bold 13" + if size == "GRANDE": + return "sans bold 26" + + def cambiar_tipo(self, w): + + if (self.teclado_tipo=="NUMERICO"): + tipo = "LETRAS" + else: + tipo = "NUMERICO" + + self.set_tipo_teclado(tipo) + + self.hilo_type = threading.Thread(target = self.reset) + self.hilo_type.start() + self.hilo_type.quit = True + + self.close() + +class Boton(gtk.Button): + font_desc = '' + font_color = '' + fondo_color = '' + text = '' + text_desc = '' + + def __init__(self, nom=None): + gtk.Button.__init__(self) + + self.hbox = gtk.HBox(False, 0) + self.add(self.hbox) + + self.label = gtk.Label() + self.set_text(nom) + + self.set_text(nom) + self.set_text_desc(nom) + self.set_font_desc('sans bold 13') + self.set_font_color('black') + self.set_fondo_color('white') + + self.label.set_use_underline(True) + self.hbox.add(self.label) + + def set_font_desc(self, pfont_desc): + self.font_desc = pfont_desc + self.label.modify_font(pango.FontDescription(pfont_desc)) + + def set_font_color(self, pfont_color): + self.font_color = pfont_color + self.label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(pfont_color)) + + def set_fondo_color(self, pfondo_color): + self.fondo_color = pfondo_color + self.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse(pfondo_color)) + + def set_text(self, ptext): + if (not ptext == None): + self.text = ptext + self.label.set_text(self.text) + + def get_font_desc(self): + return self.font_desc + + def get_font_color(self): + return self.font_color + + def get_fondo_color(self): + return self.fondo_color + + def get_text(self): + return self.text + + def is_visible(self): + self.get_property('visible') + + def get_text_desc(self): + return self.text_desc + + def set_text_desc(self, ptext_desc): + self.text_desc = ptext_desc + + def set_icon(self, icon): + #http://www.pygtk.org/docs/pygtk/gtk-stock-items.html + s = gtk.Style() + icon = s.lookup_icon_set(icon).render_icon(s, gtk.TEXT_DIR_LTR, gtk.STATE_NORMAL, gtk.ICON_SIZE_BUTTON, self.hbox, None) + img = gtk.Image() + img.set_from_pixbuf(icon) + self.hbox.add(img) -- 1.7.6