Гайд Примеры Mimgui с пояснениями

Введение
Данная тема создана, как продолжение гайда "Mimgui для чайников" (обязательно к прочтению) с целью ознакомить начинающих скриптеров с mimgui на практике.

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

Крайне приветствуются идеи по примерам, скрипты, которые интересно разобрать и просто рекомендации/исправления по гайду.

Путеводитель по гайду
1.0 - Шаблоны пустых мимгуи

2.0 - Пример с использованием fAwesome6 (иконок)
2.1 - Пример с сохранением в конфиг
2.2 - Пример с вкладками (2 способа)
2.3 - Пример с поиском по списку (2 способа)
2.4 - Пример со вторым окном (без курсора)
2.5 - Пример с подгрузкой картинки в формате .png
2.6 - Пример с изменением темы/стиля мимгуи окна (без выбора)
2.7 - Пример с несколькими цветовыми стилями/темами (с выбором)

1.0 Шаблоны пустых мимгуи
Вариант с пояснениями в 1-ом гайде по Mimgui
По команде
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new = imgui.new

local WinState = new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
По кнопке
Lua:
require('lib.moonloader')
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new = imgui.new

local WinState = new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)
    imgui.End()
end)

function main()
    while true do wait(0)
        if wasKeyPressed(VK_R) and not sampIsCursorActive() then -- Если нажата клавиша R и не активен самп курсор (во избежании активации при открытом чате/диалоге)
            WinState[0] = not WinState[0]
        end
    end
end

Скачать, а также ознакомиться с fAwesome4/5/6 можно тут *клик*
Список иконок для fAwesome6 можно найти тут - https://fontawesome.com/v6/search
Ниже представлен шаблон готовый к использованию
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local faicons = require('fAwesome6')

local WinState = imgui.new.bool()

imgui.OnFrame(function() return WinState[0] end, function()
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(250,300), imgui.Cond.FirstUseEver)
    imgui.Begin('##Window', WinState)
    imgui.Button(faicons('user'),imgui.ImVec2(24,24)) -- faicons('user') отрисовывание самой иконки
    imgui.Text(faicons('star')..u8' Текст')
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function()
        WinState[0] = not WinState[0]
    end)
    wait(-1)
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    config.PixelSnapH = true
    iconRanges = imgui.new.ImWchar[3](faicons.min_range, faicons.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromMemoryCompressedBase85TTF(faicons.get_font_data_base85('solid'), 14, config, iconRanges)
end)
1691262526650.png

Доп. пояснения:
1. Всего есть 5 типов иконок
(применяются только к самой иконке, текст будет обычным(не как на скрине))
- Solid
- Thin
- Regular
- Light
- Duotune
1691262734469.png


Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new, str = imgui.new, ffi.string

-- вписываем всё необходимое
local inicfg = require 'inicfg'
local settings = inicfg.load({
    nigger =
    {
        inputsaved = '', -- значение инпута
        checkboxstatus = false, -- значение чекбокса
    }}, 'Test.ini')

local inputt = new.char[256](u8(settings.nigger.inputsaved)) -- в скобках значение конфига, перед скобками обязательно пишите u8
local checkboxone = new.bool(settings.nigger.checkboxstatus) -- в скобках путь где хранится статус чекбокса
---------------------------------
local WinState = imgui.new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('Test', WinState, imgui.WindowFlags.NoResize)
    -- Пример использования --
    if imgui.InputText('##Add', inputt, 256) then
        settings.nigger.inputsaved = u8:decode(str(inputt)) -- значение вписывается в конфиг
        inicfg.save(settings, 'Test.ini') -- конфиг сохраняется
    end
    imgui.Text(inputt)
    if imgui.Button(u8'Вывести в чат') then
        sampAddChatMessage(settings.nigger.inputsaved,-1) -- выводим значение конфига в чат
    end
    if imgui.Button(u8'Очистить') then -- по этой кнопке можно очистить значение в конфиге
        imgui.StrCopy(inputt, '') -- очищает поле инпута
        settings.nigger.inputsaved = ''
        inicfg.save(settings, 'Test.ini')
    end
    imgui.Separator()
    if imgui.Checkbox(u8'Тестовый чекбокс',checkboxone) then -- обязательно прописываем чекбокс, как условие, чтоб в дальнейшем он сам сохранялся
        settings.nigger.checkboxstatus = checkboxone[0] -- меняем значение конфига на значение чекбокса
        inicfg.save(settings, 'Test.ini') -- сохраняем в конфиге
    end
    imgui.Text(u8'(Конфиг) Чекбокс '..(settings.nigger.checkboxstatus and u8'активен' or u8'неактивен'))
    imgui.Text(u8'(Буфер) Чекбокс '..(checkboxone[0] and u8'активен' or u8'неактивен'))
    -- Пример закончился --
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end

1691259363057.png

Доп. пояснения:
1. В буфере путь к значению конфига указывается, чтоб задать начальное значение буферу.
2. Если вы достаёте кфг где хранятся символы, обязательно прописывайте путь к значению в скобках после
u8 (как в примере на 17 строке)
3. Чтобы получить состояние, например, чекбокса, можно использовать следующие 2 способа:

Lua:
-- 1-ый способ с помощью обращения к конфигу
imgui.Text(u8'(Конфиг) Чекбокс '..(settings.nigger.checkboxstatus and u8'активен' or u8'неактивен'))
-- 2-ой способ с помощью обращения к буферу чекбокса
imgui.Text(u8'(Буфер) Чекбокс '..(checkboxone[0] and u8'активен' or u8'неактивен'))

1-ый способ: используя встроенную функцию в мимгуи
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local WinState = imgui.new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 280), imgui.Cond.Always)
    imgui.Begin(u8'Пример', WinState, imgui.WindowFlags.NoResize)
    if imgui.BeginTabBar('Tabs') then
        if imgui.BeginTabItem(u8'Первая') then -- задаём название первой вкладки
            -- далее идёт содержимое вкладки
            imgui.Text(u8'Сейчас открыта первая вкладка')
            -- конец содержимого вкладки
            imgui.EndTabItem()
        end
        if imgui.BeginTabItem(u8'Вторая') then -- задаём название второй вкладки
            -- далее идёт содержимое вкладки
            if imgui.Button('Test') then
                sampAddChatMessage('Вы нажали кнопку во второй вкладке',-1)
            end
            -- конец содержимого вкладки
            imgui.EndTabItem()
        end
        imgui.EndTabBar()
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
1691259850460.png

2-ой способ: с помощью кнопок
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local WinState = imgui.new.bool()

local tab = 1 -- в этой переменной будет хранится номер открытой вкладки

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(400, 120), imgui.Cond.Always)
    imgui.Begin(u8'Пример', WinState, imgui.WindowFlags.NoResize)
    for numberTab,nameTab in pairs({'Основное','Настройки','Инфа'}) do -- создаём и парсим таблицу с названиями будущих вкладок
        if imgui.Button(u8(nameTab), imgui.ImVec2(80,24)) then -- 2ым аргументом настраивается размер кнопок (подробнее в гайде по мимгуи)
            tab = numberTab -- меняем значение переменной tab на номер нажатой кнопки
        end
    end
    imgui.SetCursorPos(imgui.ImVec2(95, 28)) -- [Для декора] Устанавливаем позицию для чайлда ниже
    if imgui.BeginChild('Name##'..tab, imgui.ImVec2(300, 80), true) then -- [Для декора] Создаём чайлд в который поместим содержимое
        -- == [Основное] Содержимое вкладок == --
        if tab == 1 then -- если значение tab == 1
            -- == Содержимое вкладки №1
            imgui.Text(u8'Открыта первая вкладка "Основное"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 2 then -- если значение tab == 2
            -- == Содержимое вкладки №2
            imgui.Text(u8'Открыта первая вкладка "Настройки"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 3 then -- если значение tab == 3
            -- == Содержимое вкладки №3
            imgui.Text(u8'Открыта первая вкладка "Инфа"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        end
        -- == [Основное] Содержимое вкладок закончилось == --
        imgui.EndChild()
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
1691260944001.png


1-ый способ: за пример спасибо @RTD)
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new = imgui.new

local WinState = new.bool()
local filter = imgui.ImGuiTextFilter() -- создаём короткий псевдоним функции
local commands = {'Правило 1: Не упоминать о помидорной диете',
'Правило 2: Не упоминать нигде о помидорной диете',
'Правило 3: Участник крикнул "стоп", наелся, выдохся - диета приостановлена',
'Правило 4: Если оскорбили одного, то это не рофл, это статья 103 и штраф от 10 до 15 тысяч',
'Правило 5: Диета проходит без пауз',
'Правило 6: Перед употреблением помидора, читать молитву помидорному монстру',
'Правило 7: Диета продолжается столько, сколько нужно',
'Правило 8: Тот, кто впервые сел на диету, первым съест помидор'}

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(580, 205), imgui.Cond.Always)
    imgui.Begin('Example', WinState, imgui.WindowFlags.NoResize)
    filter:Draw(u8"Поиск", 80) -- отрисовываем поле для поиска, 2-й аргумент его ширина
    if filter:IsActive() then -- проверка на то используется ли фильтр
        imgui.SameLine()
        if imgui.Button("Clear") then
            filter:Clear() -- очищаем поле с поиском, если нажата клавиша
        end
    end
    for i = 1, #commands do -- парсим таблицу с нужным текстом
        if filter:PassFilter(u8(commands[i])) then -- как в первом примере, если находит совпадение, то
            imgui.Text(u8(commands[i])) -- выдает нужный текст
        end
    end
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
Скриншот 06-08-2023 022619.png

2-ой способ:
Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- == Для удобства создаём список в таблице == --
local commands = {'Правило 1: Не упоминать о помидорной диете',
'Правило 2: Не упоминать нигде о помидорной диете',
'Правило 3: Участник крикнул "стоп", наелся, выдохся - диета приостановлена',
'Правило 4: Если оскорбили одного, то это не рофл, это статья 103 и штраф от 10 до 15 тысяч',
'Правило 5: Диета проходит без shit',
'Правило 6: Перед употреблением помидора, читать молитву помидорному монстру',
'Правило 7: Диета продолжается столько, сколько нужно',
'Правило 8: Тот, кто впервые сел на диету, первым съест помидор'}

local WinState = imgui.new.bool(true)
local search = imgui.new.char[256]() -- создаём буфер для поиска

imgui.OnFrame(function() return WinState[0] end,function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(600, 200), imgui.Cond.Always)
    imgui.Begin('Example', WinState, imgui.WindowFlags.NoResize)
    imgui.InputTextWithHint('##Search',u8'Поиск',search,256) -- создаём инпут поле в котором будет вводится нужный текст
    imgui.SameLine()
    if imgui.Button(u8'Очистить') then -- создаём кнопку, чтобы быстро очищать инпут
        imgui.StrCopy(search,'') -- задаём в инпут пустоту
    end
    for k,v in pairs(commands) do -- парсим таблицу с текстом
        if u8(v):find(ffi.string(search)) then -- если значение с таблицы u8(v) совпадает со значением инпута ffi.string(search), то
            imgui.Text(u8(v)) -- отображаем текст
        end
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
1691305122902.png

Lua:
local imgui = require 'mimgui'
local WinState, show = imgui.new.bool(), imgui.new.bool()
local changepos = false -- статус редактирования позиции окошка
local posX, posY = 500, 500 -- задаём начальную позицию второго окошка

imgui.OnFrame(function() return show[0] and not isGamePaused() end, function()
    imgui.SetNextWindowPos(imgui.ImVec2(posX, posY), imgui.Cond.Always, imgui.ImVec2(1, 1))
    imgui.SetNextWindowSize(imgui.ImVec2(255, 90), imgui.Cond.Always)
    imgui.Begin('Window Two', show, imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration)
    imgui.Text('One')
    imgui.Text('Two')
    imgui.End()
end).HideCursor = true -- HideCursor отвечает за то, чтобы курсор не показывался

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 280), imgui.Cond.Always)
    imgui.Begin('Window One', WinState, imgui.WindowFlags.NoResize + imgui.WindowFlags.AlwaysAutoResize)
    if imgui.Button('Open new window') then -- вкл/выкл второе окошко
        show[0] = not show[0]
    end
    if imgui.Button('Change pos') then -- нажав на эту кнопку, можно поменять позицию окна
        changepos = true
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    while true do wait(0)
        if changepos then -- редактирование позиции окошка, его можно впихнуть и в сам мимгуи
            posX, posY = getCursorPos() -- функция позволяет получить координаты курсора на экране
            if isKeyJustPressed(1) then -- если нажата ЛКМ, то сохраняем позицию
                changepos = false
            end
        end
    end
