Bisher haben alle Skripte irgendwelche Dinge beim Start ausgeführt. Das ist von begrenztem Nutzen und erlaubt es nicht, auf Nutzeraktionen zu reagieren. Um anspruchsvollere Sachen zu tun, benötigen wir Funktionen, die auf ein bestimmtes Ereignis reagieren. Und das üblichste Ereignis ist ein Kurzbefehl.

1Ansel = require "Ansel"
2
3local function hello_shortcut(event, shortcut)
4Ansel.print("Hallo, habe '"..event..
5       "' empfangen mit Parameter '"..shortcut.."'")
6end
7
8Ansel.register_event("shortcut",hello_shortcut,
9       "Kurzbefehl, der seine Parameter druckt")

Nun starte Ansel, gehe zu “Ansel-Voreinstellungen > Kurzbefehle > lua > Kurzbefehl, der seine Parameter druckt”, weise einen Kurzbefehl zu und probiere ihn aus. Eine schöne Meldung sollte auf dem Bildschirm erscheinen.

Lass uns den Code genauer ansehen. Wir definieren zuerst eine Funktion mit zwei Zeichenketten (Strings) als Eingabeparameter. Die erste ist der Typ des augelösten Ereignisses (“shortcut”) und der zweite ist der Name des Kurzbefehls (“Kurzbefehl, der seine Parameter druckt”). Die Funktion selber ruft Ansel.print auf, was die Meldung auf dem Bildschirm einblendet (als Overlay).

Wenn die Funktion definiert ist, wird diese als Callback eines Kurzbefehls registiert. Dazu wird Ansel.register_event aufgerufen, die eine generische Funktion für alle Typen von Ereignissen ist. Wir teilen ihr mit, dass wir ein Kurzbefehl-Ereignis registrieren, dann geben wir den Callback für Aufruf an und schließlich definieren wir die Zeichenkette, die als Beschreibung für den Kurzbefehl in den Voreinstellungen erscheinen soll.

Nun probieren wir einen Kurzbefehl aus, der etwas mehr interaktiv ist. Dieser schaut nach Bildern, die den Nutzer gerade interessieren (die ausgewählt oder unter dem Mauszeiger sind) und erhöht deren Bewertung:

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,"Erhöhe die Bewertung eines Bildes")

Für jetzt, sollte das meiste dieses Codes selbsterklärend sein. Nur noch einige Notizen:

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

Das ist die Art, wie Lua Fehler rapportiert. Wir haben versucht eine Wertung von 6 an ein Bild zu vergeben, aber eine Wertung kann nur bis 5 gehen. Es würde einfach sein, eine Kontrolle einzubauen, aber gehen wir doch stattdessen den komplizierteren Weg:

 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("Kann die Bewertung des Bildes "..
 9          tostring(v).." nicht erhöhen: "..message)
10      end
11    end
12end,"Erhöhe die Bewertung eines Bildes")

pcall wird das erste Argument durchprüfen und jede Abweichung feststellen. Falls es keine Abweichung findet, wird es true zurückgeben plus jedes Resultat, das die Funktion ergibt. Wenn es eine Abweichung gibt, wird false und die Fehlermeldung der Abweichung. Die Resultate des Tests werden auf dem Gerät ausgedruckt.