Гайд Примеры 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. Будьте внимательны с выбором темы и её использованием в коде, при любой мелкой ошибки скрипт будет крашится
 
Последнее редактирование:

RTD

Потужно
Модератор
394
456
2.3 - Пример с поиском по списку
В 2023 все еще его не любят(
 

MLycoris

Режим чтения
Автор темы
Проверенный
1,897
2,008
В 2023 все еще его не любят(
о пасиба, завтра добавлю в тему
 

kyrtion

Известный
710
263
Если искать по кириллице, то это тоже в utf8
чтобы не замучался с кодировкой, то можно исправить:
1. сохранить скрипт кодировка на utf8
2. либ сампев заменить на глобальное, типа убрать local
3. и этот код добавить в конце

Взято из скрипта от автора рубин:
-- ** code-lua **

-->> SCRIPT UTF-8
-->> utf8(table path, incoming variables encoding, outcoming variables encoding)
-->> table path example { 'sampev', 'onShowDialog' }
-->> encoding options nil | AnsiToUtf8 | Utf8ToAnsi
_utf8 = load([=[return function(utf8_func, in_encoding, out_encoding); if encoding == nil then; encoding = require("encoding"); encoding.default = "CP1251"; u8 = encoding.UTF8; end; if type(utf8_func) ~= "table" then; return false; end; if AnsiToUtf8 == nil or Utf8ToAnsi == nil then; AnsiToUtf8 = function(text); return u8(text); end; Utf8ToAnsi = function(text); return u8:decode(text); end; end; if _UTF8_FUNCTION_SAVE == nil then; _UTF8_FUNCTION_SAVE = {}; end; local change_var = "_G"; for s = 1, #utf8_func do; change_var = string.format('%s["%s"]', change_var, utf8_func[s]); end; if _UTF8_FUNCTION_SAVE[change_var] == nil then; _UTF8_FUNCTION = function(...); local pack = table.pack(...); readTable = function(t, enc); for k, v in next, t do; if type(v) == 'table' then; readTable(v, enc); else; if enc ~= nil and (enc == "AnsiToUtf8" or enc == "Utf8ToAnsi") then; if type(k) == "string" then; k = _G[enc](k); end; if type(v) == "string" then; t[k] = _G[enc](v); end; end; end; end; return t; end; return table.unpack(readTable({_UTF8_FUNCTION_SAVE[change_var](table.unpack(readTable(pack, in_encoding)))}, out_encoding)); end; local text = string.format("_UTF8_FUNCTION_SAVE['%s'] = %s; %s = _UTF8_FUNCTION;", change_var, change_var, change_var); load(text)(); _UTF8_FUNCTION = nil; end; return true; end]=])
function utf8(...)
    pcall(_utf8(), ...)
end

utf8({ 'print' }, 'Utf8ToAnsi')
--
utf8({ 'sampSetCurrentDialogEditboxText' }, 'Utf8ToAnsi')
utf8({ 'sampShowDialog' }, 'Utf8ToAnsi')
utf8({ 'sampSendChat' }, 'Utf8ToAnsi')
utf8({ 'sampAddChatMessage' }, 'Utf8ToAnsi')
utf8({ 'sampHasDialogRespond' }, nil, 'AnsiToUtf8')
-- если указан либ для событии сампев, нужно заменить переменную либ на глобальные
-- local sampev = require.. => sampev = require..
utf8({ 'sampev', 'onShowDialog' }, 'AnsiToUtf8', 'Utf8ToAnsi')
utf8({ 'sampev', 'onServerMessage' }, 'AnsiToUtf8', 'Utf8ToAnsi')

Также нужно тестировать как там приходят, и есть немного проблема, что невозможно вводить кириллицы в консоль СФ (либо у меня проблемы)
 

kyrtion

Известный
710
263
Попробуй написать мунмонет с сохранением json. Рекомендую сохранить цвет только в 4 массив, RR,GG,BB,AA. Не в целом числовое значение.
в конверте вроде используется BBGGRRAA
 
  • Нравится
Реакции: #Northn и MLycoris

whyega52

52NGG
Модератор
2,625
2,352
Давай про DrawList :)
У Чапо есть гайд

 
  • Нравится
Реакции: MLycoris

ManstikosUA

Участник
67
15
как добавить ещё одну строчку для вывода сообщения?
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:
 

ManstikosUA

Участник
67
15
в смысле? В примере есть способы как вывести строку инпута в чат и мимгуи окно
ты же должен знать мвд хелпер, и как там реализованна система с именем, должностью и т.д., а так-же их выводом, как добавить так-же много строчек ?
я чёт там пробовал химичить, но крашило
 

plalkeo

Известный
591
213
ты же должен знать мвд хелпер, и как там реализованна система с именем, должностью и т.д., а так-же их выводом, как добавить так-же много строчек ?
я чёт там пробовал химичить, но крашило
Lua:
-- 1
imgui.Text('FirstLine')
imgui.Text('SecondLine')

-- 2
imgui.Text('FirstLine\nSecondLine')
--or
imgui.Text([[FirstLine
SecondLine]])
оно?
 

ManstikosUA

Участник
67
15
Lua:
-- 1
imgui.Text('FirstLine')
imgui.Text('SecondLine')

-- 2
imgui.Text('FirstLine\nSecondLine')
--or
imgui.Text([[FirstLine
SecondLine]])
оно?
а где строка для ввода текста?

а где строка для ввода текста?
тоесть чтобы было два и больше буффера, в которые можно вводить текст
 

MLycoris

Режим чтения
Автор темы
Проверенный
1,897
2,008
тоесть чтобы было два и больше буффера, в которые можно вводить текст
сам ответил на свой вопрос, просто добавляй новый буфер для каждого инпута:/
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