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

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

darktable = require "darktable"

local function hello_shortcut(event, shortcut)
darktable.print("Hello, I just received '"..event..
       "' with parameter '"..shortcut.."'")
end

darktable.register_event("hello shortcut",
       "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, що надрукує повідомлення у вигляді накладеного тексту в головному вікні.

Once that function is defined, we register it as a shortcut callback. To do that we call darktable.register_event which is a generic function for all types of events. We tell it that we are registering an event of type “shortcut” with the name “hello shortcut”, then we give the callback to call and finally, we give the string to use to describe the shortcut in the preferences window.

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

darktable = require "darktable"

darktable.register_event("increase rating","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 ?
   [C]: in metamethod 'newindex'
   ./configdir/luarc:10: in function <./configdir/luarc:7>
   [C]: in ?
   [C]: in ?
  ]]>

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

darktable.register_event("increase rating","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