Интерфейс колеса

Колесо Jester состоит из веб-интерфейса и предлагает API, доступный для Lua, для изменения его содержимого и реакции на действия.

Интерфейс

Интерфейс - это веб-сайт на основе Pixi JS, определённый в

f-4e\ModFolders\Mods\aircraft\F-4E\UI\JesterWheel

Открытие index.html в браузере показывает колесо, заполненное базовым содержимым.

Веб-сайт можно свободно редактировать, изменения видны после перезагрузки DCS (SHIFT+R).

Логика интерфейса, такая как анимация, определена в renderer.js, а взаимодействие обрабатывается в main.js.

interface.js объявляет основное содержимое колеса, а также все методы, относящиеся к связи C++ с JS.

Метод hb_send_proxy используется для отправки команд в C++, например, для уведомления о том, что действие было выбрано.

Lua

Колесо по сути представляет собой дерево меню. Каждое меню состоит из максимум 8 элементов. Элемент может быть конечным или содержать другое подменю. Кроме того, подменю также можно создать как внешнее меню, что увеличивает количество слотов для элементов до 18.

Каждый элемент может быть связан с действием, строкой, которая привязана к системе событий и, следовательно, на неё можно реагировать, если она вызвана.

Для взаимодействия с меню определено несколько методов, которые экспортируются в Lua:

Wheel.ReplaceMainMenu(main_menu)
Wheel.ReplaceSubMenu(sub_menu, menu_location)
Wheel.AddItem(item, menu_location)
Wheel.RemoveItem(item_name, menu_location)
Wheel.ReplaceItem(item, item_name, menu_location)
Wheel.RenameItem(new_item_name, current_item_name, menu_location)
Wheel.SetMenuInfo(info_text, menu_location)
Wheel.NavigateTo(menu_location)

Ниже показан простой пример добавления нового подменю в меню Navigation (Навигация):

local waypoint_menu = Wheel.Item:new({
  name = "Select Waypoint",
  menu = Wheel.Menu:new({
    name = "Select Waypoint",
    items = {
      Wheel.Item:new({ name = "TGT 1", action = "select_tgt_1" }),
      Wheel.Item:new({ name = "TGT 2", action = "select_tgt_2" }),
      Wheel.Item:new({ name = "Advanced", outer_menu = Wheel.Menu:new({
        name = "More Waypoints",
        items = {
          Wheel.Item:new({ name = "RTB", action = "select_rtb" }),
          Wheel.Item:new({ name = "Nearest Target", action = "select_tgt" }),
        },
      })}),
    }
  }),
})

Wheel.AddItem(waypoint_menu, {"Navigation"})

Информационный текст меню можно обновить с помощью

local current_waypoint = "WP 2"
Wheel.SetMenuInfo(current_waypoint, {"Navigation", "Select Waypoint"})

Чтобы отреагировать на выбранное действие, прослушайте соответствующее событие:

ListenTo("select_tgt_1", function(task)
  -- Интерфейс компонентов
  task:Click("Nav Panel Function", "TARGET_1")

  -- или необработанный интерфейс
  task:Then(function()
    ClickRaw(
      devices.NavigationComputer_AN_ASN_46A,
      device_commands.RIO_NAV_COMP_FUNCTION_SELECTOR_KNOB,
      3,
      5
    ) -- Target 1
  end)
end)