Browse Source

Added _enabled param for imguiBeginScrollArea().

Dario Manesku 11 years ago
parent
commit
dde03c6bee
2 changed files with 65 additions and 27 deletions
  1. 64 26
      examples/common/imgui/imgui.cpp
  2. 1 1
      examples/common/imgui/imgui.h

+ 64 - 26
examples/common/imgui/imgui.cpp

@@ -277,6 +277,7 @@ struct Imgui
 		, m_insideCurrentScroll(false)
 		, m_insideCurrentScroll(false)
 		, m_areaId(0)
 		, m_areaId(0)
 		, m_widgetId(0)
 		, m_widgetId(0)
+		, m_enabledAreaIds(0)
 		, m_scissor(UINT16_MAX)
 		, m_scissor(UINT16_MAX)
 		, m_scrollTop(0)
 		, m_scrollTop(0)
 		, m_scrollBottom(0)
 		, m_scrollBottom(0)
@@ -437,6 +438,16 @@ struct Imgui
 			&& m_my <= _y + _height;
 			&& m_my <= _y + _height;
 	}
 	}
 
 
+	bool isEnabled(uint32_t _areaId)
+	{
+		return (m_enabledAreaIds>>_areaId)&0x1;
+	}
+
+	void setEnabled(uint32_t _areaId)
+	{
+		m_enabledAreaIds |= (1ULL<<_areaId)&UINT64_MAX;
+	}
+
 	void clearInput()
 	void clearInput()
 	{
 	{
 		m_leftPressed = false;
 		m_leftPressed = false;
@@ -545,8 +556,9 @@ struct Imgui
 		m_widgetY = 0;
 		m_widgetY = 0;
 		m_widgetW = 0;
 		m_widgetW = 0;
 
 
-		m_areaId = 1;
-		m_widgetId = 1;
+		m_areaId = 0;
+		m_widgetId = 0;
+		m_enabledAreaIds = 0;
 	}
 	}
 
 
 	void endFrame()
 	void endFrame()
@@ -555,12 +567,17 @@ struct Imgui
 		nvgEndFrame(m_nvg);
 		nvgEndFrame(m_nvg);
 	}
 	}
 
 
