Информация ImGui сниппеты и частые вопросы

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
Описание
Тема создана с целью сбора удачных решений и ответов на частые вопросы по ImGui интерфейсу.
В шапке темы я постараюсь их красиво организовывать, чтобы искать необходимое было легче.

Оставляйте свои варианты решений ориентируясь на такой шаблон:
  • Название
  • Скриншот
  • Описание
  • Код
  • Пример использования

Элементы интерфейса

Кнопки
qWgQRwq.png


Код
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

apEn0zH.png


Код
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
OH9Uz0n.png


Код
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)

Другое
f4imdhV.png


Код
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)}.

Код
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
meZoK5f.png




Гайд по модулю 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

Работа со шрифтами [Скоро будет]
 
Последнее редактирование:

NoName_001

Участник
152
21
Lua:
primer_text = {'text1', 'text2'} -- все ваши imgui.text'ы, не забывайте про u8

imgui.Text(primer_text[1]) -- вызов первого текста
if imgui.IsItemClicked() then
    imgui.LogToClipboard()
    imgui.LogText(primer_text[1]) -- копирование текста
    imgui.LogFinish()
end
 

Cosmo

Известный
Друг
653
2,725
Элементы интерфейса:
Lua:
function imgui.NewInputText(lable, val, width, hint, hintpos)
    local hint = hint and hint or ''
    local hintpos = tonumber(hintpos) and tonumber(hintpos) or 1
    local cPos = imgui.GetCursorPos()
    imgui.PushItemWidth(width)
    local result = imgui.InputText(lable, val)
    if #val.v == 0 then
        local hintSize = imgui.CalcTextSize(hint)
        if hintpos == 2 then imgui.SameLine(cPos.x + (width - hintSize.x) / 2)
        elseif hintpos == 3 then imgui.SameLine(cPos.x + (width - hintSize.x - 5))
        else imgui.SameLine(cPos.x + 5) end
        imgui.TextColored(imgui.ImVec4(1.00, 1.00, 1.00, 0.40), tostring(hint))
    end
    imgui.PopItemWidth()
    return result
end

Пример использования:
Lua:
imgui.NewInputText('##SearchBar', sBuffer, 300, u8'Поиск по списку', 2)
-- 300 - ширина нашего инпут-бара
-- u8'Поиск по списку' - Сама подсказка
-- 2 - Необязательный параметр. Он устанавливает центрирование подсказки внутри бара (1 - слева, 2 - середина, 3 - справа)

1603184815566.png

1603184831358.png
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,141
Элементы интерфейса:
Функция:
imgui.NewInputText(lable, val, width, [hint = "":
, [hintpos = 1])"]function imgui.NewInputText(lable, val, width, hint, hintpos)
    local hint = hint and hint or ''
    local hintpos = tonumber(hintpos) and tonumber(hintpos) or 1
    local cPos = imgui.GetCursorPos()
    imgui.PushItemWidth(width)
    local result = imgui.InputText(lable, val)
    if #val.v == 0 then
        local hintSize = imgui.CalcTextSize(hint)
        if hintpos == 2 then imgui.SameLine(cPos.x + (width - hintSize.x) / 2)
        elseif hintpos == 3 then imgui.SameLine(cPos.x + (width - hintSize.x - 5))
        else imgui.SameLine(cPos.x + 5) end
        imgui.TextColored(imgui.ImVec4(1.00, 1.00, 1.00, 0.40), tostring(hint))
    end
    imgui.PopItemWidth()
    return result
end
Пример использования:
Lua:
imgui.NewInputText('##SearchBar', sBuffer, 300, u8'Поиск по списку', 2)
-- 300 - ширина нашего инпут-бара
-- u8'Поиск по списку' - Сама подсказка
-- 2 - Необязательный параметр. Он устанавливает центрирование подсказки внутри бара (1 - слева, 2 - середина, 3 - справа)

Посмотреть вложение 72390
Посмотреть вложение 72391
C:
IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
Lua:
local buf = imgui.new.char[128]()
imgui.InputTextWithHint('Any Text', 'Placeholder', buf, ffi.sizeof(buf) - 1)
 

Cosmo

Известный
Друг
653
2,725
C++:
IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
Lua:
local buf = imgui.new.char[128]()
imgui.InputTextWithHint('Any Text', 'Placeholder', buf, ffi.sizeof(buf) - 1)
Это для mimgui. Я для imgui сделал
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,141
Это для mimgui. Я для imgui сделал
До сих пор на Moon ImGUI сидеть - себя не уважать.
Неужели так сложно переехать на mimgui уже.
Lua:
local pushiw = imgui.PushItemWidth
function imgui.PushItemWidth(width)
    _G['_IMGUI_WIDTH'] = width
    return pushiw(width)
end
local popiw = imgui.PopItemWidth
function imgui.PopItemWidth()
    _G['_IMGUI_WIDTH'] = nil
    return popiw()
end

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_WIDTH and t_size > _IMGUI_WIDTH) and t:sub(1, math.floor(_IMGUI_WIDTH / l_size)) or t)
    imgui.SetCursorPos(l_pos[2])
    return handle
