Гайд Mimgui для чайников. Описание, пояснения, шаблоны

MLycoris

Режим чтения
Автор темы
Проверенный
1,795
1,826
logo123.png

Путеводитель по гайду
2.0 - Типы буферов

2.1 - Основные аспекты
2.2 - Основные функции
2.3 - Функции для оформления мимгуи окна

2.4 - Изменение стиля(темы) мимгуи

Дополнительные возможности
3.0 - Цветной текст
3.1 - Текст по центру
3.2 - Изменение шрифта (размера) текста
3.3 - Цветная кнопка/сепаратор

Полезные статьи/видео, которые помогут в изучении мимгуи:

Вместе с этим, рекомендую к просмотру гайды @chapo
Считаю, что начать стоит с типов, которые используются для создания буфера к различным функциям Мимгуи
  • imgui.new.bool() - возвращает true/false (по умолчанию false).
  • imgui.new.char[128]() - хранит символы
  • imgui.new.int() - хранит в себе целую цифру/число (1, 2, 3, 4)
  • imgui.new.float() - хранит в себе нецелую цифру/число (1.1, 1.2, 1.3, 1.4)
В скобках каждого буфера можно задать значение по умолчанию:
  • imgui.new.bool(true) - изначально будет возвращать true
  • imgui.new.int(2) - начальным значением задана цифра 2
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

В imgui.Begin можно задать флаги, которые влияют на само окно и их перечень таков (жирным шрифтом отмечены наиболее популярные флаги):
imgui.WindowFlags.NoDecoration - убирает верхнюю бровь, полузнок для изменения окна и любые другие элементы мимгуи окна
imgui.WindowFlags.NoTitleBar - убирает заголовок окна
imgui.WindowFlags.NoResize - запрещает изменять размер
imgui.WindowFlags.NoMove - запрещает передвигать окно
imgui.WindowFlags.AlwaysAutoResize - автоматически ставит размер окна

imgui.WindowFlags.NoBackground - делает фон окна прозрачным
imgui.WindowFlags.Tooltip - включает подсказки
imgui.WindowFlags.ShowBorders - включает обводку элементов
imgui.WindowFlags.NoScrollbar - убирает ползунок прокрутки
imgui.WindowFlags.NoCollapse - запрещает минимизировать окно при двойном клике
imgui.WindowFlags.NoScrollWithMouse - отключает прокрутку колёсиком мыши
imgui.WindowFlags.NoSavedSettings - отключает сохранения настроек в файл
imgui.WindowFlags.AlwaysUseWindowPadding - создает отступы вокруг окна
imgui.WindowFlags.NoInputs - отключает мышь и клавиатуру
imgui.WindowFlags.NoFocusOnAppearing - отключает фокус при переходе от скрытого к видимому состоянию

При использовании больше 1 флага, их следует перечислять через знак +. Пример:
Lua:
imgui.Begin('##Window', WinState, imgui.WindowFlags.NoMove + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.AlwaysAutoResize)

[Примечание]:
1. Любую функцию можно прописать, как условие.

Тогда то, что вы пропишите будет выполнятся при взаимодействии с этой функцией. Пример на чекбоксе:
Lua:
if imgui.Checkbox(u8'Чекбокс', checkboxone) then
    sampAddChatMessage('Вы нажали на чекбокс', -1)
end

2. Зачем нужен ключ [0]?
Для многих функций необходимо создание буфера, которое хранит в себе то или иное значение/состояние. Например, imgui.new.bool() хранит в себе true/false, а imgui.new.int() хранит в себе целую цифру/число. Чтобы получить их значение используется ключ [0] (в имгуи этим ключом служит .v).
Как правило, каждому буферу создается свой псевдоним
(( local checkboxone = imgui.new.bool() )), который прописывается в функции и чтобы получить состояние/значение этой функции, после псевдонима ставится ключ [0], к примеру, для получения состояния imgui.Checkbox('Name', checkboxone) ((в самой функции, где указывается псевдоним буфера, ключ использовать не надо)) к его псевдониму необходимо приписать ключ, в итоге получится checkboxone[0].


[imgui.Button] Обычная кнопка
Lua:
imgui.Button('Button')
Для неё не надо создавать буфер, но для её работоспособности, необходимо прописать её, как условие, например:
Lua:
if imgui.Button('Button') then
    sampAddChatMessage('Вы нажали кнопку',-1)
