imgui = require 'imgui' --нужно без local
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local window = imgui.ImBool(false)
local imgui_model = {
{
['Кнопочка 1'] = imgui.ImBool(false),
},
{ --Тут чилд не создаётся
sl = 'imgui.SameLine()', -- тут можно записывать любую имгуи функцию
},
{
["Кнопочка 2"] = imgui.ImBool(false), -- Тут создатся чекбокс
},
{
pw = 'imgui.PushItemWidth(80)', -- ставится ширина след элемента на 80
},
{
["Число 3"] = imgui.ImInt(5), -- Тут создатся поле ввода текста
handler = { --Создавать обработчик не обязательно
func = function(args)
sampAddChatMessage('Изменено: '..args.name..': '..tostring(args.value.v), -1) -- вот что возвращается обработчиком: name - название с которым выводится элемент на который нажали, value - его значение в userdata
end,
use_for = {} -- обработчик юзается только для всей родительской таблицы
}
},
{
pw = 'imgui.PushItemWidth(50)', -- ставится ширина след элемента на 50
},
{
["Текст 4"] = imgui.ImBuffer(24), -- Тут создатся текстовое поле
handler = { --Создавать обработчик не обязательно
func = function(args)
sampAddChatMessage('Изменено: '..args.name..': '..tostring(args.value.v), -1) -- вот что возвращается обработчиком: name - название с которым выводится элемент на который нажали, value - его значение в userdata
end,
use_for = {} -- обработчик юзается только для всей родительской таблицы
}
},
{ -- Я думаю вам понятно что эти 2 элемента будут в рандомном порядке?
["Кнопочка 5"] = imgui.ImBool(false),
["Кнопочка 5 (1)"] = imgui.ImBool(false), --тут не будет обработчика
handler = { --Создавать обработчик не обязательно
func = function(args)
sampAddChatMessage('Изменено: '..args.name..': '..tostring(args.value.v), -1) -- вот что возвращается обработчиком: name - название с которым выводится элемент на который нажали, value - его значение в userdata
end,
use_for = {"Кнопочка 5"} -- обработчик юзается только для элемента с таким названием, в родительской таблице
}
},
{
pw = 'imgui.PushItemWidth(50)', -- ставится ширина след элемента на 50
},
{
['qqq'] = 'imgui.Button("qqq")', -- рисуется кнопка с таким названием, желательно key делать таким же как и текст в кнопке
handler = { --Для кнопок, колапсов, и так далее, поддерживается обработчик, но value возвращает nil
func = function(args)
sampAddChatMessage('Нажата кнопка: '..args.name, -1) -- вот что возвращается обработчиком: name - название с которым выводится элемент на который нажали, value - nil так как это кнопка
end,
use_for = {}
}
}
}
function imgui.OnDrawFrame()
if window.v then
imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
imgui.Begin('Demo', window)
local generated = imguiGenerateGUI({table = imgui_model, in_key = '', use_in_key = false, use_childs = true}) -- Возвращается таблица, ниже есть описание параметров
for k, v in ipairs(generated) do
if v.gui() then --Это гуи элемент
if v.handler ~= false then --иногда нету обработчика, и возвращается false
print('handle')
v.handler() --А это обработчик, его нужно запускать
end
end
end
imgui.End()
end
end
function main()
while not isSampAvailable() do wait(100) end
sampRegisterChatCommand('dgui', function() window.v = not window.v end)
sampRegisterChatCommand('active_elements', function() showActiveElemets(imgui_model) end)
while true do
wait(0)
imgui.Process = window.v
end
end
function showActiveElemets(table)
for k, val in pairs(table) do
if type(val) == 'userdata' then
if type(val.v) == 'boolean' then
if val.v then
sampAddChatMessage('Активировано: '..tostring(k)..': '..tostring(val.v), -1)
end
end
end
if type(val) == 'table' then
if key ~= 'handler' then
showActiveElemets(val)
end
end
end
end
function imguiGenerateGUI(params)
local generated = {}
local params_model = {
table = 'table', -- Сюда таблицу совать надо
use_in_key = 'boolean', -- Тут ты говоришь юзать ли key родительского элемента (над потыкать)
in_key = 'string', -- Задаешь вручную key родительского элемента (над потыкать)
use_childs = 'boolean', -- Юзать ли автоматические imgui.Child
}
getChildY = function(table)
local size = 0
for key, value in pairs(table) do
if type(value) == 'userdata' then
size = size + 30
else
if type(value) == 'string' then
if not value:find('imgui%..+%(') then
size = size + 15
--imgui.Text(u8(value))
else
size = size + 25
end
end
end
if type(value) == 'table' then
if key ~= 'handler' then
size = size + getChildY(value)
end
end
end
return size
end
local child_size = getChildY(params.table)
local iin = function(list, what_find, mode)
if what_find and type(what_find) ~= 'table' then
local set = {}
for _, l in ipairs(list) do set[l] = true end
return set[what_find] and true or false
elseif type(what_find) == 'table' then
if not mode or mode == false then
local set = {}
for _, l in ipairs(list) do set[l] = true end
for _, l in ipairs(what_find) do if set[l] then return true end end
elseif mode == true then
local set = {}
local res = nil
for _, l in ipairs(list) do set[l] = true end
for k,v in pairs(what_find) do if set[v] then res = true else res = false end end
return res
end
end
end
local get_handler = function(table, text, value)
if table.handler then
if #table.handler.use_for > 0 then
if iin(table.handler.use_for, text) then
table.handler.func({name = text, value = value})
end
else
table.handler.func({name = text, value = value})
end
end
end
if params.use_childs then
if child_size > 30 then
table.insert(generated, {gui = function() imgui.BeginChild(tostring(params.table), imgui.ImVec2(0, child_size), true) end, handler = false})
--imgui.BeginChild(tostring(params.table), imgui.ImVec2(0, child_size), true)
end
end
for key, value in pairs(params.table) do
local text = key
if params.use_in_key and params.in_key ~= '' and child_size < 30 then
text = params.in_key
end
if type(value) == 'userdata' then
if type(value.v) == 'boolean' then
table.insert(generated, {gui = function() return imgui.Checkbox(u8(text), value) end, handler = function() get_handler(params.table, text, value) end})
elseif type(value.v) == 'string' then
table.insert(generated, {gui = function() return imgui.InputText(u8(text), value) end, handler = function() get_handler(params.table, text, value) end})
elseif type(value.v) == 'number' then
if tostring(value.v):find('%.') then
table.insert(generated, {gui = function() return imgui.InputFloat(u8(text), value) end, handler = function() get_handler(params.table, text, value) end})
else
table.insert(generated, {gui = function() return imgui.InputInt(u8(text), value) end, handler = function() get_handler(params.table, text, value) end})
end
end
else
if type(value) == 'string' then
if value:find('imgui%..+%(') then
table.insert(generated, {gui = load('return '..value), handler = function() get_handler(params.table, text, nil) end})
else
table.insert(generated, {gui = function() imgui.Text(u8(value)) end, handler = false})
end
end
end
if type(value) == 'table' then
if key ~= 'handler' then
local tables = imguiGenerateGUI({table = value, in_key = key, use_in_key = params.use_in_key, use_childs = params.use_childs})
for k, gen in ipairs(tables) do
table.insert(generated, gen)
end
end
end
end
if params.use_childs then
if child_size > 30 then
table.insert(generated, {gui = function() imgui.EndChild() end, handler = false})
--imgui.EndChild()
end
end
return generated
end