Siguiendo al ratón

Una de las necesidades básicas de cualquier programa es aumentar la interacción con el usuario. Es decir, que el usuario tenga una información de que esta pasando, que esta haciendo. En ocasiones es muy importante poder seguir los movimientos del ratón. Bien para poder informar de algún punto de la pantalla, bien para dibujar siguiendo al ratón u otras opciones.

Es evidente que seguir siempre y en todo al ratón significa una carga muy importante para cualquier ordenador. Por eso hay varias estrategias para evitar al máximo el seguimiento del ratón. En primer lugar el seguimiento no esta activado siempre, solamente cuando se activa expresamente. En este artículo explicaré como se hace. Pero también hay estrategias más interesantes. Pero en Cocoa también se evita seguir al ratón en todas las tareas, por ejemplo si solamente hace falta cambiar el símbolo del cursor al pasar sobre un objeto no hace falta el seguimiento.

Para seguir al ratón nos harán falta tres cosas:
1. Establecer que la vista con la que trabajamos sea responsable de la respuesta
2. Crear el área de seguimiento
3. Aceptar los eventos de seguimiento
4. Reescribir las funciones para gestionar los eventos del ratón

¡Atención! Este método sirve para Tiger (10.4.x) y para Leopard (10.5.x) pero en este último es un método desaconsejado y puede dejar de funcionar en versiones futuras. Más información en addTrackingArea:.

1. Responsable de la primera respuesta

Para seguir al ratón lo primero es crear una vista personalizada (ver ….) y convertir esta vista en receptora primaria de los distintos eventos del sistema. Para ello simplemente sobreescribir la función acceptsFirstResponder

- (BOOL)acceptsFirstResponder {
return YES;
}

2. Crear el área de seguimiento

El siguiente paso es definir un área de seguimiento. Esto se hace con el método creando un objeto del tipo NSTrackingRectTag y asignando el área de seguimiento con el mensaje addTrackingRect:, por ejemplo:

areaSeguimiento = [self addTrackingRect:[self visibleRect]
    owner: self
    userData: nil
    assumeInside: YES];

En el código anterior areaSeguimiento es un objeto del tipo NSTrackingRectTag que se ha inicializado anteriormente. Quien recibe el mensaje addTrackingRect: es la propia vista ( y no tenemos que programar nada, maravillas de la herencia Cocoa :) ). Como parámetros hay que enviar el objeto NSRect (rectángulo) dónde se va a hacer el seguimiento ([self visibleRect]). Quien se encarga de la gestión del seguimiento (owner:self), en este caso la propia vista, pero podría ser otro objeto. También los datos del evento para el usuario (userData: nil), en el ejemplo, nada, nil. Y cómo último parámetro si se asume que el ratón comienza estando dentro o fuera del área de seguimiento.

3. Aceptar los eventos de seguimiento

Pese a crear el área de seguimiento además hay que activarla. Para ello hay que enviar el mensaje SetAcceptsMouseMovedEvents:YES a la ventana (sí, a la ventana) dónde esta incluida la vista.

[[self window] setAcceptsMouseMovedEvents:YES];

4. Funciones de eventos

Una vez definida y activada el área hay que crear las funciones que gestionarán los eventos de ratón. En concreto tres: entrada y salida del ratón del área de seguimiento, y la función del movimiento

4.1. Entrada y salida del área

Para definir lo que hará cada vez que el ratón entra o sale del área de seguimiento, por ejemplo:

- (void)mouseEntered:(NSEvent *)evento{
    [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent *)evento{
    [[self window] setAcceptsMouseMovedEvents:NO];
}

En el ejemplo sólo lo más sencillo activar y desactivar el seguimiento del ratón cuando entra y sale de la ventana.

4.2. Movimiento del ratón

Y por fin a lo importante, que hacer con los movimientos del ratón. Hace falta sobreescribir la función mouseMoved: Por ejemplo

- (void)mouseMoved:(NSEvent *)evento{
    puntoActual = [self convertPoint:[evento locationInWindow] fromView:nil];
    [self setNeedsDisplay:YES];
}

Dibus y la interacción

En el caso de mi programa Dibus (en creación y que espero que sea maravilloso) añadir un área de seguimiento hace que ahora se vean las rectas mientras las estamos dibujando.

Más información

ADC: Cocoa Event-Handling Guide. Using Tracking-Area Object

Simson Garfinkel, Michael Mahoney, Building Cocoa Applications: A Step by Step Guide. Mayo 2002, O’Reilly, [http://www.oreilly.com/catalog/buildcocoa/]

Etiquetas: , , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: