Até agora, nossos scripts são executados durante a inicialização do Ansel. Isto é um uso limitado e não nos permite reagir a ações reais do usuário. Para tarefas mais avançadas, nós precisamos registrar uma função que será chamada em um determinado evento. O evento mais comum é reagir a um atalho de teclado.

1Ansel = require “Ansel”
2
3local function hello_shortcut(event, shortcut)
4Ansel.print(“Olá, eu acabei de receber '”..event..
5	“' com o parâmetro '”..shortcut..“'”)
6end
7
8Ansel.register_event(“shortcut”,hello_shortcut,
9	“Um atalho que imprime seus parâmetros”)

Agora inicie o Ansel, vá para “preferências > atalhos > lua > Um atalho que imprime seus parâmetros”, atribua um atalho e experimente. Você deve ver uma mensagem legal impressa em sua tela.

Vamos dar uma olhada no código em detalhes. Primeiro, definimos uma função que recebe duas cadeias de texto como parâmetros de entrada. A primeira é o tipo de evento disparado (“atalho”) e a segunda é o nome do atalho (“Um atalho que imprime seus parâmetros”). Esta função se chama Ansel.print, que imprimirá a mensagem como uma sobreposição na janela principal.

Una vez definida esta função, a registramos como uma devolução de chamada de atalho. Para fazer isto, chamamos Ansel.register_event que é uma função genérica para todo tipo de eventos. Nós dissemos que estamos registrando um evento de atalho, fornecemos a devolução de chamada a chamar e, finalmente, fornecemos uma cadeia de texto a usar para descrever o atalho na janela de preferências.

Vamos tornar este atalho um pouco mais interativo. Ele verá as imagens que o usuário está interessado no momento (selecionadas ou com o mouse sobre) e aumentará sua qualificação.

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,“Aumenta a classificação de uma imagem”)

Neste ponto, a maior parte do código deve ser auto-explicativa. Apenas algumas notas:

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

Esta é a forma que o lua reporta erros. Nós tentamos atribuir uma classificação de 6 estrelas a uma imagem, mas a classificação só pode ir até 5. Seria trivial adicionar uma verificação, mas ao invés disso vamos complicar a maneira de detectar o erro:

 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(“não é possível aumentar a classificação da imagem ”..
 9          tostring(v)..“ : ”..message)
10      end
11    end
12end,“Aumenta a classificação de uma imagem”)

O pcall executará seu primeiro argumento e detectará qualquer exceção lançada por ele. Se não houver uma exceção, devolverá true mais qualquer resultado devolvido pela função. Se houver uma exceção, devolverá false e a mensagem de erro da exceção. Simplesmente testamos os resultados e os imprimimos no console.