end
[Доп. непопулярные функции с кнопками]
Используя эти кнопки, их также нужно прописывать, как условие.
Невидимая кнопка
Lua:
imgui.InvisibleButton('InvisibleButton',imgui.ImVec2(50,24)) -- 50 ширина, 24 высота
1691251422206.png

Кнопка в виде стрелки
Lua:
-- Аргумент number: 0 = влево, 1 = вправо, 2 = вверх, 3 = вниз
imgui.ArrowButton('Arrow',number)
1691251509560.png

Маленькая кнопка
Lua:
imgui.SmallButton('SmallButton')
1691251556762.png
[imgui.CollapsingHeader] Вкладка
1681059021040.png

Lua:
imgui.CollapsingHeader('Button')
Для неё не надо создавать буфер, но для её работоспособности, необходимо прописать её, как условие, например:
Lua:
if imgui.CollapsingHeader(u8'Пример списка') then
    imgui.TextWrapped(u8'Удобная функция, позволяет сэкономить место и красиво оформить скрипт')
    imgui.Separator()
end

[imgui.Checkbox] Поле с галочкой. Возвращает true/false
1679419785325.png

Lua:
-- в начале скрипта
local checkboxone = new.bool() -- создём буфер для чекбокса, который возвращает true/false

-- в мимгуи
imgui.Checkbox(u8'Чекбокс', checkboxone)
Для работы чекбокса, вставлять его в условие необязательно:
Lua:
function main()
    while true do wait(0)
        if checkboxone[0] then
            sampAddChatMessage('Вы поставили галочку в чекбоксе',-1)
            wait(5000)
        end
    end
end
[imgui.RadioButtonBool & imgui.RadioButtonIntPtr] Радиокнопка
Отличия двух этих функций в том, что:
imgui.RadioButtonBool - принимает true/false
imgui.RadioButtonIntPtr - принимает цифру/число
Их можно использовать следующими способами:
1. Либо с помощью буфера мимгуи, например:

Lua:
-- вне мимгуи
local radioBool = imgui.new.bool()
local radioInt = imgui.new.int()

-- в мимгуи
if imgui.RadioButtonBool('RadioButton',radioBool[0]) then
    radioBool[0] = not radioBool[0]
end
for i = 0, 3 do
    if imgui.RadioButtonIntPtr(tostring(i),radioInt,i) then
        radioInt[0] = i
    end
end
2. С помощью обычных локалок (применимо только к imgui.RadioButtonBool):
Lua:
-- вне мимгуи
local radioStatus = false

-- в мимгуи
if imgui.RadioButtonBool('RadioButton',radioStatus) then
    radioStatus = not radioStatus
end
1701109268089.png
[imgui.InputText] Позволяет работать с различным однострочным текстом
1679419807292.png

Lua:
-- в начале скрипта
local inputField = new.char[256]() -- создаём буфер для инпута

-- в мимгуи
imgui.InputText(u8"Ваш текст", inputField, 256)
Чтобы считать текст, введённый в инпут, необходимо его декодировать
Lua:
text = u8:decode(ffi.string(inputField))
sampAddChatMessage(text,-1)
[imgui.InputTextWithHint] InputText с подсказкой
1684616954840.png

Lua:
-- в начале скрипта
local inputField = new.char[256]() -- создаём буфер для инпута

-- в мимгуи
imgui.InputTextWithHint(u8'Ещё пример', u8'Введите текст', inputField, 256)
[imgui.InputTextMultiline] Позволяет работать с различным многострочным текстом
1679419982037.png

Lua:
-- в начале скрипта
 local TextMultiLine = new.char[256]() -- создаём буфер для imgui InputTextMultiline

-- в мимгуи
imgui.InputTextMultiline("##MyMultilineInput", TextMultiLine, 256) -- если в первом аргументе стоит ##, то следующий текст виден не будет

-- пример использования
imgui.Text(TextMultiLine) -- выводим текст, написанный в многострочном инпуте

Либо декодим, как с обычным инпут текстом
Lua:
text = u8:decode(ffi.string(TextMultiLine))
[imgui.SliderInt & imgui.SliderFloat] В простонароде "ползунки"
1679419845905.png

Lua:
-- в начале скрипта
local SliderOne = new.int(2) -- создаём буфер для SliderInt со значением 2 по умолчанию
local SliderTwo = new.float() -- создаём буфер для SliderFloat

