El ratón

Este es un periférico habitual de nuestro trabajo con un computador. La utilización de interfaces gráficas hace posible tareas con un una alta componente visual y el ratón es un medio para que el usuario pueda señalar una posición en la ventana. Hemos utilizado mucho el evento mouseUp para hacer que un control, señalado físicamente con el ratón de manera arbitraria por el usuario o por que se le ha enviado el evento por la aplicación, haga su tarea.

Una de las facetas más interesantes de las órdenes asociadas con el ratón es choose: puede hacerse su propia paleta de herramientas o utilizarlas para crear en la ejecución de su aplicación un botón o pintar un área con el aerosol (spray). Aquí revisaremos las posibilidades de actuar conforme el ratón se mueve por la pantalla, o mejor dicho por la ventana de nuestra aplicación. Básicamente utilizaremos las coordenas de este para realizar algún tipo de actividad. Por ejemplo, podríamos mover un objeto que no està dentro de la ventana que define la pila:

move button "accio" to the mouseLoc
                    

También es posible ocultarlo, moverlo y como haremos en diferentes ocasiones cambiar la apariencia del mismo. Esto último no tanto para lucirnos sino para informar al usuario de que se está realizando una tarea (que está ocupada la máquina aunque no se vean resultados en pantalla) o que está en disposición de empezarla. Muchas de estas tareas se realizan con los cursores que incorporan las herramientas y así hay definidas una serie de identificadores estándar par las situaciones habituales, tal como reza en la ayuda de MetaCard: none, arrow, busy, clock, cross, hand, iBeam, plus, watch y help

Nota: Pero recuerde que esas constantes son sólo identificadores a imágenes de una subpila de MetaCard. Así que, si de verdad lo necesita, puede importar una imagen, ocultarla y utilizar el id de las propiedades de esta para asignarselo a la propiedad cursor. ¡Haga la prueba!

Centrándonos en mover cosas con el ratón, en muchos lenguajes existen las órdenes drag o grab. Aquí también, pero hay que tener una cosa presente al respecto de utilizarlas:

Implementación de una banda elástica

Otro ejemplo que puede ser de interés es la construcción de una banda elástica o de goma que permita identificar un área de, por ejemplo una imagen, con intención de señalar el área de interés de la misma donde aplicar un determinado proceso. Así que el contexto es el de una pila donde se encuentra un objeto de tipo image y sobre el que, a voluntad del usuario, se hará visible la selección de un área rectangular de la misma utilizando el ratón. Cuando este pulse un botón se inicia el proceso, que durará mientras lo mantenga pulsado y acabará cuando lo levante.

Parece que todo el código de la imagen gira en torno al evento mouseMove y el conjunto de coordenas que este nos devuelve utilzarlas para pintar un rectángulo, execpto en los casos de incio y fin de la actividad, así que podemos pensar en algo como:

#
# Imagen "gImatgeOriginal"
#
on mouseDown
  send "bandaActiva" to graphic "bandaElastica"
end mouseDown

on mouseUp
  send "bandaInactiva" to graphic "bandaElastica"
end mouseUp

on mouseMove x,  y
  send ("actualitzaBanda " & x & "," & y) to graphic "bandaElastica"
end mouseMove
                    

Dejando la responsabilidad del trabajo en el gráfico, quien debe mantener actualizadas las coordenas asignadas a su área de trabajo. Seleccionando el gráfico con el icono Graphic tool (rectangle) el resto puede ser sencillo:.

Esta lista de acciones se puede implementar como:

#
# Gráfico "bandaElastica"
#
local x0, y0, \
    x1, y1, estesNoFanFaltaPerAraComprobahhoooo,\
    seguintLaBandaElastica

on bandaActiva
  put the first item of the mouseLoc into x0
  put the second item of the mouseLoc into y0
  set the rectangle of me to x0,y0,x0,y0
  put true into seguintLaBandaElastica
end bandaActiva

on bandaInactiva
  put false into seguintLaBandaElastica
  put the rect of me 
end bandaInactiva

on actualitzaBanda x,  y
  if (seguintLaBandaElastica) then \
      set the rectangle of graphic "bandaElastica" to \
      x0,y0,\
      min( the third item of the rect of image "gImatgeOriginal", x), \
      min( the fourth item of the rect of image "gImatgeOriginal",  y )
end actualitzaBanda
                    

Sólo un único detalle final: puesto que es una cuestión que se utiliza como interfaz para el usuario, hay que mantener a este informado de lo que se hace. Así que será interesante saber que sobre esa imagen sucede "algo": cambiaremos la forma del cursor para este caso, utilizando los eventos que nos indican que se entra o se sale del área de trabajo de un objeto. El código se añade al ya existente de la imagen, antes o después del anterior y es de la forma:

#
# Imagen "gImatgeOriginal"
#
on mouseEnter
  set the lockCursor to true
  set the cursor to cross  
end mouseEnter

on mouseLeave
  set the lockCursor to false
end mouseLeave
                    

Figura 5-6. Un momento de la ejecución de la aplicación de demostración de la "banda de goma"