-	bool beginScrollArea(const char* _name, int32_t _x, int32_t _y, int32_t _width, int32_t _height, int32_t* _scroll)
+	bool beginScrollArea(const char* _name, int32_t _x, int32_t _y, int32_t _width, int32_t _height, int32_t* _scroll, bool _enabled)
 	{
 	{
 		m_areaId++;
 		m_areaId++;
 		m_widgetId = 0;
 		m_widgetId = 0;
 		m_scrollId = (m_areaId << 16) | m_widgetId;
 		m_scrollId = (m_areaId << 16) | m_widgetId;
 
 
+		if (_enabled)
+		{
+			setEnabled(m_areaId);
+		}
+
 		m_widgetX = _x + SCROLL_AREA_PADDING;
 		m_widgetX = _x + SCROLL_AREA_PADDING;
 		m_widgetY = _y + AREA_HEADER + (*_scroll);
 		m_widgetY = _y + AREA_HEADER + (*_scroll);
 		m_widgetW = _width - SCROLL_AREA_PADDING * 4;
 		m_widgetW = _width - SCROLL_AREA_PADDING * 4;
@@ -715,7 +732,8 @@ struct Imgui
 		int32_t height = BUTTON_HEIGHT;
 		int32_t height = BUTTON_HEIGHT;
 		m_widgetY += BUTTON_HEIGHT + DEFAULT_SPACING;
 		m_widgetY += BUTTON_HEIGHT + DEFAULT_SPACING;
 
 
-		bool over = _enabled	&& inRect(xx, yy, width, height);
+		bool enabled = _enabled && isEnabled(m_areaId);
+		bool over = enabled	&& inRect(xx, yy, width, height);
 		bool res = buttonLogic(id, over);
 		bool res = buttonLogic(id, over);
 
 
 		drawRoundedRect( (float)xx
 		drawRoundedRect( (float)xx
@@ -726,7 +744,7 @@ struct Imgui
 			, imguiRGBA(128, 128, 128, isActive(id) ? 196 : 96)
 			, imguiRGBA(128, 128, 128, isActive(id) ? 196 : 96)
 			);
 			);
 
 
-		if (_enabled)
+		if (enabled)
 		{
 		{
 			drawText(xx + BUTTON_HEIGHT / 2
 			drawText(xx + BUTTON_HEIGHT / 2
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
@@ -759,7 +777,8 @@ struct Imgui
 		int32_t height = BUTTON_HEIGHT;
 		int32_t height = BUTTON_HEIGHT;
 		m_widgetY += BUTTON_HEIGHT + DEFAULT_SPACING;
 		m_widgetY += BUTTON_HEIGHT + DEFAULT_SPACING;
 
 
-		bool over = _enabled && inRect(xx, yy, width, height);
+		bool enabled = _enabled && isEnabled(m_areaId);
+		bool over = enabled && inRect(xx, yy, width, height);
 		bool res = buttonLogic(id, over);
 		bool res = buttonLogic(id, over);
 
 
 		if (isHot(id) )
 		if (isHot(id) )
@@ -773,7 +792,7 @@ struct Imgui
 				);
 				);
 		}
 		}
 
 
-		if (_enabled)
+		if (enabled)
 		{
 		{
 			drawText(xx + BUTTON_HEIGHT / 2
 			drawText(xx + BUTTON_HEIGHT / 2
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
@@ -806,7 +825,8 @@ struct Imgui
 		int32_t height = BUTTON_HEIGHT;
 		int32_t height = BUTTON_HEIGHT;
 		m_widgetY += BUTTON_HEIGHT + DEFAULT_SPACING;
 		m_widgetY += BUTTON_HEIGHT + DEFAULT_SPACING;
 
 
-		bool over = _enabled && inRect(xx, yy, width, height);
+		bool enabled = _enabled && isEnabled(m_areaId);
+		bool over = enabled && inRect(xx, yy, width, height);
 		bool res = buttonLogic(id, over);
 		bool res = buttonLogic(id, over);
 
 
 		const int32_t cx = xx + BUTTON_HEIGHT / 2 - CHECK_SIZE / 2;
 		const int32_t cx = xx + BUTTON_HEIGHT / 2 - CHECK_SIZE / 2;
@@ -821,7 +841,7 @@ struct Imgui
 
 
 		if (_checked)
 		if (_checked)
 		{
 		{
-			if (_enabled)
+			if (enabled)
 			{
 			{
 				drawRoundedRect( (float)cx
 				drawRoundedRect( (float)cx
 					, (float)cy
 					, (float)cy
@@ -843,7 +863,7 @@ struct Imgui
 			}
 			}
 		}
 		}
 
 
-		if (_enabled)
+		if (enabled)
 		{
 		{
 			drawText(xx + BUTTON_HEIGHT
 			drawText(xx + BUTTON_HEIGHT
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
@@ -922,7 +942,8 @@ struct Imgui
 		const int32_t cx = xx + BUTTON_HEIGHT / 2 - CHECK_SIZE / 2;
 		const int32_t cx = xx + BUTTON_HEIGHT / 2 - CHECK_SIZE / 2;
 		const int32_t cy = yy + BUTTON_HEIGHT / 2 - CHECK_SIZE / 2;
 		const int32_t cy = yy + BUTTON_HEIGHT / 2 - CHECK_SIZE / 2;
 
 
-		bool over = _enabled && inRect(xx, yy, width, height);
+		bool enabled = _enabled && isEnabled(m_areaId);
+		bool over = enabled && inRect(xx, yy, width, height);
 		bool res = buttonLogic(id, over);
 		bool res = buttonLogic(id, over);
 
 
 		if (_checked)
 		if (_checked)
@@ -946,7 +967,7 @@ struct Imgui
 				);
 				);
 		}
 		}
 
 
-		if (_enabled)
+		if (enabled)
 		{
 		{
 			drawText(xx + BUTTON_HEIGHT
 			drawText(xx + BUTTON_HEIGHT
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
 				, yy + BUTTON_HEIGHT / 2 + TEXT_HEIGHT / 2
@@ -1034,7 +1055,8 @@ struct Imgui
 		float uu = bx::fsaturate( (_val - _vmin) / (_vmax - _vmin) );
 		float uu = bx::fsaturate( (_val - _vmin) / (_vmax - _vmin) );
 		int32_t m = (int)(uu * range);
 		int32_t m = (int)(uu * range);
 
 
-		bool over = _enabled && inRect(xx + m, yy, SLIDER_MARKER_WIDTH, SLIDER_HEIGHT);
+		bool enabled = _enabled && isEnabled(m_areaId);
+		bool over = enabled && inRect(xx + m, yy, SLIDER_MARKER_WIDTH, SLIDER_HEIGHT);
 		bool res = buttonLogic(id, over);
 		bool res = buttonLogic(id, over);
 		bool valChanged = false;
 		bool valChanged = false;
 
 
@@ -1085,7 +1107,7 @@ struct Imgui
 		char msg[128];
 		char msg[128];
 		bx::snprintf(msg, 128, fmt, _val);
 		bx::snprintf(msg, 128, fmt, _val);
 
 
-		if (_enabled)
+		if (enabled)
 		{
 		{
 			drawText(xx + SLIDER_HEIGHT / 2
 			drawText(xx + SLIDER_HEIGHT / 2
 				, yy + SLIDER_HEIGHT / 2 + TEXT_HEIGHT / 2
 				, yy + SLIDER_HEIGHT / 2 + TEXT_HEIGHT / 2
@@ -1141,7 +1163,7 @@ struct Imgui
 	void separatorLine()
 	void separatorLine()
 	{
 	{
 		int32_t xx = m_widgetX;
 		int32_t xx = m_widgetX;
-		int32_t yy = m_widgetY;
+		int32_t yy = m_widgetY + DEFAULT_SPACING*2;
 		int32_t width = m_widgetW;
 		int32_t width = m_widgetW;
 		int32_t height = 1;
 		int32_t height = 1;
 		m_widgetY += DEFAULT_SPACING * 4;
 		m_widgetY += DEFAULT_SPACING * 4;
@@ -1667,7 +1689,8 @@ struct Imgui
 		float hsv[3];
 		float hsv[3];
 		bx::rgbToHsv(hsv, _rgb);
 		bx::rgbToHsv(hsv, _rgb);
 
 
-		if (_enabled)
+		bool enabled = _enabled && isEnabled(m_areaId);
+		if (enabled)
 		{
 		{
 			if (m_leftPressed)
 			if (m_leftPressed)
 			{
 			{
@@ -1704,7 +1727,7 @@ struct Imgui
 
 
 		}
 		}
 
 
-		if (_enabled
+		if (enabled
 		&&  m_left
 		&&  m_left
 		&&  isActive(triangleId) )
 		&&  isActive(triangleId) )
 		{
 		{
@@ -1767,7 +1790,21 @@ struct Imgui
 		// Draw widget.
 		// Draw widget.
 		nvgSave(m_nvg);
 		nvgSave(m_nvg);
 		{
 		{
-			const float drawSaturation = _enabled ? 1.0f : 0.0f;
+			float saturation;
+			uint8_t alpha0;
+			uint8_t alpha1;
+			if (enabled)
+			{
+				saturation = 1.0f;
+				alpha0 = 255;
+				alpha1 = 192;
+			}
+			else
+			{
+				saturation = 0.0f;
+				alpha0 = 10;
+				alpha1 = 10;
+			}
 
 
 			// Circle.
 			// Circle.
 			for (uint8_t ii = 0; ii < 6; ii++)
 			for (uint8_t ii = 0; ii < 6; ii++)
@@ -1786,8 +1823,8 @@ struct Imgui
 				NVGpaint paint = nvgLinearGradient(m_nvg
 				NVGpaint paint = nvgLinearGradient(m_nvg
 												 , ax, ay
 												 , ax, ay
 												 , bx, by
 												 , bx, by
-												 , nvgHSLA(a0/NVG_PI*0.5f,drawSaturation,0.55f,255)
-												 , nvgHSLA(a1/NVG_PI*0.5f,drawSaturation,0.55f,255)
+												 , nvgHSLA(a0/NVG_PI*0.5f,saturation,0.55f,alpha0)
+												 , nvgHSLA(a1/NVG_PI*0.5f,saturation,0.55f,alpha0)
 												 );
 												 );
 
 
 				nvgFillPaint(m_nvg, paint);
 				nvgFillPaint(m_nvg, paint);
@@ -1810,7 +1847,7 @@ struct Imgui
 				nvgStrokeWidth(m_nvg, 2.0f);
 				nvgStrokeWidth(m_nvg, 2.0f);
 				nvgBeginPath(m_nvg);
 				nvgBeginPath(m_nvg);
 				nvgRect(m_nvg, ri-1.0f,-3.0f,rd+2.0f,6.0f);
 				nvgRect(m_nvg, ri-1.0f,-3.0f,rd+2.0f,6.0f);
-				nvgStrokeColor(m_nvg, nvgRGBA(255,255,255,192) );
+				nvgStrokeColor(m_nvg, nvgRGBA(255,255,255,alpha1) );
 				nvgStroke(m_nvg);
 				nvgStroke(m_nvg);
 
 
 				// Hue selector drop shadow.
 				// Hue selector drop shadow.
@@ -1832,10 +1869,10 @@ struct Imgui
 				nvgStroke(m_nvg);
 				nvgStroke(m_nvg);
 
 
 				// Center triangle fill.
 				// Center triangle fill.
-				paint = nvgLinearGradient(m_nvg, aa[0], aa[1], bb[0], bb[1], nvgHSL(hsv[0],drawSaturation,0.5f), nvgRGBA(0,0,0,255) );
+				paint = nvgLinearGradient(m_nvg, aa[0], aa[1], bb[0], bb[1], nvgHSL(hsv[0],saturation,0.5f), nvgRGBA(0,0,0,alpha0) );
 				nvgFillPaint(m_nvg, paint);
 				nvgFillPaint(m_nvg, paint);
 				nvgFill(m_nvg);
 				nvgFill(m_nvg);
-				paint = nvgLinearGradient(m_nvg, (aa[0]+bb[0])*0.5f, (aa[1]+bb[1])*0.5f, cc[0], cc[1], nvgRGBA(0,0,0,0), nvgRGBA(255,255,255,255) );
+				paint = nvgLinearGradient(m_nvg, (aa[0]+bb[0])*0.5f, (aa[1]+bb[1])*0.5f, cc[0], cc[1], nvgRGBA(0,0,0,0), nvgRGBA(255,255,255,alpha0) );
 				nvgFillPaint(m_nvg, paint);
 				nvgFillPaint(m_nvg, paint);
 				nvgFill(m_nvg);
 				nvgFill(m_nvg);
 
 
@@ -1843,7 +1880,7 @@ struct Imgui
 				nvgStrokeWidth(m_nvg, 2.0f);
 				nvgStrokeWidth(m_nvg, 2.0f);
 				nvgBeginPath(m_nvg);
 				nvgBeginPath(m_nvg);
 				nvgCircle(m_nvg, sel[0], sel[1], 5);
 				nvgCircle(m_nvg, sel[0], sel[1], 5);
-				nvgStrokeColor(m_nvg, nvgRGBA(255,255,255,192) );
+				nvgStrokeColor(m_nvg, nvgRGBA(255,255,255,alpha1) );
 				nvgStroke(m_nvg);
 				nvgStroke(m_nvg);
 
 
 				// Color selector stroke.
 				// Color selector stroke.
@@ -1882,6 +1919,7 @@ struct Imgui
 
 
 	uint32_t m_areaId;
 	uint32_t m_areaId;
 	uint32_t m_widgetId;
 	uint32_t m_widgetId;
+	uint64_t m_enabledAreaIds;
 	uint16_t m_scissor;
 	uint16_t m_scissor;
 
 
 	float m_tempCoords[MAX_TEMP_COORDS * 2];
 	float m_tempCoords[MAX_TEMP_COORDS * 2];
@@ -1945,9 +1983,9 @@ void imguiEndFrame()
 	s_imgui.endFrame();
 	s_imgui.endFrame();
 }
 }
 
 
-bool imguiBeginScrollArea(const char* _name, int32_t _x, int32_t _y, int32_t _width, int32_t _height, int32_t* _scroll)
+bool imguiBeginScrollArea(const char* _name, int32_t _x, int32_t _y, int32_t _width, int32_t _height, int32_t* _scroll, bool _enabled)
 {
 {
-	return s_imgui.beginScrollArea(_name, _x, _y, _width, _height, _scroll);
+	return s_imgui.beginScrollArea(_name, _x, _y, _width, _height, _scroll, _enabled);
 }
 }
 
 
 void imguiEndScrollArea()
 void imguiEndScrollArea()

+ 1 - 1
examples/common/imgui/imgui.h

@@ -69,7 +69,7 @@ void imguiDestroy();
 void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint8_t _view = 31);
 void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint8_t _view = 31);
 void imguiEndFrame();
 void imguiEndFrame();
 
 
-bool imguiBeginScrollArea(const char* _name, int _x, int _y, int _width, int _height, int* _scroll);
+bool imguiBeginScrollArea(const char* _name, int _x, int _y, int _width, int _height, int* _scroll, bool _enabled = true);
 void imguiEndScrollArea();
 void imguiEndScrollArea();
 
 
 void imguiIndent();
 void imguiIndent();