dodanie prostego skrótu klawiszowego

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.

darktable = require "darktable"

local function hello_shortcut(event, shortcut)
darktable.print("Czołem, właśnie otrzymałem zdarzenie '"..event..
       "' z parametrem '"..shortcut.."'")
end

darktable.register_event("shortcut",hello_shortcut,
       "Skrót, który wypisuje swoje parametry")

Uruchom darktable, 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 darktable.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 darktable.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ę.

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

Kod nie wymaga komentarza. Parę uwag dodatkowych:

  • Zamiast deklarowania funkcji i odwoływania się do niej, deklarujemy ją bezpośrednio w wywołaniu do darktable.register_event. Jest to dokładnie to samo, ale bardziej zwięźle.

  • image.rating to pole, zawierające ocenę gwiazdkową zdjęcia (od zera do pięciu gwiazdek, -1 oznacza odrzucone).

  • darktable.gui.action_images to tablica, zawierająca wszystkie interesujące nas zdjęcia. darktable wykona działanie na zaznaczonych, jeśli zaznaczono jakiekolwiek zdjęcie, lub na obrazie pod kursorem, jeśli nie zaznaczono żadnego. Funkcja pozwala prześledzić logikę interfejsu darktable w lua.

Jeśli zaznaczysz zdjęcie i wciśniesz skrót kilka razy, będzie działał dobrze do osiągnięcia pięciu gwiazdek, a potem darktable zacznie wyświetlać na konsoli następujący błąd:

<![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
  ]]>

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

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

translations