- 458
- 314
Представляю вашему вниманию данную замечательную библиотеку,
позволяющую удобно использовать хоткеи в мимгуи!
Прямо сейчас я занят разработкой одного скрипта и мне понадобились хоткеи для мимгуи.
Облазив бластхак, я осознал, что нормальных, адекватно функцианирующих хоткеев для мимгуи нигде нет.
Именно после этого я сел за разработку данной библиотеки, взяв немного стилистики у либы @chapo
В остальном же, библиотека самописная и свою задачу (как я надеюсь) выполнять будет
Ниже будет указан код Example скрипта со всеми пояснениями (его также можно будет скачать из вложений)
Облазив бластхак, я осознал, что нормальных, адекватно функцианирующих хоткеев для мимгуи нигде нет.
Именно после этого я сел за разработку данной библиотеки, взяв немного стилистики у либы @chapo
В остальном же, библиотека самописная и свою задачу (как я надеюсь) выполнять будет
Ниже будет указан код Example скрипта со всеми пояснениями (его также можно будет скачать из вложений)
Example:
local imgui = require 'mimgui'
local hotkey = require 'mimgui_hotkeys' -- подключаем библиотеку
local encoding = require 'encoding'
local u8 = encoding.UTF8
encoding.default = 'CP1251'
local sw, sh = getScreenResolution()
local mainWindow = imgui.new.bool()
local exampleHotKey
function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('example', function() mainWindow[0] = not mainWindow[0] end)
hotkey.RegisterHotKey('random hotkey 1', false, {}, function() sampAddChatMessage('pressed first hotkey', -1) end) -- регистрируем хоткей 1
exampleHotKey = hotkey.RegisterHotKey('random hotkey 2', false, {16, 67}, secondHotkey) -- регистрируем хоткей 2
--[[
При регистрации каллбека, в 1 параметре метода указывается уникальное имя. Если указать одно и то же имя при регистрации двух разных хоткеев, работать будет только первый.
Во 2 параметре можно указать тип хоткея. Если указать 'true', в хоткее можно будет использовать только 1 клавишу, например: 'H', 'R' и др.,
если же указать 'false', то хоткей будет поддерживать специальные клавиши. Пример хоткеев такого типа: 'Ctrl + H', 'Shift + Ctrl + R' и др.
В 3 параметре указывается комбинация из клавиш в виде таблицы, которая будет использоваться в хоткее. Например {16, 67} это бинд 'Ctrl + C'. Можно оставить бинд свободным, вписав туда пустую таблицу ({}).
В 4 параметре указывается каллбек функция. Данная функция будет вызываться при использовании комбинации клавиш хоткея
]]
hotkey.RegisterHotKey('random hotkey 3', false, {}, function() end)
hotkey.EditHotKey('random hotkey 3', {16, 68}) -- данный метод позволяет изменить бинд
--[[
В качестве 1 параметра необходимо указать уникальное имя хоткея.
Во 2 параметре метода указывается таблица с комбинацией клавиш, которые будут использоваться в хоткее.
]]
hotkey.RemoveHotKey('random hotkey 3') -- удаляет зарегистрированный хоткей. В качестве единственного параметра указывается уникальное имя хоткея.
hotkey.CancelKey = 0x2E -- изменяет клавишу, отвечающую за отмену изменения комбинации клавиш хоткея. По умолчанию: 0x1B (Клавиша ESCAPE).
hotkey.RemoveKey = 0x1B -- изменяет клавишу, отвечающую за полное удаление бинда у хоткея. По умолчанию: 0x08 (Клавиша BACKSPACE).
hotkey.Text.NoKey = u8'Пусто' -- изменяет текст, который появляется у хоткея, когда бинд пуст. По умолчанию: '< Свободно >'.
hotkey.Text.WaitForKey = u8'Ожидание клавиши...' -- изменяет текст, который появляется у хоткея, когда пользователь изменяет бинд.
wait(-1)
end
secondHotkey = function() -- каллбек функция, срабатывает при каждой комбинации клавиш хоткея
sampAddChatMessage('pressed second hotkey', -1)
end
imgui.OnInitialize(function()
imgui.GetIO().IniFilename = nil
end)
mainFrame = imgui.OnFrame(
function() return mainWindow[0] end,
function(window)
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver)
imgui.Begin('Example HotKey Window', mainWindow)
hotkey.ShowHotKey('random hotkey 1') -- отображаем первый хоткей, не будем указывать размер
-- Можно также использовать конструкцию, чтобы выполнять какой либо код, если бинд был изменен пользователем
if exampleHotKey:ShowHotKey(imgui.ImVec2(200, 25)) then -- отображаем второй хоткей, укажем размер во 2 параметре
sampAddChatMessage(table.concat(exampleHotKey:GetHotKey(), ', '), -1) -- данный метод используется для получения таблицы с клавишами бинда. В данном примере мы получим '{16, 67}'. В качестве единственного параметра необходимо указать уникальное имя хоткея
end
imgui.End()
end
)
В Moonloader есть встроенные функции для работы с JSON, такие как encodeJson и decodeJson.
encodeJson кодирует стандартную луа таблицу в JSON объект. Вот пример: {16, 67} -> "[16, 67]"
decodeJson декодирует JSON объект в стаднартную луа таблицу. Вот пример: "[16, 67]" -> {16, 67}
Вот так выглядит сохранение бинда в массив в случае с моей библиотекой:
encodeJson кодирует стандартную луа таблицу в JSON объект. Вот пример: {16, 67} -> "[16, 67]"
decodeJson декодирует JSON объект в стаднартную луа таблицу. Вот пример: "[16, 67]" -> {16, 67}
Вот так выглядит сохранение бинда в массив в случае с моей библиотекой:
Example inicfg:
-- Для начала подключаем все необходимые библиотеки
local imgui = require 'mimgui'
local hotkey = require 'mimgui_hotkeys'
local inicfg = require 'inicfg'
-- Создаём конфиг
local cfg = inicfg.load({
config = {
bind = '[16, 67]' -- это и есть наши клавиши по умолчанию. Если хоткей нужно оставить пустым, можно вписать просто {}
},
}, 'inifile.ini')
inicfg.save(cfg, 'inifile.ini')
local sw, sh = getScreenResolution()
local mainWindow = imgui.new.bool(true)
local exampleHotKey -- эта переменная позже будет хранить в себе хоткей
function main()
while not isSampAvailable() do wait(100) end
exampleHotKey = hotkey.RegisterHotKey('random hotkey 1', false, decodeJson(cfg.config.bind), function() sampAddChatMessage('Keys have been pressed', -1) end) -- регистрируем хоткей, а также вписываем туда клавиши из конфига. Не забываем привести это в стандартную луа таблицу с помощью декодирования JSON
wait(-1)
end
imgui.OnInitialize(function()
imgui.GetIO().IniFilename = nil
end)
mainFrame = imgui.OnFrame(
function() return mainWindow[0] end,
function(window)
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver)
imgui.Begin('Example HotKey Window', mainWindow)
if exampleHotKey:ShowHotKey() then -- создаем условие, которое будет срабатывать при обновлении бинда пользователем
cfg.config.bind = encodeJson(exampleHotKey:GetHotKey()) -- заносим в конфиг изменённую пользователем комбинацию клавиш
inicfg.save(cfg, 'inifile.ini') -- не забываем конфиг сохранить
end
imgui.End()
end
)
Почему же нельзя сделать всё то же самое, но без encodeJson и decodeJson, просто передавая стандартную луа таблицу?:
Ответ довольно прост. Если вписать в конфиг стандартную луа таблицу, вместо нее впишется указатель на эту самую таблицу, т.е вместо {16, 67} в конфиге будет что-то вроде "table: 0x2fe43318".
Для установки необходимо переместить библиотеку из вложений по пути:
moonloader/lib
Вложения
Последнее редактирование: