Moon ImGui — Dear ImGui for MoonLoader

29072770-aef614e2-7c7b-11e7-8861-212c2c416439.png


Это ImGui - самый функциональный и одновременно самый простой GUI-фреймворк из всех, что мне известны.
И теперь каждый из вас сможет использовать его в своих Lua скриптах для MoonLoader.

Представляю вам Moon ImGui - Lua биндинг ImGui для MoonLoader. Он включает все основные возможности фреймворка, а API максимально приближен к оригинальному по мере возможного.
Тут не будут подробно рассматриваться возможности и особенности ImGui, в этой теме будет рассказано и показано как использовать Moon ImGui в Lua. За информацией по самому ImGui сюда:

Начнём с самого элементарного:
Lua:
local imgui = require 'imgui' -- загружаем библиотеку

-- в этой функции осуществляется вся работа с ImGui
-- она вызывается каждый кадр, но только если imgui.Process равен true
function imgui.OnDrawFrame()
  imgui.Begin('My window') -- новое окно с заголовком 'My window'
  imgui.Text('Hello world') -- простой текст внутри этого окна
  imgui.End() -- конец окна
end

function main()
  imgui.Process = true -- ImGui будет обрабатываться, пока imgui.Process равен true
  -- в этом примере мы просто активируем ImGui сразу же после загрузки игры
end
Результат:
upload_2017-11-25_18-29-2.png


Это работает, но что-то не впечатляет, согласитесь. Окно изначально маленькое, показывается сразу при старте и его нельзя закрыть.
Сделаем его побольше, добавим активацию и какое-нибудь действие:
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'

-- одно из основных отличий от оригинального апи
-- все переменные, значения которых записываются в ImGui по указателю, могут использоваться только через специальные типы
local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then -- чтение и запись значения такой переменной осуществляется через поле v (или Value)
    imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver) -- меняем размер
    -- но для передачи значения по указателю - обязательно напрямую
    -- тут main_window_state передаётся функции imgui.Begin, чтобы можно было отследить закрытие окна нажатием на крестик
    imgui.Begin('My window', main_window_state)
    imgui.Text('Hello world')
    if imgui.Button('Press me') then -- а вот и кнопка с действием
      -- условие будет выполнено при нажатии на неё
      printStringNow('Button pressed!', 1000)
    end
    imgui.End()
  end
end

function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then -- активация по нажатию клавиши X
        main_window_state.v = not main_window_state.v -- переключаем статус активности окна, не забываем про .v
    end
    imgui.Process = main_window_state.v -- теперь значение imgui.Process всегда будет задаваться в зависимости от активности основного окна
  end
end
Теперь окно выглядит так и его можно скрыть:
upload_2017-11-25_18-29-17.png


В коде была использована переменная типа ImBool - это один из новых типов, добавленных в Moon ImGui. Такой подход неизбежен, поскольку в луа невозможна передача базовых типов по ссылке. Это не единственное изменение, есть и другие, вам потребуется о них знать. Вот их полный список:

Разница между C++ API и Lua API
ОписаниеВ C++В Lua
Все функции из пространства имён ImGui, как и все типы, и все перечисления находятся в таблице, возвращаемой модулемImGui::Text("text");
ImVec2(0.1f, 2.3f);
imgui.Text("text");
imgui.ImVec2(0.1, 2.3);
Названия перечислений (enum) и их значений лишились префиксов и символа "_" в концеImGuiWindowFlags_NoTitleBarimgui.WindowFlags.NoTitleBar
Значения базовых типов, которые в ImGui записываются по указателю, должны быть использованы через специальные типы: ImBool для bool, ImFloat для float, ImInt для int и unsigned int, ImFloat2-4 для float[2-4], ImInt2-4 для int[2-4]static bool win = false; ImGui::Begin("window", &win);
win = false;
local win = imgui.ImBool(false) imgui.Begin("window", win)
win.v = false
Функции с переменным количеством аргументов для форматирования текста не поддерживают форматирование, используйте string.formatImGui::Text("hey, %s", name)imgui.Text(string.format('hey, %s', name))
Функции InputText и InputTextMultiline принимают ImBuffer вместо char* buf + size_t buf_sizechar buf[256]{};
ImGui::InputText('input', buf, sizeof(buf))
local buf = imgui.ImBuffer(256);
imgui.InputText('input', buf)
Динамические массивы в виде массива указателей + количество элементов заменены таблицамиconst char* items[] = {"1", "2", "3"}; ImGui::ListBox("list", &lb_cur, items, 3)imgui.ListBox('list', lb_cur, {'1', '2', '3'})
Функции с аргументами const char* str_start, const char* str_end, идущими подряд, принимают обычную строкуImGui::TextUnformatted(some_str, some_str + 24)imgui.TextUnformatted(some_str)
Все функции, принимающие калбэк + user_data, принимают ImCallbackvoid swszCb(ImGuiSizeConstraintCallbackData*) {};
ImGui::SetNextWindowSizeConstraints(size_min, size_max, &swszCb, (void*)&my_data)
local swszCb = imgui.ImCallback(function(data) end)
imgui.SetNextWindowSizeConstraints(size_min, size_max, swszCb)
ImFont::CalcTextSizeA,
ImFontAtlas::CustomRect::CalcCustomRectUV,
ImFontAtlas::GetTexDataAsRGBA32,
ImFontAtlas::GetTexDataAsAlpha8,
ImFontAtlas::GlyphRangesBuilder::BuildRanges,
ImGui::ColorConvertRGBtoHSV и
ImGui::ColorConvertHSVtoRGB
возвращают значения вместо изменения по ссылке
float r, g, b;
ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b);
local r, g, b = imgui.ColorConvertHSVtoRGB(h, s, v)
ImGuiIO::IniFilename и ImGuiIO::LogFilename принимают ImBuffer вместо указателя на строкуconst char ini_path[] = "my/path.ini";
ImGui::GetIO().IniFilename = ini_path;
local ini_path = imgui.ImBuffer('my/path.ini')
imgui.GetIO().IniFilename = ini_path
Изменение ImGuiTextEditCallbackData::Buf автоматически обновляет длину и задаёт значение BufDirtys.copy(data.Buf, data.BufSize);
data.BufTextLen = s.length();
data.BufDirty = true;
data.Buf = 'text'