end
Доп. пояснения:
1. За что отвечают флаги во втором окне:
-
imgui.WindowFlags.NoMove - не позволяет передвигать окно с помощью мышки
- imgui.WindowFlags.NoDecoration - убирает у окна декор части, а именно верхнюю бровь, херню для изменения размера окна, ползунок

1691258255206.png


Важно: не называйте подгружаемую картинку logo.png, почему-то с таким названием работать не хочет.
Lua:
local imgui = require 'mimgui'
local WinState = imgui.new.bool()

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end

imgui.OnFrame(function() return WinState[0] and not isPauseMenuActive() end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(300, 300), imgui.Cond.Always)
    imgui.Begin('##Window', WinState,imgui.WindowFlags.NoResize)
    imgui.Image(imhandle, imgui.ImVec2(200, 200)) -- эта функция рендерит саму картинку
    imgui.End()
end)

imgui.OnInitialize(function()
    if doesFileExist(getWorkingDirectory()..'\\resource\\example.png') then -- находим необходимую картинку с названием example.png в папке moonloader/resource/
        imhandle = imgui.CreateTextureFromFile(getWorkingDirectory() .. '\\resource\\example.png') -- если найдена, то записываем в переменную хендл картинки
    end
end)
1692370682723.png



Выбрать стиль (далее - тема) можно в этой теме (учитывайте, что темы для мимгуи и имгуи отличаются):
Пример того, как изменить стиль/тему начинается с 18 строки
Lua:
-- == Самый обычный шаблон мимгуи == --
local imgui = require 'mimgui'
local new = imgui.new

local WinState = new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
-- == Ниже задаётся тема == --
imgui.OnInitialize(function()
    themeExample()
end)
function themeExample()
    imgui.SwitchContext()
    local ImVec4 = imgui.ImVec4
    imgui.GetStyle().WindowPadding = imgui.ImVec2(5, 5)
    imgui.GetStyle().FramePadding = imgui.ImVec2(5, 5)
    imgui.GetStyle().ItemSpacing = imgui.ImVec2(5, 5)
    imgui.GetStyle().ItemInnerSpacing = imgui.ImVec2(2, 2)
    imgui.GetStyle().TouchExtraPadding = imgui.ImVec2(0, 0)
    imgui.GetStyle().IndentSpacing = 0
    imgui.GetStyle().ScrollbarSize = 10
    imgui.GetStyle().GrabMinSize = 10
    imgui.GetStyle().WindowBorderSize = 1
    imgui.GetStyle().ChildBorderSize = 1
    imgui.GetStyle().PopupBorderSize = 1
    imgui.GetStyle().FrameBorderSize = 1
    imgui.GetStyle().TabBorderSize = 1
    imgui.GetStyle().WindowRounding = 8
    imgui.GetStyle().ChildRounding = 8
    imgui.GetStyle().FrameRounding = 8
    imgui.GetStyle().PopupRounding = 8
    imgui.GetStyle().ScrollbarRounding = 8
    imgui.GetStyle().GrabRounding = 8
    imgui.GetStyle().TabRounding = 8
 
    imgui.GetStyle().Colors[imgui.Col.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    imgui.GetStyle().Colors[imgui.Col.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    imgui.GetStyle().Colors[imgui.Col.ChildBg]                = ImVec4(1.00, 1.00, 1.00, 0.00)
    imgui.GetStyle().Colors[imgui.Col.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    imgui.GetStyle().Colors[imgui.Col.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
    imgui.GetStyle().Colors[imgui.Col.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBg]                = ImVec4(0.48, 0.16, 0.16, 0.54)
    imgui.GetStyle().Colors[imgui.Col.FrameBgHovered]         = ImVec4(0.98, 0.26, 0.26, 0.40)
    imgui.GetStyle().Colors[imgui.Col.FrameBgActive]          = ImVec4(0.98, 0.26, 0.26, 0.67)
    imgui.GetStyle().Colors[imgui.Col.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TitleBgActive]          = ImVec4(0.48, 0.16, 0.16, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    imgui.GetStyle().Colors[imgui.Col.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    imgui.GetStyle().Colors[imgui.Col.CheckMark]              = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.SliderGrab]             = ImVec4(0.88, 0.26, 0.24, 1.00)
    imgui.GetStyle().Colors[imgui.Col.SliderGrabActive]       = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Button]                 = ImVec4(0.98, 0.26, 0.26, 0.40)
    imgui.GetStyle().Colors[imgui.Col.ButtonHovered]          = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ButtonActive]           = ImVec4(0.98, 0.06, 0.06, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Header]                 = ImVec4(0.98, 0.26, 0.26, 0.31)
    imgui.GetStyle().Colors[imgui.Col.HeaderHovered]          = ImVec4(0.98, 0.26, 0.26, 0.80)
    imgui.GetStyle().Colors[imgui.Col.HeaderActive]           = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Separator]              = ImVec4(0.43, 0.43, 0.50, 0.50)
    imgui.GetStyle().Colors[imgui.Col.SeparatorHovered]       = ImVec4(0.75, 0.10, 0.10, 0.78)
    imgui.GetStyle().Colors[imgui.Col.SeparatorActive]        = ImVec4(0.75, 0.10, 0.10, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ResizeGrip]             = ImVec4(0.98, 0.26, 0.26, 0.25)
    imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered]      = ImVec4(0.98, 0.26, 0.26, 0.67)
    imgui.GetStyle().Colors[imgui.Col.ResizeGripActive]       = ImVec4(0.98, 0.26, 0.26, 0.95)
    imgui.GetStyle().Colors[imgui.Col.Tab]                    = ImVec4(0.98, 0.26, 0.26, 0.40)
    imgui.GetStyle().Colors[imgui.Col.TabHovered]             = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TabActive]              = ImVec4(0.98, 0.06, 0.06, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TabUnfocused]           = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TabUnfocusedActive]     = ImVec4(0.98, 0.26, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TextSelectedBg]         = ImVec4(0.98, 0.26, 0.26, 0.35)
