Интерфейс колеса
Колесо 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)