-- в мимгуи
imgui.SliderInt(u8'Первый', SliderOne, 0, 24) -- 3 аргументом является минимальное значение, а 4 аргумент задаёт максимальное значение
imgui.SliderFloat(u8'Второй', SliderTwo, 0, 4) -- 3 аргументом является минимальное значение, а 4 аргумент задаёт максимальное значение
imgui.SliderInt - возвращает целую цифру/число (1, 2, 3, 4)
imgui.SliderFloat - возвращает нецелую цифру/число(1.1, 1.2, 1.3, 1.4)
Чтобы получить значение, в обоих случаях достаточно добавить ключ [0] к названию буфера. Например:

Lua:
if wasKeyPressed(VK_Q) and not sampIsCursorActive() then
    sampAddChatMessage('В SliderInt вы установили '..SliderOne[0],-1)
elseif wasKeyPressed(VK_E) and not sampIsCursorActive() then
    sampAddChatMessage('В SliderFloat вы установили '..SliderTwo[0],-1)
end
[imgui.VSliderInt & imgui.VSliderFloat] Вертикальные ползунки
1701115790659.png

Принцип работы тот же, что и у слайдеров выше, разница лишь во внешнем виде
Lua:
-- В начале
local testSliderInt = new.int()
local testSliderFloat = new.float()

-- В мимгуи
imgui.VSliderFloat('Float',imgui.ImVec2(50,50),testSliderFloat,0,24)
imgui.VSliderInt('Int',imgui.ImVec2(24,100),testSliderInt,0,50)
[imgui.SliderInt2-4 & imgui.SliderFloat2-4] Полузнки с несколькими параметрами
1701116606755.png

Ползунки, позволяющие записывать несколько параметров в один буфер
Пример использования SliderInt с 4 параметрами:

Lua:
-- вне мимгуи
local testSliderInt = new.int()

-- в мимгуи
imgui.SliderInt4('SliderInt4',testSliderInt,0,20)

-- пример использования
imgui.Text(string.format('SliderInt[0] = %s\nSliderInt[1] = %s\nSliderInt[2] = %s\nSliderInt[3] = %s',testSliderInt[0],testSliderInt[1],testSliderInt[2],testSliderInt[3]))
Пример использования SliderFloat с 2 параметрами:
Lua:
-- вне мимгуи
local testSliderFloat = new.float()

-- в мимгуи
imgui.SliderFloat2('SliderFloat2',testSliderFloat,0,20)

-- пример использования
imgui.Text(string.format('SliderFloat[0] = %s\nSliderFloat[1] = %s',testSliderFloat[0],testSliderFloat[1]))

[imgui.Combo] Позволяет работать со списком
1679419896479.png

Lua:
-- в начале скрипта
local ComboTest = new.int() -- создаём буфер для комбо
local item_list = {u8'Раз', u8'Два'} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)

