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

Статус
В этой теме нельзя размещать новые ответы.

RIPJake

Новичок
Автор темы
23
6
Привет, решил уйти с OSHGui на ImGui, и столкнулся с такой траблой, что не могу сделать 2 разных текста при актив и не актив Button'e

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

RIPJake

Новичок
Автор темы
23
6
ImGui::Button(Active ? "Tekst " : "Tekst2");
Или ты про зажатие кнопки?
У меня ещё и 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
 
  • Нравится
Реакции: AnWu

УченикДимаса

Известный
37
15
Примерчик можно
просто в нужном месте ImGui:: PushFont
И это совсем не костыль, давно ли костылем считается использование одной функции, которая для этого и создана автором гуи?

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

RIPJake

Новичок
Автор темы
23
6
просто в нужном месте ImGui:: PushFont
И это совсем не костыль, давно ли костылем считается использование одной функции, которая для этого и создана автором гуи?

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

УченикДимаса

Известный
37
15
Но с табами все равно сложно
ты табы на буттонах хочешь сделать?
ImGui:: Button возвращает тру, когда ты нажимаешь на кнопку.
Объяви переменные и ставь меняй их при нажатии, например
Код:
bool isActive = false;
if(ImGui:: Button (arguments) )
isActive = true;

if(isActive)
drawTab();

для множества табов - инт или еще шото
 
  • Нравится
Реакции: RIPJake

RIPJake

Новичок
Автор темы
23
6
ты табы на буттонах хочешь сделать?
ImGui:: Button возвращает тру, когда ты нажимаешь на кнопку.
Объяви переменные и ставь меняй их при нажатии, например
Код:
bool isActive = false;
if(ImGui:: Button (arguments) )
isActive = true;

if(isActive)
drawTab();

для множества табов - инт или еще шото
Хорошо, спасибо. Завтра попробую и отпишу
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
C++:
#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

C++:
#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;
}

C++:
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();
 
Последнее редактирование:

RIPJake

Новичок
Автор темы
23
6
C++:
#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

C++:
#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;
}

C++:
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();
Осталось только это под мой чит сделать чтобы нормально работало и не крашилоD:
 
Статус
В этой теме нельзя размещать новые ответы.