Hasta ahora, todos nuestros script se ejecutan al inicio. La utilidad de esto es limitada y no nos permite reaccionar a las acciones de los usuarios. Para hacer cosas más avanzadas, necesitamos registrar una función que será llamada en un evento dado. Los eventos más típicos a los que reaccionar son los atajos de teclado.

1Ansel = require "Ansel"
2
3local function hello_shortcut(event, shortcut)
4Ansel.print("Hello, I just received '"..event..
5	"' with parameter '"..shortcut.."'")
6end
7
8Ansel.register_event("shortcut",hello_shortcut,
9	"A shortcut that prints its parameters")

Ahora inicie Ansel, vaya a “preferencias > atajos > lua > A shortcut that prints its parameters” (un atajo que imprime sus parámetros), asígnele un atajo y pruébelo. Debiera ver un lindo mensaje impreso en pantalla.

Veamos el código en detalle. Primero definimos una función que toma dos cadenas como parámetros de entrada. El primero es el tipo de evento disparado (“shortcut”) y el segundo es el nombre del atajo (“A shortcut that prints its parameters”). La función en sí llama a Ansel.print, que imprimirá el mensaje como una superposición en la ventana principal.

Una vez definida esa función, la registramos como una devolución de llamada de acceso directo. Para hacer eso, llamamos Ansel.register_event que es una función genérica para todo tipo de eventos. Le decimos que estamos registrando un evento de acceso directo, luego le damos la devolución de llamada para llamar y finalmente, le damos la cadena para usar para describir el acceso directo en la ventana de preferencias.

Probemos con un atajo que sea un poco más interactivo. Este verá las imágenes que le interesan al usuario en ese momento (seleccionadas o con el ratón sobre ellas) y aumentará su calificación:

1Ansel = require "Ansel"
2
3Ansel.register_event("shortcut",function(event,shortcut)
4		local images = Ansel.gui.action_images
5		for _,v in pairs(images) do
6			v.rating = v.rating + 1
7		end
8	end,"Increase the rating of an image")

En este punto, la mayor parte de este código debería explicarse por sí mismo. Solo un par de notas:

  • Instead of declaring a function and referencing it, we declare it directly in the call to Ansel.register_event this is strictly equivalent but slightly more compact.

  • image.rating is a field that gives the star rating of any image (between 0 and 5 stars, -1 means rejected).

  • Ansel.gui.action_images is a table containing all the images of interest. Ansel will act on selected images if any image is selected, and on the image under the mouse if no image is selected. This function makes it easy to follow Ansel’s UI logic in lua.

If you select an image and press your shortcut a couple of times, it will work correctly at first but when you have reached five stars, Ansel will start showing the following error on the console:

1<![CDATA[
2LUA ERROR : rating too high : 6
3stack traceback:
4		[C]: in ?
5		[C]: in function '__newindex'
6	./configdir/luarc:10: in function <./configdir/luarc:7>
7			LUA ERROR : rating too high : 6
8	]]>

Esta es la forma en que lua reporta errores. Hemos intentado establecer una calificación de 6 para una imagen, pero una calificación solo puede llegar hasta 5. Sería trivial agregar una marca, pero vayamos por el camino complicado y detectemos el error en su lugar:

 1Ansel.register_event("shortcut",function(event,shortcut)
 2    local images = Ansel.gui.action_images
 3    for _,v in pairs(images) do
 4      result,message = pcall(function()
 5        v.rating = v.rating + 1
 6        end)
 7      if not result then
 8        Ansel.print_error("could not increase rating of image "..
 9          tostring(v).." : "..message)
10      end
11    end
12end,"Increase the rating of an image")

pcall ejecutará su primer argumento y detectará cualquier excepción lanzada por él. Si no hay una excepción, devolverá true más cualquier resultado devuelto por la función. Si hay una excepción, devolverá false y el mensaje de error de la excepción. Simplemente probamos estos resultados y los imprimimos en la consola.