-- в мимгуи
imgui.Combo(u8'Список',ComboTest,ImItems, #item_list)
Для работы с ним достаточно к названию буфера добавить ключ [0]. Например:
Lua:
if wasKeyPressed(VK_R) and not sampIsCursorActive() then
    if ComboTest[0] == 0 then -- комбо возвращает значение, поэтому следует указывать при каком пункте выполняется условие
        sampAddChatMessage('Выбран первый пункт',-1)
    elseif ComboTest[0] == 1 then
        sampAddChatMessage('Выбран второй пункт',-1)
    end
end

[imgui.Text] Текст без переноса на следующие строчки
Lua:
imgui.Text('Primer')
[imgui.TextWrapped] Текст с переносом на следующие строчки
Lua:
imgui.TextWrapped('I want to fuck a cheeseburger. Just having that cheesy goodness melt all around my cock woild make me fell at easy with the world again.')
[Доп. непопулярные функции с текстом]
Удалённый (серый) текст
Lua:
imgui.TextDisabled('Text Disabled')
1691249726266.png

Текст в виде списка
Lua:
imgui.BulletText('Bullet Text')
1691249778843.png

Текст в 2 столбика (вообще хз где он используется)
Lua:
imgui.LabelText('One','Two')
1691249835082.png
[imgui.Separator] Горизонтальная линия
Lua:
imgui.Separator()
[imgui.SameLine] Отменяет перенос нижней функции на следующую строку
Lua:
imgui.SameLine()
1684661230544.png

[imgui.PushItemWidth] Изменение ширины функции
Применимо к: SliderInt, SliderFloat, Combo, InputText
(мб ещё чему-то, про что забыл)
Вставляется до и после функции, размер которой необходимо изменить. Пример ниже:
Lua:
imgui.PushItemWidth(180)
imgui.SliderInt(u8'Пример', test, 0, 60) -- слайдер
imgui.PopItemWidth()
1684660777429.png

Переместить функцию по горизонтали/вертикали можно следующими способами
Lua:
-- Первый способ
imgui.SetCursorPosX(150) -- позволяет задать положение функции по горизнотали
imgui.SetCursorPosY(140) -- позволяет задать положение функции по вертикали
imgui.Button(u8'Кнопка три')

-- Второй способ
imgui.SetCursorPos(imgui.ImVec2(50, 170)) -- 50 = по горизонтали, 170 по вертикали
imgui.Button(u8'Кнопка три')
1684660810799.png

Видоизменить размер функции можно следующим образом
Применимо к: Button, InputTextMultiline
(мб ещё чему-то, про что забыл)
Lua:
imgui.Button(u8'Кнопка четыре', imgui.ImVec2(160, 35)) -- 160 - ширина, 35 высота
1684660826013.png

[imgui.BeginChild] Окно внутри другого окна
Lua:
if imgui.BeginChild('Name', imgui.ImVec2(160, 60), true) then
    imgui.Text(u8'Пример чайлда') -- содержание чайлда
    imgui.Button(u8'Тестовая кнопка')
    imgui.EndChild() -- обязательно следите за тем, чтобы каждый чайлд был закрыт
end
1684661758807.png

[imgui.BeginPopupModal] Всплывающее окно
Lua:
if imgui.Button('Open') then
    imgui.OpenPopup(u8'Пример')
end
if imgui.BeginPopupModal(u8'Пример', _, imgui.WindowFlags.NoResize) then
    imgui.SetWindowSizeVec2(imgui.ImVec2(290, 190)) -- задаём размер окна
    imgui.Text('Test')
    if imgui.Button(u8'Закрыть', imgui.ImVec2(280, 24)) then -- обязательно создавайте такую кнопку, чтобы была возможность закрыть окно
        imgui.CloseCurrentPopup()
    end
    imgui.End()
end
[Вкладки] Вкладки (2 способа)
1-ый способ встроенной функцией:
Lua:
if imgui.BeginTabBar('Tabs') then -- задаём начало вкладок
    if imgui.BeginTabItem(u8'Основная вкладка') then -- первая вкладка
 
        imgui.EndTabItem() -- конец вкладки
    end
    if imgui.BeginTabItem(u8'Пустая вкладка') then -- вторая вкладка
 
        imgui.EndTabItem() -- конец вкладки
    end
    imgui.EndTabBar() -- конец всех вкладок
end
1684852123752.png

2-й способ с помощью кнопок
Lua:
-- вне мимгуи, можно где-нибудь в начале
local tab = 1

-- в мимгуи
if imgui.Button(u8'Первый раздел') then tab = 1 end -- это первая кнопка, которая будет отвечать за переключение на раздел 1
imgui.SameLine()
if imgui.Button(u8'Второй раздел') then tab = 2 end -- это вторая кнопка, которая будет отвечать за переключение на раздел 2
if tab == 1 then
    imgui.Text(u8'Открыт первый раздел')
elseif tab == 2 then
    imgui.Text(u8'Открыт второй раздел')
end
1684852185783.png

[imgui.IsItemHovered] Действие при наведении
С помощью этой функции, можно сделать простую подсказку при наведении, пример:
Lua:
imgui.Button(u8'Пример подскази 1')
if imgui.IsItemHovered() then
    imgui.BeginTooltip()
    imgui.Text(u8'Вы навелись на кнопку')
    imgui.EndTooltip()
end
imgui.Text(u8'Пример подсказки 2')
if imgui.IsItemHovered() then
    imgui.BeginTooltip()
    imgui.Text(u8'Вы навелись на текст')
    imgui.EndTooltip()
end
1684852452355.png

[imgui.IsItemClicked] Действие при клике
Если вписать это, как условие после какой-либо функции, например, обычного текста (imgui.Text), то выполнится прописанное условие
Lua:
imgui.Text(u8'Текст')
if imgui.IsItemClicked() then
    sampAddChatMessage('Вы нажали на текст', -1)
end
[imgui.Columns] Таблица
Создаёт колонки/столбики в мимгуи окне
Lua:
-- для удобства зададим ширину каждой колонки в начале
local w = {
    first = 120,
    second = 70,
}
-- == Первая строка
imgui.Columns(3) -- 3 количество столбцов
imgui.Text(u8'Первая') imgui.SetColumnWidth(-1, w.first) -- первый столбик
imgui.NextColumn()
imgui.Text(u8'Вторая') imgui.SetColumnWidth(-1, w.second) -- второй столбик
imgui.NextColumn()
imgui.Text(u8'Третья') imgui.SetColumnWidth(-1, 80) -- либо можете самостоятельно вписывать
imgui.Columns(1)
imgui.Separator()
-- == Вторая строка
imgui.Columns(3)
imgui.Text(u8'Текст под первой') imgui.SetColumnWidth(-1, w.first)
imgui.NextColumn()
imgui.Button(u8'Кнопка') imgui.SetColumnWidth(-1, w.second)
imgui.NextColumn()
imgui.Text(u8'Колонка 3') imgui.SetColumnWidth(-1, 80) -- копируем верхнее
imgui.Columns(1)
imgui.Separator()
-- == Можете задать сколько вам нужно строк
1684852648962.png

[imgui.ProgressBar] Прогресс бар
1701111843045.png

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

Lua:
-- Отражаем скорость нашего персонажа в прогресс баре
local speed = math.floor(getCharSpeed(1))
imgui.ProgressBar(speed/100,imgui.ImVec2(100,24),'Speed: '..speed)

-- Отражаем полоску ХП нашего персонажа в прогресс баре
local myHP = getCharHealth(1)
imgui.ProgressBar(myHP/100,imgui.ImVec2(100,24),'HP: '..myHP)
1-ый аргумент - текущее значение чего либо/максимальное
2-ой аргумент - размеры прогресс бара. Можно указать nil и тогда он растянется до конца окна
3-ий аргумент - надпись внутри прогресс бара
Изменить цвет фона прогресс бара можно с помощью параметра
imgui.Col.FrameBg
Изменить цвет самой полоски прогресс бара можно с помощью параметра
imgui.Col.PlotHistogram
[imgui.Dummy] Отступ по вертикали/горизонтали
С помощью этой функции можно сделать отступ по вертикали/горизонтали

Lua:
imgui.Text('Test1')
imgui.Dummy(imgui.ImVec2(0,24))
imgui.Text('Test2')
[imgui.NewLine] Пустая строка между функциями
Пример использования:
Lua:
imgui.Text('1')
imgui.NewLine()
imgui.Text('2')
[imgui.Indent] Отступ на текущей строке
Пример использования:
Lua:
imgui.Text('1')
imgui.Indent(50)
imgui.Text('2')

Для начала, надо выбрать любой понравившийся стиль. Будьте внимательны, для мимгуи и имгуи они отличаются. Можно выбрать на последних страницах этой темы:

Допустим, мне понравилась эта тема

Копируем её и вставляем в конце (чтоб в дальнейшем не мазолила глаза)
Lua:
function theme()
    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(1.00, 1.00, 1.00, 0.43);
    imgui.GetStyle().Colors[imgui.Col.WindowBg]               = ImVec4(0.00, 0.00, 0.00, 0.90);
    imgui.GetStyle().Colors[imgui.Col.ChildBg]                = ImVec4(1.00, 1.00, 1.00, 0.07);
    imgui.GetStyle().Colors[imgui.Col.PopupBg]                = ImVec4(0.00, 0.00, 0.00, 0.94);
    imgui.GetStyle().Colors[imgui.Col.Border]                 = ImVec4(1.00, 1.00, 1.00, 0.00);
    imgui.GetStyle().Colors[imgui.Col.BorderShadow]           = ImVec4(1.00, 0.00, 0.00, 0.32);
    imgui.GetStyle().Colors[imgui.Col.FrameBg]                = ImVec4(1.00, 1.00, 1.00, 0.09);
    imgui.GetStyle().Colors[imgui.Col.FrameBgHovered]         = ImVec4(1.00, 1.00, 1.00, 0.17);
    imgui.GetStyle().Colors[imgui.Col.FrameBgActive]          = ImVec4(1.00, 1.00, 1.00, 0.26);
    imgui.GetStyle().Colors[imgui.Col.TitleBg]                = ImVec4(0.19, 0.00, 0.00, 1.00);
    imgui.GetStyle().Colors[imgui.Col.TitleBgActive]          = ImVec4(0.46, 0.00, 0.00, 1.00);
    imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed]       = ImVec4(0.20, 0.00, 0.00, 1.00);
    imgui.GetStyle().Colors[imgui.Col.MenuBarBg]              = ImVec4(0.14, 0.03, 0.03, 1.00);
    imgui.GetStyle().Colors[imgui.Col.ScrollbarBg]            = ImVec4(0.19, 0.00, 0.00, 0.53);
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab]          = ImVec4(1.00, 1.00, 1.00, 0.11);
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered]   = ImVec4(1.00, 1.00, 1.00, 0.24);
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive]    = ImVec4(1.00, 1.00, 1.00, 0.35);
    imgui.GetStyle().Colors[imgui.Col.CheckMark]              = ImVec4(1.00, 1.00, 1.00, 1.00);
    imgui.GetStyle().Colors[imgui.Col.SliderGrab]             = ImVec4(1.00, 0.00, 0.00, 0.34);
    imgui.GetStyle().Colors[imgui.Col.SliderGrabActive]       = ImVec4(1.00, 0.00, 0.00, 0.51);
    imgui.GetStyle().Colors[imgui.Col.Button]                 = ImVec4(1.00, 0.00, 0.00, 0.19);
    imgui.GetStyle().Colors[imgui.Col.ButtonHovered]          = ImVec4(1.00, 0.00, 0.00, 0.31);
    imgui.GetStyle().Colors[imgui.Col.ButtonActive]           = ImVec4(1.00, 0.00, 0.00, 0.46);
    imgui.GetStyle().Colors[imgui.Col.Header]                 = ImVec4(1.00, 0.00, 0.00, 0.19);
    imgui.GetStyle().Colors[imgui.Col.HeaderHovered]          = ImVec4(1.00, 0.00, 0.00, 0.30);
    imgui.GetStyle().Colors[imgui.Col.HeaderActive]           = ImVec4(1.00, 0.00, 0.00, 0.50);
    imgui.GetStyle().Colors[imgui.Col.Separator]              = ImVec4(1.00, 0.00, 0.00, 0.41);
    imgui.GetStyle().Colors[imgui.Col.SeparatorHovered]       = ImVec4(1.00, 1.00, 1.00, 0.78);
    imgui.GetStyle().Colors[imgui.Col.SeparatorActive]        = ImVec4(1.00, 1.00, 1.00, 1.00);
    imgui.GetStyle().Colors[imgui.Col.ResizeGrip]             = ImVec4(0.19, 0.00, 0.00, 0.53);
    imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered]      = ImVec4(0.43, 0.00, 0.00, 0.75);
    imgui.GetStyle().Colors[imgui.Col.ResizeGripActive]       = ImVec4(0.53, 0.00, 0.00, 0.95);
    imgui.GetStyle().Colors[imgui.Col.Tab]                    = ImVec4(1.00, 0.00, 0.00, 0.27);
    imgui.GetStyle().Colors[imgui.Col.TabHovered]             = ImVec4(1.00, 0.00, 0.00, 0.48);
    imgui.GetStyle().Colors[imgui.Col.TabActive]              = ImVec4(1.00, 0.00, 0.00, 0.60);
    imgui.GetStyle().Colors[imgui.Col.TabUnfocused]           = ImVec4(1.00, 0.00, 0.00, 0.27);
    imgui.GetStyle().Colors[imgui.Col.TabUnfocusedActive]     = ImVec4(1.00, 0.00, 0.00, 0.54);
    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(1.00, 1.00, 1.00, 0.35);
    imgui.GetStyle().Colors[imgui.Col.DragDropTarget]         = ImVec4(1.00, 1.00, 0.00, 0.90);
    imgui.GetStyle().Colors[imgui.Col.NavHighlight]           = ImVec4(0.26, 0.59, 0.98, 1.00);
    imgui.GetStyle().Colors[imgui.Col.NavWindowingHighlight]  = ImVec4(1.00, 1.00, 1.00, 0.70);
    imgui.GetStyle().Colors[imgui.Col.NavWindowingDimBg]      = ImVec4(0.80, 0.80, 0.80, 0.20);
    imgui.GetStyle().Colors[imgui.Col.ModalWindowDimBg]       = ImVec4(0.80, 0.80, 0.80, 0.35);
