Eine einfache Tastenkombination hinzufügen

Bis jetzt waren alles Skripte, die beim Aufstarten durchgeführt wurden. Das ist von begrenztem Nutzen und erlaubt es nicht wirkliche Nutzer-Aktionen einzuführen. Um anspruchsvollere Sachen zu tun, müssen wir Funktionen auslösen können, die in einem bestimmten Fall aufgerufen werden können. Die einfachste Art zu reagieren, ist mit einer Tastenkombination.

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,
       "Eine Tastenkombination, die deren Parameter druckt")

Nun starte darktable, gehe zu “darktable-Voreinstellungen > Tastenkombinationen > lua > A shortcut that prints its parameters”, Erstelle eine Tastenkombination und probiere diese aus. Du solltest eine schöne Meldung auf deinem Bildschirm sehen.

Lass uns den Code im Detail ansehen. Wir definieren zuerst eine Funktion mit 2 Strings als Eingabe Parameter. Der erste ist der Typus von Aktion, die aufgerufen wird (“shortcut”) und der zweite ist der Name der Tastenkombination (“A shortcut that prints its parameters”). Die Funktion selber ruft nach darktable.print, was dann die Meldung als Überlagerung auf den Bildschirm druckt.

Einmal, wenn diese Funktion definiert ist, können wir sie als Tastenkombination-Aufruf. Um das zu machen, rufen wir darktable.register_event, was eine generische Funktion für alle Typen von Anlässen ist. Dann sagen wir, dass wir eine Tastenkombination registrieren, dann geben wir den Aufruf und als letztes, geben wir den String ein, der gezeigt werden soll und machen eine Beschreibung im Fenster der Voreinstellungen.

Nun versuchen wir eine Tastenkombination, die etwas mehr auslöst. Diese zielt auf die Bilder, die den Nutzer gegenwärtig gerade interessieren (angewählt oder über denen er/sie mit der Maus ist) und erhöhen 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 deine Tastenkombination mehrere Male drückst, wird diese zuerst richtig funktionieren, aber wenn du 5 Sterne erreicht hast, wird sie den folgenden Fehler auf dem Gerät 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("could not increase rating of image "..
          tostring(v).." : "..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