Остальные изменения
  • Добавлено несколько дополнительных функций
    • ImColor::ToU32 - преобразование ImColor в целое
    • ImGui::GetStyleColorU32 вместо ImGui::GetColorU32 для цвета стиля
    • ImGui::PlotLinesEx вместо callback-варианта PlotLines
    • ImGui::PlotHistogramEx вместо callback-варианта PlotHistogram
    • ImDrawList::AddTextEx вместо AddText с дополнительными аргументами
  • Отсутствуют функции
    • Функции, принимающие и возвращающие void*-идентификаторы (например, PushID(void*) и GetID(void*))
    • Функции с va_list-форматированием текста (например, TextV)
Теперь, зная всё это, вы уже можете начать работать с Moon ImGui. За списком функций ImGui и примерами на C++ обращайтесь на официальную страницу.

Но это ещё не всё. Вся работа с текстом в ImGui основана на UTF-8, т.е. текст не ограничен лишь стандартным набором символов. Но т.к. GTA, SAMP и MoonLoader не поддерживают юникод, кодировки необходимо конвертировать.

Работа с другими языками на примере русского
В MoonLoader v.025 были добавлены библиотеки lua-iconv и encoding, они призваны помочь в работе с разными кодировками текста.
Следующий пример показывает как использовать текст на русском в ImGui:
Скрипт должен быть сохранён в кодировке Windows-1251
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

local test_text_buffer = imgui.ImBuffer(256)
function imgui.OnDrawFrame()
  imgui.Begin(u8'Основное окно') -- обратите внимание на u8 перед текстом, это и есть преобразование кодировки
  if imgui.InputText(u8'Вводить текст сюда', test_text_buffer) then -- условие будет срабатывать при изменении текста
    -- здесь первая строка передаётся по-обычному, без u8
    -- но введённый текст при выводе преобразуется обратно из UTF-8 в кодировку по умолчанию, т.е. в Windows-1251
    print('Введённый текст:', u8:decode(test_text_buffer.v)) -- при работе с ImBuffer тоже не забывайте о .v
  end
  imgui.Text(u8'Введённый текст: ' .. test_text_buffer.v) -- но тут обратное преобразование введённого текста не требуется, т.к. текст буфера и так в UTF-8
  imgui.Text(u8(string.format('Текущая дата: %s', os.date()))) -- u8 - это функция, её можно использовать и с неконстантными строками
  imgui.End()
end

function main()
  imgui.Process = true
end
Результат:
upload_2017-11-25_18-29-37.png


Не так уж и сложно, верно? Текст, передаваемый ImGui - кодируем, текст, получаемый из ImGui - декодируем. Если в вашем скрипте много текста на русском для ImGui, но мало текста, выводимого через MoonLoader (в лог или чат SA:MP, к примеру), то можно сделать наоборот - сохранить скрипт в кодировке UTF-8 и не кодировать текст, передаваемый ImGui, а вместо этого кодировать текст при работе с функциями мунлоадера.

Остальные особенности
В Moon ImGui есть несколько дополнительных возможностей. В частности, они реализуют взаимодействие с игрой и управление интерфейсом.
Код:
Параметры
imgui.BeforeDrawFrame = nil  -  опциональный калбэк. Если он задан, будет вызываться каждый кадр перед OnDrawFrame и NewFrame самого ImGui. Его можно использовать для загрузки шрифтов и текстур (будьте осторожны, он вызывается каждый кадр)
imgui.OnDrawFrame = nil  -  основной калбэк для рендера, о нём вы уже знаете
imgui.Process = false  -  только если задано true, имгуи будет обрабатываться и выводиться
imgui.RenderInMenu = false  -  показывать интерфейс в меню паузы, по умолчанию отключено
imgui.ShowCursor = true  -  показывать курсор, по умолчанию включен. Отключение может пригодиться, если нужно рисовать только какой-то оверлей без взаимодействия с ним
imgui.LockPlayer = false  -  отключить управление игроком, пока ImGui активен. Если не задано, то управление игроком будет отключаться только когда ImGui требуется обработать ввод с клавиатуры

Функции
после загрузки новых шрифтов и обязательно вне OnDrawFrame
function imgui.CreateTextureFromFile(path)  -  загрузить текстуру из файла. Возвращает загруженную текстуру или nil в случае неудачи
function imgui.CreateTextureFromMemory(address, size)  -  загрузить текстуру из изображения, хранящегося по указанному адресу в памяти. Возвращает загруженную текстуру или nil в случае неудачи
function imgui.GetTextureFromAddress(address)  -  получить ImGui-совместимую текстуру по адресу памяти
function imgui.ReleaseTexture(texture)  -  выгрузить текстуру, загруженную с помощью CreateTextureFromFile или CreateTextureFromMemory\
function imgui.RebuildFonts()  -  пересобрать внутреннюю текстуру шрифтов. Необходимо использовать
function imgui.SwitchContext()  -  переключить ImGui-контекст на принадлежащий скрипту. В BeforeDrawFrame и OnDrawFrame контекст переключается автоматически, так что в них эту функцию использовать нет нужды.

На этом всё. Во вложениях есть пример с демонстрацией использования всех этих фич, рекомендую посмотреть код и пощупать его в игре. Вот скриншот:

upload_2017-11-25_18-28-12.png

Полезные штуки для разработчиков
FontAwesome 4: https://blast.hk/threads/19292/post-168990
FontAwesome 5: https://blast.hk/threads/19292/post-335148
ImGui Pie: https://blast.hk/threads/19648/post-226145
Внутриигровая песочница: https://blast.hk/threads/19292/post-219453
ImGui Custom (хоткеи и ещё чет): https://blast.hk/threads/22080/
Global notification: https://blast.hk/threads/21619/
Стили:
https://blast.hk/threads/19292/post-260462

Ссылки
Скачать Moon ImGui (Download)
Установка:
распаковать содержимое архива в корневую папку игры.
Требуется MoonLoader v.026 или выше
Официальная страница ImGui
Пример на C++ с применением большинства возможностей (imgui_demo.cpp)
Все функции ImGui (imgui.h. Список поддерживаемых также есть в imgui.lua)
 

Вложения

  • moon imgui demo.lua
    9.2 KB · Просмотры: 113,888
Последнее редактирование:

Rowland

Новичок
114
2
Последнее редактирование модератором:

uryukhai

Активный
196
104
При наведении - выделяется абсолютно весь меню бар, как расположить элементы отдельно? Main Window только работает, SameLine() - не помогает
upload_2018-6-12_8-7-19.png

Lua:
        imgui.BeginMainMenuBar()
        imgui.Selectable('Main Window')
        imgui.Selectable('Hui Window')
        imgui.Selectable('Colors Window')
        imgui.Selectable('Config Window')
        imgui.EndMainMenuBar()
Если использовать SameLine(), то по идее должно быть, как на скрине

upload_2018-6-12_7-59-16.png
 

Aniki

🐰
Администратор
1,225
1,506
При наведении - выделяется абсолютно весь меню бар, как расположить элементы отдельно? Main Window только работает, SameLine() - не помогает
Посмотреть вложение 14839
Lua:
        imgui.BeginMainMenuBar()
        imgui.Selectable('Main Window')
        imgui.Selectable('Hui Window')
        imgui.Selectable('Colors Window')
        imgui.Selectable('Config Window')
        imgui.EndMainMenuBar()
Если использовать SameLine(), то по идее должно быть, как на скрине

Посмотреть вложение 14838
Вместо Selectable используй MenuItem
Lua:
imgui.MenuItem('Main Window')
 
  • Нравится
Реакции: uryukhai

uryukhai

Активный
196
104
Крашит при нажатии на первый MenuItem, не понимаю, как испрвить
Lua:
local main_window_state = imgui.ImBool(false)
local show_teleport_window = imgui.ImBool(false)
Lua:
            imgui.BeginMainMenuBar()
            imgui.PushStyleVar(imgui.StyleVar.ItemSpacing, imgui.ImVec2(8 * 2.0, 4 * 2.0))
            if imgui.MenuItem('Teleport Window') then
                show_teleport_window.v = not show_teleport_window.v --тут крашит
            end
            imgui.MenuItem('Colors Window')
            imgui.MenuItem('Config Window')
            imgui.PopStyleVar()
            imgui.EndMainMenuBar()

Lua:
function show_teleport_window()
    if  main_window.v then
        imgui.Begin('Teleport Window')
        if imgui.CollapsingHeader(u8'Государственные организации') then
            if imgui.Button(u8'Мэрия LS') then
                setCharCoordinates(PLAYER_PED, 1417.20, -1807.29, 13.55 - 1.0)
            end
---
---
---
 

Adventurer

Известный
151
69
Крашит при нажатии на первый MenuItem, не понимаю, как испрвить
Lua:
local main_window_state = imgui.ImBool(false)
local show_teleport_window = imgui.ImBool(false)
Lua:
            imgui.BeginMainMenuBar()
            imgui.PushStyleVar(imgui.StyleVar.ItemSpacing, imgui.ImVec2(8 * 2.0, 4 * 2.0))
            if imgui.MenuItem('Teleport Window') then
                show_teleport_window.v = not show_teleport_window.v --тут крашит
            end
            imgui.MenuItem('Colors Window')
            imgui.MenuItem('Config Window')
            imgui.PopStyleVar()
            imgui.EndMainMenuBar()

Lua:
function show_teleport_window()
    if  main_window.v then
        imgui.Begin('Teleport Window')
        if imgui.CollapsingHeader(u8'Государственные организации') then
            if imgui.Button(u8'Мэрия LS') then
                setCharCoordinates(PLAYER_PED, 1417.20, -1807.29, 13.55 - 1.0)
            end
---
---
---

любое окно, должно быть в функции OnDrawFrame, а не внешней
Lua:
function imgui.OnDrawFrame()
    --тут идет твое первое окно
    if main_window_state.v then
        imgui.Begin('Main Menu', main_window_state)--[[code]]
        imgui.End()
    end

    --а тут уже можно разместить и второе
    if  show_teleport_window.v then
        imgui.Begin('Teleport Window', show_teleport_window)--[[code]]
        imgui.End()
    end
 
end

Имею два важных вопроса.
Как рисовать текст ровно по центру?
Допустиим, имею окно:
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(210, 160), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(cfg.gui.pos_x, cfg.gui.pos_y), imgui.Cond.FirstUseEver)
imgui.Begin('sample window', swindow, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize)
imgui.Text(u8'Отцентрованный текст)
imgui.Separator()
if hen1.v then imgui.Text('hen1') end -- тут у меня вообще динамическое значение текста, которое может состоять из 10 , а затем и более символов
if hen2.v then imgui.Text('hen2') end
if hen3.v then imgui.Text('hen3') end
imgui.End()
...и вот как сделать грамотно, не используя флага alwaysautoresize, чтобы размер окна зависел от количества включенных HEN(текстов в окне)?
Если же использовать этот флаг, то при смене количества символов в тексте hen1, изменяется ширина окна.
Дополнение: если везде прописать условие if ... then imgui.setnexwindowsize, то получится весьма громоздкий и неудобный быдлокод.
 
Последнее редактирование:

Aniki

🐰
Администратор
1,225
1,506
любое окно, должно быть в функции OnDrawFrame, а не внешней
Lua:
function imgui.OnDrawFrame()
    --тут идет твое первое окно
    if main_window_state.v then
        imgui.Begin('Main Menu', main_window_state)--[[code]]
        imgui.End()
    end

    --а тут уже можно разместить и второе
    if  show_teleport_window.v then
        imgui.Begin('Teleport Window', show_teleport_window)--[[code]]
        imgui.End()
    end
 
end

Имею два важных вопроса.
Как рисовать текст ровно по центру?
Допустиим, имею окно:
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(210, 160), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(cfg.gui.pos_x, cfg.gui.pos_y), imgui.Cond.FirstUseEver)
imgui.Begin('sample window', swindow, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize)
imgui.Text(u8'Отцентрованный текст)
imgui.Separator()
if hen1.v then imgui.Text('hen1') end -- тут у меня вообще динамическое значение текста, которое может состоять из 10 , а затем и более символов
if hen2.v then imgui.Text('hen2') end
if hen3.v then imgui.Text('hen3') end
imgui.End()
...и вот как сделать грамотно, не используя флага alwaysautoresize, чтобы размер окна зависел от количества включенных HEN(текстов в окне)?
Если же использовать этот флаг, то при смене количества символов в тексте hen1, изменяется ширина окна.
Дополнение: если везде прописать условие if ... then imgui.setnexwindowsize, то получится весьма громоздкий и неудобный быдлокод.
Насчет текста ровно по центру лучший способ по мне это imgui.SetCursorPosX на середину окна. Пример:
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(210, 160), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(cfg.gui.pos_x, cfg.gui.pos_y), imgui.Cond.FirstUseEver)
imgui.Begin('sample window', swindow, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize)
imgui.SetCursorPosX((210 - imgui.CalcTextSize(u8'Отцентрованный текст').x)/2) -- в общем случае - (ширина_окна - ширина_текста)/2
imgui.Text(u8'Отцентрованный текст')
Чтобы не менялась ширина окна попробуй использовать SetNextWindowSizeConstraints, но с авторесайзом я ее не тестил
Lua:
imgui.SetNextWindowSizeConstraints(imgui.ImVec2(-1, 160), imgui.ImVec(-1, 600)) -- первый вектор - минимальный размер окна, второй - максимальный, -1 сохраняет текущие размеры окна
 
  • Нравится
Реакции: Adventurer

Aniki

🐰
Администратор
1,225
1,506
Крашит при нажатии на первый MenuItem, не понимаю, как испрвить
Lua:
local main_window_state = imgui.ImBool(false)
local show_teleport_window = imgui.ImBool(false)
Lua:
            imgui.BeginMainMenuBar()
            imgui.PushStyleVar(imgui.StyleVar.ItemSpacing, imgui.ImVec2(8 * 2.0, 4 * 2.0))
            if imgui.MenuItem('Teleport Window') then
                show_teleport_window.v = not show_teleport_window.v --тут крашит
            end
            imgui.MenuItem('Colors Window')
            imgui.MenuItem('Config Window')
            imgui.PopStyleVar()
            imgui.EndMainMenuBar()

Lua:
function show_teleport_window()
    if  main_window.v then
        imgui.Begin('Teleport Window')
        if imgui.CollapsingHeader(u8'Государственные организации') then
            if imgui.Button(u8'Мэрия LS') then
                setCharCoordinates(PLAYER_PED, 1417.20, -1807.29, 13.55 - 1.0)
            end
---
---
---
Скорее всего крашит из-за открывающегося окна с телепортами, где то там ошибка. По тому куску что ты скинул не понятно в чем проблема, кидай полностью код окна
 

uryukhai

Активный
196
104
Скорее всего крашит из-за открывающегося окна с телепортами, где то там ошибка. По тому куску что ты скинул не понятно в чем проблема, кидай полностью код окна

щас сделал так, всё работает, но при нажатии на Teleport Window - ничего (не крашит хоть))

Вначале кода:
Lua:
local main_window_state = imgui.ImBool(false)
local show_teleport_window = imgui.ImBool(false)

Само меню:
Lua:
function imgui.OnDrawFrame(switchTabs)
    if main_window_state.v then

        --centrovka
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(1200, 600), imgui.Cond.FirstUseEver)
        --centrovka

        if main_window_state.v then
            imgui.Begin('Main Menu', main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoResize)
                if imgui.Button(tabs[1], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 1
                end
                    imgui. SameLine()
                if imgui.Button(tabs[2], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 2
                end
                    imgui. SameLine()
                if imgui.Button(tabs[3], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 3
                end
                    imgui. SameLine()
                if imgui.Button(tabs[4], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 4
                end
            imgui.End()
        end

            imgui.BeginMainMenuBar()
            imgui.PushStyleVar(imgui.StyleVar.ItemSpacing, imgui.ImVec2(8 * 2.0, 4 * 2.0))
            imgui.MenuItem('Teleport Window', show_teleport_window) --not working
            imgui.MenuItem('Colors Window')
            imgui.MenuItem('Config Window')
            imgui.PopStyleVar()
            imgui.EndMainMenuBar()

        if  show_teleport_window.v then
            imgui.Begin('Teleport Window')
            if imgui.CollapsingHeader(u8'Государственные организации') then
            if imgui.Button(u8'Мэрия LS') then
                setCharCoordinates(PLAYER_PED, 1417.20, -1807.29, 13.55 - 1.0)
            end
            if imgui.Button(u8'Мэрия SF') then
                setCharCoordinates(PLAYER_PED, -2773.59, 321.37, 4.51 - 1.0)
            end
            if imgui.Button(u8'Мэрия LV') then
                setCharCoordinates(PLAYER_PED, 2399.80, 2529.62, 10.82 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Лос-Сантос 1') then
                setCharCoordinates(PLAYER_PED, 1170.42, -1311.38, 13.98 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Лос-Сантос 2') then
                setCharCoordinates(PLAYER_PED, 2003.74, -1407.23, 17.11 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Сан-Фиерро') then
                setCharCoordinates(PLAYER_PED, -2679.46, 640.16, 14.45 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Лас-Вентурас') then
                setCharCoordinates(PLAYER_PED, 1585.60, 1798.90, 10.83 - 1.0)
            end
            if imgui.Button(u8'Новости LS') then
                setCharCoordinates(PLAYER_PED, 1668.54, -1641.17, 22.53 - 1.0)
            end
            if imgui.Button(u8'Новости SF') then
                setCharCoordinates(PLAYER_PED, -1830.45, 628.72, 30.75 - 1.0)
            end
            if imgui.Button('FBI') then
                setCharCoordinates(PLAYER_PED, -2462.11, 507.32, 30.08 - 1.0)
            end
            if imgui.Button('LSPD') then
                setCharCoordinates(PLAYER_PED, 1553.83, -1679.49, 13.55 - 1.0)
            end
            if imgui.Button('SFPD') then
                setCharCoordinates(PLAYER_PED, -1594.08, 716.79, 10.01 - 1.0)
            end
            if imgui.Button('LVPD') then
                setCharCoordinates(PLAYER_PED, 2173.00, 2467.69, 10.82 - 1.0)
            end
            if imgui.Button('CB') then
                setCharCoordinates(PLAYER_PED, 373.48, 2056.60, 17.64 - 1.0)
            end
            if imgui.Button('BBC') then
                setCharCoordinates(PLAYER_PED, 395.60, 2676.52, 59.26 - 1.0)
            end
            if imgui.Button(u8'ВМФ') then
                setCharCoordinates(PLAYER_PED, -2342.89, 2440.75, 7.30 - 1.0)
            end
        end

        if imgui.CollapsingHeader(u8'Криминальные организации') then
            if imgui.Button('Groove') then
                setCharCoordinates(PLAYER_PED, 2502.32, -1700.04, 13.56 - 1.0)
            end
            if imgui.Button('Aztec') then
                setCharCoordinates(PLAYER_PED, 1666.29, -2095.46, 13.55 - 1.0)
            end
            if imgui.Button('Rifa') then
                setCharCoordinates(PLAYER_PED, 2134.97,    -1831.51, 13.55 - 1.0 )
            end
            if imgui.Button('Ballas') then
                setCharCoordinates(PLAYER_PED, 2045.49, -1116.63, 26.36 - 1.0)
            end
            if imgui.Button('Vagos') then
                setCharCoordinates(PLAYER_PED, 2763.95, -1204.11, 67.80 - 1.0)
            end
            if imgui.Button('La Cosa Nostra') then
                setCharCoordinates(PLAYER_PED, 1437.38, 2736.66, 10.82 - 1.0)
            end
            if imgui.Button('Russian Mafia') then
                setCharCoordinates(PLAYER_PED, 956.43, 1805.87, 8.65 - 1.0)
            end
            if imgui.Button('Yakuza') then
                setCharCoordinates(PLAYER_PED, 2539.04, 1849.94, 11.02 - 1.0)
            end
        end

        if imgui.CollapsingHeader(u8'Работа') then
            if imgui.Button(u8'Грузчик') then
                setCharCoordinates(PLAYER_PED, 2182.35, -2232.09, 13.45 - 1.0)
            end
            if imgui.Button(u8'Шахта') then
                setCharCoordinates(PLAYER_PED, -1899.64, -1626.07, 21.76 - 1.0)
            end
            if imgui.Button(u8'Завод') then
                setCharCoordinates(PLAYER_PED, -74.91, -270.75, 6.43 - 1.0)
            end
            if imgui.Button(u8'Ферма 0') then
                setCharCoordinates(PLAYER_PED, -389.1, -1419.83, 25.73 - 1.0)
            end
            if imgui.Button(u8'Ферма 1') then
                setCharCoordinates(PLAYER_PED, -89.53, -24.39, 6.48 - 1.0)
            end
            if imgui.Button(u8'Ферма 2') then
                setCharCoordinates(PLAYER_PED, -1066.05, -1190.29, 129.22 - 1.0)
            end
            if imgui.Button(u8'Ферма 3') then
                setCharCoordinates(PLAYER_PED, 1904.94, 166.15, 37.14 - 1.0)
            end
        end

        if imgui.CollapsingHeader(u8'Разное') then
            if imgui.Button(u8'Оружейный магазин\n"AMMU-NATION') then
                setCharCoordinates(PLAYER_PED, 1304.32, -1243.73, 13.55 - 1.0)
            end
            if imgui.Button(u8'Магазин одежды\n"Victim"') then
                setCharCoordinates(PLAYER_PED, 418.49, -1506.06, 31.31 - 1.0)
            end
            if imgui.Button(u8'Ж/Д Вокзал LS') then
                setCharCoordinates(PLAYER_PED, 1767.98, -1908.51, 13.56 - 1.0)
            end
            if imgui.Button(u8'Ж/Д Вокзал SF') then
                setCharCoordinates(PLAYER_PED, -1920.96, 154.26, 26.68 - 1.0)
            end
            if imgui.Button(u8'Ж/Д Вокзал LV') then
                setCharCoordinates(PLAYER_PED, 2845.09, 1247.49, 11.39 - 1.0)
            end
            if imgui.Button(u8'Аэропорт LS') then
                setCharCoordinates(PLAYER_PED, 1987.62, -2136.95, 13.55 - 1.0)
            end
            if imgui.Button(u8'Аэропорт SF') then
                setCharCoordinates(PLAYER_PED, -1538.19, -443.38, 6.02 - 1.0)
            end
            if imgui.Button(u8'Аэропорт LV') then
                setCharCoordinates(PLAYER_PED, 1648.36, 1647.26, 10.82 - 1.0)
            end
            if imgui.Button(u8'Заброшенный аэродром LV') then
                setCharCoordinates(PLAYER_PED, 383.86, 2475.78, 16.50 - 1.0)
            end
            if imgui.Button(u8'Стадион LS') then
                setCharCoordinates(PLAYER_PED, 2738.40, -1690.51, 11.84 - 1.0)
            end
            if imgui.Button(u8'Стадион LV') then
                setCharCoordinates(PLAYER_PED, 1150.95, 1523.79, 12.55 - 1.0)
            end
            if imgui.Button(u8'Завод КАСС') then
                setCharCoordinates(PLAYER_PED, 2498.07, 2839.58, 10.82 - 1.0)
            end
            if imgui.Button(u8'Автошкола') then
                setCharCoordinates(PLAYER_PED, -2018.89, -117.27, 35.18 - 1.0)
            end
            if imgui.Button(u8'Военкомат') then
                setCharCoordinates(PLAYER_PED, 1079.07, 1397.37, 7.21 - 1.0)
            end
            if imgui.Button(u8'Притон') then
                setCharCoordinates(PLAYER_PED, 2155.78, -1667.89, 15.09 - 1.0)
            end
            if imgui.Button(u8'Чилиад') then
                setCharCoordinates(PLAYER_PED, -2387.25, -1579.70, 499.71 - 1.0)
            end
            if imgui.Button(u8'Киностудия') then
                setCharCoordinates(PLAYER_PED, 928.47, -1259.04, 15.71 - 1.0)
            end
            if imgui.Button(u8'Маяк') then
                setCharCoordinates(PLAYER_PED, 154.38, -1957.21, 3.77 - 1.0)
            end
            if imgui.Button('Hippy Shopper') then
                setCharCoordinates(PLAYER_PED, -2525.10, -59.78, 21.35 - 1.0)
            end
            if imgui.Button(u8'Burger Shot') then
                setCharCoordinates(PLAYER_PED, 782.85, -1654.75, 13.45 - 1.0)
            end
            if imgui.Button(u8'VineWood') then
                setCharCoordinates(PLAYER_PED, 1446.97, -807.92, 84.29 - 1.0)
            end
        end
            imgui.End()
        end
    end
end
 

Aniki

🐰
Администратор
1,225
1,506
щас сделал так, всё работает, но при нажатии на Teleport Window - ничего (не крашит хоть))

Вначале кода:
Lua:
local main_window_state = imgui.ImBool(false)
local show_teleport_window = imgui.ImBool(false)

Само меню:
Lua:
function imgui.OnDrawFrame(switchTabs)
    if main_window_state.v then

        --centrovka
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(1200, 600), imgui.Cond.FirstUseEver)
        --centrovka

        if main_window_state.v then
            imgui.Begin('Main Menu', main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoResize)
                if imgui.Button(tabs[1], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 1
                end
                    imgui. SameLine()
                if imgui.Button(tabs[2], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 2
                end
                    imgui. SameLine()
                if imgui.Button(tabs[3], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 3
                end
                    imgui. SameLine()
                if imgui.Button(tabs[4], imgui.ImVec2(290.0, 0.0)) then
                    switchTabs = 4
                end
            imgui.End()
        end

            imgui.BeginMainMenuBar()
            imgui.PushStyleVar(imgui.StyleVar.ItemSpacing, imgui.ImVec2(8 * 2.0, 4 * 2.0))
            imgui.MenuItem('Teleport Window', show_teleport_window) --not working
            imgui.MenuItem('Colors Window')
            imgui.MenuItem('Config Window')
            imgui.PopStyleVar()
            imgui.EndMainMenuBar()

        if  show_teleport_window.v then
            imgui.Begin('Teleport Window')
            if imgui.CollapsingHeader(u8'Государственные организации') then
            if imgui.Button(u8'Мэрия LS') then
                setCharCoordinates(PLAYER_PED, 1417.20, -1807.29, 13.55 - 1.0)
            end
            if imgui.Button(u8'Мэрия SF') then
                setCharCoordinates(PLAYER_PED, -2773.59, 321.37, 4.51 - 1.0)
            end
            if imgui.Button(u8'Мэрия LV') then
                setCharCoordinates(PLAYER_PED, 2399.80, 2529.62, 10.82 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Лос-Сантос 1') then
                setCharCoordinates(PLAYER_PED, 1170.42, -1311.38, 13.98 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Лос-Сантос 2') then
                setCharCoordinates(PLAYER_PED, 2003.74, -1407.23, 17.11 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Сан-Фиерро') then
                setCharCoordinates(PLAYER_PED, -2679.46, 640.16, 14.45 - 1.0)
            end
            if imgui.Button(u8'Госпиталь Лас-Вентурас') then
                setCharCoordinates(PLAYER_PED, 1585.60, 1798.90, 10.83 - 1.0)
            end
            if imgui.Button(u8'Новости LS') then
                setCharCoordinates(PLAYER_PED, 1668.54, -1641.17, 22.53 - 1.0)
            end
            if imgui.Button(u8'Новости SF') then
                setCharCoordinates(PLAYER_PED, -1830.45, 628.72, 30.75 - 1.0)
            end
            if imgui.Button('FBI') then
                setCharCoordinates(PLAYER_PED, -2462.11, 507.32, 30.08 - 1.0)
            end
            if imgui.Button('LSPD') then
                setCharCoordinates(PLAYER_PED, 1553.83, -1679.49, 13.55 - 1.0)
            end
            if imgui.Button('SFPD') then
                setCharCoordinates(PLAYER_PED, -1594.08, 716.79, 10.01 - 1.0)
            end
            if imgui.Button('LVPD') then
                setCharCoordinates(PLAYER_PED, 2173.00, 2467.69, 10.82 - 1.0)
            end
            if imgui.Button('CB') then
                setCharCoordinates(PLAYER_PED, 373.48, 2056.60, 17.64 - 1.0)
            end
            if imgui.Button('BBC') then
                setCharCoordinates(PLAYER_PED, 395.60, 2676.52, 59.26 - 1.0)
            end
            if imgui.Button(u8'ВМФ') then
                setCharCoordinates(PLAYER_PED, -2342.89, 2440.75, 7.30 - 1.0)
            end
        end

        if imgui.CollapsingHeader(u8'Криминальные организации') then
            if imgui.Button('Groove') then
                setCharCoordinates(PLAYER_PED, 2502.32, -1700.04, 13.56 - 1.0)
            end
            if imgui.Button('Aztec') then
                setCharCoordinates(PLAYER_PED, 1666.29, -2095.46, 13.55 - 1.0)
            end
            if imgui.Button('Rifa') then
                setCharCoordinates(PLAYER_PED, 2134.97,    -1831.51, 13.55 - 1.0 )
            end
            if imgui.Button('Ballas') then
                setCharCoordinates(PLAYER_PED, 2045.49, -1116.63, 26.36 - 1.0)
            end
            if imgui.Button('Vagos') then
                setCharCoordinates(PLAYER_PED, 2763.95, -1204.11, 67.80 - 1.0)
            end
            if imgui.Button('La Cosa Nostra') then
                setCharCoordinates(PLAYER_PED, 1437.38, 2736.66, 10.82 - 1.0)
            end
            if imgui.Button('Russian Mafia') then
                setCharCoordinates(PLAYER_PED, 956.43, 1805.87, 8.65 - 1.0)
            end
            if imgui.Button('Yakuza') then
                setCharCoordinates(PLAYER_PED, 2539.04, 1849.94, 11.02 - 1.0)
            end
        end

        if imgui.CollapsingHeader(u8'Работа') then
            if imgui.Button(u8'Грузчик') then
                setCharCoordinates(PLAYER_PED, 2182.35, -2232.09, 13.45 - 1.0)
            end
            if imgui.Button(u8'Шахта') then
                setCharCoordinates(PLAYER_PED, -1899.64, -1626.07, 21.76 - 1.0)
            end
            if imgui.Button(u8'Завод') then
                setCharCoordinates(PLAYER_PED, -74.91, -270.75, 6.43 - 1.0)
            end
            if imgui.Button(u8'Ферма 0') then
                setCharCoordinates(PLAYER_PED, -389.1, -1419.83, 25.73 - 1.0)
            end
            if imgui.Button(u8'Ферма 1') then
                setCharCoordinates(PLAYER_PED, -89.53, -24.39, 6.48 - 1.0)
            end
            if imgui.Button(u8'Ферма 2') then
                setCharCoordinates(PLAYER_PED, -1066.05, -1190.29, 129.22 - 1.0)
            end
            if imgui.Button(u8'Ферма 3') then
                setCharCoordinates(PLAYER_PED, 1904.94, 166.15, 37.14 - 1.0)
            end
        end

        if imgui.CollapsingHeader(u8'Разное') then
            if imgui.Button(u8'Оружейный магазин\n"AMMU-NATION') then
                setCharCoordinates(PLAYER_PED, 1304.32, -1243.73, 13.55 - 1.0)
            end
            if imgui.Button(u8'Магазин одежды\n"Victim"') then
                setCharCoordinates(PLAYER_PED, 418.49, -1506.06, 31.31 - 1.0)
            end
            if imgui.Button(u8'Ж/Д Вокзал LS') then
                setCharCoordinates(PLAYER_PED, 1767.98, -1908.51, 13.56 - 1.0)
            end
            if imgui.Button(u8'Ж/Д Вокзал SF') then
                setCharCoordinates(PLAYER_PED, -1920.96, 154.26, 26.68 - 1.0)
            end
            if imgui.Button(u8'Ж/Д Вокзал LV') then
                setCharCoordinates(PLAYER_PED, 2845.09, 1247.49, 11.39 - 1.0)
            end
            if imgui.Button(u8'Аэропорт LS') then
                setCharCoordinates(PLAYER_PED, 1987.62, -2136.95, 13.55 - 1.0)
            end
            if imgui.Button(u8'Аэропорт SF') then
                setCharCoordinates(PLAYER_PED, -1538.19, -443.38, 6.02 - 1.0)
            end
            if imgui.Button(u8'Аэропорт LV') then
                setCharCoordinates(PLAYER_PED, 1648.36, 1647.26, 10.82 - 1.0)
            end
            if imgui.Button(u8'Заброшенный аэродром LV') then
                setCharCoordinates(PLAYER_PED, 383.86, 2475.78, 16.50 - 1.0)
            end
            if imgui.Button(u8'Стадион LS') then
                setCharCoordinates(PLAYER_PED, 2738.40, -1690.51, 11.84 - 1.0)
            end
            if imgui.Button(u8'Стадион LV') then
                setCharCoordinates(PLAYER_PED, 1150.95, 1523.79, 12.55 - 1.0)
            end
            if imgui.Button(u8'Завод КАСС') then
                setCharCoordinates(PLAYER_PED, 2498.07, 2839.58, 10.82 - 1.0)
            end
            if imgui.Button(u8'Автошкола') then
                setCharCoordinates(PLAYER_PED, -2018.89, -117.27, 35.18 - 1.0)
            end
            if imgui.Button(u8'Военкомат') then
                setCharCoordinates(PLAYER_PED, 1079.07, 1397.37, 7.21 - 1.0)
            end
            if imgui.Button(u8'Притон') then
                setCharCoordinates(PLAYER_PED, 2155.78, -1667.89, 15.09 - 1.0)
            end
            if imgui.Button(u8'Чилиад') then
                setCharCoordinates(PLAYER_PED, -2387.25, -1579.70, 499.71 - 1.0)
            end
            if imgui.Button(u8'Киностудия') then
                setCharCoordinates(PLAYER_PED, 928.47, -1259.04, 15.71 - 1.0)
            end
            if imgui.Button(u8'Маяк') then
                setCharCoordinates(PLAYER_PED, 154.38, -1957.21, 3.77 - 1.0)
            end
            if imgui.Button('Hippy Shopper') then
                setCharCoordinates(PLAYER_PED, -2525.10, -59.78, 21.35 - 1.0)
            end
            if imgui.Button(u8'Burger Shot') then
                setCharCoordinates(PLAYER_PED, 782.85, -1654.75, 13.45 - 1.0)
            end
            if imgui.Button(u8'VineWood') then
                setCharCoordinates(PLAYER_PED, 1446.97, -807.92, 84.29 - 1.0)
            end
        end
            imgui.End()
        end
    end
end
Lua:
if imgui.MenuItem('Teleport Window') then
  show_teleport_window.v = not show_teleport_window.v
end
 
  • Нравится
Реакции: uryukhai

Musaigen

abobusnik
Проверенный
1,583
1,302
sa-mp-019.png

Lua:
local imgui = require 'imgui'
function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2

    style.WindowPadding = ImVec2(15, 15)
    style.WindowRounding = 5.0
    style.FramePadding = ImVec2(5, 5)
    style.FrameRounding = 4.0
    style.ItemSpacing = ImVec2(12, 8)
    style.ItemInnerSpacing = ImVec2(8, 6)
    style.IndentSpacing = 25.0
    style.ScrollbarSize = 15.0
    style.ScrollbarRounding = 9.0
    style.GrabMinSize = 5.0
    style.GrabRounding = 3.0

    colors[clr.Text] = ImVec4(0.80, 0.80, 0.83, 1.00)
    colors[clr.TextDisabled] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.WindowBg] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ChildWindowBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.PopupBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.Border] = ImVec4(0.80, 0.80, 0.83, 0.88)
    colors[clr.BorderShadow] = ImVec4(0.92, 0.91, 0.88, 0.00)
    colors[clr.FrameBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.FrameBgHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.FrameBgActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.TitleBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.TitleBgCollapsed] = ImVec4(1.00, 0.98, 0.95, 0.75)
    colors[clr.TitleBgActive] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.MenuBarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.ScrollbarGrabHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ScrollbarGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ComboBg] = ImVec4(0.19, 0.18, 0.21, 1.00)
    colors[clr.CheckMark] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.Button] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ButtonHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.ButtonActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.Header] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.HeaderHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.HeaderActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ResizeGrip] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ResizeGripHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ResizeGripActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.CloseButton] = ImVec4(0.40, 0.39, 0.38, 0.16)
    colors[clr.CloseButtonHovered] = ImVec4(0.40, 0.39, 0.38, 0.39)
    colors[clr.CloseButtonActive] = ImVec4(0.40, 0.39, 0.38, 1.00)
    colors[clr.PlotLines] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotLinesHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.PlotHistogram] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotHistogramHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.TextSelectedBg] = ImVec4(0.25, 1.00, 0.00, 0.43)
    colors[clr.ModalWindowDarkening] = ImVec4(1.00, 0.98, 0.95, 0.73)
end
apply_custom_style()
 
Последнее редактирование:

Adventurer

Известный
151
69
Как сделать грамотно, не используя флага alwaysautoresize, чтобы размер окна зависел от количества включенных HEN(текстов в окне)?
Если же использовать этот флаг, то при смене количества символов в тексте hen1, изменяется ширина окна.
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(210, 160), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(cfg.gui.pos_x, cfg.gui.pos_y), imgui.Cond.FirstUseEver)
imgui.Begin('sample window', swindow, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize)
imgui.SetCursorPosX((210 - imgui.CalcTextSize(col_g_3..u8'Отцентрованный текст').x)/2)
imgui.TextColoredRGB(col_g_3 .. 'Отцентрованный текст')
imgui.Separator()
if hen1.v then imgui.Text('hen1') end -- тут у меня вообще динамическое значение текста, которое может состоять из 10 , а затем и более символов
if hen2.v then imgui.Text('hen2') end
if hen3.v then imgui.Text('hen3') end
imgui.End()
Дополнение: если везде прописать условие if ... then imgui.setnexwindowsize, то получится весьма громоздкий и неудобный быдлокод.
Предыдущий ответ мне не помог.
UPD: раскрою суть на всякий.
Вот у меня есть небольшое окошко. В нем три динамических айтема(hen1-3). Допустим, если айтем включен только один, то размер GUI у меня 210 на 120; если два айтема, то размер уже 210x140. То есть, должен изменятся Y.
Но при этом, есть беда еще в том, что в айтеме hen1, значение текста динамическое, которое меняется, и может состоять то из 10 символов, то из 30.
 
Последнее редактирование:

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
Как сделать грамотно, не используя флага alwaysautoresize, чтобы размер окна зависел от количества включенных HEN(текстов в окне)?
Если же использовать этот флаг, то при смене количества символов в тексте hen1, изменяется ширина окна.
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(210, 160), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(cfg.gui.pos_x, cfg.gui.pos_y), imgui.Cond.FirstUseEver)
imgui.Begin('sample window', swindow, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize)
imgui.SetCursorPosX((210 - imgui.CalcTextSize(col_g_3..u8'Отцентрованный текст').x)/2)
imgui.TextColoredRGB(col_g_3 .. 'Отцентрованный текст')
imgui.Separator()
if hen1.v then imgui.Text('hen1') end -- тут у меня вообще динамическое значение текста, которое может состоять из 10 , а затем и более символов
if hen2.v then imgui.Text('hen2') end
if hen3.v then imgui.Text('hen3') end
imgui.End()
Дополнение: если везде прописать условие if ... then imgui.setnexwindowsize, то получится весьма громоздкий и неудобный быдлокод.
Предыдущий ответ мне не помог.
UPD: раскрою суть на всякий.
Вот у меня есть небольшое окошко. В нем три динамических айтема(hen1-3). Допустим, если айтем включен только один, то размер GUI у меня 210 на 120; если два айтема, то размер уже 210x140. То есть, должен изменятся Y.
Но при этом, есть беда еще в том, что в айтеме hen1, значение текста динамическое, которое меняется, и может состоять то из 10 символов, то из 30.
Используй Push/PopTextWrapPos и будь спокоен за ширину окна.
 
  • Нравится
Реакции: Adventurer

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
Не знаю даже, как объяснить, но бывает такое, что при открытии нового окна, оно может быть неактивным.
Открываю новое окно A, нажатием на клавишу, все нормально. Могу нажимать на кнопки, двигать итд.
Открываю другое окно B, нажатием на другую клавишу, затем его закрываю, и снова открываю окно А и тут у меня это окно А неактивное, я не могу нажимать на кнопки, я не могу перемещать, попасть по крестику закрытия, и вообще ничего не реагирует.
Как выйти из такой засады?
Скинуть файл с кодом
 

tlwsn

Известный
537
85
как сделать меню активации как на этом скрине:
AovNl.png
Желательно киньте исходник где похожая менюшка есть
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Логику поймешь?
imgui.begin
imgui.Button
imgui.Button
imgui.Button
imgui.Button
imgui.Button
imgui.Button
imgui.end
 
  • Нравится
Реакции: imring