Ajouter un raccourci simple
Jusqu’à présent, tous nos scripts ont fait des choses au démarrage. Ceci est d’une utilité limitée et ne nous permet pas d’interagir avec l’utilisateur. Pour faire des choses plus avancées, nous devons enregistrer une fonction qui est appelée sur un événement donné. L’événement le plus courant auquel réagir est un raccourci clavier.
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")
Maintenant, démarrez darktable, allez dans Préférences > Raccourcis > Scripts Lua > A shortcut that prints its parameters » (Un raccourci qui imprime ses paramètres), attribuez un raccourci et essayez-le. Vous devriez voir un joli message imprimé à l’écran.
Regardons le code en détail. Nous définissons d’abord une fonction qui prend deux chaînes comme paramètres d’entrée. Le premier est le type de l’événement déclenché (“raccourci”) et le second est le nom du raccourci (“A shortcut that prints its parameters”). La fonction elle-même appelle darktable.print, qui imprime le message dans la fenêtre principale.
Une fois cette fonction définie, nous l’enregistrons en tant que fonction de rappel pour un événement de type raccourci. Pour ce faire, nous appelons darktable.register_event qui est une fonction générique pour tous les types d’événements. Nous lui disons que nous enregistrons un événement raccourci, puis nous donnons la fonction de rappel à appeler et enfin, nous donnons la chaîne à utiliser pour décrire le raccourci dans la fenêtre des préférences.
Essayons un raccourci un peu plus interactif. Celui-ci examine les images qui intéressent l’utilisateur (celles qui sont sélectionnées ou survolées) et augmente sa note :
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")
À ce stade, une grande partie de ce code devrait être explicite. Juste quelques remarques :
-
Au lieu de déclarer une fonction et de la référencer ensuite, nous la déclarons directement dans l’appel à darktable.register_event, c’est strictement équivalent mais légèrement plus compact.
-
image.rating est un champ qui donne le nombre d’étoiles de n’importe quelle image (entre 0 et 5 étoiles, -1 signifie rejeté).
-
darktable.gui.action_images est un tableau contenant toutes les images d’intérêt. darktable agit sur les images sélectionnées s’il y en a au moins une, ou sinon, sur l’image sous la souris. Cette fonction permet de suivre facilement la logique de l’interface utilisateur de darktable dans Lua.
Si vous sélectionnez une image et appuyez plusieurs fois sur votre raccourci, cela fonctionne correctement au début, mais lorsque vous atteignez cinq étoiles, darktable commence à afficher l’erreur suivante sur la console :
<![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
]]>
C’est la façon dont Lua signale les erreurs. Nous avons essayé de donner une note de 6 à une image, mais elle est limitée à 5. Il serait trivial d’ajouter une vérification, mais suivons le chemin compliqué et capturons l’erreur :
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 exécute son premier argument et intercepte toute exception émise par celui-ci. S’il n’y a pas d’exception, il renvoie true (vrai) plus tout résultat renvoyé par la fonction. S’il y a une exception, il renverra false (faux) et le message d’erreur de l’exception. Nous testons simplement ces résultats et les imprimons sur la console.