end
image.png

Lua:
local buf = imgui.ImBuffer(128)
function imgui.OnDrawFrame()
  imgui.Begin('My window')

  imgui.Text('imgui.InputTextWithHint')
  imgui.PushItemWidth(50)
  imgui.InputTextWithHint('##imgui.InputTextWithHint', 'Big Text Hint Fuck Me', buf)
  imgui.PopItemWidth()

  imgui.Text('imgui.NewInputText (cringe sounds)')
  imgui.NewInputText('##imgui.NewInputText (cringe sounds)', buf, 50, 'Big Text Hint Fuck Me', 1)

  imgui.End()
end
 

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
function imgui.Hint(text, delay, action)
    if imgui.IsItemHovered() then
        if go_hint == nil then go_hint = os.clock() + (delay and delay or 0.0) end
        local alpha = (os.clock() - go_hint) * 5
        if os.clock() >= go_hint then
            imgui.PushStyleVar(imgui.StyleVar.WindowPadding, imgui.ImVec2(10, 10))
            imgui.PushStyleVar(imgui.StyleVar.Alpha, (alpha <= 1.0 and alpha or 1.0))
                imgui.PushStyleColor(imgui.Col.PopupBg, imgui.ImVec4(0.11, 0.11, 0.11, 1.00))
                    imgui.BeginTooltip()
                    imgui.PushTextWrapPos(450)
                    imgui.TextColored(imgui.GetStyle().Colors[imgui.Col.ButtonHovered], u8' Подсказка:')
                    imgui.TextUnformatted(text)
                    if action ~= nil then
                        imgui.TextColored(imgui.GetStyle().Colors[imgui.Col.TextDisabled], '\n '..action)
                    end
                    if not imgui.IsItemVisible() and imgui.GetStyle().Alpha == 1.0 then go_hint = nil end
                    imgui.PopTextWrapPos()
                    imgui.EndTooltip()
                imgui.PopStyleColor()
            imgui.PopStyleVar(2)
        end
    end
end
Пример использования:
imgui.Hint(u8"Прожмите 'Мне нравится' если используете :)",0)
 

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
А как сделать выбор стиля Imgui через Combo.
Пожалуйста, не кидайте видео, я его уже посмотрел, но там используется RadioButton, мне бы желательно на комбо.
Кто-то сможет помочь?
Lua:
function aply_style_1()
    --
end

function aply_style_2()
    --
end


names = {"Style 1", "Style 2"}
styles = {aply_style_1, aply_style_2}

current_style = 1
ImInt = imgui.ImInt(current_style - 1) -- Нумерация в комбо с нуля начинается, по этому отнимаю один

styles[current_style]()


-- OnDrawFrame

        if  imgui.Combo("YourStyle", ImInt, names) then
            current_style = ImInt.v + 1 -- А список Lua начинается с еденици, по-этому добавляю её.
            styles[current_style]()
        end
 
Последнее редактирование:
  • Нравится
Реакции: Viktor Aris

M0rtelli

Участник
34
6
Как в одно окно запихнуть несколько стилей?
Допустим в imgui.BeginChild запихнуть один стиль, а вне чилда другой.
 
  • Нравится
Реакции: Viktor Aris

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
Как в одно окно запихнуть несколько стилей?
Допустим в imgui.BeginChild запихнуть один стиль, а вне чилда другой.
Можно использовать функции типо PushStyleVar() и PushStyleColor() для временного изменения элементов стиля, как в твоем случае. Или применить другой стиль прямо перед чилдом, а потом применить предыдущий стиль.... Но этот вариант я не проверял, не могу сказать будет ли так работатьь, и на сколько быстро.
 
  • Нравится
Реакции: M0rtelli

ewin

Известный
673
372
Элементы интерфейса:
Lua:
function imgui.NewInputText(lable, val, width, hint, hintpos)
    local hint = hint and hint or ''
    local hintpos = tonumber(hintpos) and tonumber(hintpos) or 1
    local cPos = imgui.GetCursorPos()
    imgui.PushItemWidth(width)
    local result = imgui.InputText(lable, val)
    if #val.v == 0 then
        local hintSize = imgui.CalcTextSize(hint)
        if hintpos == 2 then imgui.SameLine(cPos.x + (width - hintSize.x) / 2)
        elseif hintpos == 3 then imgui.SameLine(cPos.x + (width - hintSize.x - 5))
        else imgui.SameLine(cPos.x + 5) end
        imgui.TextColored(imgui.ImVec4(1.00, 1.00, 1.00, 0.40), tostring(hint))
    end
    imgui.PopItemWidth()
    return result
end

Пример использования:
Lua:
imgui.NewInputText('##SearchBar', sBuffer, 300, u8'Поиск по списку', 2)
-- 300 - ширина нашего инпут-бара
-- u8'Поиск по списку' - Сама подсказка
-- 2 - Необязательный параметр. Он устанавливает центрирование подсказки внутри бара (1 - слева, 2 - середина, 3 - справа)

Посмотреть вложение 72390
Посмотреть вложение 72391
Mimgui:
Lua:
local ffi = require 'ffi'
local str, sizeof = ffi.string, ffi.sizeof

