aggiungere una semplice scorciatoia

Fino ad ora, tutti i nostri script hanno effettuato operazioni durante la fase di avvio. Questo è di utilità limitata e non ci permette di reagire alle azioni dell’utente. Per fare operazioni più avanzate abbiamo bisogno di registrare una funzione che verrà chiamata da un dato evento. L’evento più comune a cui reagire è una scorciatoia da tastiera.

darktable = require "darktable"

local function hello_shortcut(event, shortcut)
darktable.print("Hello, I just received '"..event..
       "' with parameter '"..shortcut.."'")
end

darktable.register_event("shortcut",hello_shortcut,
       "A shortcut that prints its parameters")

Adesso avvia darktable, vai a “preferenze > scorciatoie > lua > Una scorciatoia che stampa i suoi parametri”, assegnagli una scorciatoia e provalo. Dovresti vedere un simpatico messaggio stampato a schermo.

Ora guardiamo in dettaglio al codice. Prima definiamo una funzione che prende due stringhe come parametri di input. La prima è il tipo di evento innescato (“shortcut”) e il secondo è il nome della scorciatoia (“Una scorciatoia che stampa i suoi paramtri”). La funzione stessa chiama darktable.print, che stamperà il messaggio in sovrapposizione alla finestra principale.

Dopo che la funzione è definita, la registriamo come un callback per la scorciatoia. Per farlo chiamiamo darktable.register_event che è una funzione generica per tutti i tipi di eventi. Gli stiamo dicendo che stiamo registrando un evento scorciatoia, e gli stiamo fornendo il callback da chiamare e, finalmente, gli stiamo dando la stringa da usare per descrivere la scorciatoia nella finestra delle preferenze.

Cerchiamo ora di provare una scorciatoia che sia un poco più interattiva. Questa guarderà a tutte le immagini a cui l’utente è al momento interessato (selezionate o con il mouse sopra) e incrementerà la loro valutazione:

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,"Increase the rating of an image")

A questo punto, gran parte del codice non dovrebbe avere bisogno di spiegazioni. Giusto un paio di note:

  • Invece di dichiarare la funzione e referenziarla, la dichiariamo direttamente nella chiamata a darktable.register_event, questo è assolutamente equivalente ma leggermente più compatto.

  • image.rating è un campo che fornisce la valutazione in stelle di qualsiasi immagine (tra 0 e 5, dove -1 significa scartata).

  • darktable.gui.action_images è una tabella contenente tutte le immagini di interesse. darktable agirà sulle immagini selezionate (se selezionate), e sull’immagine sotto il mouse se nessuna immagine è selezionata. Questa funzione rende facile seguire la logica della UI di darktable in lua.

Se selezioni un’immagine e premi la tua scorciatoia un paio di volte, funzionerà correttamente all’inizio, ma quando avrai raggiunto le cinque stelle, darktable comincerà a mostrare sulla console il seguente errore:

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

Questo è il modo di lua di riportare errori. Abbiamo provato ad assegnare 6 stelle ad un’immagine, ma la valutazione può arrivare solo fino a 5. Sarebbe molto semplice aggiungere un controllo, ma invece seguiamo la via più ardua e catturiamo l’errore:

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("could not increase rating of image "..
          tostring(v).." : "..message)
      end
    end
end,"Increase the rating of an image")

pcall eseguirà il primo argomento e catturerà qualsiasi eccezione lanciata. Se non ci sono eccezioni restituirà true e anche qualsiasi altro risultato restituito dalla funzione. Se c’è invece un’eccezione restituirà false e il messaggio di errore dell’eccezione. Semplicemente verifichiamo questi risultati e li stampiamo sulla console.

translations