end


Далее, чтобы её задать, необходимо в любом месте кода вписать следующее
Lua:
imgui.OnInitialize(function()
    theme()
end)

Много интересного, связанного с оформлением мимгуи, вы можете найти в этой теме
Дополнительные возможности
Авторы этих функций мне неизвестны, но если вы знаете и скажите кто, то укажу его в теме.
Встроенной функции с использованием HEX в мимгуи нет, поэтому прибегнем к этой
Lua:
function imgui.TextColoredRGB(text)
    local style = imgui.GetStyle()
    local colors = style.Colors
    local ImVec4 = imgui.ImVec4
    local explode_argb = function(argb)
        local a = bit.band(bit.rshift(argb, 24), 0xFF)
        local r = bit.band(bit.rshift(argb, 16), 0xFF)
        local g = bit.band(bit.rshift(argb, 8), 0xFF)
        local b = bit.band(argb, 0xFF)
        return a, r, g, b
    end
    local getcolor = function(color)
        if color:sub(1, 6):upper() == 'SSSSSS' then
            local r, g, b = colors[1].x, colors[1].y, colors[1].z
            local a = tonumber(color:sub(7, 8), 16) or colors[1].w * 255
            return ImVec4(r, g, b, a / 255)
        end
        local color = type(color) == 'string' and tonumber(color, 16) or color
        if type(color) ~= 'number' then return end
        local r, g, b, a = explode_argb(color)
        return imgui.ImVec4(r/255, g/255, b/255, a/255)
    end
    local render_text = function(text_)
        for w in text_:gmatch('[^\r\n]+') do
            local text, colors_, m = {}, {}, 1
            w = w:gsub('{(......)}', '{%1FF}')
            while w:find('{........}') do
                local n, k = w:find('{........}')
                local color = getcolor(w:sub(n + 1, k - 1))
                if color then
                    text[#text], text[#text + 1] = w:sub(m, n - 1), w:sub(k + 1, #w)
                    colors_[#colors_ + 1] = color
                    m = n
                end
                w = w:sub(1, n - 1) .. w:sub(k + 1, #w)
            end
            if text[0] then
                for i = 0, #text do
                    imgui.TextColored(colors_[i] or colors[1], u8(text[i]))
                    imgui.SameLine(nil, 0)
                end
                imgui.NewLine()
            else imgui.Text(u8(w)) end
        end
    end
    render_text(text)
end
Пример использования:
Lua:
imgui.TextColoredRGB('{FF0000}Пр{00FF00}им{0000FF}ер')
1691246389612.png

Lua:
function imgui.CenterText(text)
    imgui.SetCursorPosX(imgui.GetWindowWidth()/2-imgui.CalcTextSize(u8(text)).x/2)
    imgui.Text(u8(text))
end
Пример использования:
Lua:
imgui.CenterText('Пример')
1691246759621.png

Если у вас ещё нет следующей функции в коде, то вписываем её в любом месте:
Lua:
imgui.OnInitialize(function()
 
end)
Внутрь этой функции будет указываться необходимый шрифт. В качестве примера будет вызываться шрифт impact.ttf с размером шрифта 16
Lua:
imgui.OnInitialize(function()
    local glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    example = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14)..'\\impact.ttf', 16, _, glyph_ranges)
end)
Чтобы начать его использовать в нужном месте, перед и после нужной части кода, необходимо вписывать следующее:
Lua:
imgui.PushFont(example) -- вызываем функцию, которая меняет шрифт
imgui.Text(u8'Текст жирным шрифтом') -- сам текст
imgui.PopFont() -- функция, заменяющая шрифт заканчивается
1691247329655.png

Как можно наблюдать, это применимо к тексту на других функциях. Пример со скрина:

Lua:
-- == Обычный шрифт == --
imgui.Text(u8'Текст')
imgui.Button(u8'Обычная кнопка')
-- == Шрифт impact с размером шрифта 16 == --
imgui.PushFont(example)
imgui.Text(u8'Текст с изм шрифтом')
imgui.Button(u8'Кнопка с изм шрифтом')
imgui.PopFont()
-- == == --

Цветная кнопка
Lua:
function imgui.ColoredButton(text,hex,trans,size)
    local r,g,b = tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6))
    if tonumber(trans) ~= nil and tonumber(trans) < 101 and tonumber(trans) > 0 then a = trans else a = 60 end
    imgui.PushStyleColor(imgui.Col.Button, imgui.ImVec4(r/255, g/255, b/255, a/100))
    imgui.PushStyleColor(imgui.Col.ButtonHovered, imgui.ImVec4(r/255, g/255, b/255, a/100))
    imgui.PushStyleColor(imgui.Col.ButtonActive, imgui.ImVec4(r/255, g/255, b/255, a/100))
    local button = imgui.Button(text, size)
    imgui.PopStyleColor(3)
    return button
