побудова елементів інтерфейсу користувача
Наш попередній приклад був трохи обмеженим. Зокрема, використання налаштувань для шляху експорту було не дуже гарним рішенням. Ми можемо зробити це краще, додавши елементи до інтерфейсу користувача у діалоговому вікні експорту.
Елементи інтерфейсу створюються за допомогою функції darktable_new_widget
. Ця функція приймає тип віджета як параметр і повертає новий об’єкт, відповідний цьому віджету. Потім ви можете встановити різні поля у цьому віджеті, щоб встановити його параметри. Потім ви використовуватимете цей об’єкт як параметр для різних функцій, які додадуть його до інтерфейсу darktable. Наступний простий приклад додає lib у режимі світлого стола з простою міткою:
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)
Існує приємний синтаксичний трюк, щоб полегшити читання та запис коду елементів інтерфейсу. Ви можете викликати ці об’єкти як функції з таблицею значень ключів як аргументом. Це дозволяє працювати наступному прикладу. Він створює віджет контейнера з двома допоміжними віджетами: міткою та текстовим полем.
local my_widget = darktable.new_widget("box"){
orientation = "horizontal",
darktable.new_widget("label"){ label = "here => " },
darktable.new_widget("entry"){ tooltip = "please enter text here" }
}
Тепер, коли ми це знаємо, давайте трохи вдосконалимо наш сценарій.
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,
})