У меня ещё и 2 шрифта должно на это идтиImGui::Button(Active ? "Tekst " : "Tekst2");
Или ты про зажатие кнопки?
Примерчик можно. На костыли пофигпридется дико костылить. пушфонт, баттон и баттон имейдж
просто в нужном месте ImGui:: PushFontПримерчик можно
Я уже понял про дебаг и варнинг, его пофиксить не сложно. Шрифт в коде, а не подключается через диск, и ерров нет. Но с табами все равно сложно, уже несколько часов пытаюсь сделатьпросто в нужном месте ImGui:: PushFont
И это совсем не костыль, давно ли костылем считается использование одной функции, которая для этого и создана автором гуи?
p.s. в дебаг режиме имгуй иногда ругается на пушфонт, выкидывая ассершн, имей ввиду (если че варнинги можно скипать, но это раздражает)
ты табы на буттонах хочешь сделать?Но с табами все равно сложно
bool isActive = false;
if(ImGui:: Button (arguments) )
isActive = true;
if(isActive)
drawTab();
Хорошо, спасибо. Завтра попробую и отпишуты табы на буттонах хочешь сделать?
ImGui:: Button возвращает тру, когда ты нажимаешь на кнопку.
Объяви переменные и ставь меняй их при нажатии, например
Код:bool isActive = false; if(ImGui:: Button (arguments) ) isActive = true; if(isActive) drawTab();
для множества табов - инт или еще шото
Могу дать гавно код мой для работы с табами.Хорошо, спасибо. Завтра попробую и отпишу
давайМогу дать гавно код мой для работы с табами.
#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();
Осталось только это под мой чит сделать чтобы нормально работало и не крашилоD: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();