[LUG.ro Mix] dev: sugerencias para controlador simple para chatarra circuit-bent?

Manuel Naranjo naranjo.manuel en gmail.com
Sab Sep 12 15:48:39 ART 2009


Lara,
> hay algo como lugro-dev en lugro.org.ar? lugro.org.ar no me responde y no
> me puedo fijar.
>   
Hay una lista de programación: programacion en lugro.org.ar
> estoy haciendo una muñeca que si la electrocutás habla, con un
> circuito de mouse adentro. los clicks están conectados a placas de
> cobre en su pecho/pubis/sienes, y le sale un cable pelado que al tocar
> las placas los clickea. la voy a usar para disparar voces pregrabadas.
>
> la muñeca ya anda, pero necesito hacerle un controlador. como el laser
> del desplazamiento no anda sólo tengo la ruedita de scroll, que le
> sale de la espalda.
>   
Que cosa bizarra por dios! no es un tanto cruel eso?

> mi idea era la siguiente. hacer una lista de botones uno sobre el
> otro. con la ruedita scroll elegís sobre cual pararte. para cada botón
> con la electrocución dependiendo del click (izq, der, med, todas las
> combinaciones de a dos) disparás un sonido diferente.
>
> lo iba a hacer en javascript, pero se me complica combinar los
> botones. aparentemente lo de que cada boton de click tire un valor tal
> que al sumarlos como sea de a dos no se pisen (1, 2, 4 - ej 3 sería
> 1+2, etc) funciona solo en teoría y solo en IE. iceweasel y todos los
> gecko tiran 1,2,3 o 0,1,2, y no se puede combinar derecho de entrada.
>   
En realidad se puede en todos, lo que tenes que hacer es manejar el 
evento onmousedown y el onmouseup. Si el usuario presiona un sólo botón 
salis como piña con el onmousedown, pero si queres poder manejar una 
combinación de botones, entonces vas a tener que meter todos los 
onmousedown en un array y después limpiar el array cuando detectes que 
se suelta el botón.

Que raro que IE haga las cosas como se le cante, primero tenes que 
identificar el browser, y definir un par de variables globales:
    var stack=Array();                                 
                                                       
    var LEFT = 1;                                      
    var MIDDLE = 2;                                    
    var RIGHT = 3;                                     
                                                       
    if ( navigator.appName == "Microsoft Internet Explorer" 
){                                                         
        MIDDLE = 4;                                        
        RIGHT = 2;                                         
    }

También vas a necesitar otra variable global que te haga las veces de 
pila de botones apretados:
var stack = Array();

luego en el evento onmousedown haces algo como:
    function mousedown(event)                              
    { 
        if ( navigator.appName == "Microsoft Internet Explorer" )
             stack.push(event.button)
        else
            stack.push(event.which)
    }

Y por último en el evento onmouseup tendrías que hacer algo como:

    function mouseup(event){                               
        if (stack.length > 0){                             
            var flags = 0
            for (var i in stack){
                var j = stack[i];
                if ( j == LEFT ){
                    flags+=1
                }  else if ( j == MIDDLE ){
                    flags+=2
                }else if ( j == RIGHT ){
                    flags+=4
                }
            }
            stack.length = 0
/* en este momento flags tiene un formato como
flag = 1 se apreto izquierdo
flag = 2 se apreto derecho
flag = 3 se apreto izq + der
flag = 4 se apreto centro
flag = 5 se apreto centro + izq
flag = 6 se apreto centro + der
flag = 7 se apreto izq+centro+der
*/
        }
}

La forma para registrarte para dichos eventos sería:
<b><A onmousedown="mousedown(event)" 
onmouseup="mouseup(event)">Hola!</a></b>

El (event) es importantisimo sino te va a dar cualquiera.

Lo que te puede ser muy útil es pasarle oncontextmenu="return false;" al 
<body>:
<body oncontextmenu="return false;">

Entonces no vas a tener el menú del botón derecho.
> si no: con qué otra cosa lo puedo hacer que sea simple? (esp: python
> què tanto me serviría?) en cualquier caso, nunca programé gráficos.
> sugerencias de lib para gui para principiantes?
>   
Podría ser una aplicación python con un web server embebido, esto es 
posible con Twisted, pero la forma javascript parece más simple. Ya que 
tu aplicación de cierta forma es estática (no genera contenido web 
dinámico).

Manu


Más información sobre la lista de distribución Lugro-mix