Введение
Данная тема создана, как продолжение гайда "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
По команде
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
Ниже представлен шаблон готовый к использованию
Список иконок для 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)
Доп. пояснения:
1. Всего есть 5 типов иконок (применяются только к самой иконке, текст будет обычным(не как на скрине))
- Solid
- Thin
- Regular
- Light
- Duotune
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
Доп. пояснения:
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
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
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
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
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 - убирает у окна декор части, а именно верхнюю бровь, херню для изменения размера окна, ползунок
Важно: не называйте подгружаемую картинку 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)
Выбрать стиль (далее - тема) можно в этой теме (учитывайте, что темы для мимгуи и имгуи отличаются):
Пример того, как изменить стиль/тему начинается с 18 строки
Информация - Стили/Темы для ImGUI
Приветствую всех! В данной теме вы можете делиться своими стилями/темами для ImGUI. Желательно вместе с кодом прикладывать скриншот того, как выглядит в игре. Что-ж, приступим! :dance:
www.blast.hk
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
В примере будет использовано три темы:
1-ая тема - Красная. Автор: хз кто, давно использую в своих
2-ая тема - Зелёная. Автор: @neverlane
3-ья тема - Синяя. Автор: @Miron Diamond
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
1. Будьте внимательны с выбором темы и её использованием в коде, при любой мелкой ошибки скрипт будет крашится
Последнее редактирование: