een eenvoudige snelkoppeling toevoegen
Tot nu toe hebben al onze scripts dingen gedaan tijdens het opstarten. Dit is van beperkt nut en stelt ons niet in staat te reageren op echte gebruikersacties. Om meer geavanceerde dingen te doen, moeten we een functie registreren die bij een bepaalde gebeurtenis wordt aangeroepen. De meest voorkomende gebeurtenis om op te reageren is een sneltoets.
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")
Start nu darktable, ga naar “voorkeuren> snelkoppelingen> lua> Een snelkoppeling die de parameters afdrukt”, wijs een snelkoppeling toe en probeer het. Je zou een leuk bericht op het scherm moeten zien verschijnen.
Laten we de code in detail bekijken. We definiëren eerst een functie die twee strings als invoerparameters nodig heeft. De eerste is het type gebeurtenis dat wordt geactiveerd (“snelkoppeling”) en de tweede is de naam van de snelkoppeling (“Een snelkoppeling die de parameters ervan afdrukt”). De functie zelf roept darktable.print
aan, die het bericht als een overlay in het hoofdvenster zal afdrukken.
Zodra die functie is gedefinieerd, registreren we deze als een snelkoppeling. Om dat te doen noemen we darktable.register_event
wat een generieke functie is voor alle soorten gebeurtenissen. We vertellen het dat we een snelkoppelingsgebeurtenis registreren, dan geven we de callback om te bellen en tot slot geven we de string die moet worden gebruikt om de snelkoppeling in het voorkeurenvenster te beschrijven.
Laten we een snelkoppeling proberen die iets interactiever is. Deze zal de afbeeldingen bekijken waarin de gebruiker momenteel geïnteresseerd is (geselecteerd of met muis overgegaan) en hun beoordeling verhogen:
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")
Op dit punt zou het grootste deel van deze code voor zichzelf moeten spreken. Even een paar opmerkingen:
-
In plaats van een functie te declareren en ernaar te verwijzen, declareren we deze direct in de aanroep van
darktable.register_event
. Dit is strikt equivalent maar iets compacter. -
image.rating
is een veld dat de sterrenclassificatie van een afbeelding geeft (tussen 0 en 5 sterren, -1 betekent afgewezen). -
darktable.gui.action_images
is een tabel met alle afbeeldingen die van belang zijn. darktable werkt op geselecteerde afbeeldingen als er een afbeelding is geselecteerd, en op de afbeelding onder de muis als er geen afbeelding is geselecteerd. Deze functie maakt het gemakkelijk om de UI-logica van darktable in lua te volgen.
Als je een afbeelding selecteert en een paar keer op jouw snelkoppeling drukt, zal deze eerst correct werken, maar wanneer je vijf sterren hebt bereikt, zal darktable de volgende fout op de console weergeven:
![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
]]>
Dit is lua’s manier om fouten te melden. We hebben geprobeerd een beoordeling van 6 voor een afbeelding in te stellen, maar een beoordeling kan maar tot 5 gaan. Het zou triviaal zijn om een vinkje toe te voegen, maar laten we de gecompliceerde weg gaan en in plaats daarvan de fout opvangen:
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
zal zijn eerste argument uitvoeren en elke uitzondering opvangen die erdoor wordt gegenereerd. Als er geen uitzondering is, wordt true
geretourneerd plus elk resultaat dat door de functie wordt geretourneerd. Als er een uitzondering is, wordt ‘false’ geretourneerd en de foutmelding van de uitzondering. We testen deze resultaten eenvoudig en printen ze naar de console.