Browse Source

Added imguiTabs().

Dario Manesku 11 years ago
parent
commit
b9af3544ad
2 changed files with 88 additions and 0 deletions
  1. 85 0
      examples/common/imgui/imgui.cpp
  2. 3 0
      examples/common/imgui/imgui.h

+ 85 - 0
examples/common/imgui/imgui.cpp

@@ -324,6 +324,7 @@ struct Imgui
 		const bgfx::Memory* mem = bgfx::alloc(m_textureWidth * m_textureHeight);
 		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);
 		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_texture = bgfx::createTexture2D(m_textureWidth, m_textureHeight, 1, bgfx::TextureFormat::R8, BGFX_TEXTURE_NONE, mem);
+		m_fonts[handle.idx].m_size = _fontSize;
 #else
 #else
 		const ImguiFontHandle handle = { bgfx::invalidHandle };
 		const ImguiFontHandle handle = { bgfx::invalidHandle };
 #endif // !USE_NANOVG_FONT
 #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)
 	void image(bgfx::TextureHandle _image, float _lod, int32_t _width, int32_t _height, ImguiImageAlign::Enum _align)
 	{
 	{
 		int32_t xx;
 		int32_t xx;
@@ -2299,6 +2373,7 @@ struct Imgui
 	{
 	{
 		stbtt_bakedchar m_cdata[96]; // ASCII 32..126 is 95 glyphs
 		stbtt_bakedchar m_cdata[96]; // ASCII 32..126 is 95 glyphs
 		bgfx::TextureHandle m_texture;
 		bgfx::TextureHandle m_texture;
+		float m_size;
 	};
 	};
 
 
 	uint16_t m_currentFontIdx;
 	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);
 	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, ...)
 uint32_t imguiChooseUseMacroInstead(uint32_t _selected, ...)
 {
 {
 	va_list argList;
 	va_list argList;

+ 3 - 0
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);
 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);
 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, ...);
 uint32_t imguiChooseUseMacroInstead(uint32_t _selected, ...);
 #define imguiChoose(...) imguiChooseUseMacroInstead(__VA_ARGS__, NULL)
 #define imguiChoose(...) imguiChooseUseMacroInstead(__VA_ARGS__, NULL)