Der Bau von Schnittstellen Elementen

Unser voriges Beispiel war etwas limitiert. Insbesondere der Gebrauch einer Präferenz für den Export-Pfad war nicht wirklich sehr gut. Das können wir besser mit dem Hinzufügen von Schnittstellenelementen im Export-Dialog.

UI Elemente werden mit der darktable_new_widget Funktion kreiert. Diese Funktion nimmt einen Typ von Grafikobjekt als Parameter und gibt ein neues Objekt zurück, das mit diesem Grafikobjekt korrespondiert. Du kannst dann verschiedene Felder in dieses Grafikobjekt setzen, um dessen Parameter zu setzen. Dann wirst du dieses Objekt als Parameter zu verschiedenen Funktionen zuweisen und es dem darktable UI zuteilen. Das folgende einfache Beispiel fügt einen lib der Ansicht Leuchttisch hinzu mit einem einfachen Label:

local my_label = darktable.new_widget("label")
my_label.label = "Hello, world !"

dt.register_lib("test","test",false,{
    [dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_CENTER",20},
    },my_label)

Es gibt einen netten syntaktischen Trick, um das Lesen und Schreiben von UI-Element-Code zu erleichtern. Sie können diese Objekte als Funktionen mit einer Tabelle von Schlüsselwerten als Argument aufrufen. Damit kann das folgende Beispiel funktionieren. Es erstellt ein Container-Widget mit zwei Sub-Widgets. Ein Label und ein Texteingabefeld.

   local my_widget = darktable.new_widget("box"){
      orientation = "horizontal",
      darktable.new_widget("label"){ label = "here => " },
      darktable.new_widget("entry"){ tooltip = "please enter text here" }
   }

Da wir das jetzt wissen, verbessern wir unser Skript ein wenig.

darktable = require "darktable"

local scp_path = darktable.new_widget("entry"){
  tooltip ="Complete path to copy to. Can include user and hostname",
  text = "",
  reset_callback = function(self) self.text = "" end
}

darktable.register_storage("scp_export","Export via scp",
  function( storage, image, format, filename,
     number, total, high_quality, extra_data)
    if not darktable.control.execute(scp "..filename.." "..
      scp_path.text
    ) then
      darktable.print_error("scp failed for "..tostring(image))
    end
    end,
    nil, --finalize
    nil, --supported
    nil, --initialize
    darktable.new_widget("box") {
    orientation ="horizontal",
    darktable.new_widget("label"){label = "target SCP PATH "},
    scp_path,
})

translations