function imgui.NewInputText(lable, val, width, hint, hintpos)
  local hint = hint and hint or ''
  local hintpos = tonumber(hintpos) and tonumber(hintpos) or 1
  local cPos = imgui.GetCursorPos()
  imgui.PushItemWidth(width)
  local result = imgui.InputText(lable, val, sizeof(val))
  if #str(val) == 0 then
      local hintSize = imgui.CalcTextSize(hint)
      if hintpos == 2 then imgui.SameLine(cPos.x + (width - hintSize.x) / 2)
      elseif hintpos == 3 then imgui.SameLine(cPos.x + (width - hintSize.x - 5))
      else imgui.SameLine(cPos.x + 5) end
      imgui.TextColored(imgui.ImVec4(1.00, 1.00, 1.00, 0.40), tostring(hint))
  end
  imgui.PopItemWidth()
  return result
end
 
Последнее редактирование:

(^O_O^)

Активный
114
27
кратко гайд для инвалидок как и я

пример создания на имгуи



gay:
--[[
Вот вам файл, передайте его всем остальным. Не трогайте меня только.

С уважением,
Double Tap Inside
]]


-- Необходимые модули
encoding = require("encoding")
encoding.default = "CP1251"
u8 = encoding.UTF8
inicfg = require("inicfg")
vkeys = require("vkeys")
rkeys = require("rkeys") -- "2.1.1"
imgui = require("imgui")
imgui.HotKey = require("imgui_addons").HotKey

-- encodeJson(obj) -- Кодирует lua таблицу в json формат и возвращает строку
-- decodeJson(obj) - Делает из json строки lua таблицу


-- Пути и путь к ini файлу

filename_ini = "htest\\htest.ini"


-- стандартные настройки
ini = {}
ini.HOTKEYS = {
    callback_1 = encodeJson( {vkeys.VK_MENU, vkeys.VK_1} ), -- комбинация клавишь в формате json строки
    callback_2 = encodeJson( {vkeys.VK_MENU, vkeys.VK_2} ),
}

-- Обновляем стандартные настройки значениями из файла
inicfg.load(ini, filename_ini)


-- Объекты имгуя
img = {}
img.window_main = imgui.ImBool(false)

img.HOTKEYS = {
    callback_1 = {
        v = decodeJson(ini.HOTKEYS.callback_1) -- создаю callback_1.v который засуну потом в imgui.HotKey()
    },
    
    callback_2 = {
        v = decodeJson(ini.HOTKEYS.callback_2) -- создаю callback_2.v который засуну потом в imgui.HotKey()
    }
}


-- функция которую вызываем на нажатие комбинации
function callback_1()
    sampAddChatMessage("Работает!", 0xFF8800)
end

function callback_2()
    sampAddChatMessage("Собака!", 0xFF8800)
end

-- Отрисовка имгуя
function imgui.OnDrawFrame()
    if img.window_main.v then
        imgui.Begin(u8"Тест хоткея##img.window_main", img.window_main)
        
            -- Рисуем первое поле для выбора комбинации
            if imgui.HotKey("##img.HOTKEYS.callback_1", img.HOTKEYS.callback_1) then
                rkeys.changeHotKey(ID_CALLBACK_1, img.HOTKEYS.callback_1.v)
                ini.HOTKEYS.callback_1 = encodeJson(img.HOTKEYS.callback_1.v)
                inicfg.save(ini, filename_ini)
                sampAddChatMessage("Сохранено в config\\"..filename_ini, 0xFF8800)
            end
        
            imgui.SameLine()
            imgui.Text(u8"Работает!")
            
            -- Рисуем второе поле для выбора комбинации           
            if imgui.HotKey("##img.HOTKEYS.callback_2", img.HOTKEYS.callback_2) then
                rkeys.changeHotKey(ID_CALLBACK_2, img.HOTKEYS.callback_2.v)
                ini.HOTKEYS.callback_2 = encodeJson(img.HOTKEYS.callback_2.v)
                inicfg.save(ini, filename_ini)
                sampAddChatMessage("Сохранено в config\\"..filename_ini, 0xFF8800)
            end
            
            imgui.SameLine()
            imgui.Text(u8"Собака!")
        imgui.End()
    end
end


-- Запуск скрипта
function main()
    while not isSampAvailable() do
        wait(0)
    end
    
    imgui.Process = true
    
    sampRegisterChatCommand("htest", function()
        img.window_main.v = not img.window_main.v
    end)
    
    -- Регистрируем эти горячие клавиши
    ID_CALLBACK_1 = rkeys.registerHotKey(img.HOTKEYS.callback_1.v, 1, callback_1)
    ID_CALLBACK_2 = rkeys.registerHotKey(img.HOTKEYS.callback_2.v, 1, callback_2)

    
    sampAddChatMessage("/htest", 0xFF8800)
    
    while true do
        imgui.ShowCursor = img.window_main.v
        wait(0)
    end
end
 

Вложения

  • htest.lua
    2.8 KB · Просмотры: 26
  • Влюблен
Реакции: Double Tap Inside