gebruikersinterface-elementen bouwen

Ons vorige voorbeeld was een beetje beperkt. Met name het gebruik van een voorkeur voor het exportpad was niet erg prettig. We kunnen beter dan dat door elementen toe te voegen aan de gebruikersinterface in het exportdialoogvenster.

UI-elementen worden gemaakt via de functie darktable_new_widget. Deze functie neemt een type widget als parameter en retourneert een nieuw object dat overeenkomt met die widget. Je kan vervolgens verschillende velden in die widget instellen om de parameters in te stellen. Je gebruikt dat object dan als parameter voor verschillende functies die het toevoegen aan de gebruikersinterface van de darktable. Het volgende eenvoudige voorbeeld voegt een lib toe aan de bibliotheekweergave met een eenvoudig 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)

Er is een leuke syntactische truc om de code van UI-elementen gemakkelijker te lezen en te schrijven. Je kan deze objecten aanroepen als functies met een tabel met sleutelwaarden als argument. Hierdoor kan het volgende voorbeeld werken. Het maakt een containerwidget met twee subwidgets: een label en een tekstinvoerveld.

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

Nu we dat weten, laten we ons script een beetje verbeteren.

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