Einfachen Kurzbefehl hinzufügen

Bisher haben alle Skripte irgendwelche Dinge beim Start ausgeführt. Das ist von begrenztem Nutzen und erlaubt es nicht, auf Nutzeraktionen zu reagieren. Um anspruchsvollere Sachen zu tun, benötigen wir Funktionen, die auf ein bestimmtes Ereignis reagieren. Und das üblichste Ereignis ist ein Kurzbefehl.

darktable = require "darktable"

local function hello_shortcut(event, shortcut)
darktable.print("Hallo, habe '"..event..
       "' empfangen mit Parameter '"..shortcut.."'")
end

darktable.register_event("shortcut",hello_shortcut,
       "Kurzbefehl, der seine Parameter druckt")

Nun starte darktable, gehe zu “darktable-Voreinstellungen > Kurzbefehle > lua > Kurzbefehl, der seine Parameter druckt”, weise einen Kurzbefehl zu und probiere ihn aus. Eine schöne Meldung sollte auf dem Bildschirm erscheinen.

Lass uns den Code genauer ansehen. Wir definieren zuerst eine Funktion mit zwei Zeichenketten (Strings) als Eingabeparameter. Die erste ist der Typ des augelösten Ereignisses (“shortcut”) und der zweite ist der Name des Kurzbefehls (“Kurzbefehl, der seine Parameter druckt”). Die Funktion selber ruft darktable.print auf, was die Meldung auf dem Bildschirm einblendet (als Overlay).

Wenn die Funktion definiert ist, wird diese als Callback eines Kurzbefehls registiert. Dazu wird darktable.register_event aufgerufen, die eine generische Funktion für alle Typen von Ereignissen ist. Wir teilen ihr mit, dass wir ein Kurzbefehl-Ereignis registrieren, dann geben wir den Callback für Aufruf an und schließlich definieren wir die Zeichenkette, die als Beschreibung für den Kurzbefehl in den Voreinstellungen erscheinen soll.

Nun probieren wir einen Kurzbefehl aus, der etwas mehr interaktiv ist. Dieser schaut nach Bildern, die den Nutzer gerade interessieren (die ausgewählt oder unter dem Mauszeiger sind) und erhöht deren Bewertung:

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,"Erhöhe die Bewertung eines Bildes")

Für jetzt, sollte das meiste dieses Codes selbsterklärend sein. Nur noch einige Notizen:

  • Anstelle von einer Funktion deklarieren und sie zu referenzieren, deklarieren wir sie direkt im Aufruf zu darktable.register_event, das ist genau gleich, aber kompakter.

  • image.rating ist ein Feld, um die Bewertung mit Sternen zu vergeben (zwischen 0 und 5 Sternen, -1 bedeutet zurückgewiesen).

  • darktable.gui.action_images ist eine Tabelle, die alle Bilder von Interesse enthält. darktable agiert hier auf angewählte Bilder, wenn es solche hat und auf die Bilder unter der Maus, wenn es keine ausgewählten hat. Diese Funktion macht es einfach darktable’s UI Logik in lua zu folgen.

Wenn du ein Bild auswählst und den Kurzbefehl mehrfach drückst, wird diese zuerst richtig funktionieren, aber wenn du 5 Sterne erreicht hast, wird darktable den folgenden Fehler in der Console anzeigen:

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

Das ist die Art, wie Lua Fehler rapportiert. Wir haben versucht eine Wertung von 6 an ein Bild zu vergeben, aber eine Wertung kann nur bis 5 gehen. Es würde einfach sein, eine Kontrolle einzubauen, aber gehen wir doch stattdessen den komplizierteren Weg:

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("Kann die Bewertung des Bildes "..
          tostring(v).." nicht erhöhen: "..message)
      end
    end
end,"Erhöhe die Bewertung eines Bildes")

pcall wird das erste Argument durchprüfen und jede Abweichung feststellen. Falls es keine Abweichung findet, wird es true zurückgeben plus jedes Resultat, das die Funktion ergibt. Wenn es eine Abweichung gibt, wird false und die Fehlermeldung der Abweichung. Die Resultate des Tests werden auf dem Gerät ausgedruckt.

translations