agregando un atajo simple
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.
darktable = require "darktable"
local function hello_shortcut(event, shortcut)
darktable.print("Hello, I just received '"..event..
"' with parameter '"..shortcut.."'")
end
darktable.register_event("shortcut",hello_shortcut,
"A shortcut that prints its parameters")
Ahora inicie darktable, 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 darktable.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 darktable.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:
darktable = require "darktable"
darktable.register_event("shortcut",function(event,shortcut)
local images = darktable.gui.action_images
for _,v in pairs(images) do
v.rating = v.rating + 1
end
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:
-
En lugar de declarar una función y hacer referencia a ella, la declaramos directamente en la llamada a
darktable.register_event
, esto es estrictamente equivalente pero un poco más compacto. -
image.rating
es un campo que da la calificación de estrellas de cualquier imagen (entre 0 y 5 estrellas, -1 significa rechazada). -
darktable.gui.action_images
es una tabla que contiene todas las imágenes de interés. darktable actuará sobre las imágenes seleccionadas si se selecciona alguna imagen, y sobre la imagen debajo del ratón si no se selecciona ninguna imagen. Esta función facilita el seguimiento de la lógica de la interfaz de usuario de darktable en lua.
Si selecciona una imagen y presiona su atajo un par de veces, funcionará correctamente al principio, pero cuando haya alcanzado las cinco estrellas, darktable comenzará a mostrar el siguiente error en la consola:
<![CDATA[
LUA ERROR : rating too high : 6
stack traceback:
[C]: in ?
[C]: in function '__newindex'
./configdir/luarc:10: in function <./configdir/luarc:7>
LUA ERROR : rating too high : 6
]]>
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:
darktable.register_event("shortcut",function(event,shortcut)
local images = darktable.gui.action_images
for _,v in pairs(images) do
result,message = pcall(function()
v.rating = v.rating + 1
end)
if not result then
darktable.print_error("could not increase rating of image "..
tostring(v).." : "..message)
end
end
end,"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.