end
Пример использования:
Lua:
imgui.ColoredButton(u8'Красная кнопка', 'F94242', 50)
imgui.ColoredButton(u8'Зелёная кнопка', '32CD32', 70,imgui.ImVec2(150,24))
1701112689565.png

1-ый аргумент - название кнопки,
2-ой аргумент - цвет в HEX формате
3-ий аргумент - прозрачность
4-ый аргумент - размер кнопки

Цветной сепаратор

Lua:
function imgui.ColSeparator(hex,trans)
    local r,g,b = tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6))
    if tonumber(trans) ~= nil and tonumber(trans) < 101 and tonumber(trans) > 0 then a = trans else a = 100 end
    imgui.PushStyleColor(imgui.Col.Separator, imgui.ImVec4(r/255, g/255, b/255, a/100))
    local colsep = imgui.Separator()
    imgui.PopStyleColor(1)
    return colsep
end
Пример использования:
Lua:
for i = 100, 10, -10 do
    imgui.ColSeparator('F94242', i)
    imgui.ColSeparator('32CD32', i)
end
1701112966694.png

1-ый аргумент - цвет в HEX формате
2-ой аргумент - прозрачность
 
Последнее редактирование:

MLycoris

Режим чтения
Автор темы
Проверенный
1,795
1,826
Объясни что str это ffi.string
Могу ошибаться, но насколько я понял str позволяет считывать введённый текст в инпуте, чтобы в дальнейшем вывести чат, ну или декодировать в кириллицу. Без этого скрипт банально крашит
 
  • Bug
  • Эм
