Исходник Гайд MimGui Hotkeys By СоМиК | Хоткеи в мимгуи!

СоМиК

Известный
Автор темы
457
310

Представляю вашему вниманию данную замечательную библиотеку,

позволяющую удобно использовать хоткеи в мимгуи!

1685744182915.png

Прямо сейчас я занят разработкой одного скрипта и мне понадобились хоткеи для мимгуи.
Облазив бластхак, я осознал, что нормальных, адекватно функцианирующих хоткеев для мимгуи нигде нет.
Именно после этого я сел за разработку данной библиотеки, взяв немного стилистики у либы @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}

Вот так выглядит сохранение бинда в массив в случае с моей библиотекой:
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
 

Вложения

  • mimgui_hotkeys.lua
    5.9 KB · Просмотры: 1,354
  • mimgui_hotkeys_example.lua
    3.8 KB · Просмотры: 256
Последнее редактирование:
D

deleted-user-422095

Гость
Ощущение, что это сборка mimgui addons, rkeys, mimhotkey от chapo
И скорее всего нет ключевого, Shift + 1 и 1 + Shift (разные сочетания) не забиндить
 
  • Влюблен
Реакции: Vespan

XRLM

Известный
2,539
854
мне больше нравится хоткей из аш хелпера для аризоны
 
  • Нравится
Реакции: Yondime

CaJlaT

Овощ
Модератор
2,806
2,606
  • Нравится
Реакции: MLycoris

XRLM

Известный
2,539
854
У чупачупса говно лютое... Позже чекну эту либу, сейчас времени особо нет. Если верить Сомику, то эти хоткеи, как минимум, должны быть лучше, чем у чапы
у чапы чот хоткеи не сохранялись, когда я его либу юзал, мб пофиксил
 

СоМиК

Известный
Автор темы
457
310
должны быть лучше, чем у чапы
они не должны быть прям лучше. Это те ж самые хоткеи, но без багов. Тем не менее это сейчас как я понял единственные норм. хоткеи в опенсурсе

UPD: Внёс малясь изменений в код либы

Обновил библиотеку, а также экземпл.

Теперь обращаться к хоткеям можно вот так:

example:
-- по старому
hotkey.RegisterHotKey('random hotkey 1', false, {}, function() sampAddChatMessage('pressed hotkey', -1) end)
hotkey.ShowHotKey('random hotkey 1', imgui.ImVec2(100, 100))
hotkey.RemoveHotKey('random hotkey 1')

-- по новому
exampleHotKey = hotkey.RegisterHotKey('random hotkey 1', false, {}, function() sampAddChatMessage('pressed hotkey', -1) end)
exampleHotKey:ShowHotKey(imgui.ImVec2(100, 100))
exampleHotKey:RemoveHotKey()
 
Последнее редактирование:

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,769
11,213
добавь гайд по сохранению в конфиг
Lua:
local inicfg = require('inicfg')
local iniFileName = 'filename.ini'
local ini = inicfg.load({
    binds = {
        lock = '[76]',
        key = '[75]'
    },
}, iniFileName)
inicfg.save(ini, iniFileName)

local bindKeys = {
    lock = decodeJson(ini.binds.lock),
    key = decodeJson(ini.binds.key)
}

-- save
ini.binds.lock = encodeJson(bindKeys.lock)
ini.binds.key = encodeJson(bindKeys.key)
inicfg.save(ini, iniFileName)
 
  • Нравится
Реакции: XRLM

XRLM

Известный
2,539
854
Lua:
local inicfg = require('inicfg')
local iniFileName = 'filename.ini'
local ini = inicfg.load({
    binds = {
        lock = '[76]',
        key = '[75]'
    },
}, iniFileName)
inicfg.save(ini, iniFileName)

local bindKeys = {
    lock = decodeJson(ini.binds.lock),
    key = decodeJson(ini.binds.key)
}

-- save
ini.binds.lock = encodeJson(bindKeys.lock)
ini.binds.key = encodeJson(bindKeys.key)
inicfg.save(ini, iniFileName)
да я то знаю как эту хуйня делается, просто над добавить для тех, кто не знает

не биндится шифт и альт, фикс пж, а лучше добавь настройку игнора этих клавиш, добавь настройку такой хуйни, что можно забиндить шифт + д, а хоткей будет выполняться ещё при д + шифт.

Код:
REBUILT KICHIRO 25k\moonloader\lib\mimgui_hotkeys.lua:79: bad argument #1 to 'next' (table expected, got string)
stack traceback:
    [C]: in function 'next'
    ...bh\REBUILT KICHIRO 25k\moonloader\lib\mimgui_hotkeys.lua:79: in function 'searchHotKey'
    ...bh\REBUILT KICHIRO 25k\moonloader\lib\mimgui_hotkeys.lua:184: in function <...bh\REBUILT KICHIRO 25k\moonloader\lib\mimgui_hotkeys.lua:168>
пезда.
 
Последнее редактирование:

СоМиК

Известный
Автор темы
457
310
добавь гайд по сохранению в конфиг
В Moonloader есть встроенные функции для работы с JSON, такие как encodeJson и decodeJson.
encodeJson кодирует стандартную луа таблицу в JSON объект. Вот пример: {16, 67} -> "[16, 67]"
decodeJson декодирует JSON объект в стаднартную луа таблицу. Вот пример: "[16, 67]" -> {16, 67}

Вот так выглядит сохранение бинда в массив в случае с моей библиотекой:
Example:
-- Для начала подключаем все необходимые библиотеки
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".
 
  • Нравится
Реакции: why ega и XRLM