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.

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")

Start nu Ansel, 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 Ansel.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 Ansel.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:

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")

Op dit punt zou het grootste deel van deze code voor zichzelf moeten spreken. Even een paar opmerkingen:

  • 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  ]]>

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:

 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 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.