Реакции: Rice. и Sadow

Sadow

Известный
1,437
585
Могу ошибаться, но насколько я понял str позволяет считывать введённый текст в инпуте, чтобы в дальнейшем вывести чат, ну или декодировать в кириллицу. Без этого скрипт банально крашит
А зачем мне эта информация7 Напиши просто в теме что str это переменная равная ffi.string. Чтобы чайники вопросы не задавали
 

MLycoris

Режим чтения
Автор темы
Проверенный
1,795
1,826
Обновил и апаю гайд:
1. Добавлено 2 шаблона
2. Добавлено 2 примера простых скриптов
3. Чутка обновлён дизайн
4. Добавлено чуть больше подробностей
5. Добавлено описание ещё одной полезной функции и 2 варианта написания обычного текста в окошке
 

the same

Активный
173
25
такой вопрос, есть какой либо сильный смысл переходить с imgfui на mimgui ?
 

ChromiusJ

x B x A x R x
Друг
4,861
3,167
такой вопрос, есть какой либо сильный смысл переходить с imgfui на mimgui ?
хз,я сразу с мимгуи начал,вроде норм,люди говорят что типо мимгуи более оптимизированей для сампика и тд тп,так что наверно да,можешь попробовать
 

kyrtion

Известный
630
232
Обновил и апаю гайд:
1. Добавлено 2 шаблона
2. Добавлено 2 примера простых скриптов
3. Чутка обновлён дизайн
4. Добавлено чуть больше подробностей
5. Добавлено описание ещё одной полезной функции и 2 варианта написания обычного текста в окошке
Там где сортировка по поиске, рекомендую использовать для поиска по маленькой или большой буквы, а список ставить с маленькой или наоборот, так как и на финде.

Функция типа string.rlower или string.rupper
 
  • Нравится
Реакции: MLycoris

KOHTOP

Участник
138
17
Сделай гайд про добавление двух разделов для конфига
И ещё про radiobutton
Буду благодарен
 

MLycoris

Режим чтения
Автор темы
Проверенный
1,795
1,826
Сделай гайд про добавление двух разделов для конфига
И ещё про radiobutton
Буду благодарен
Планировал много всего добавить, но ограничение 50к символов не позволяет, мб 2 тему сделаю
 

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,157
Оформи как статью
Цвета излишни, нет смысла, только жирный текст
Убери забор, выделяй текст только там где нужно
Пример с поиском говно, юзай фильтры имгуи
 
  • Нравится
Реакции: MLycoris

MLycoris

Режим чтения
Автор темы
Проверенный
1,795
1,826
Оформи как статью
Цвета излишни, нет смысла, только жирный текст
Убери забор, выделяй текст только там где нужно
Пример с поиском говно, юзай фильтры имгуи
Спасибо, поработаю над этим