construyendo elementos de interfaz de usuario

Nuestro ejemplo anterior fue un poco limitado. En particular, el uso de una preferencia por la ruta de exportación no fue muy agradable. Podemos hacerlo mejor agregando elementos a la interfaz de usuario en el cuadro de diálogo de exportación.

Los elementos de la interfaz de usuario se crean mediante la función darktable_new_widget. Esta función toma un tipo de widget como parámetro y devuelve un nuevo objeto correspondiente a ese widget. A continuación, puede establecer varios campos en ese widget para establecer sus parámetros. Luego, usará ese objeto como parámetro para varias funciones que lo agregarán a la interfaz de usuario de darktable. El siguiente ejemplo simple agrega una biblioteca en la vista de mesa de luz con una etiqueta simple:

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)

Hay un buen truco sintáctico para hacer que el código de los elementos de la interfaz de usuario sea más fácil de leer y escribir. Puede llamar a estos objetos como funciones con una tabla de valores clave como argumento. Esto permite que funcione el siguiente ejemplo. Crea un widget contenedor con dos sub-widgets: una etiqueta y un campo de entrada de texto.

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

Ahora que lo sabemos, mejoremos un poco nuestro script.

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,
})