Описание
Тема создана с целью сбора удачных решений и ответов на частые вопросы по ImGui интерфейсу.
В шапке темы я постараюсь их красиво организовывать, чтобы искать необходимое было легче.
Оставляйте свои варианты решений ориентируясь на такой шаблон:
Элементы интерфейса
Кнопки
Код
Абстрактный пример использования
Код
Абстрактный пример использования
Поля ввода
Другое
Код
Абстрактный пример использования
Частые вопросы
Примеры / Гайды
Гайд по модулю inicfg
В примере я использую модифицированный модуль inicfg_ex.lua, который может сохранять нормально строки и таблици.
Внимание: Файлы созданные через inicfg_ex.lua несовместимы с файлами созданными через inicfg.lua
Для работы самого примера также нужно:
Dear ImGui
[Module] ImGui Addons | v1.0.0
[Module] RKeys v2.1.1 (Там ссылка на GitHub, Переходим, жмем зеленую кнопочку "Code", выбираем строчку "Download Zip", внутри архива находим rkeys.lua и закидываем его в свою папку lib. Если зеленой кнопочки нет или нет ссылки - то зарегистрируйтесь на этом сайте)
В примере есть:
imgui_addons.HotKey()
imgui.Checkbox()
imgui.InputInt()
imgui.InputText()
imgui.InputTextMultiline()
Работа со шрифтами [Скоро будет]
Тема создана с целью сбора удачных решений и ответов на частые вопросы по ImGui интерфейсу.
В шапке темы я постараюсь их красиво организовывать, чтобы искать необходимое было легче.
Оставляйте свои варианты решений ориентируясь на такой шаблон:
- Название
- Скриншот
- Описание
- Код
- Пример использования
Элементы интерфейса
Кнопки
Код
Lua:
imgui = require "imgui"
-- Включаема / отключаемая кнопка кладкок
function imgui.ButtonActivated(activated, ...)
if activated then
imgui.PushStyleColor(imgui.Col.Button, imgui.GetStyle().Colors[imgui.Col.CheckMark])
imgui.PushStyleColor(imgui.Col.ButtonHovered, imgui.GetStyle().Colors[imgui.Col.CheckMark])
imgui.PushStyleColor(imgui.Col.ButtonActive, imgui.GetStyle().Colors[imgui.Col.CheckMark])
imgui.Button(...)
imgui.PopStyleColor()
imgui.PopStyleColor()
imgui.PopStyleColor()
else
return imgui.Button(...)
end
end
Абстрактный пример использования
Lua:
-- переменная текущей активной вкладки
local tab = "one" -- or "two"
------------ Отрисовка списка вкладкок --------------
if imgui.Button(text=="one", "ONE## tab one") then
tab = "one"
end
imgui.SameLine()
if imgui.Button(text=="one", "TWO## tab two") then
tab = "two"
end
----------- Отрисовка содержимого вкладкок -----------
if tab == "one" then
imgui.Text("ONE")
elseif tab == "two" then
imgui.Text("TWO")
end
Источник: https://www.blast.hk/threads/13380/post-511721
Код
Абстрактный пример использования
Код
Lua:
imgui = require "imgui"
function imgui.Link(label, description)
local size = imgui.CalcTextSize(label)
local p = imgui.GetCursorScreenPos()
local p2 = imgui.GetCursorPos()
local result = imgui.InvisibleButton(label, size)
imgui.SetCursorPos(p2)
if imgui.IsItemHovered() then
if description then
imgui.BeginTooltip()
imgui.PushTextWrapPos(600)
imgui.TextUnformatted(description)
imgui.PopTextWrapPos()
imgui.EndTooltip()
end
imgui.TextColored(imgui.GetStyle().Colors[imgui.Col.CheckMark], label)
imgui.GetWindowDrawList():AddLine(imgui.ImVec2(p.x, p.y + size.y), imgui.ImVec2(p.x + size.x, p.y + size.y), imgui.GetColorU32(imgui.GetStyle().Colors[imgui.Col.CheckMark]))
else
imgui.TextColored(imgui.GetStyle().Colors[imgui.Col.CheckMark], label)
end
return result
end
Абстрактный пример использования
Lua:
if imgui.Link("Download## ID", "Description") then
os.execute(('explorer.exe "%s"'):format("http://www.blast.hk"))
end
Код
Lua:
imgui = require "imgui"
-- Кликабельная / не кликабельная кнопка
function imgui.ButtonClickable(clickable, ...)
if clickable then
return imgui.Button(...)
else
local r, g, b, a = imgui.ImColor(imgui.GetStyle().Colors[imgui.Col.Button]):GetFloat4()
imgui.PushStyleColor(imgui.Col.Button, imgui.ImVec4(r, g, b, a/2) )
imgui.PushStyleColor(imgui.Col.ButtonHovered, imgui.ImVec4(r, g, b, a/2))
imgui.PushStyleColor(imgui.Col.ButtonActive, imgui.ImVec4(r, g, b, a/2))
imgui.PushStyleColor(imgui.Col.Text, imgui.GetStyle().Colors[imgui.Col.TextDisabled])
imgui.Button(...)
imgui.PopStyleColor()
imgui.PopStyleColor()
imgui.PopStyleColor()
imgui.PopStyleColor()
end
end
Абстрактный пример использования
Lua:
local text = "test"
if imgui.Button(text=="test", "Label## ID") then
print("TEST MESSAGE")
end
Поля ввода
Код
Абстрактный пример использования
Lua:
-- Однострочное поле возвращает true после потери фокуса, если было отредактировано.
imgui.InputTextEx = {
_edited_item = {}
}
setmetatable(imgui.InputTextEx, {__call = function(self, str_id, ...)
local result = imgui.InputText(str_id, ...)
if result then
imgui.InputTextEx._edited_item[str_id] = true
end
if not imgui.IsItemActive() and imgui.InputTextEx._edited_item[str_id] then
imgui.InputTextEx._edited_item[str_id] = nil
return true
end
end})
-- Многострочное поле возвращает true после потери фокуса, если было отредактировано.
imgui.InputTextMultilineEx = {
_edited_item = {}
}
setmetatable(imgui.InputTextMultilineEx, {__call = function(self, str_id, ...)
local result = imgui.InputTextMultiline(str_id, ...)
if result then
imgui.InputTextMultilineEx._edited_item[str_id] = true
end
if not imgui.IsItemActive() and imgui.InputTextMultilineEx._edited_item[str_id] then
imgui.InputTextMultilineEx._edited_item[str_id] = nil
return true
end
end})
-- Поле для целого числа возвращает true после потери фокуса, если было отредактировано.
imgui.InputIntEx = {
_edited_item = {}
}
setmetatable(imgui.InputIntEx, {__call = function(self, str_id, ...)
local result = imgui.InputInt(str_id, ...)
if result then
imgui.InputIntEx._edited_item[str_id] = true
end
if not imgui.IsItemActive() and imgui.InputIntEx._edited_item[str_id] then
imgui.InputIntEx._edited_item[str_id] = nil
return true
end
end})
Абстрактный пример использования
Lua:
cfg = {
int = 228,
text = "test",
text_long = "test long",
}
im_int = imgui.ImInt(cfg.int)
im_buffer = imgui.ImBuffer(cfg.test, 128)
im_buffer_long = imgui.ImBuffer(cfg.test_long, 1024)
do
if imgui.InputIntEx("Number## ID", im_int) then
cfg.int = im_int.v
end
if imgui.InputTextEx("Text## ID", im_buffer) then
cfg.text = im_buffer.v
end
if imgui.InputTextMultilineEx("Text Long## ID", im_buffer_long) then
cfg.text = im_buffer_long.v
end
end
Источник
Код
Абстрактный пример использования
Код
Lua:
function imgui.InputTextWithHint(label, hint, buf, flags, callback, user_data)
local l_pos = {imgui.GetCursorPos(), 0}
local handle = imgui.InputText(label, buf, flags, callback, user_data)
l_pos[2] = imgui.GetCursorPos()
local t = (type(hint) == 'string' and buf.v:len() < 1) and hint or '\0'
local t_size, l_size = imgui.CalcTextSize(t).x, imgui.CalcTextSize('A').x
imgui.SetCursorPos(imgui.ImVec2(l_pos[1].x + 8, l_pos[1].y + 2))
imgui.TextDisabled((imgui.CalcItemWidth() and t_size > imgui.CalcItemWidth()) and t:sub(1, math.floor(imgui.CalcItemWidth() / l_size)) or t)
imgui.SetCursorPos(l_pos[2])
return handle
end
Абстрактный пример использования
Lua:
im_buffer = imgui.ImBuffer(128)
imgui.InputTextWithHint(u8"Label## im_buffer", "Hint", im_buffer)
Другое
Код
Lua:
imgui = require "imgui"
function imgui.TextQuestion(label, description)
imgui.TextDisabled(label)
if imgui.IsItemHovered() then
imgui.BeginTooltip()
imgui.PushTextWrapPos(600)
imgui.TextUnformatted(description)
imgui.PopTextWrapPos()
imgui.EndTooltip()
end
end
Абстрактный пример использования
Lua:
imgui.TextQuestion("( ? )", "Text")
Источник: https://www.blast.hk/threads/13380/post-184571
Описание: заменяет цвет текста форматом RRGGBB(AA).
Вернуть цвет текста на стандартный (ImGuiCol_Text) - {SSSSSS(AA)}.
Код
Абстрактный пример использования
Описание: заменяет цвет текста форматом RRGGBB(AA).
Вернуть цвет текста на стандартный (ImGuiCol_Text) - {SSSSSS(AA)}.
Код
Lua:
function imgui.TextColoredRGB(text)
local style = imgui.GetStyle()
local colors = style.Colors
local ImVec4 = imgui.ImVec4
local explode_argb = function(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end
local getcolor = function(color)
if color:sub(1, 6):upper() == 'SSSSSS' then
local r, g, b = colors[1].x, colors[1].y, colors[1].z
local a = tonumber(color:sub(7, 8), 16) or colors[1].w * 255
return ImVec4(r, g, b, a / 255)
end
local color = type(color) == 'string' and tonumber(color, 16) or color
if type(color) ~= 'number' then return end
local r, g, b, a = explode_argb(color)
return imgui.ImColor(r, g, b, a):GetVec4()
end
local render_text = function(text_)
for w in text_:gmatch('[^\r\n]+') do
local text, colors_, m = {}, {}, 1
w = w:gsub('{(......)}', '{%1FF}')
while w:find('{........}') do
local n, k = w:find('{........}')
local color = getcolor(w:sub(n + 1, k - 1))
if color then
text[#text], text[#text + 1] = w:sub(m, n - 1), w:sub(k + 1, #w)
colors_[#colors_ + 1] = color
m = n
end
w = w:sub(1, n - 1) .. w:sub(k + 1, #w)
end
if text[0] then
for i = 0, #text do
imgui.TextColored(colors_[i] or colors[1], text[i])
imgui.SameLine(nil, 0)
end
imgui.NewLine()
else imgui.Text(w) end
end
end
render_text(text)
end
Абстрактный пример использования
Lua:
imgui.TextColoredRGB("{FFFFFF}text1 {SSSSSS}text2 {CCFF00}text3 {FF0000}text4")
[/SPOILER]
[B][COLOR=rgb(243, 121, 52)]Частые проблемы[/COLOR][/B]
[SPOILER="Появляется курсор / Не реагирует окно"]
[B]Суть решения в том, чтобы включить imgui.Process и не выключать его.
Вместо этого мы будем либо прятать курсор, либо отображать.
Также onScriptTerminate() будет отключать курсор при перезагрузке (завершении) скрипта.[/B]
[CODE=lua]im_window = imgui.ImBool(true) -- Окно без курсора
im_window2 = imgui.ImBool(false) -- Окно с курсором
im_window3 = imgui.ImBool(false) -- другое окно с курсором
function main()
while not isSampAvailable() do
wait(0)
end
imgui.Process = true
while true do
wait(0)
if im_window2.v or im_window3.v then -- окна с курсором
imgui.ShowCursor = true
else -- Окна без курсора или нет активных окон
imgui.ShowCursor = false
end
end
end
function imgui.OnDrawFrame()
if im_window.v then
-- рисуем окно без курсора
end
if im_window2.v then
-- рисуем окно с курсором
end
if im_window3.v then
-- рисуем окно с курсором
end
end
function onScriptTerminate(LuaScript, quitGame)
if LuaScript == thisScript() and not quitGame then
showCursor(false, false)
end
end
Частые вопросы
Lua:
function imgui.CenterText(text)
local width = imgui.GetWindowWidth()
local calc = imgui.CalcTextSize(text)
imgui.SetCursorPosX( width / 2 - calc.x / 2 )
imgui.Text(text)
end
-- Пример использования
imgui.CenterText("hello")
Lua:
im_int = imgui.ImInt(42)
imgui.InputInt("Label## ID", im_int, 0, 0)
Примеры / Гайды
Lua:
encoding = require "encoding"
encoding.default = "CP1251"
u8 = encoding.UTF8
-- Это настройки, в них есть переменная отвечающая за язык lang_index
cfg = {
lang_index = 1
}
-- Язык 1
LANG_RUS = {
LABEL = u8"Русский",
BUTTON = u8"Кнопка"
}
-- Язык 2
LANG_ENG = {
LABEL = u8"English",
BUTTON = u8"Button"
}
-- Список этих языков, чтобы по индексу можно было достать любой.
LANGS = {LANG_RUS, LANG_ENG}
-- По индексу языка в настройках делаем переменную LANG которая будет содержать нужный нам язык
LANG = LANGS[cfg.lang_index]
function imgui.OnDrawFrame()
-- Пример с кнопкой
--
imgui.Button(LANG.BUTTON.."## Кнопка 1")
--
-- Выбора языка. ПРИМЕР!
--
for index, value in ipairs(LANGS) do
if imgui.RadioButton(value.LABEL.."## LANG "..index, cfg.lang_index == index) then
cfg.lang_id = index -- меняем айди языка на выбранный
LANG = LANGS[cfg.lang_index] -- обновляем язык
-- luacfg.save(cfg, filename_cfg) -- Сохраняем настройки в файл
end
imgui.SameLine()
end
end
Гайд по модулю inicfg
В примере я использую модифицированный модуль inicfg_ex.lua, который может сохранять нормально строки и таблици.
Внимание: Файлы созданные через inicfg_ex.lua несовместимы с файлами созданными через inicfg.lua
Для работы самого примера также нужно:
Dear ImGui
[Module] ImGui Addons | v1.0.0
[Module] RKeys v2.1.1 (Там ссылка на GitHub, Переходим, жмем зеленую кнопочку "Code", выбираем строчку "Download Zip", внутри архива находим rkeys.lua и закидываем его в свою папку lib. Если зеленой кнопочки нет или нет ссылки - то зарегистрируйтесь на этом сайте)
В примере есть:
imgui_addons.HotKey()
imgui.Checkbox()
imgui.InputInt()
imgui.InputText()
imgui.InputTextMultiline()
Lua:
imgui = require "imgui"
imgui.HotKey = require('imgui_addons').HotKey
rkeys = require "rkeys" -- v 2.1.1
encoding = require "encoding"
encoding.default = "CP1251"
u8 = encoding.UTF8
------------ inicfg_ex ----------------
inicfg_ex = require "inicfg_ex"
---------------------------------------------
-- Относительный путь .ini файла к папке "moonloader\\config\\"
-- Папки и файл при сохранении будут созданы автоматически
filename_ini = "TestINI\\settings.ini"
-- Стандартные настроки
ini = {
main = {
int = 0,
bool = false,
str = "Строка",
str2 = " Строка2 "
},
hotkeys = {
show_window = {}
},
}
ini = inicfg_ex.load(ini, filename_ini) -- Загружаем настроки из файла и перезаписываем переменную ini
-------------------------------------------------------------
imw_menu = imgui.ImBool(false) -- Главное окно
im_int = imgui.ImInt(ini.main.int)
im_buffer = imgui.ImBuffer(u8(ini.main.str), 256)
im_buffer2 = imgui.ImBuffer(u8(ini.main.str2), 2048)
im_bool = imgui.ImBool(ini.main.bool)
-- объект для редактора горячих клавишь imgui.HotKey()
-- конструкция {unpack(Table array)} делает копию массива im_hotkey.v
im_hotkey = {v = {unpack(ini.hotkeys.show_window)}}
-------------------------------------------------------------------
function imgui.OnDrawFrame()
local w, h = getScreenResolution()
if imw_menu.v then
imgui.SetNextWindowSize(imgui.ImVec2(800, 600), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(w/2, h/2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.Begin("TestINI## imw_menu", imw_menu, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
imgui.Checkbox(u8"Меняйте галочку## im_bool", im_bool)
imgui.InputInt(u8"Введите число## im_int", im_int, 0, 0)
imgui.InputText(u8"Текст## im_buffer", im_buffer)
imgui.InputTextMultiline(u8"Текст2## im_buffer2", im_buffer2)
-- Рисую редактор хоткея
if imgui.HotKey("## im_hotkey", im_hotkey, {}, 250) then
rkeys.changeHotKey(hotkey_id, im_hotkey.v)
end
imgui.SameLine()
imgui.Text(u8"Горячая клавиша - показать/скрыть меню")
if imgui.Button(u8"Сохранить") then
-- Меняем переменные в ini на значения из imgui.
ini.main.bool = im_bool.v
ini.main.int = im_int.v
ini.main.str = u8:decode(im_buffer.v)
ini.main.str2 = u8:decode(im_buffer2.v)
-- конструкция {unpack(Table array)} делает копию массива im_hotkey.v
ini.hotkeys.show_window = {unpack(im_hotkey.v)}
inicfg_ex.save(ini, filename_ini)
sampAddChatMessage("- [TestINI] Настройки сохранены", 0xABCDEF)
end
imgui.End()
end
end
function main()
while not isSampAvailable() do
wait(0)
end
imgui.Process = true
-- Регистрирую команду
sampRegisterChatCommand("testini",
function()
imw_menu.v = not imw_menu.v
end
)
-- Регистрирую горячуюю клавишу
hotkey_id = rkeys.registerHotKey(im_hotkey.v, 1, false,
function()
imw_menu.v = not imw_menu.v
end
)
sampAddChatMessage(" - [TestINI] /testini | Открыть меню", 0xABCDEF)
while true do
wait(0)
imgui.ShowCursor = imw_menu.v
end
end
Работа со шрифтами [Скоро будет]
Последнее редактирование: