Dear ImGui

Тема в разделе "Lua", создана пользователем FYP, 25 ноя 2017.

Метки:
  1. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    ну, скажем так, эта проблема решена в самом муне
     
  2. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Привет, у меня на ввод команды открывается меню, с этим проблем нет.

    Но вот я создал вторую команду, и хочу что б на неё открывалось другое меню, но это самое меню не открывается пока не будет открыто основное show_main_window.

    Как можно сделать независимое второе меню?
     
  3. Dark_Knight

    Dark_Knight Аннушка уже разлила масло.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.619
    Симпатии:
    846
    Репутация:
    222
    Создать вторую бул переменную и через неё
     
  4. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Так и сделал:
    show_main_window = imgui.ImBool(false)
    show_2_window = imgui.ImBool(false)
     
  5. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    как обычно, только в imgui.Process записывать true при открытии любого из окон. например, так:
    imgui.Process = show_main_window.v or show_2_window.v
     
    mirapi нравится это.
  6. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.506
    Симпатии:
    962
    Репутация:
    498
    Модуль содержащий UTF-8 коды шрифта иконок FontAwesome.
    Сами коды были взяты отсюда https://github.com/juliettef/IconFontCppHeaders; также можете сами конвертировать UTF-8 код в UTF-8 строку.

    upload_2017-12-2_0-20-50.png
    Сам шрифт (-webfont.ttf) можете взять отсюда: Font Awesome, the iconic font and CSS toolkit(http://fontawesome.io/)
    Файл faIcons.lua копируем в moonloader/lib

    Пример:
    
    local imgui = require 'imgui'
    local vkeys = require 'vkeys'
    local fa = require 'faIcons'
    
    show_main_window = imgui.ImBool(false)
    
    local fa_font = nil
    local fa_glyph_ranges = imgui.ImGlyphRanges({ fa.min_range, fa.max_range })
    function imgui.BeforeDrawFrame()
      if fa_font == nil then
        local font_config = imgui.ImFontConfig() -- to use 'imgui.ImFontConfig.new()' on error
        font_config.MergeMode = true
    
        fa_font = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fontawesome-webfont.ttf', 14.0, font_config, fa_glyph_ranges)
      end
    end
    
    function imgui.OnDrawFrame()
        if show_main_window.v then
            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(200, 200), imgui.Cond.FirstUseEver)
            imgui.Begin('test fontawesome', show_main_window, imgui.WindowFlags.NoCollapse)
    
            imgui.Button(fa.ICON_APPLE .. ' AppStore')
    
            imgui.End()
        end
    end
    
    function main()
        while true do
            wait(0)
            if wasKeyPressed(vkeys.VK_X) then
                show_main_window.v = not show_main_window.v
            end
    
            imgui.Process = show_main_window.v
        end
    end
    
    
     

    Вложения:

    • faIcons.lua
      Размер файла:
      26,8 КБ
      Просмотров:
      7
    #86 legend2360, 2 дек 2017
    Последнее редактирование модератором: 2 дек 2017
    imring, iTz_Vercetti, romacaddy и 2 другим нравится это.
  7. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Как перенести цветные кнопки с демо-примера на c++ в lua? С ImColor сложность.
    for (int i = 0; i < 7; i++)
                {
                    if (i > 0) ImGui::SameLine();
                    ImGui::PushID(i);
                    ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.6f));
                    ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.7f));
                    ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i/7.0f, 0.8f, 0.8f));
                    ImGui::Button("Click");
                    ImGui::PopStyleColor(3);
                    ImGui::PopID();
                }
     
  8. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    как есть, только вместо ImColor::HSV - imgui.ImColor.HSV(...).v
     
  9. kmsfax

    kmsfax Известный пользователь

    Регистрация:
    24.01.2015
    Сообщения:
    62
    Симпатии:
    4
    Репутация:
    2
    Такая тема.
    
    local Screen = imgui.ImBool(ini.AutoScreen.ScreenKill)
    
    if imgui.CollapsingHeader(u8'Автоскриншот') then
        if imgui.Checkbox(u8'Автоскриншот убийств', Screen) then
            ini.AutoScreen.ScreenKill = Screen.v
        end
    end
    
    Инфу черпает из ini настроек, когда ini файл с настройками существует, всё нормально работает, но когда ini не будет, я просто не смогу зайти в игру, вылезает ошибка.
    Если файла с настройками не существует, скрипт авоматически должен создать его при заходе в игру, но в моём случает создать он его не может, так как я собственно не могу зайти.
     
  10. Dark_Knight

    Dark_Knight Аннушка уже разлила масло.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.619
    Симпатии:
    846
    Репутация:
    222
    Создавай сначала стандарные настройки. Если файл есть, то перезаписывай их.
     
  11. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    @kmsfax в последних версиях муна обработка ошибок на начальном этапе загрузки скрипта слегка сломана, но у тебя ошибка - ini не существует (attempt to index a 'nil' value), поэтому крашит.
     
    Don_Homka нравится это.
  12. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    обновление. v1.1.1
    оно включает множество исправлений и несколько новых фич.
    • Добавлено изменение курсора с помощью функции imgui.SetMouseCursor и автоматически при определённых действиях
    • Добавлено несколько недостающих общих символов: "‚„…†‡€‰‹‘’“”•–—™›№"
    • В класс ImFontAtlas добавлены поля TexWidth (только чтение), TexHeight (только чтение), TexUvWhitePixel (только чтение) и ConfigData
    • Добавлена функция ImFontAtlas:GetFont для получения ImFont из массива ImFontAtlas::Fonts, индексация с единицы
    • Добавлена функция ImDrawData:GetCmdList для получения ImDrawList из массива ImDrawData::CmdLists, индексация с единицы
    • Добавлен параметр imgui.DisableInput для полного отключения обработки ввода, по умолчанию выключен
    • Класс ImColor перенесён из dll в lua и расширен новыми функциями (см imgui.lua)
    • Исправлено несоответствие идентификаторов цветов в функциях PushStyleColor, GetStyleColorVec4, GetStyleColorU32, GetStyleColorName с перечислением imgui.Col
    • Исправлено несоответствие идентификаторов клавиш в функции GetKeyIndex и в поле ImGuiTextEditCallbackData.EventKey с перечислением imgui.Key
    • Исправлена обработка двойного нажатия кнопок мыши
    • Исправлено UB, вызываемое при уничтожении объектов классов, содержащих ImVector
    • Исправлена регистрация всех конструкторов по умолчанию
    • Исправлены конструкторы классов ImGuiTextFilter и ImGuiListClipper - пропуск необязательных параметров приводил к вылету
    • Исправлен баг, из-за которого изменение значения ImBuffer производилось некорректно (imbuffer.v = 'new value')
    • Устранены проблемы при обработке ввода, когда активно несколько скриптов, использующих ImGui
    это обновление является важным, поскольку включает исправления всех известных проблем и добавляет недостающие возможности. в ближайшее время других крупных обновлений не планируется.

    UDP
    v1.1.2
    исправлен вылет при выгрузке или перезагрузке скриптов
     
    #92 FYP, 4 дек 2017
    Последнее редактирование: 4 дек 2017
    Don_Homka, Garrus, Cquint и ещё 1-му нравится это.
  13. KEPOCUH

    KEPOCUH Известный пользователь

    Регистрация:
    10.04.2017
    Сообщения:
    54
    Симпатии:
    7
    Репутация:
    1
    как сделать активацию командой, чёт не получается
     
  14. imring

    imring Известный пользователь

    Регистрация:
    03.08.2016
    Сообщения:
    99
    Симпатии:
    23
    Репутация:
    5
    
    menu_imgui = imgui.ImBool(false)
    
    function main()
        sampRegisterChatCommand('active', function()
            menu_imgui.v = not menu_imgui.v
        end)
        wait(-1)
    end
    
     
  15. Don_Homka

    Don_Homka Известный пользователь

    Регистрация:
    08.11.2017
    Сообщения:
    98
    Симпатии:
    15
    Репутация:
    5
    Как изменить размер текста?
    imgui.ImFont.FontSize = 13.0 не катит чет(

    Еще вопрос. Как отменить удар рукой при двойном клике с последующим закрытием окна? Почему-то срабатывает удар.

    Дружище. Буфер теперь очищает инпат, но если его очистить через Buffer.v = '' потом инпат невозможно использовать, начинает мигать и снимать фокус.
    ПС: Проверил, даже если Buffer =imgui.ImBuffer(256) задать, всё равно инпат багается. #fixgui
     
    #95 Don_Homka, 7 дек 2017
    Последнее редактирование: 7 дек 2017
  16. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    функцией SetWindowFontScale можно, но она лишь масштабирует текстуру шрифтов, соответственно, качество хуже. чтобы нормально изменить размер символов, шрифт нужно пересоздать.
    отключать imgui.Process с маленькой задержкой после закрытия окна
     
    deStrange нравится это.
  17. Don_Homka

    Don_Homka Известный пользователь

    Регистрация:
    08.11.2017
    Сообщения:
    98
    Симпатии:
    15
    Репутация:
    5
    Хм, а как можно загрузить допустим шрифт Comic Sans MC с размером 10?

    Отключать процесс с задержкой как то геморно, лишнии проверки только.

    imgui.SetWindowFontScale(1.0) вызывает странное окно "Debug". Не вижу причин для его появления кроме как баг функции.

    
    if not fontChanged then
    fontChanged = true
    lua_thread.create(function()
    -- Fonts' texture cannot be rebuilt within OnDrawFrame, so we doing it in a separate script-thread
    wait(0) -- delay here is necessary
    imgui.GetIO().Fonts:Clear()
    imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\trebucbd.ttf', 15.5, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
    imgui.RebuildFonts()
    end)
    end
    
    Мб кому интересно, дефолт шрифт размером 15.5
     
    #97 Don_Homka, 7 дек 2017
    Последнее редактирование модератором: 7 дек 2017
    deStrange нравится это.
  18. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Как можно определить версию imgui непосредственно в скрипте?

    UPD: нашел
    imgui._VERSION
     
  19. Don_Homka

    Don_Homka Известный пользователь

    Регистрация:
    08.11.2017
    Сообщения:
    98
    Симпатии:
    15
    Репутация:
    5
    Вопрос со шрифтами решен, как теперь сделать текст жирным?
     
  20. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    загружать жирный вариант шрифта
     
  21. LUCHARE

    Проверенный

    Регистрация:
    23.05.2017
    Сообщения:
    359
    Симпатии:
    196
    Репутация:
    37
    Либо я криворукий, либо это баги
    local imgui = require 'imgui'
    
    local show_wnd = imgui.ImBool(false)
    local lel      = imgui.ImBool(false)
    
    function imgui.OnDrawFrame()
        if show_wnd.v then
            imgui.Begin('lel')
                imgui.RadioButton('lel', lel) -- RadioButton(const char* label, bool active);
            imgui.End()
        end
    end
    
    function main()
        while true do
            if wasKeyPressed(1) then
                show_wnd.v = not show_wnd.v
            end
            imgui.Process = show_wnd.v
            wait(0)
        end
    end
    
    Ошибка:
    [19:48:38.308101] (error)    test.lua: D:\games\SAMP\moonloader\test.lua:9: sol: no matching function call takes this number of arguments and the specified types
    
    stack traceback:
        [C]: in function 'RadioButton'
        D:\games\SAMP\moonloader\test.lua:9: in function 'OnDrawFrame'
        D:\games\SAMP\moonloader\lib\imgui.lua:1377: in function <D:\games\SAMP\moonloader\lib\imgui.lua:1366>


    local imgui = require 'imgui'
    
    local show_wnd = imgui.ImBool(false)
    
    function imgui.OnDrawFrame()
        if show_wnd.v then
            imgui.Begin('lel')
                imgui.Button("I'm useful!") imgui.SameLine() imgui.ShowHelpMarker('*useless') -- просто ShowHelpMarker() тоже не работает
            imgui.End()
        end
    end
    
    function main()
        while true do
            if wasKeyPressed(1) then
                show_wnd.v = not show_wnd.v
            end
            imgui.Process = show_wnd.v
            wait(0)
        end
    end
    Oшибка:
    [19:58:35.261810] (error)    test.lua: D:\games\SAMP\moonloader\test.lua:8: attempt to call field 'ShowHelpMarker' (a nil value)
    stack traceback:
        D:\games\SAMP\moonloader\test.lua:8: in function 'OnDrawFrame'
        D:\games\SAMP\moonloader\lib\imgui.lua:1377: in function <D:\games\SAMP\moonloader\lib\imgui.lua:1366>

     
  22. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.506
    Симпатии:
    962
    Репутация:
    498
    ImGui не имеет ShowHelpMarker
     
    Последние данные очков репутации:
    LUCHARE: 2 Очки 9 дек 2017 в 13:18
    LUCHARE нравится это.
  23. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    @LUCHARE RadioButton принимает boolean по значению, а не по ссылке, соответственно, нужно юзать обычное значение:
    
    local rb_selected = 0
    function imgui.OnDrawFrame()
    ...
    if imgui.RadioButton('rb1', rb_selected == 1) then  -- rb_selected == 1 это почти то же самое, что и local result; if rb_selected == 1 then result = true else result = false end
      rb_selected = 1
    end
    if imgui.RadioButton('rb2', rb_selected == 2) then
      rb_selected = 2
    end
    if imgui.RadioButton('rb3', rb_selected == 3) then
      rb_selected = 3
    end
    ...
    end
    
     
    #103 FYP, 9 дек 2017 в 14:01
    Последнее редактирование: 9 дек 2017 в 14:26
    Garrus и LUCHARE нравится это.
  24. kmsfax

    kmsfax Известный пользователь

    Регистрация:
    24.01.2015
    Сообщения:
    62
    Симпатии:
    4
    Репутация:
    2
    Как правильно юзать InputInt ?
     
  25. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.506
    Симпатии:
    962
    Репутация:
    498
    
    local input_int_data = imgui.ImInt(0)
    local input_int_data2 = imgui.ImInt2(5,15)
    local input_int_data3 = imgui.ImInt3(5,15,25)
    local input_int_data4 = imgui.ImInt4(5,15,25,35)
    function imgui.OnDrawFrame()
        -- ...
        imgui.InputInt('inputint', input_int_data, 2, 10)
        imgui.InputInt2('inputint2', input_int_data2)
        imgui.InputInt3('inputint3', input_int_data3)
        imgui.InputInt4('inputint4', input_int_data4)
    end
    
     
    #105 legend2360, 9 дек 2017 в 22:48
    Последнее редактирование: 9 дек 2017 в 22:59
  26. kmsfax

    kmsfax Известный пользователь

    Регистрация:
    24.01.2015
    Сообщения:
    62
    Симпатии:
    4
    Репутация:
    2
    Спасибо.
    Возможно ли как-то изменить размер окна ввода?
    Когда ввожу 'inputint' (30 символов), окно ввода текста сильно растягивается, мне нужно чтобы оно было примерно на 3 символа
     
    #106 kmsfax, 9 дек 2017 в 23:03
    Последнее редактирование: 9 дек 2017 в 23:10
  27. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.506
    Симпатии:
    962
    Репутация:
    498
    
    imgui.PushItemWidth(10.0)
    -- create item
    imgui.PopItemWidth()
    
     
  28. Garrus

    Garrus Известный пользователь

    Регистрация:
    08.01.2016
    Сообщения:
    124
    Симпатии:
    10
    Репутация:
    2
    Подскажите, как сделать listbox? Никак не доходит)
     
  29. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.506
    Симпатии:
    962
    Репутация:
    498
    
    local selected_item = imgui.ImInt(-1)
    
    function imgui.OnDrawFrame()
        -- ...
        imgui.ListBox('##listbox', selected_item, {'1', '2', '3'}, 3)
    
    end
    
     
    Garrus нравится это.
  30. KEPOCUH

    KEPOCUH Известный пользователь

    Регистрация:
    10.04.2017
    Сообщения:
    54
    Симпатии:
    7
    Репутация:
    1
    Как сделать чтобы выполнялась функция при нажатии кнопки в ListBox?
     
  31. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.506
    Симпатии:
    962
    Репутация:
    498
    Почти все элементы, которые требуют выбора от пользователя, возвращают boolean переменную, указывающая на то, что какое-то событие произошло с этим элементом. У ListBox оно есть в том числе. Номер выбранной строки из списка возвращается в current_item (с 0 номера).
     
  32. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Подскажите, как реализовать функцию консоли, как из примера, что-бы при добавлении текста внизу, блок скроллился автоматически вниз, а не оставался вверху как обычный текст. В примере что то очень сложно, в нескольких местах
     
  33. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    вызвать imgui.SetScrollHere() после вывода текста
     
    mirapi нравится это.
  34. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Да, теперь скроллит вниз, но как строк становится достаточно много, то скролл перестает находится низу, а смещается ближе к середине, при этом если листать его колесиком - возвращается всеравно в середину.
     
  35. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    скорее всего из-за неправильной реализации, он должен работать исправно.
     
  36. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Например сделал так:

    if show_log_window.v
    then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2((sw / 5) - 200, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(300, 200), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Log', show_log_window)
        local btn_size = imgui.ImVec2(-0.1, 0)
        wrap_width = 290
        imgui.PushTextWrapPos(imgui.GetCursorPos().x + wrap_width);
      
        imgui.Text(u8(test_log), wrap_width)
        imgui.SetScrollHere()
      
        if time_lup < os.time()
        then
            test_log = test_log .. string.format("%s\n", math.random(0, 1000))
            time_lup = os.time() + 0.5
        end
      
        imgui.End()
    end
    Пока окно заполняется - скроллит к низу, а спустя время скролл стремительно стремиться к середине.
     
  37. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.275
    Симпатии:
    2.323
    Репутация:
    802
    лучше выводи все строки по отдельности, я думаю проблема как раз в выводе. а ещё после использования PushTextWrapPos нужно вызывать PopTextWrapPos.
     
    mirapi нравится это.
  38. mirapi

    mirapi Активный пользователь

    Регистрация:
    24.07.2017
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Ну я разное по-тыкал. Если я выведу весь большой текст сразу, то скролл становится в самый низ, но если по строке добавлять с задержкой в секунду например, то все опять к середине мчит
     
  39. KEPOCUH

    KEPOCUH Известный пользователь

    Регистрация:
    10.04.2017
    Сообщения:
    54
    Симпатии:
    7
    Репутация:
    1
    Как сделать появление кнопки которая указана в конфиге
     
  40. Don_Homka

    Don_Homka Известный пользователь

    Регистрация:
    08.11.2017
    Сообщения:
    98
    Симпатии:
    15
    Репутация:
    5
    Название?

    imgui.Button(u8(iniButtonName))