додавання простого прискорювача

Поки що всі наші сценарії робили щось під час запуску. Це має обмежену користь і не дозволяє нам реагувати на реальні дії користувача. Щоб зробити більш просунуті речі, нам потрібно зареєструвати функцію, яка буде викликана при настанні певної події. Найпоширеніша подія, на яку слід реагувати, – це клавіатурний прискорювач.

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,
       "A shortcut that prints its parameters")

Тепер запустіть darktable, перейдіть до “налаштування > клавіатурні прискорювачі > lua > A shortcut that prints its parameters”, призначте прискорювач і спробуйте. Ви повинні побачити приємне повідомлення, надруковане на екрані.

Давайте розглянемо код детально. Спочатку ми визначаємо функцію, яка приймає два рядки як вхідні параметри. Перший – це тип ініційованої події (“shortcut”), а другий – назва цього прискорювача (“A shortcut that prints its parameters”). Сама функція викликає darktable.print, що надрукує повідомлення у вигляді накладеного тексту в головному вікні.

Як тільки ця функція визначена, ми реєструємо її як функцію зворотного виклику для прискорювача. Для цього ми викликаємо darktable.register_event, що є загальною функцією для всіх типів подій. Ми повідомляємо їй, що реєструємо подію натискання прискорювача, тоді передаємо їй функцію зворотного виклику при настанні цієї події і, нарешті, даємо рядок для опису прискорювача у вікні налаштувань.

Давайте спробуємо прискорювач, який є трохи більш інтерактивним. Він перегляне зображення, в яких користувач зараз зацікавлений (вибрані або під вказівником миші), і збільшить їх рейтинг:

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,"Increase the rating of an image")

На даний момент більшість цього коду має бути зрозумілою. Лише пару приміток:

  • Замість того, щоб оголошувати функцію та посилатися на неї, ми оголошуємо її безпосередньо у виклику darktable.register_event, це абсолютно еквівалентно, але трохи компактніше.

  • image.rating – це поле, яке дає рейтинг будь-якого зображення (від 0 до 5 зірок, -1 означає відхилене).

  • darktable.gui.action_images – таблиця, що містить усі зображення, які нас цікавлять. darktable діятиме на вибрані зображення, якщо вибрано будь-яке зображення, і на зображення під мишею, якщо жодне зображення не вибрано. Ця функція дозволяє легко слідувати логіці інтерфейсу darktable в lua.

Якщо вибрати зображення та натиснути прискорювач кілька разів, спочатку це буде працювати коректно, але коли ви досягли п’яти зірок, darktable на консолі почне відображати таку помилку:

<![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
  ]]>

Це спосіб Lua повідомляти про помилки. Ми намагалися встановити для зображення оцінку 6, але оцінка може сягати лише 5. Додати перевірку було б тривіально, але давайте підемо складним шляхом і замість цього виявимо помилку:

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,"Increase the rating of an image")

pcall запустить свій перший аргумент і вловить будь-який виняток, викликаний ним. Якщо немає винятку, він поверне true плюс будь-який результат, повернутий функцією. Якщо є виняток, він поверне “false” та повідомлення про помилку винятку. Ми просто перевіряємо ці результати та друкуємо їх на консолі.

Translations