end
1691424763168.png

В примере будет использовано три темы:
1-ая тема - Красная. Автор: хз кто, давно использую в своих
2-ая тема - Зелёная. Автор: @neverlane
3-ья тема - Синяя. Автор: @Miron Diamond
Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new = imgui.new

local WinState = new.bool()

local colorList = {u8'Красная', u8'Зелёная',u8'Синяя'} -- создаём таблицу с названиями тем
local colorListNumber = new.int() -- создаём буфер где будет хранится номер выбранной темы
local colorListBuffer = new['const char*'][#colorList](colorList) -- создаём буфер для списка

local sliderBuf = new.int() -- буфер для тестового слайдера

-- == Создаём таблицу с цветами
theme = {
    {
        change = function()
            local ImVec4 = imgui.ImVec4
            imgui.SwitchContext()
            imgui.GetStyle().Colors[imgui.Col.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
            imgui.GetStyle().Colors[imgui.Col.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
            imgui.GetStyle().Colors[imgui.Col.ChildBg]                = ImVec4(1.00, 1.00, 1.00, 0.00)
            imgui.GetStyle().Colors[imgui.Col.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
            imgui.GetStyle().Colors[imgui.Col.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
            imgui.GetStyle().Colors[imgui.Col.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
            imgui.GetStyle().Colors[imgui.Col.FrameBg]                = ImVec4(0.48, 0.16, 0.16, 0.54)
            imgui.GetStyle().Colors[imgui.Col.FrameBgHovered]         = ImVec4(0.98, 0.26, 0.26, 0.40)
            imgui.GetStyle().Colors[imgui.Col.FrameBgActive]          = ImVec4(0.98, 0.26, 0.26, 0.67)
            imgui.GetStyle().Colors[imgui.Col.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TitleBgActive]          = ImVec4(0.48, 0.16, 0.16, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
            imgui.GetStyle().Colors[imgui.Col.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
            imgui.GetStyle().Colors[imgui.Col.CheckMark]              = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.SliderGrab]             = ImVec4(0.88, 0.26, 0.24, 1.00)
            imgui.GetStyle().Colors[imgui.Col.SliderGrabActive]       = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Button]                 = ImVec4(0.98, 0.26, 0.26, 0.40)
            imgui.GetStyle().Colors[imgui.Col.ButtonHovered]          = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ButtonActive]           = ImVec4(0.98, 0.06, 0.06, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Header]                 = ImVec4(0.98, 0.26, 0.26, 0.31)
            imgui.GetStyle().Colors[imgui.Col.HeaderHovered]          = ImVec4(0.98, 0.26, 0.26, 0.80)
            imgui.GetStyle().Colors[imgui.Col.HeaderActive]           = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Separator]              = ImVec4(0.43, 0.43, 0.50, 0.50)
            imgui.GetStyle().Colors[imgui.Col.SeparatorHovered]       = ImVec4(0.75, 0.10, 0.10, 0.78)
            imgui.GetStyle().Colors[imgui.Col.SeparatorActive]        = ImVec4(0.75, 0.10, 0.10, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ResizeGrip]             = ImVec4(0.98, 0.26, 0.26, 0.25)
            imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered]      = ImVec4(0.98, 0.26, 0.26, 0.67)
            imgui.GetStyle().Colors[imgui.Col.ResizeGripActive]       = ImVec4(0.98, 0.26, 0.26, 0.95)
            imgui.GetStyle().Colors[imgui.Col.Tab]                    = ImVec4(0.98, 0.26, 0.26, 0.40)
            imgui.GetStyle().Colors[imgui.Col.TabHovered]             = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TabActive]              = ImVec4(0.98, 0.06, 0.06, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TabUnfocused]           = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TabUnfocusedActive]     = ImVec4(0.98, 0.26, 0.26, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TextSelectedBg]         = ImVec4(0.98, 0.26, 0.26, 0.35)
        end
    },
    {
        change = function()
            local ImVec4 = imgui.ImVec4
            imgui.SwitchContext()
            imgui.GetStyle().Colors[imgui.Col.Text]                   = ImVec4(0.90, 0.90, 0.90, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TextDisabled]           = ImVec4(0.60, 0.60, 0.60, 1.00)
            imgui.GetStyle().Colors[imgui.Col.WindowBg]               = ImVec4(0.08, 0.08, 0.08, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ChildBg]                = ImVec4(0.10, 0.10, 0.10, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Border]                 = ImVec4(0.70, 0.70, 0.70, 0.40)
            imgui.GetStyle().Colors[imgui.Col.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
            imgui.GetStyle().Colors[imgui.Col.FrameBg]                = ImVec4(0.15, 0.15, 0.15, 1.00)
            imgui.GetStyle().Colors[imgui.Col.FrameBgHovered]         = ImVec4(0.19, 0.19, 0.19, 0.71)
            imgui.GetStyle().Colors[imgui.Col.FrameBgActive]          = ImVec4(0.34, 0.34, 0.34, 0.79)
            imgui.GetStyle().Colors[imgui.Col.TitleBg]                = ImVec4(0.00, 0.69, 0.33, 0.80)
            imgui.GetStyle().Colors[imgui.Col.TitleBgActive]          = ImVec4(0.00, 0.74, 0.36, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed]       = ImVec4(0.00, 0.69, 0.33, 0.50)
            imgui.GetStyle().Colors[imgui.Col.MenuBarBg]              = ImVec4(0.00, 0.80, 0.38, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarBg]            = ImVec4(0.16, 0.16, 0.16, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab]          = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered]   = ImVec4(0.00, 0.82, 0.39, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive]    = ImVec4(0.00, 1.00, 0.48, 1.00)
            imgui.GetStyle().Colors[imgui.Col.CheckMark]              = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.SliderGrab]             = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.SliderGrabActive]       = ImVec4(0.00, 0.77, 0.37, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Button]                 = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ButtonHovered]          = ImVec4(0.00, 0.82, 0.39, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ButtonActive]           = ImVec4(0.00, 0.87, 0.42, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Header]                 = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.HeaderHovered]          = ImVec4(0.00, 0.76, 0.37, 0.57)
            imgui.GetStyle().Colors[imgui.Col.HeaderActive]           = ImVec4(0.00, 0.88, 0.42, 0.89)
            imgui.GetStyle().Colors[imgui.Col.Separator]              = ImVec4(1.00, 1.00, 1.00, 0.40)
            imgui.GetStyle().Colors[imgui.Col.SeparatorHovered]       = ImVec4(1.00, 1.00, 1.00, 0.60)
            imgui.GetStyle().Colors[imgui.Col.SeparatorActive]        = ImVec4(1.00, 1.00, 1.00, 0.80)
            imgui.GetStyle().Colors[imgui.Col.ResizeGrip]             = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered]      = ImVec4(0.00, 0.76, 0.37, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ResizeGripActive]       = ImVec4(0.00, 0.86, 0.41, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotLines]              = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotLinesHovered]       = ImVec4(0.00, 0.74, 0.36, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotHistogram]          = ImVec4(0.00, 0.69, 0.33, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotHistogramHovered]   = ImVec4(0.00, 0.80, 0.38, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TextSelectedBg]         = ImVec4(0.00, 0.69, 0.33, 0.72)
        end
    },
    {
        change = function()
            local ImVec4 = imgui.ImVec4
            imgui.SwitchContext()
            imgui.GetStyle().Colors[imgui.Col.WindowBg]               = ImVec4(0.08, 0.08, 0.08, 1.00)
            imgui.GetStyle().Colors[imgui.Col.FrameBg]                = ImVec4(0.16, 0.29, 0.48, 0.54)
            imgui.GetStyle().Colors[imgui.Col.FrameBgHovered]         = ImVec4(0.26, 0.59, 0.98, 0.40)
            imgui.GetStyle().Colors[imgui.Col.FrameBgActive]          = ImVec4(0.26, 0.59, 0.98, 0.67)
            imgui.GetStyle().Colors[imgui.Col.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TitleBgActive]          = ImVec4(0.16, 0.29, 0.48, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
            imgui.GetStyle().Colors[imgui.Col.CheckMark]              = ImVec4(0.26, 0.59, 0.98, 1.00)
            imgui.GetStyle().Colors[imgui.Col.SliderGrab]             = ImVec4(0.24, 0.52, 0.88, 1.00)
            imgui.GetStyle().Colors[imgui.Col.SliderGrabActive]       = ImVec4(0.26, 0.59, 0.98, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Button]                 = ImVec4(0.26, 0.59, 0.98, 0.40)
            imgui.GetStyle().Colors[imgui.Col.ButtonHovered]          = ImVec4(0.26, 0.59, 0.98, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ButtonActive]           = ImVec4(0.06, 0.53, 0.98, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Header]                 = ImVec4(0.26, 0.59, 0.98, 0.31)
            imgui.GetStyle().Colors[imgui.Col.HeaderHovered]          = ImVec4(0.26, 0.59, 0.98, 0.80)
            imgui.GetStyle().Colors[imgui.Col.HeaderActive]           = ImVec4(0.26, 0.59, 0.98, 1.00)
            imgui.GetStyle().Colors[imgui.Col.Separator]              = ImVec4(0.43, 0.43, 0.50, 0.50)
            imgui.GetStyle().Colors[imgui.Col.SeparatorHovered]       = ImVec4(0.26, 0.59, 0.98, 0.78)
            imgui.GetStyle().Colors[imgui.Col.SeparatorActive]        = ImVec4(0.26, 0.59, 0.98, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ResizeGrip]             = ImVec4(0.26, 0.59, 0.98, 0.25)
            imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered]      = ImVec4(0.26, 0.59, 0.98, 0.67)
            imgui.GetStyle().Colors[imgui.Col.ResizeGripActive]       = ImVec4(0.26, 0.59, 0.98, 0.95)
            imgui.GetStyle().Colors[imgui.Col.TextSelectedBg]         = ImVec4(0.26, 0.59, 0.98, 0.35)
            imgui.GetStyle().Colors[imgui.Col.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
            imgui.GetStyle().Colors[imgui.Col.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
            imgui.GetStyle().Colors[imgui.Col.WindowBg]               = ImVec4(0.06, 0.53, 0.98, 0.70)
            imgui.GetStyle().Colors[imgui.Col.ChildBg]                = ImVec4(0.10, 0.10, 0.10, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PopupBg]                = ImVec4(0.06, 0.53, 0.98, 0.70)
            imgui.GetStyle().Colors[imgui.Col.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
            imgui.GetStyle().Colors[imgui.Col.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
            imgui.GetStyle().Colors[imgui.Col.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
            imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
            imgui.GetStyle().Colors[imgui.Col.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
        end
    }
}

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)
    -- == Выбор цвета == --
    if imgui.Combo(u8'Темы',colorListNumber,colorListBuffer, #colorList) then -- создаём комбо для выбора темы
        theme[colorListNumber[0]+1].change() -- меняем на выбранную тему
    end
    -- == Для наглядного примера
    if imgui.BeginChild('Name', imgui.ImVec2(235, 207), true) then
        imgui.Text(u8'Текущая тема: '..colorList[colorListNumber[0]+1])
        for i = 1, 3 do
            imgui.Button(u8'Пример кнопки №'..i)
        end
        imgui.Separator()
        imgui.SliderInt('SliderInt',sliderBuf,0,10)
        for i = 1, 4 do
            imgui.RadioButtonBool('Test##'..i,sliderBuf[0] == i and true or false)
            if i < 4 then imgui.SameLine() end
        end
        for i = 0, 3 do
            imgui.ArrowButton('tesst',i)
            if i < 4 then imgui.SameLine() end
        end
        imgui.EndChild()
    end
    -- == == --
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
imgui.OnInitialize(function()
    decor() -- применяем декор часть
    theme[colorListNumber[0]+1].change() -- применяем цветовую часть
end)
function decor()
    -- == Декор часть == --
    imgui.SwitchContext()
    local ImVec4 = imgui.ImVec4
    imgui.GetStyle().WindowPadding = imgui.ImVec2(5, 5)
    imgui.GetStyle().FramePadding = imgui.ImVec2(5, 5)
    imgui.GetStyle().ItemSpacing = imgui.ImVec2(5, 5)
    imgui.GetStyle().ItemInnerSpacing = imgui.ImVec2(2, 2)
    imgui.GetStyle().TouchExtraPadding = imgui.ImVec2(0, 0)
    imgui.GetStyle().IndentSpacing = 0
    imgui.GetStyle().ScrollbarSize = 10
    imgui.GetStyle().GrabMinSize = 10
    imgui.GetStyle().WindowBorderSize = 1
    imgui.GetStyle().ChildBorderSize = 1
    imgui.GetStyle().PopupBorderSize = 1
    imgui.GetStyle().FrameBorderSize = 1
    imgui.GetStyle().TabBorderSize = 1
    imgui.GetStyle().WindowRounding = 8
    imgui.GetStyle().ChildRounding = 8
    imgui.GetStyle().FrameRounding = 8
    imgui.GetStyle().PopupRounding = 8
    imgui.GetStyle().ScrollbarRounding = 8
    imgui.GetStyle().GrabRounding = 8
    imgui.GetStyle().TabRounding = 8
end
1691269096943.png
1691269114512.png
1691269134269.png
Доп. пояснения:
1. Будьте внимательны с выбором темы и её использованием в коде, при любой мелкой ошибки скрипт будет крашится
 
Последнее редактирование:

ManstikosUA

Участник
66
13
сам ответил на свой вопрос, просто добавляй новый буфер для каждого инпута:/
Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new, str = imgui.new, ffi.string

-- вписываем всё необходимое
local inicfg = require 'inicfg'
local settings = inicfg.load({
    nigger =
    {
        inputsaved = '', -- значение инпута
        nick = '',
        rang = '',
    }}, 'Test.ini')

local inputt = new.char[256](u8(settings.nigger.inputsaved)) -- в скобках значение конфига, перед скобками обязательно пишите u8

local nick = new.char[256](u8(settings.nigger.nick))
local rang = new.char[256](u8(settings.nigger.rang))
---------------------------------
local WinState = imgui.new.bool()

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('Test', WinState, imgui.WindowFlags.NoResize)
    -- Пример использования --
    if imgui.InputText('##Add', inputt, 256) then
        settings.nigger.inputsaved = u8:decode(str(inputt)) -- значение вписывается в конфиг
        inicfg.save(settings, 'Test.ini') -- конфиг сохраняется
    end
    imgui.Text(inputt)
    if imgui.InputText('Nick', nick, 256) then
        settings.nigger.nick = u8:decode(str(nick)) -- значение вписывается в конфиг
        inicfg.save(settings, 'Test.ini') -- конфиг сохраняется
    end
    imgui.Text(nick)
    if imgui.InputText('Rang', rang, 256) then
        settings.nigger.rang = u8:decode(str(rang)) -- значение вписывается в конфиг
        inicfg.save(settings, 'Test.ini') -- конфиг сохраняется
    end
    imgui.Text(rang)
    -- Пример закончился --
    imgui.End()
end)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
а, это я тупой, я везде вписывал ##Add , спасибо


короче, написал я по другому не много, и теперь проблема, как сохранить текст из буффера в ини




Lua:
require 'moonloader'
local ffi = require 'ffi'
require "lib.sampfuncs"

local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local new, str = imgui.new, ffi.string



local keys = require 'vkeys'
local bNotf, notf = pcall(import, "imgui_notf.lua")


local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local inputField = imgui.ImBuffer(256)

local inicfg = require 'inicfg'

local directIni = "moonloader\\pdhelperManstikosUA.ini"

local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(main.Ini, directIni)


local settings = inicfg.load({
    imgui =
    {
        imgui2 = '', -- значение инпута
        checkboxstatus = false, -- значение чекбокса
    }}, 'pdhelperManstikosUA.ini"')




Lua:
function cmd_phelp(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

local buffer1 = imgui.ImBuffer(256)
local buffer2 = imgui.ImBuffer(256)


function imgui.OnDrawFrame()
    imgui.Begin(u8"Инструкция к использованию:", main_window_state)
    imgui.Text(u8"!!!!ВАЖНО!!!!")
    imgui.Text(u8"СНАЧАЛО УСТАНОВИТЕ ДАННЫЕ!")
    imgui.Text(u8"/setcity - ГОРОД ВАШЕГО ПД(ЕСЛИ ЛСПД - ЛС, СФПД - СФ, ЛВПД - ЛВ)")
    imgui.Text(u8"/setnamesurname - ВАШЕ ИМЯ И ФАМИЛИЯ(Sam_Mason)")
    imgui.Text(u8"Если вы ФБР то /setcity ФБР")
    imgui.Text("")
    imgui.Text("")
    imgui.Text("")
    imgui.Text("")
    imgui.Text(u8"Команда /pas - показывает паспорт (/pas ID)")
    imgui.Text(u8"Команда /lics - показывает лицензии(/lics ID)")
    imgui.Text(u8"Команда /medka - отыгрывает рп для мед.карты(передавать нужно вручную)")
    imgui.Text(u8"Команда /udost - отыгрывает рп для удостоверения(передавать нужно вручную)")
    imgui.Text(u8"Команда /cuff - надеть на игрока наручники, есть отыгровка(/cuff ID)")
    imgui.Text(u8"Команда /gotome - потащить игрока за собой, есть отыгровка(/gotome ID)")
    imgui.Text(u8"Команда /cput - посадить игрока в машину, есть отыгровка(/cput ID)")
    imgui.Text(u8"Команда /bodycam - включает отыгровку фрапса")
    imgui.Text(u8"Команда /ticket - отыгровка рп для штарафа + выписка штрафа(/ticket ID)")
    imgui.Text(u8"Команда /frisk - отыгровка рп для обыска + обыск(/frisk ID)")
    imgui.Text(u8"Команда /arrest - отыгровка ареста + арест(/arrest ID)")
    imgui.Text(u8"Команда /uncuff - снять наручники + отыгровка(/uncuff ID)")
    imgui.Text(u8"Команда /su - выдать розыск + отыгровка(/su ID)")
    imgui.Text(u8"Команда /clear - очистить розыск + отыгровка(/clear ID)")
    imgui.Text(u8"Команда /doki - запросить документы(/doki ID)")
    imgui.Text(u8"Команда /meg - просьба остановить машину в мегафон(/meg)")
    imgui.Text(u8"Команда /setpaswrld - установить пароль для быстрого захода")
    imgui.Text(u8"Команда /chatclear - визуально очистить чат")
    imgui.Text(u8"Команда /ecspertiza - отыгровка рп экспертизы")
    imgui.Text(u8"Команда /drug количество - употребить наркотики с рп")
    imgui.Text(u8"Зажать клавишу L.ALT - сирена+стробоскопы")
    imgui.Text(u8"Команда /statistiko - вывести статистику персонажа")
    imgui.Text(u8"Текст 1:", buffer1.v)
    imgui.InputText(u8"123", buffer1)
    if imgui.Button("Press me") then
        sampAddChatMessage(u8:decode(buffer1.v), -1)
    end
    ------------------------------------------
    if imgui.InputText(u8"123123", buffer2) then
        mainIni.imgui.Buffer2 = u8:decode(str(buffer2))
    end
    -------------------------------------------
    if imgui.Button("Press mee") then
        sampAddChatMessage(buffer2.v, -1)
    end
    imgui.End()  
end
 
Последнее редактирование:
  • Нравится
Реакции: MLycoris

idea64

Участник
52
5
как можно увеличить пробор между кнопками в примере со вкладками? 2 способ
1705678686903.png
вот это
 

ManstikosUA

Участник
66
13
как можно увеличить пробор между кнопками в примере со вкладками? 2 способПосмотреть вложение 229374 вот это
можно изменив стиль, но тогда будет так со всеми. Можно сделать и так:
1705679316851.png

Код:
Lua:
imgui.Button(u8"Настройки")
            imgui.Dummy(imgui.ImVec2(0, 10))
            imgui.Button(u8"Инфа")
 
  • Нравится
Реакции: idea64

idea64

Участник
52
5
можно изменив стиль, но тогда будет так со всеми. Можно сделать и так:
Посмотреть вложение 229375
Код:
Lua:
imgui.Button(u8"Настройки")
            imgui.Dummy(imgui.ImVec2(0, 10))
            imgui.Button(u8"Инфа")
у меня таблица, я не могу взять и выделить отдельную кнопку
lua:
imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(400, 120), imgui.Cond.Always)
    imgui.Begin(u8'Пример', WinState, imgui.WindowFlags.NoResize)
    for numberTab,nameTab in pairs({'Основное','Настройки','Инфа'}) do -- создаём и парсим таблицу с названиями будущих вкладок
        if imgui.Button(u8(nameTab), imgui.ImVec2(80,24)) then -- 2ым аргументом настраивается размер кнопок (подробнее в гайде по мимгуи)
            tab = numberTab -- меняем значение переменной tab на номер нажатой кнопки
        end
    end
    imgui.SetCursorPos(imgui.ImVec2(95, 28)) -- [Для декора] Устанавливаем позицию для чайлда ниже
    if imgui.BeginChild('Name##'..tab, imgui.ImVec2(300, 80), true) then -- [Для декора] Создаём чайлд в который поместим содержимое
        -- == [Основное] Содержимое вкладок == --
        if tab == 1 then -- если значение tab == 1
            -- == Содержимое вкладки №1
            imgui.Text(u8'Открыта первая вкладка "Основное"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 2 then -- если значение tab == 2
            -- == Содержимое вкладки №2
            imgui.Text(u8'Открыта первая вкладка "Настройки"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 3 then -- если значение tab == 3
            -- == Содержимое вкладки №3
            imgui.Text(u8'Открыта первая вкладка "Инфа"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        end
        -- == [Основное] Содержимое вкладок закончилось == --
        imgui.EndChild()
    end
    imgui.End()
вот пример
1705691761263.png
 

ManstikosUA

Участник
66
13
у меня таблица, я не могу взять и выделить отдельную кнопку
lua:
imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(400, 120), imgui.Cond.Always)
    imgui.Begin(u8'Пример', WinState, imgui.WindowFlags.NoResize)
    for numberTab,nameTab in pairs({'Основное','Настройки','Инфа'}) do -- создаём и парсим таблицу с названиями будущих вкладок
        if imgui.Button(u8(nameTab), imgui.ImVec2(80,24)) then -- 2ым аргументом настраивается размер кнопок (подробнее в гайде по мимгуи)
            tab = numberTab -- меняем значение переменной tab на номер нажатой кнопки
        end
    end
    imgui.SetCursorPos(imgui.ImVec2(95, 28)) -- [Для декора] Устанавливаем позицию для чайлда ниже
    if imgui.BeginChild('Name##'..tab, imgui.ImVec2(300, 80), true) then -- [Для декора] Создаём чайлд в который поместим содержимое
        -- == [Основное] Содержимое вкладок == --
        if tab == 1 then -- если значение tab == 1
            -- == Содержимое вкладки №1
            imgui.Text(u8'Открыта первая вкладка "Основное"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 2 then -- если значение tab == 2
            -- == Содержимое вкладки №2
            imgui.Text(u8'Открыта первая вкладка "Настройки"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        elseif tab == 3 then -- если значение tab == 3
            -- == Содержимое вкладки №3
            imgui.Text(u8'Открыта первая вкладка "Инфа"')
            if imgui.Button(u8'Кнопка') then
                sampAddChatMessage('Вы нажали кнопку во вкладке номер '..tab, -1)
            end
        end
        -- == [Основное] Содержимое вкладок закончилось == --
        imgui.EndChild()
    end
    imgui.End()
вот пример Посмотреть вложение 229386
напиши мне в лс, постараюсь помочь
 
  • Нравится
Реакции: idea64

|Il|Il|

Активный
407
70
а, это я тупой, я везде вписывал ##Add , спасибо


короче, написал я по другому не много, и теперь проблема, как сохранить текст из буффера в ини




Lua:
require 'moonloader'
local ffi = require 'ffi'
require "lib.sampfuncs"

local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local new, str = imgui.new, ffi.string



local keys = require 'vkeys'
local bNotf, notf = pcall(import, "imgui_notf.lua")


local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local inputField = imgui.ImBuffer(256)

local inicfg = require 'inicfg'

local directIni = "moonloader\\pdhelperManstikosUA.ini"

local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(main.Ini, directIni)


local settings = inicfg.load({
    imgui =
    {
        imgui2 = '', -- значение инпута
        checkboxstatus = false, -- значение чекбокса
    }}, 'pdhelperManstikosUA.ini"')




Lua:
    imgui.Text(u8"!!!!ВАЖНО!!!!")
    imgui.Text(u8"СНАЧАЛО УСТАНОВИТЕ ДАННЫЕ!")
    imgui.Text(u8"/setcity - ГОРОД ВАШЕГО ПД(ЕСЛИ ЛСПД - ЛС, СФПД - СФ, ЛВПД - ЛВ)")
    imgui.Text(u8"/setnamesurname - ВАШЕ ИМЯ И ФАМИЛИЯ(Sam_Mason)")
    imgui.Text(u8"Если вы ФБР то /setcity ФБР")
    imgui.Text("")
    imgui.Text("")
    imgui.Text("")
    imgui.Text("")
    imgui.Text(u8"Команда /pas - показывает паспорт (/pas ID)")
    imgui.Text(u8"Команда /lics - показывает лицензии(/lics ID)")
    imgui.Text(u8"Команда /medka - отыгрывает рп для мед.карты(передавать нужно вручную)")
    imgui.Text(u8"Команда /udost - отыгрывает рп для удостоверения(передавать нужно вручную)")
    imgui.Text(u8"Команда /cuff - надеть на игрока наручники, есть отыгровка(/cuff ID)")
    imgui.Text(u8"Команда /gotome - потащить игрока за собой, есть отыгровка(/gotome ID)")
    imgui.Text(u8"Команда /cput - посадить игрока в машину, есть отыгровка(/cput ID)")
    imgui.Text(u8"Команда /bodycam - включает отыгровку фрапса")
    imgui.Text(u8"Команда /ticket - отыгровка рп для штарафа + выписка штрафа(/ticket ID)")
    imgui.Text(u8"Команда /frisk - отыгровка рп для обыска + обыск(/frisk ID)")
    imgui.Text(u8"Команда /arrest - отыгровка ареста + арест(/arrest ID)")
    imgui.Text(u8"Команда /uncuff - снять наручники + отыгровка(/uncuff ID)")
    imgui.Text(u8"Команда /su - выдать розыск + отыгровка(/su ID)")
    imgui.Text(u8"Команда /clear - очистить розыск + отыгровка(/clear ID)")
    imgui.Text(u8"Команда /doki - запросить документы(/doki ID)")
    imgui.Text(u8"Команда /meg - просьба остановить машину в мегафон(/meg)")
    imgui.Text(u8"Команда /setpaswrld - установить пароль для быстрого захода")
    imgui.Text(u8"Команда /chatclear - визуально очистить чат")
    imgui.Text(u8"Команда /ecspertiza - отыгровка рп экспертизы")
    imgui.Text(u8"Команда /drug количество - употребить наркотики с рп")
    imgui.Text(u8"Зажать клавишу L.ALT - сирена+стробоскопы")
    imgui.Text(u8"Команда /statistiko - вывести статистику персонажа")
    imgui.Text(u8"Текст 1:", buffer1.v)
    imgui.InputText(u8"123", buffer1)
    if imgui.Button("Press me") then
        sampAddChatMessage(u8:decode(buffer1.v), -1)
    end
это что за пиздец , не легче было создать local со всеми командами сверху и в фрейм уже использовать этот локал 😐
 
  • Bug
Реакции: Fott