From b9af3544ad3e45e98595106c9bd5f420771a2d04 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Sun, 10 Aug 2014 15:17:37 +0100 Subject: [PATCH] Added imguiTabs(). --- examples/common/imgui/imgui.cpp | 85 +++++++++++++++++++++++++++++++++ examples/common/imgui/imgui.h | 3 ++ 2 files changed, 88 insertions(+) diff --git a/examples/common/imgui/imgui.cpp b/examples/common/imgui/imgui.cpp index ba24779c..a658468e 100644 --- a/examples/common/imgui/imgui.cpp +++ b/examples/common/imgui/imgui.cpp @@ -324,6 +324,7 @@ struct Imgui const bgfx::Memory* mem = bgfx::alloc(m_textureWidth * m_textureHeight); stbtt_BakeFontBitmap( (uint8_t*)_data, 0, _fontSize, mem->data, m_textureWidth, m_textureHeight, 32, 96, m_fonts[handle.idx].m_cdata); m_fonts[handle.idx].m_texture = bgfx::createTexture2D(m_textureWidth, m_textureHeight, 1, bgfx::TextureFormat::R8, BGFX_TEXTURE_NONE, mem); + m_fonts[handle.idx].m_size = _fontSize; #else const ImguiFontHandle handle = { bgfx::invalidHandle }; #endif // !USE_NANOVG_FONT @@ -1060,6 +1061,79 @@ struct Imgui ); } + uint8_t tabs(uint8_t _selected, bool _enabled, va_list _argList) + { + uint8_t count; + const char* titles[16]; + const char* str = va_arg(_argList, const char*); + for (count = 0; str != NULL || count >= 16; ++count, str = va_arg(_argList, const char*) ) + { + titles[count] = str; + } + + const int32_t yy = m_widgetY; + const int32_t height = BUTTON_HEIGHT; + m_widgetY += height + DEFAULT_SPACING; + + uint8_t selected = _selected; + const int32_t tabWidth = m_scrollAreaInnerWidth / count; + const int32_t tabWidthHalf = m_scrollAreaInnerWidth / (count*2); + const int32_t textY = yy + height/2 + int32_t(m_fonts[m_currentFontIdx].m_size)/2 - 1; + + drawRoundedRect( (float)m_widgetX + , (float)yy-1 + , (float)m_scrollAreaInnerWidth + , (float)height+2 + , (float)BUTTON_HEIGHT / 2 - 1 + , imguiRGBA(128, 128, 128, 96) + ); + + for (uint8_t ii = 0; ii < count; ++ii) + { + m_widgetId++; + const uint16_t id = (m_areaId << 8) | m_widgetId; + + int32_t xx = m_widgetX + ii*tabWidth; + int32_t textX = xx + tabWidthHalf; + + const bool enabled = _enabled && isEnabled(m_areaId); + const bool over = enabled && inRect(xx, yy, tabWidth, height); + const bool res = buttonLogic(id, over); + + if (res) + { + selected = ii; + } + + uint32_t textColor; + if (ii == selected) + { + textColor = enabled?imguiRGBA(0,0,0,255):imguiRGBA(255,255,255,100); + + drawRoundedRect( (float)xx + , (float)yy-1 + , (float)tabWidth + , (float)height+2 + , (float)BUTTON_HEIGHT / 2 - 1 + , enabled?imguiRGBA(255,196,0,200):imguiRGBA(128,128,128,96) + ); + } + else + { + textColor = isHot(id) ? imguiRGBA(255, 196, 0, enabled?255:100) : imguiRGBA(255, 255, 255, enabled?200:100); + } + + drawText(textX + , textY + , ImguiTextAlign::Center + , titles[ii] + , textColor + ); + } + + return selected; + } + void image(bgfx::TextureHandle _image, float _lod, int32_t _width, int32_t _height, ImguiImageAlign::Enum _align) { int32_t xx; @@ -2299,6 +2373,7 @@ struct Imgui { stbtt_bakedchar m_cdata[96]; // ASCII 32..126 is 95 glyphs bgfx::TextureHandle m_texture; + float m_size; }; uint16_t m_currentFontIdx; @@ -2434,6 +2509,16 @@ void imguiInput(const char* _label, char* _str, uint32_t _len, bool _enabled) s_imgui.input(_label, _str, _len, _enabled); } +uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ...) +{ + va_list argList; + va_start(argList, _enabled); + const uint8_t result = s_imgui.tabs(_selected, _enabled, argList); + va_end(argList); + + return result; +} + uint32_t imguiChooseUseMacroInstead(uint32_t _selected, ...) { va_list argList; diff --git a/examples/common/imgui/imgui.h b/examples/common/imgui/imgui.h index aff98f38..d3ef25d0 100644 --- a/examples/common/imgui/imgui.h +++ b/examples/common/imgui/imgui.h @@ -108,6 +108,9 @@ bool imguiSlider(const char* _text, float& _val, float _vmin, float _vmax, float bool imguiSlider(const char* _text, int32_t& _val, int32_t _vmin, int32_t _vmax, bool _enabled = true); void imguiInput(const char* _label, char* _str, uint32_t _len, bool _enabled = true); +uint8_t imguiTabsUseMacroInstead(uint8_t _selected, bool _enabled, ...); +#define imguiTabs(_selected, _enabled, ...) imguiTabsUseMacroInstead(_selected, _enabled, __VA_ARGS__, NULL) + uint32_t imguiChooseUseMacroInstead(uint32_t _selected, ...); #define imguiChoose(...) imguiChooseUseMacroInstead(__VA_ARGS__, NULL)