Вопрос Вопросик про ImGui

Тема в разделе "C, C++", создана пользователем RIPJake, 3 авг 2018.

  1. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    Привет, решил уйти с OSHGui на ImGui, и столкнулся с такой траблой, что не могу сделать 2 разных текста при актив и не актив Button'e

    Если кто шарит помогите
     
  2. BlackKnigga

    BlackKnigga читы самп в лс
    Всефорумный модератор

    Регистрация:
    10 янв 2016
    Сообщения:
    922
    Симпатии:
    449
    ImGui::Button(Active ? "Tekst " : "Tekst2");
    Или ты про зажатие кнопки?
     
  3. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    У меня ещё и 2 шрифта должно на это идти

    Сейчас стоит так
    upload_2018-8-3_11-23-58.png

    Прописан только 1 шрифт на это, и там будут только иконки. Нужно что бы при активной кнопке, был виден текст

    Пример, aimware (не реклама)

    upload_2018-8-3_11-25-30.png

    upload_2018-8-3_11-25-57.png
     
    DonHomka нравится это.
  4. DonHomka

    DonHomka Лучше бы раньше, но ... раньше уже закончилось
    Всефорумный модератор

    Регистрация:
    8 ноя 2017
    Сообщения:
    1.925
    Симпатии:
    1.015
    придется дико костылить. пушфонт, баттон и баттон имейдж
     
  5. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    Примерчик можно. На костыли пофиг
     
  6. УченикДимаса

    УченикДимаса Активный участник

    Регистрация:
    2 июл 2013
    Сообщения:
    44
    Симпатии:
    23
    просто в нужном месте ImGui:: PushFont
    И это совсем не костыль, давно ли костылем считается использование одной функции, которая для этого и создана автором гуи?

    p.s. в дебаг режиме имгуй иногда ругается на пушфонт, выкидывая ассершн, имей ввиду (если че варнинги можно скипать, но это раздражает)
     
    RIPJake нравится это.
  7. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    Я уже понял про дебаг и варнинг, его пофиксить не сложно. Шрифт в коде, а не подключается через диск, и ерров нет. Но с табами все равно сложно, уже несколько часов пытаюсь сделать
     
  8. УченикДимаса

    УченикДимаса Активный участник

    Регистрация:
    2 июл 2013
    Сообщения:
    44
    Симпатии:
    23
    ты табы на буттонах хочешь сделать?
    ImGui:: Button возвращает тру, когда ты нажимаешь на кнопку.
    Объяви переменные и ставь меняй их при нажатии, например
    bool isActive = false;
    if(ImGui:: Button (arguments) )
    isActive = true;
    
    if(isActive)
    drawTab();
    для множества табов - инт или еще шото
     
    RIPJake нравится это.
  9. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    Хорошо, спасибо. Завтра попробую и отпишу
     
  10. Dark_Knight

    Dark_Knight Glory to mankind
    Друг

    Регистрация:
    18 мар 2013
    Сообщения:
    3.338
    Симпатии:
    1.640
    Могу дать гавно код мой для работы с табами.
     
  11. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    давай
     
  12. Dark_Knight

    Dark_Knight Glory to mankind
    Друг

    Регистрация:
    18 мар 2013
    Сообщения:
    3.338
    Симпатии:
    1.640
    #ifndef IMGUI_TABS_HPP
    #define IMGUI_TABS_HPP
    
    #include "imgui.h"
    #include "imgui_internal.h"
    
    namespace ImGui {
        struct TabsDesc {
            __int32    lableCount;
            float lableWidth;
            __int32 currentidx;
            __int32 lableHeight;
        };
    
        struct Tabs {
            TabsDesc* tbd;
            ImGuiID ID;
            __int32 selectedIdx;
        };
    
        static   ImVector<Tabs*> CacheTabs;
        static   Tabs* CurTabs;
        IMGUI_API void BeginTabs(const char* name, int lablesCount, int lablesHeight, float tabwidth = 0);
        IMGUI_API void EndTabs();
        IMGUI_API bool AddTab(const char* label, const char* tooltip);
    }
    
    #endif

    #include "imgui_tabs.h"
    
    void ImGui::BeginTabs(const char* name, int lablesCount, int lablesHeight, float tabwidth){
        //Find exists Tabs
        Tabs* exsisttbs = NULL;
        ImGuiID id = ImHash(name, 0);
        for (int i = 0; i < CacheTabs.Size; i++) {
            if (CacheTabs[i]->ID == id) {
                exsisttbs = CacheTabs[i];
            }
        }
    
        if (exsisttbs == NULL) {
            Tabs* tbs = (Tabs*)ImGui::MemAlloc(sizeof(Tabs));
            tbs->selectedIdx = 0;
            tbs->ID = id;
            CacheTabs.insert(CacheTabs.begin(), tbs);
            CurTabs = tbs;
        }
        else
        {
            CurTabs = exsisttbs;
        }
    
        TabsDesc* tbd = (TabsDesc*)ImGui::MemAlloc(sizeof(TabsDesc));
        tbd->lableCount = lablesCount;
        tbd->currentidx = 0;
        tbd->lableHeight = lablesHeight;
        ImVec2 windowSize = ImGui::GetWindowSize();
        tbd->lableWidth = windowSize.x / lablesCount ;
        CurTabs->tbd = tbd;
    }
    
    void ImGui::EndTabs() {
        MemFree(CurTabs->tbd);
        CurTabs = NULL;
    }
    
    bool ImGui::AddTab(const char* label, const char* tooltip) {
        /*if (label == NULL || label == nullptr)
            return false;*/
        static bool result;
        TabsDesc* tbs = CurTabs->tbd;
        ImGuiStyle& style = ImGui::GetStyle();
        ImVec2 itemSpacing = style.ItemSpacing;
        ImVec4 color = style.Colors[ImGuiCol_Button];
        ImVec4 colorActive = style.Colors[ImGuiCol_ButtonActive];
        ImVec4 colorHover = style.Colors[ImGuiCol_ButtonHovered];
        style.ItemSpacing.x = 0;
    
        if (tbs->currentidx > 0 && tbs->currentidx % tbs->lableHeight != 0)
            ImGui::SameLine();
     
    
        // push the style
        if (tbs->currentidx == CurTabs->selectedIdx)
        {
            style.Colors[ImGuiCol_Button] = colorActive;
            style.Colors[ImGuiCol_ButtonActive] = colorActive;
            style.Colors[ImGuiCol_ButtonHovered] = colorActive;
        }
        else
        {
            style.Colors[ImGuiCol_Button] = color;
            style.Colors[ImGuiCol_ButtonActive] = colorActive;
            style.Colors[ImGuiCol_ButtonHovered] = colorHover;
        }
    
        // Draw the button
        if (ImGui::Button(label, ImVec2(tbs->lableWidth, 0))) {
            CurTabs->selectedIdx = tbs->currentidx;
        }
    
        if (tooltip != nullptr && ImGui::IsItemHovered())
        {
            ImGui::BeginTooltip();
            ImGui::Text(tooltip);
            ImGui::EndTooltip();
        }
    
        // Restore the style
        style.Colors[ImGuiCol_Button] = color;
        style.Colors[ImGuiCol_ButtonActive] = colorActive;
        style.Colors[ImGuiCol_ButtonHovered] = colorHover;
        style.ItemSpacing = itemSpacing;
        result = CurTabs->selectedIdx == tbs->currentidx;
        tbs->currentidx++;
        return result;
    }

    static char buffer[512] = { u8"Тест хуест" };
    static bool tabs[3] = { false, false, false };
    ImGui::Begin("Test", NULL, ImVec2(800, 500), -1, ImGuiWindowFlags_::ImGuiWindowFlags_NoSavedSettings);    
    ImGui::BeginTabs("Tabs1", 3);
    tabs[0] = ImGui::AddTab("Tab1");
    tabs[1] = ImGui::AddTab("Tab2", "123");
    tabs[2] = ImGui::AddTab("Tab3", "NULL");
    ImGui::EndTabs();
    if(tabs[0])
          ImGui::InputText("Test input rus", buffer, sizeof(buffer));
    if (tabs[1])
          ImGui::Text(u8"Українській таб");
    if (tabs[2] )
          ImGui::Text(u8"Українській таб №2");
    ImGui::End();
    
     
    #12 Dark_Knight, 6 авг 2018
    Последнее редактирование: 6 авг 2018
  13. RIPJake

    RIPJake Участник

    Регистрация:
    3 авг 2018
    Сообщения:
    10
    Симпатии:
    1
    Осталось только это под мой чит сделать чтобы нормально работало и не крашилоD: