adicionar um atalho simples
Até agora, nossos scripts são executados durante a inicialização do darktable. 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.
darktable = require “darktable”
local function hello_shortcut(event, shortcut)
darktable.print(“Olá, eu acabei de receber '”..event..
“' com o parâmetro '”..shortcut..“'”)
end
darktable.register_event(“shortcut”,hello_shortcut,
“Um atalho que imprime seus parâmetros”)
Agora inicie o darktable, 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 darktable.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 darktable.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.
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,“Aumenta a classificação de uma imagem”)
Neste ponto, a maior parte do código deve ser auto-explicativa. Apenas algumas notas:
-
Ao invés de declarar uma função e referenciá-la, nós a declaramos diretamente na chamada para
darktable.register_event
. Isto é equivalente, mas ligeiramente mais compacto. -
O
image.rating
é o campo que dá a classificação em estrelas de uma imagem (entre 0 e 5 estrelas, -1 significa rejeitada). -
O
darktable.gui.action_images
é uma tabela contendo todas as imagens de interesse. O darktable agirá nas imagens selecionadas se houver e na imagem sob o mouse se nenhuma imagem estiver selecionada. Esta função torna mais fácil seguir a lógica da interface do usuário do darktable no lua.
Se você selecionar uma imagem e pressionar seu atalho algumas vezes, ele funcionará corretamente a princípio mas, quando você atingir as cinco estrelas, o darktable começará a exibir o seguinte erro no console:
<![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
]]>
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:
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(“não é possível aumentar a classificação da imagem ”..
tostring(v)..“ : ”..message)
end
end
end,“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.