Dotychczas nasze skrypty wykonywały jedynie akcje przy starcie programu. Nie jest to bardzo użyteczne i nie pozwala na odpowiedź wobec faktycznych czynności użytkownika. Do wykonania bardziej zaawansowanych rzeczy będziemy potrzebować rejestracji funkcji, która zostanie wywołana w reakcji na określone zdarzenie. Najczęstszym zdarzeniem jest reakcja na wciśnięcie skrótu klawiszowego.

1Ansel = require "Ansel"
2
3local function hello_shortcut(event, shortcut)
4Ansel.print("Czołem, właśnie otrzymałem zdarzenie '"..event..
5       "' z parametrem '"..shortcut.."'")
6end
7
8Ansel.register_event("shortcut",hello_shortcut,
9       "Skrót, który wypisuje swoje parametry")

Uruchom Ansel, przejdź do “ustawienia > skróty > lua > Skrót, który wypisuje swoje parametry”, przypisz skrót klawiszowy i wypróbuj go. Powinieneś zobaczyć ładną wiadomość, wypisaną na ekranie.

Rzućmy okiem na kod. Najpierw definiujemy dwa łańcuchy znakowe jako parametry wejściowe. Pierwszy to typ wyzwalanego zdarzenia (“shortcut”), a drugi to nazwa skrótu (“Skrót, który wpisuje swoje parametry”). Sama funkcja wywołuje Ansel.print, które wypisze komunikat jako nakładkę w głównym oknie.

Po zdefiniowaniu funkcji rejestrujemy ją jako wywołanie zwrotne skrótu. W tym celu wywołujemy Ansel.register_event, będące ogólną funkcją dla wszystkich typów zdarzeń. Informujemy ją, że rejestrujemy zdarzenie skrótu, przekazujemy wywołanie zwrotne, a na koniec przekazujemy łańcuch znakowy dla opisu skrótu w oknie ustawień.

Wypróbujmy teraz skrót nieco bardziej interaktywny. W tym przykładzie wybierzemy zdjęcia, którymi użytkownik jest zainteresowany (wybrane lub pod kursorem) i zwiększymy ich ocenę.

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,"Zwiększa ocenę zdjęcia")

Kod nie wymaga komentarza. Parę uwag dodatkowych:

  • 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  ]]>
 9
10(ang. rating too high – ocena zbyt wysoka)

W ten sposób lua raportuje błędy. Spróbowaliśmy przyznać zdjęciu sześć gwiazdek, ale maksymalna ocena może wynosić tylko 5. Sprawdzenie tego byłoby trywialne, ale zróbmy to w nieoczywisty sposób i przechwyćmy błąd.

 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("nie można zwiększyć oceny zdjęcia "..
 9          tostring(v).." : "..message)
10      end
11    end
12end,"Zwiększ ocenę zdjęcia")

pcall uruchamia pierwszy argument i przechwytuje każdy rzucony wyjątek. Jeśli wyjątek nie wystąpił, zwraca true i dowolny wynik, zwrócony przez funkcję. Jeśli wyjątek wystąpił, zwraca false i informację o błędzie z wyjątku. Testujemy po prostu te przypadki i wypisujemy je na konsolę.