Просмотр исходного кода

Added GUILayoutExplicit
Re-arranged GUIElement methods to make it clearer what is an internal method

Marko Pintera 11 лет назад
Родитель
Сommit
e9775eae14
60 измененных файлов с 500 добавлено и 317 удалено
  1. 1 1
      BansheeEditor/Include/BsDockManager.h
  2. 5 5
      BansheeEditor/Include/BsGUIColor.h
  3. 1 1
      BansheeEditor/Include/BsGUIDockSlider.h
  4. 1 1
      BansheeEditor/Include/BsGUIDropButton.h
  5. 1 1
      BansheeEditor/Include/BsGUITabButton.h
  6. 1 1
      BansheeEditor/Include/BsGUITabbedTitleBar.h
  7. 3 3
      BansheeEditor/Include/BsGUITreeView.h
  8. 1 1
      BansheeEditor/Include/BsGUITreeViewEditBox.h
  9. 1 1
      BansheeEditor/Include/BsGUIWindowDropArea.h
  10. 7 7
      BansheeEditor/Source/BsDockManager.cpp
  11. 5 5
      BansheeEditor/Source/BsGUIColor.cpp
  12. 3 3
      BansheeEditor/Source/BsGUIComponentFoldout.cpp
  13. 2 2
      BansheeEditor/Source/BsGUIDockSlider.cpp
  14. 2 2
      BansheeEditor/Source/BsGUIDropButton.cpp
  15. 1 1
      BansheeEditor/Source/BsGUIFloatField.cpp
  16. 6 6
      BansheeEditor/Source/BsGUIFoldout.cpp
  17. 1 1
      BansheeEditor/Source/BsGUIIntField.cpp
  18. 1 1
      BansheeEditor/Source/BsGUITabButton.cpp
  19. 13 13
      BansheeEditor/Source/BsGUITabbedTitleBar.cpp
  20. 22 22
      BansheeEditor/Source/BsGUITreeView.cpp
  21. 2 2
      BansheeEditor/Source/BsGUITreeViewEditBox.cpp
  22. 1 1
      BansheeEditor/Source/BsGUIWindowDropArea.cpp
  23. 2 0
      BansheeEngine/BansheeEngine.vcxproj
  24. 6 0
      BansheeEngine/BansheeEngine.vcxproj.filters
  25. 1 1
      BansheeEngine/Include/BsGUIButton.h
  26. 5 5
      BansheeEngine/Include/BsGUIButtonBase.h
  27. 2 2
      BansheeEngine/Include/BsGUIDropDownHitBox.h
  28. 100 69
      BansheeEngine/Include/BsGUIElement.h
  29. 4 4
      BansheeEngine/Include/BsGUIElementContainer.h
  30. 10 10
      BansheeEngine/Include/BsGUIInputBox.h
  31. 5 5
      BansheeEngine/Include/BsGUILabel.h
  32. 47 0
      BansheeEngine/Include/BsGUILayoutExplicit.h
  33. 2 2
      BansheeEngine/Include/BsGUIListBox.h
  34. 2 2
      BansheeEngine/Include/BsGUIScrollArea.h
  35. 4 4
      BansheeEngine/Include/BsGUIScrollBar.h
  36. 5 5
      BansheeEngine/Include/BsGUISliderHandle.h
  37. 5 5
      BansheeEngine/Include/BsGUITexture.h
  38. 2 2
      BansheeEngine/Include/BsGUIToggle.h
  39. 4 4
      BansheeEngine/Include/BsGUIViewport.h
  40. 8 8
      BansheeEngine/Source/BsGUIButtonBase.cpp
  41. 4 4
      BansheeEngine/Source/BsGUIDropDownHitBox.cpp
  42. 31 13
      BansheeEngine/Source/BsGUIElement.cpp
  43. 4 4
      BansheeEngine/Source/BsGUIElementContainer.cpp
  44. 13 13
      BansheeEngine/Source/BsGUIInputBox.cpp
  45. 4 4
      BansheeEngine/Source/BsGUILabel.cpp
  46. 88 0
      BansheeEngine/Source/BsGUILayoutExplicit.cpp
  47. 5 5
      BansheeEngine/Source/BsGUILayoutX.cpp
  48. 3 3
      BansheeEngine/Source/BsGUILayoutY.cpp
  49. 2 2
      BansheeEngine/Source/BsGUIListBox.cpp
  50. 7 7
      BansheeEngine/Source/BsGUIManager.cpp
  51. 6 6
      BansheeEngine/Source/BsGUIProgressBar.cpp
  52. 7 7
      BansheeEngine/Source/BsGUIScrollArea.cpp
  53. 4 4
      BansheeEngine/Source/BsGUIScrollBar.cpp
  54. 6 6
      BansheeEngine/Source/BsGUISlider.cpp
  55. 5 5
      BansheeEngine/Source/BsGUISliderHandle.cpp
  56. 4 4
      BansheeEngine/Source/BsGUITexture.cpp
  57. 2 2
      BansheeEngine/Source/BsGUIToggle.cpp
  58. 4 4
      BansheeEngine/Source/BsGUIViewport.cpp
  59. 5 5
      BansheeEngine/Source/BsGUIWidget.cpp
  60. 1 10
      TODO.txt

+ 1 - 1
BansheeEditor/Include/BsDockManager.h

@@ -126,7 +126,7 @@ namespace BansheeEngine
 
 		void updateDropOverlay(INT32 x, INT32 y, UINT32 width, UINT32 height);
 
-		bool mouseEvent(const GUIMouseEvent& event);
+		bool _mouseEvent(const GUIMouseEvent& event);
 		bool insidePolygon(Vector2* polyPoints, UINT32 numPoints, Vector2 point) const;
 	};
 }

+ 5 - 5
BansheeEditor/Include/BsGUIColor.h

@@ -28,22 +28,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements()
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial()
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads()
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer()
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**
@@ -56,7 +56,7 @@ namespace BansheeEngine
 		 */
 		virtual void updateClippedBounds();
 
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 	private:
 		static const float ALPHA_SPLIT_POSITION;

+ 1 - 1
BansheeEditor/Include/BsGUIDockSlider.h

@@ -17,7 +17,7 @@ namespace BansheeEngine
 
 		Event<void(const Vector2I&)> onDragged;
 	protected:
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		bool _hasCustomCursor(const Vector2I position, CursorType& type) const;
 	private:

+ 1 - 1
BansheeEditor/Include/BsGUIDropButton.h

@@ -26,7 +26,7 @@ namespace BansheeEngine
 	protected:
 		GUIDropButton(UINT32 dragType, const String& styleName, const GUILayoutOptions& layoutOptions);
 
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 		virtual bool _acceptDragAndDrop(const Vector2I position, UINT32 typeId) const;
 
 		UINT32 mDragType;

+ 1 - 1
BansheeEditor/Include/BsGUITabButton.h

@@ -29,7 +29,7 @@ namespace BansheeEngine
 		Event<void(UINT32, const Vector2I&)> onDragged;
 		Event<void(UINT32, const Vector2I&)> onDragEnd;
 	protected:
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 	private:
 		UINT32 mIndex;

+ 1 - 1
BansheeEditor/Include/BsGUITabbedTitleBar.h

@@ -69,7 +69,7 @@ namespace BansheeEngine
 		GUITabbedTitleBar(const String& backgroundStyle, const String& tabBtnStyle, 
 			const String& minBtnStyle, const String& closeBtnStyle, const GUILayoutOptions& layoutOptions);
 
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		void startDrag(UINT32 seqIdx, const Vector2I& startDragPos);
 		void endDrag();

+ 3 - 3
BansheeEditor/Include/BsGUITreeView.h

@@ -133,9 +133,9 @@ namespace BansheeEngine
 		void enableEdit(TreeElement* element);
 		void disableEdit(bool acceptChanges);
 
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
-		virtual bool commandEvent(const GUICommandEvent& ev);
-		virtual bool virtualButtonEvent(const GUIVirtualButtonEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _commandEvent(const GUICommandEvent& ev);
+		virtual bool _virtualButtonEvent(const GUIVirtualButtonEvent& ev);
 		void elementToggled(TreeElement* element, bool toggled);
 
 		virtual TreeElement& getRootElement() = 0;

+ 1 - 1
BansheeEditor/Include/BsGUITreeViewEditBox.h

@@ -19,6 +19,6 @@ namespace BansheeEngine
 	private:
 		GUITreeViewEditBox(const String& styleName, const GUILayoutOptions& layoutOptions);
 
-		virtual bool commandEvent(const GUICommandEvent& ev);
+		virtual bool _commandEvent(const GUICommandEvent& ev);
 	};
 }

+ 1 - 1
BansheeEditor/Include/BsGUIWindowDropArea.h

@@ -21,6 +21,6 @@ namespace BansheeEngine
 		~GUIWindowDropArea();
 		GUIWindowDropArea(const String& styleName, const GUILayoutOptions& layoutOptions);
 
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 	};
 }

+ 7 - 7
BansheeEditor/Source/BsDockManager.cpp

@@ -107,9 +107,9 @@ namespace BansheeEngine
 				mChildren[0]->setArea(mArea.x, mArea.y, mArea.width, sizeTop);
 				mChildren[1]->setArea(mArea.x, mArea.y + sizeTop + SLIDER_SIZE, mArea.width, sizeBottom);
 
-				mSlider->_setOffset(Vector2I(mArea.x, mArea.y + sizeTop));
-				mSlider->_setWidth(mArea.width);
-				mSlider->_setHeight(SLIDER_SIZE);
+				mSlider->setOffset(Vector2I(mArea.x, mArea.y + sizeTop));
+				mSlider->setWidth(mArea.width);
+				mSlider->setHeight(SLIDER_SIZE);
 
 				Rect2I elemClipRect(clipRect.x - mArea.x, clipRect.y - mArea.y, clipRect.width, clipRect.height);
 				mSlider->_setClipRect(elemClipRect);
@@ -123,9 +123,9 @@ namespace BansheeEngine
 				mChildren[0]->setArea(mArea.x, mArea.y, sizeLeft, mArea.height);
 				mChildren[1]->setArea(mArea.x + sizeLeft + SLIDER_SIZE, mArea.y, sizeRight, mArea.height);
 
-				mSlider->_setOffset(Vector2I(mArea.x + sizeLeft, mArea.y));
-				mSlider->_setWidth(SLIDER_SIZE);
-				mSlider->_setHeight(mArea.height);
+				mSlider->setOffset(Vector2I(mArea.x + sizeLeft, mArea.y));
+				mSlider->setWidth(SLIDER_SIZE);
+				mSlider->setHeight(mArea.height);
 
 				Rect2I elemClipRect(clipRect.x - mArea.x, clipRect.y - mArea.y, clipRect.width, clipRect.height);
 				mSlider->_setClipRect(elemClipRect);
@@ -918,7 +918,7 @@ namespace BansheeEngine
 		mDropOverlayMesh = Mesh::create(meshData);
 	}
 
-	bool DockManager::mouseEvent(const GUIMouseEvent& event)
+	bool DockManager::_mouseEvent(const GUIMouseEvent& event)
 	{
 		if(event.getType() == GUIMouseEventType::MouseDragAndDropDragged)
 		{

+ 5 - 5
BansheeEditor/Source/BsGUIColor.cpp

@@ -58,7 +58,7 @@ namespace BansheeEngine
 		markContentAsDirty();
 	}
 
-	UINT32 GUIColor::getNumRenderElements() const
+	UINT32 GUIColor::_getNumRenderElements() const
 	{
 		UINT32 numElements = mColorSprite->getNumRenderElements();
 		numElements += mAlphaSprite->getNumRenderElements();
@@ -66,7 +66,7 @@ namespace BansheeEngine
 		return numElements;
 	}
 
-	const GUIMaterialInfo& GUIColor::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUIColor::_getMaterial(UINT32 renderElementIdx) const
 	{
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
 
@@ -76,7 +76,7 @@ namespace BansheeEngine
 			return mColorSprite->getMaterial(renderElementIdx);
 	}
 
-	UINT32 GUIColor::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUIColor::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
 
@@ -119,7 +119,7 @@ namespace BansheeEngine
 		return GUIHelper::calcOptimalContentsSize(Vector2I(80, 10), *_getStyle(), _getLayoutOptions()); // Arbitrary size
 	}
 
-	void GUIColor::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUIColor::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
@@ -145,7 +145,7 @@ namespace BansheeEngine
 		}
 	}
 
-	bool GUIColor::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIColor::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		if(ev.getType() == GUIMouseEventType::MouseUp)
 		{

+ 3 - 3
BansheeEditor/Source/BsGUIComponentFoldout.cpp

@@ -89,9 +89,9 @@ namespace BansheeEngine
 			INT32 yOffset = Math::roundToInt(((INT32)height - optimalSize.y) * 0.5f);
 
 			Vector2I offset(x, y + yOffset);
-			mToggle->_setOffset(offset);
-			mToggle->_setWidth(width);
-			mToggle->_setHeight(optimalSize.y);
+			mToggle->setOffset(offset);
+			mToggle->setWidth(width);
+			mToggle->setHeight(optimalSize.y);
 			mToggle->_setAreaDepth(areaDepth);
 			mToggle->_setWidgetDepth(widgetDepth);
 

+ 2 - 2
BansheeEditor/Source/BsGUIDockSlider.cpp

@@ -45,9 +45,9 @@ namespace BansheeEngine
 		return false;
 	}
 
-	bool GUIDockSlider::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIDockSlider::_mouseEvent(const GUIMouseEvent& ev)
 	{	
-		bool processed = GUIButtonBase::mouseEvent(ev);
+		bool processed = GUIButtonBase::_mouseEvent(ev);
 
 		if(ev.getType() == GUIMouseEventType::MouseDragStart)
 		{

+ 2 - 2
BansheeEditor/Source/BsGUIDropButton.cpp

@@ -39,9 +39,9 @@ namespace BansheeEngine
 			getStyleName<GUIDropButton>(styleName), GUILayoutOptions::create(layoutOptions));
 	}
 
-	bool GUIDropButton::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIDropButton::_mouseEvent(const GUIMouseEvent& ev)
 	{
-		bool processed = GUIButtonBase::mouseEvent(ev);
+		bool processed = GUIButtonBase::_mouseEvent(ev);
 
 		if(ev.getType() == GUIMouseEventType::MouseDragAndDropDragged)
 		{

+ 1 - 1
BansheeEditor/Source/BsGUIFloatField.cpp

@@ -60,7 +60,7 @@ namespace BansheeEngine
 
 	bool GUIFloatField::mouseEvent(const GUIMouseEvent& event)
 	{
-		GUIElementContainer::mouseEvent(event);
+		GUIElementContainer::_mouseEvent(event);
 
 		Rect2I draggableArea;
 

+ 6 - 6
BansheeEditor/Source/BsGUIFoldout.cpp

@@ -91,9 +91,9 @@ namespace BansheeEngine
 			INT32 yOffset = Math::roundToInt(((INT32)height - optimalSize.y) * 0.5f);
 
 			Vector2I offset(x, y + yOffset);
-			mToggle->_setOffset(offset);
-			mToggle->_setWidth(optimalSize.x);
-			mToggle->_setHeight(optimalSize.y);
+			mToggle->setOffset(offset);
+			mToggle->setWidth(optimalSize.x);
+			mToggle->setHeight(optimalSize.y);
 			mToggle->_setAreaDepth(areaDepth);
 			mToggle->_setWidgetDepth(widgetDepth);
 
@@ -108,9 +108,9 @@ namespace BansheeEngine
 			INT32 yOffset = Math::roundToInt(((INT32)height - optimalSize.y) * 0.5f);
 
 			Vector2I offset(x + toggleOffset, y + yOffset);
-			mLabel->_setOffset(offset);
-			mLabel->_setWidth(optimalSize.x);
-			mLabel->_setHeight(optimalSize.y);
+			mLabel->setOffset(offset);
+			mLabel->setWidth(optimalSize.x);
+			mLabel->setHeight(optimalSize.y);
 			mLabel->_setAreaDepth(areaDepth);
 			mLabel->_setWidgetDepth(widgetDepth);
 

+ 1 - 1
BansheeEditor/Source/BsGUIIntField.cpp

@@ -62,7 +62,7 @@ namespace BansheeEngine
 
 	bool GUIIntField::mouseEvent(const GUIMouseEvent& event)
 	{
-		GUIElementContainer::mouseEvent(event);
+		GUIElementContainer::_mouseEvent(event);
 
 		Rect2I draggableArea;
 

+ 1 - 1
BansheeEditor/Source/BsGUITabButton.cpp

@@ -71,7 +71,7 @@ namespace BansheeEngine
 		}
 	}
 
-	bool GUITabButton::mouseEvent(const GUIMouseEvent& ev)
+	bool GUITabButton::_mouseEvent(const GUIMouseEvent& ev)
 	{	
 		if(ev.getType() == GUIMouseEventType::MouseOver)
 		{

+ 13 - 13
BansheeEditor/Source/BsGUITabbedTitleBar.cpp

@@ -124,7 +124,7 @@ namespace BansheeEngine
 		return mTabButtons[position]->getIndex();
 	}
 
-	bool GUITabbedTitleBar::mouseEvent(const GUIMouseEvent& event)
+	bool GUITabbedTitleBar::_mouseEvent(const GUIMouseEvent& event)
 	{
 		if(event.getType() == GUIMouseEventType::MouseDragAndDropDragged)
 		{
@@ -248,9 +248,9 @@ namespace BansheeEngine
 		{
 			Vector2I optimalSize = mBackgroundImage->_getOptimalSize();
 			Vector2I offset(x + 1, y + 1);
-			mBackgroundImage->_setOffset(offset);
-			mBackgroundImage->_setWidth(width - 2);
-			mBackgroundImage->_setHeight(optimalSize.y);
+			mBackgroundImage->setOffset(offset);
+			mBackgroundImage->setWidth(width - 2);
+			mBackgroundImage->setHeight(optimalSize.y);
 			mBackgroundImage->_setAreaDepth(areaDepth);
 			mBackgroundImage->_setWidgetDepth(widgetDepth);
 
@@ -280,9 +280,9 @@ namespace BansheeEngine
 				offset.x = mDragBtnOffset;
 			}
 
-			btn->_setOffset(offset);
-			btn->_setWidth(optimalSize.x);
-			btn->_setHeight(optimalSize.y);
+			btn->setOffset(offset);
+			btn->setWidth(optimalSize.x);
+			btn->setHeight(optimalSize.y);
 			btn->_setAreaDepth(areaDepth);
 			btn->_setWidgetDepth(widgetDepth);
 
@@ -297,9 +297,9 @@ namespace BansheeEngine
 			INT32 optionBtnYPos = curY + Math::floorToInt((tabBtnHeight - minBtnOptimalSize.y) * 0.5f);
 
 			Vector2I offset(optionBtnXPos, optionBtnYPos);
-			mMinBtn->_setOffset(offset);
-			mMinBtn->_setWidth(minBtnOptimalSize.x);
-			mMinBtn->_setHeight(minBtnOptimalSize.y);
+			mMinBtn->setOffset(offset);
+			mMinBtn->setWidth(minBtnOptimalSize.x);
+			mMinBtn->setHeight(minBtnOptimalSize.y);
 			mMinBtn->_setAreaDepth(areaDepth);
 			mMinBtn->_setWidgetDepth(widgetDepth);
 
@@ -312,9 +312,9 @@ namespace BansheeEngine
 			INT32 optionBtnYPos = curY + Math::floorToInt((tabBtnHeight - closeBtnOptimalSize.y) * 0.5f);
 
 			Vector2I offset(optionBtnXPos, optionBtnYPos);
-			mCloseBtn->_setOffset(offset);
-			mCloseBtn->_setWidth(closeBtnOptimalSize.x);
-			mCloseBtn->_setHeight(closeBtnOptimalSize.y);
+			mCloseBtn->setOffset(offset);
+			mCloseBtn->setWidth(closeBtnOptimalSize.x);
+			mCloseBtn->setHeight(closeBtnOptimalSize.y);
 			mCloseBtn->_setAreaDepth(areaDepth);
 			mCloseBtn->_setWidgetDepth(widgetDepth);
 

+ 22 - 22
BansheeEditor/Source/BsGUITreeView.cpp

@@ -193,7 +193,7 @@ namespace BansheeEngine
 		}
 	}
 
-	bool GUITreeView::mouseEvent(const GUIMouseEvent& event)
+	bool GUITreeView::_mouseEvent(const GUIMouseEvent& event)
 	{
 		if(event.getType() == GUIMouseEventType::MouseUp)
 		{
@@ -378,7 +378,7 @@ namespace BansheeEngine
 		return false;
 	}
 
-	bool GUITreeView::commandEvent(const GUICommandEvent& ev)
+	bool GUITreeView::_commandEvent(const GUICommandEvent& ev)
 	{
 		if(ev.getType() == GUICommandEventType::MoveUp || ev.getType() == GUICommandEventType::SelectUp)
 		{
@@ -432,7 +432,7 @@ namespace BansheeEngine
 		return false;
 	}
 
-	bool GUITreeView::virtualButtonEvent(const GUIVirtualButtonEvent& ev)
+	bool GUITreeView::_virtualButtonEvent(const GUIVirtualButtonEvent& ev)
 	{
 		if(ev.getButton() == mRenameVB)
 		{
@@ -873,9 +873,9 @@ namespace BansheeEngine
 				offset.x = x + INITIAL_INDENT_OFFSET + indent * INDENT_SIZE;
 				offset.y += ELEMENT_EXTRA_SPACING;
 
-				current->mElement->_setOffset(offset);
-				current->mElement->_setWidth(elementSize.x);
-				current->mElement->_setHeight(elementSize.y);
+				current->mElement->setOffset(offset);
+				current->mElement->setWidth(elementSize.x);
+				current->mElement->setHeight(elementSize.y);
 				current->mElement->_setAreaDepth(areaDepth);
 				current->mElement->_setWidgetDepth(widgetDepth);
 
@@ -901,9 +901,9 @@ namespace BansheeEngine
 					myOffset.y -= Math::floorToInt(half);
 				}
 
-				current->mFoldoutBtn->_setOffset(myOffset);
-				current->mFoldoutBtn->_setWidth(elementSize.x);
-				current->mFoldoutBtn->_setHeight(elementSize.y);
+				current->mFoldoutBtn->setOffset(myOffset);
+				current->mFoldoutBtn->setWidth(elementSize.x);
+				current->mFoldoutBtn->setHeight(elementSize.y);
 				current->mFoldoutBtn->_setAreaDepth(areaDepth);
 				current->mFoldoutBtn->_setWidgetDepth(widgetDepth);
 
@@ -942,9 +942,9 @@ namespace BansheeEngine
 			Vector2I offset = targetElement->_getOffset();
 			offset.x = x;
 
-			selectedElem.background->_setOffset(offset);
-			selectedElem.background->_setWidth(width);
-			selectedElem.background->_setHeight(targetElement->_getHeight());
+			selectedElem.background->setOffset(offset);
+			selectedElem.background->setWidth(width);
+			selectedElem.background->setHeight(targetElement->_getHeight());
 			selectedElem.background->_setAreaDepth(areaDepth);
 			selectedElem.background->_setWidgetDepth(widgetDepth);
 
@@ -959,9 +959,9 @@ namespace BansheeEngine
 			Vector2I offset = targetElement->_getOffset();
 			UINT32 remainingWidth = (UINT32)std::max(0, (((INT32)width) - (offset.x - x)));
 
-			mNameEditBox->_setOffset(offset);
-			mNameEditBox->_setWidth(remainingWidth);
-			mNameEditBox->_setHeight(targetElement->_getHeight());
+			mNameEditBox->setOffset(offset);
+			mNameEditBox->setWidth(remainingWidth);
+			mNameEditBox->setHeight(targetElement->_getHeight());
 			mNameEditBox->_setAreaDepth(areaDepth);
 			mNameEditBox->_setWidgetDepth(widgetDepth);
 
@@ -993,9 +993,9 @@ namespace BansheeEngine
 						mDragHighlight->enableRecursively();
 
 					Vector2I offset(interactableElement->bounds.x, interactableElement->bounds.y);
-					mDragHighlight->_setOffset(offset);
-					mDragHighlight->_setWidth(interactableElement->bounds.width);
-					mDragHighlight->_setHeight(interactableElement->bounds.height);
+					mDragHighlight->setOffset(offset);
+					mDragHighlight->setWidth(interactableElement->bounds.width);
+					mDragHighlight->setHeight(interactableElement->bounds.height);
 					mDragHighlight->_setAreaDepth(areaDepth);
 					mDragHighlight->_setWidgetDepth(widgetDepth);
 
@@ -1011,9 +1011,9 @@ namespace BansheeEngine
 						mDragSepHighlight->enableRecursively();
 
 					Vector2I offset(interactableElement->bounds.x, interactableElement->bounds.y);
-					mDragSepHighlight->_setOffset(offset);
-					mDragSepHighlight->_setWidth(interactableElement->bounds.width);
-					mDragSepHighlight->_setHeight(interactableElement->bounds.height);
+					mDragSepHighlight->setOffset(offset);
+					mDragSepHighlight->setWidth(interactableElement->bounds.width);
+					mDragSepHighlight->setHeight(interactableElement->bounds.height);
 					mDragSepHighlight->_setAreaDepth(areaDepth);
 					mDragSepHighlight->_setWidgetDepth(widgetDepth);
 
@@ -1217,7 +1217,7 @@ namespace BansheeEngine
 			{
 				GUIElement* parentElement = static_cast<GUIElement*>(parent);
 
-				if(parentElement->getElementType() == GUIElement::ElementType::ScrollArea)
+				if(parentElement->_getElementType() == GUIElement::ElementType::ScrollArea)
 				{
 					GUIScrollArea* scrollArea = static_cast<GUIScrollArea*>(parentElement);
 					return scrollArea;

+ 2 - 2
BansheeEditor/Source/BsGUITreeViewEditBox.cpp

@@ -27,9 +27,9 @@ namespace BansheeEngine
 
 	}
 
-	bool GUITreeViewEditBox::commandEvent(const GUICommandEvent& ev)
+	bool GUITreeViewEditBox::_commandEvent(const GUICommandEvent& ev)
 	{
-		bool processed = GUIInputBox::commandEvent(ev);
+		bool processed = GUIInputBox::_commandEvent(ev);
 
 		if(ev.getType() == GUICommandEventType::Return)
 		{

+ 1 - 1
BansheeEditor/Source/BsGUIWindowDropArea.cpp

@@ -44,7 +44,7 @@ namespace BansheeEngine
 		markContentAsDirty();
 	}
 
-	bool GUIWindowDropArea::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIWindowDropArea::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		if(ev.getType() == GUIMouseEventType::MouseDragAndDropDropped)
 		{

+ 2 - 0
BansheeEngine/BansheeEngine.vcxproj

@@ -235,6 +235,7 @@
     <ClCompile Include="Source\BsCameraHandler.cpp" />
     <ClCompile Include="Source\BsCursor.cpp" />
     <ClCompile Include="Source\BsDrawHelper.cpp" />
+    <ClCompile Include="Source\BsGUILayoutExplicit.cpp" />
     <ClCompile Include="Source\BsGUILayoutUtility.cpp" />
     <ClCompile Include="Source\BsGUIProgressBar.cpp" />
     <ClCompile Include="Source\BsGUISlider.cpp" />
@@ -249,6 +250,7 @@
     <ClInclude Include="Include\BsCameraHandlerRTTI.h" />
     <ClInclude Include="Include\BsCursor.h" />
     <ClInclude Include="Include\BsDrawHelper.h" />
+    <ClInclude Include="Include\BsGUILayoutExplicit.h" />
     <ClInclude Include="Include\BsGUIProgressBar.h" />
     <ClInclude Include="Include\BsGUISlider.h" />
     <ClInclude Include="Include\BsRenderableElement.h" />

+ 6 - 0
BansheeEngine/BansheeEngine.vcxproj.filters

@@ -290,6 +290,9 @@
     <ClInclude Include="Include\BsGUIProgressBar.h">
       <Filter>Header Files\GUI</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsGUILayoutExplicit.h">
+      <Filter>Header Files\GUI</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsGUIElement.cpp">
@@ -499,5 +502,8 @@
     <ClCompile Include="Source\BsGUIProgressBar.cpp">
       <Filter>Source Files\GUI</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsGUILayoutExplicit.cpp">
+      <Filter>Source Files\GUI</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 1 - 1
BansheeEngine/Include/BsGUIButton.h

@@ -68,7 +68,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::Button; }
+		virtual ElementType _getElementType() const { return ElementType::Button; }
 	private:
 		GUIButton(const String& styleName, const GUIContent& content, const GUILayoutOptions& layoutOptions);
 	};

+ 5 - 5
BansheeEngine/Include/BsGUIButtonBase.h

@@ -85,22 +85,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**
@@ -116,7 +116,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::mouseEvent
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		/**
 		 * @copydoc GUIElement::_getRenderElementDepth

+ 2 - 2
BansheeEngine/Include/BsGUIDropDownHitBox.h

@@ -60,8 +60,8 @@ namespace BansheeEngine
 	private:
 		GUIDropDownHitBox(bool captureMouse, const GUILayoutOptions& layoutOptions);
 
-		virtual bool commandEvent(const GUICommandEvent& ev);
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _commandEvent(const GUICommandEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 		virtual bool _isInBounds(const Vector2I position) const;
 
 		Vector<Rect2I> mBounds;

+ 100 - 69
BansheeEngine/Include/BsGUIElement.h

@@ -36,15 +36,79 @@ namespace BansheeEngine
 		virtual ~GUIElement();
 
 		/**
+		 * @brief	Sets or removes focus from an element. Will change element style.
+		 */
+		void setFocus(bool enabled);
+
+		/**
+		 * @brief	Sets new layout options for the element.
+		 *
+		 * @param	layoutOptions	Options that allows you to control how is the element positioned in
+		 *							GUI layout. This will override any similar options set by style.
+		 */
+		void setLayoutOptions(const GUIOptions& layoutOptions);
+
+		/**
+		 * @brief	Sets new style to be used by the element.
+		 */
+		void setStyle(const String& styleName);
+
+		/**
+		 * @brief	Sets element position relative to widget origin.
+		 *
+		 * @note	Be aware that this value will get overwritten if your element is part of a non-explicit layout.
+		 */
+		void setOffset(const Vector2I& offset);
+
+		/**
+		 * @brief	Sets element width in pixels.
+		 *
+		 * @note	Be aware that this value will get overwritten if your element is part of a non-explicit layout.
+		 */
+		void setWidth(UINT32 width);
+
+		/**
+		 * @brief	Sets element height in pixels.
+		 *
+		 * @note	Be aware that this value will get overwritten if your element is part of a non-explicit layout.
+		 */
+		void setHeight(UINT32 height);
+
+		/**
+		 * @brief	Returns non-clipped bounds of the GUI element. Relative to the parent widget.
+		 *
+		 * @note	This call can be potentially expensive as the bounds need to be calculated based on current GUI state.
+		 */
+		Rect2I getBounds() const;
+
+		/**
+		 * @brief	Returns non-clipped visible bounds of the GUI element (bounds exclude the margins). Relative to parent widget.
+		 *
+		 * @note	This call can be potentially expensive as the bounds need to be calculated based on current GUI state.
+		 */
+		Rect2I getVisibleBounds() const;
+
+		/**
+		 * @brief	Destroy the element. Removes it from parent and widget, and queues
+		 *			it for deletion. Element memory will be released delayed, next frame.
+		 */	
+		static void destroy(GUIElement* element);
+
+		/************************************************************************/
+		/* 							INTERNAL METHODS                      		*/
+		/************************************************************************/
+
+/**
 		 * @brief	Returns the number of separate render elements in the GUI element.
 		 * 			
 		 * @return	The number render elements.
 		 *
-		 * @note	GUI system attempts to reduce the number of GUI meshes so it will group
+		 * @note	Internal method.
+		 *			GUI system attempts to reduce the number of GUI meshes so it will group
 		 * 			sprites based on their material and textures. One render elements represents a group
 		 * 			of such sprites that share a material/texture.
 		 */
-		virtual UINT32 getNumRenderElements() const = 0;
+		virtual UINT32 _getNumRenderElements() const = 0;
 
 		/**
 		 * @brief	Gets a material for the specified render element index.
@@ -52,8 +116,10 @@ namespace BansheeEngine
 		 * @return	Handle to the material.
 		 *
 		 * @see		getNumRenderElements()
+		 *
+		 * @note	Internal method.
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const = 0;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const = 0;
 
 		/**
 		 * @brief	Returns the number of quads that the specified render element will use. You will need this
@@ -64,11 +130,11 @@ namespace BansheeEngine
 		 * @see		getNumRenderElements()
 		 * @see		fillBuffer()
 		 * 		
-		 * @note	Number of vertices = Number of quads * 4
-		 *			Number of indices = Number of quads * 6
-		 *			
+		 * @note	Internal method.
+		 *			Number of vertices = Number of quads * 4
+		 *			Number of indices = Number of quads * 6	
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const = 0;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const = 0;
 
 		/**
 		 * @brief	Fill the pre-allocated vertex, uv and index buffers with the mesh data for the
@@ -84,75 +150,61 @@ namespace BansheeEngine
 		 * @param	indexStride			Number of bytes between two indexes in the provided index data.
 		 * @param	renderElementIdx	Zero-based index of the render element.
 		 *
-		 * @see getNumRenderElements()
-		 * @see	getNumQuads()
+		 * @see		getNumRenderElements()
+		 * @see		getNumQuads()
+		 *
+		 * @note	Internal method.
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const = 0;
 
 		/**
 		 * @brief	Recreates the internal render elements. Must be called before fillBuffer if element is dirty. 
 		 * 			Marks the element as non dirty.
-		 */
-		void updateRenderElements();
-
-		/**
-		 * @brief	Sets or removes focus from an element. Will change element style.
-		 */
-		void setFocus(bool enabled);
-
-		/**
-		 * @brief	Sets new layout options for the element.
 		 *
-		 * @param	layoutOptions	Options that allows you to control how is the element positioned in
-		 *							GUI layout. This will override any similar options set by style.
-		 */
-		void setLayoutOptions(const GUIOptions& layoutOptions);
-
-		/**
-		 * @brief	Sets new style to be used by the element.
+		 * @note	Internal method.
 		 */
-		void setStyle(const String& styleName);
+		void _updateRenderElements();
 
 		/**
 		 * @brief	Gets internal element style representing the exact type of GUI element
 		 *			in this object.
+		 *
+		 * @note	Internal method.
 		 */
-		virtual ElementType getElementType() const { return ElementType::Undefined; }
+		virtual ElementType _getElementType() const { return ElementType::Undefined; }
 
 		/**
 		 * @brief	Called when a mouse event is received on any GUI element the mouse is interacting
 		 *			with. Return true if you have processed the event and don't want other elements to process it.
+		 *
+		 * @note	Internal method.
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		/**
 		 * @brief	Called when some text is input and the GUI element has input focus. 
 		 *			Return true if you have processed the event and don't want other elements to process it.
+		 *
+		 * @note	Internal method.
 		 */	
-		virtual bool textInputEvent(const GUITextInputEvent& ev);
+		virtual bool _textInputEvent(const GUITextInputEvent& ev);
 
 		/**
 		 * @brief	Called when a command event is triggered. Return true if you have processed the event and 
 		 *			don't want other elements to process it.
+		 *
+		 * @note	Internal method.
 		 */
-		virtual bool commandEvent(const GUICommandEvent& ev);
+		virtual bool _commandEvent(const GUICommandEvent& ev);
 
 		/**
 		 * @brief	Called when a virtual button is pressed/released and the GUI element has input focus. 
 		 *			Return true if you have processed the event and don't want other elements to process it.
+		 *
+		 * @note	Internal method.
 		 */
-		virtual bool virtualButtonEvent(const GUIVirtualButtonEvent& ev);
-
-		/**
-		 * @brief	Destroy the element. Removes it from parent and widget, and queues
-		 *			it for deletion. Element memory will be released delayed, next frame.
-		 */	
-		static void destroy(GUIElement* element);
-
-		/************************************************************************/
-		/* 							INTERNAL METHODS                      		*/
-		/************************************************************************/
+		virtual bool _virtualButtonEvent(const GUIVirtualButtonEvent& ev);
 
 		/**
 		 * @brief	Set widget part of element depth. (Most significant part)
@@ -177,27 +229,6 @@ namespace BansheeEngine
 		 */
 		void _setElementDepth(UINT8 depth);
 
-		/**
-		 * @brief	Sets element position relative to widget origin.
-		 *
-		 * @note	Internal method.
-		 */
-		void _setOffset(const Vector2I& offset);
-
-		/**
-		 * @brief	Sets element width in pixels.
-		 *
-		 * @note	Internal method.
-		 */
-		void _setWidth(UINT32 width);
-
-		/**
-		 * @brief	Sets element height in pixels.
-		 *
-		 * @note	Internal method.
-		 */
-		void _setHeight(UINT32 height);
-
 		/**
 		 * @brief	Sets a clip rectangle that GUI element sprite will be clipped to. 
 		 *			Rectangle is in local coordinates. (Relative to GUIElement position)
@@ -211,7 +242,7 @@ namespace BansheeEngine
 		 *
 		 * @note	This value is updated during layout update which means it might be out of date
 		 *			if parent element bounds changed since.
-		 *			Internal method:
+		 *			Internal method.
 		 */
 		Rect2I _getCachedBounds() const;
 
@@ -358,7 +389,7 @@ namespace BansheeEngine
 		 *
 		 * @note	Internal method.
 		 */
-		virtual GUIContextMenu* getContextMenu() const { return nullptr; }
+		virtual GUIContextMenu* _getContextMenu() const { return nullptr; }
 
 		/**
 		 * @brief	Returns a clip rectangle relative to the element, used for offsetting
@@ -431,18 +462,18 @@ namespace BansheeEngine
 		/**
 		 * @brief	Returns clipped bounds excluding the margins. Relative to parent widget.
 		 */
-		Rect2I getVisibleBounds() const;
+		Rect2I getCachedVisibleBounds() const;
 
 		/**
 		 * @brief	Returns bounds of the content contained within the GUI element. Relative to parent widget.
 		 */
-		Rect2I getContentBounds() const;
+		Rect2I getCachedContentBounds() const;
 
 		/**
 		 * @brief	Returns a clip rectangle that can be used for clipping the contents of this
 		 *			GUI element. Clip rect is relative to GUI element origin.
 		 */
-		Rect2I getContentClipRect() const;
+		Rect2I getCachedContentClipRect() const;
 
 		bool mIsDestroyed;
 		GUILayoutOptions mLayoutOptions;

+ 4 - 4
BansheeEngine/Include/BsGUIElementContainer.h

@@ -18,22 +18,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**

+ 10 - 10
BansheeEngine/Include/BsGUIInputBox.h

@@ -84,7 +84,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::InputBox; }
+		virtual ElementType _getElementType() const { return ElementType::InputBox; }
 
 		/**
 		 * @copydoc	GUIElement::_getOptimalSize
@@ -112,22 +112,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements()
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial()
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads()
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer()
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**
@@ -143,22 +143,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::mouseEvent
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		/**
 		 * @copydoc	GUIElement::textInputEvent
 		 */
-		virtual bool textInputEvent(const GUITextInputEvent& ev);
+		virtual bool _textInputEvent(const GUITextInputEvent& ev);
 
 		/**
 		 * @copydoc	GUIElement::commandEvent
 		 */
-		virtual bool commandEvent(const GUICommandEvent& ev);
+		virtual bool _commandEvent(const GUICommandEvent& ev);
 
 		/**
 		 * @copydoc	GUIElement::virtualButtonEvent
 		 */
-		virtual bool virtualButtonEvent(const GUIVirtualButtonEvent& ev);
+		virtual bool _virtualButtonEvent(const GUIVirtualButtonEvent& ev);
 
 		/**
 		 * @brief	Returns how much to offset text due to scrolling.
@@ -193,7 +193,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::getContextMenu
 		 */
-		virtual GUIContextMenu* getContextMenu() const;
+		virtual GUIContextMenu* _getContextMenu() const;
 	private:
 		/**
 		 * @brief	Retrieves a sprite from a render element index, and a local render element index

+ 5 - 5
BansheeEngine/Include/BsGUILabel.h

@@ -75,29 +75,29 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::Label; }
+		virtual ElementType _getElementType() const { return ElementType::Label; }
 	protected:
 		~GUILabel();
 
 		/**
 		 * @copydoc GUIElement::getNumRenderElements
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**

+ 47 - 0
BansheeEngine/Include/BsGUILayoutExplicit.h

@@ -0,0 +1,47 @@
+#pragma once
+
+#include "BsPrerequisites.h"
+#include "BsGUILayout.h"
+
+namespace BansheeEngine
+{
+	/**
+	* @brief	Represents an explicit layout that respects bounds originally set by the element
+	*			(i.e. it won't position or resize GUI elements like other layouts)
+	*/
+	class BS_EXPORT GUILayoutExplicit : public GUILayout
+	{
+	public:
+		GUILayoutExplicit(GUIArea* parentArea);
+		GUILayoutExplicit() {};
+		~GUILayoutExplicit() {};
+
+		/**
+		 * @brief	Calculate optimal sizes of all child layout elements.
+		 */
+		void _updateOptimalLayoutSizes();
+
+		/**
+		 * @copydoc	GUIElementBase::_calculateOptimalLayoutSize
+		 */
+		virtual Vector2I _calculateOptimalLayoutSize() const;
+
+		/**
+		 * @copydoc	GUILayout::_getElementAreas
+		 */
+		void _getElementAreas(INT32 x, INT32 y, UINT32 width, UINT32 height, Rect2I* elementAreas, UINT32 numElements, const Vector<Vector2I>& optimalSizes) const;
+	protected:
+		/**
+		 * @brief	Positions/size all child layout elements based on the provided settings and their (previously calculated) optimal sizes.
+		 *
+		 * @brief	x			Start X coordinate of the layout area. First element will be placed here. Relative to parent widget.
+		 * @brief	y			Start Y coordinate of the layout area. First element will be placed here. Relative to parent widget.
+		 * @brief	width		Maximum width of the layout in pixels. Elements will be optimized so they best fit within this width if possible.
+		 * @brief	height		Maximum height of the layout in pixels. Elements will be optimized so they best fit within this height if possible.
+		 * @brief	clipRect	Rectangle to clip all child elements to. Relative to parent widget. Usually equal to specified x, y, width, height parameters.
+		 * @brief	widgetDepth	Depth of the parent widget. Determines depth at which child elements will be placed on. Takes priority over any other depth.
+		 * @brief	areaDepth	Depth of the parent area. Determines depth at which child elements will be placed on. Takes priority over element-specific depth.
+		 */
+		void _updateLayoutInternal(INT32 x, INT32 y, UINT32 width, UINT32 height, Rect2I clipRect, UINT8 widgetDepth, UINT16 areaDepth);
+	};
+}

+ 2 - 2
BansheeEngine/Include/BsGUIListBox.h

@@ -55,7 +55,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIButtonBase::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::ListBox; }
+		virtual ElementType _getElementType() const { return ElementType::ListBox; }
 
 		/**
 		 * @brief	Triggered whenever user selects a new element in the list box. Returned index
@@ -71,7 +71,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIButtonBase::mouseEvent
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		/**
 		 * @brief	Triggered when user clicks on an element.

+ 2 - 2
BansheeEngine/Include/BsGUIScrollArea.h

@@ -74,7 +74,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElementContainer::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::ScrollArea; }
+		virtual ElementType _getElementType() const { return ElementType::ScrollArea; }
 
 		/**
 		 * @brief	Returns the scroll area layout that you may use to add elements inside the scroll area.
@@ -134,7 +134,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElementContainer::mouseEvent
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		/**
 		 * @brief	Scrolls the contents to the specified position.

+ 4 - 4
BansheeEngine/Include/BsGUIScrollBar.h

@@ -72,22 +72,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**

+ 5 - 5
BansheeEngine/Include/BsGUISliderHandle.h

@@ -95,22 +95,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements()
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial()
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads()
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer()
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**
@@ -128,7 +128,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::mouseEvent
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 		/**
 		 * @brief	Checks are the specified over the scroll handle. Coordinates are relative

+ 5 - 5
BansheeEngine/Include/BsGUITexture.h

@@ -158,7 +158,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIElement::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::Texture; }
+		virtual ElementType _getElementType() const { return ElementType::Texture; }
 
 		/**
 		 * @copydoc	GUIElement::_getOptimalSize
@@ -172,22 +172,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**

+ 2 - 2
BansheeEngine/Include/BsGUIToggle.h

@@ -117,7 +117,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIButtonBase::getElementType
 		 */
-		virtual ElementType getElementType() const { return ElementType::Toggle; }
+		virtual ElementType _getElementType() const { return ElementType::Toggle; }
 
 		/**
 		 * @brief	Sets a toggle group of the toggle button. Toggling one button in a group will
@@ -139,7 +139,7 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	GUIButtonBase::mouseEvent
 		 */
-		virtual bool mouseEvent(const GUIMouseEvent& ev);
+		virtual bool _mouseEvent(const GUIMouseEvent& ev);
 
 	protected:
 		std::shared_ptr<GUIToggleGroup> mToggleGroup;

+ 4 - 4
BansheeEngine/Include/BsGUIViewport.h

@@ -61,22 +61,22 @@ namespace BansheeEngine
 		/**
 		 * @copydoc GUIElement::getNumRenderElements
 		 */
-		virtual UINT32 getNumRenderElements() const;
+		virtual UINT32 _getNumRenderElements() const;
 
 		/**
 		 * @copydoc GUIElement::getMaterial
 		 */
-		virtual const GUIMaterialInfo& getMaterial(UINT32 renderElementIdx) const;
+		virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::getNumQuads
 		 */
-		virtual UINT32 getNumQuads(UINT32 renderElementIdx) const;
+		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const;
 
 		/**
 		 * @copydoc GUIElement::fillBuffer
 		 */
-		virtual void fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
 			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const;
 
 		/**

+ 8 - 8
BansheeEngine/Source/BsGUIButtonBase.cpp

@@ -58,7 +58,7 @@ namespace BansheeEngine
 		return ((INT32)mActiveState & 0x10) != 0;
 	}
 
-	UINT32 GUIButtonBase::getNumRenderElements() const
+	UINT32 GUIButtonBase::_getNumRenderElements() const
 	{
 		UINT32 numElements = mImageSprite->getNumRenderElements();
 		numElements += mTextSprite->getNumRenderElements();
@@ -69,7 +69,7 @@ namespace BansheeEngine
 		return numElements;
 	}
 
-	const GUIMaterialInfo& GUIButtonBase::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUIButtonBase::_getMaterial(UINT32 renderElementIdx) const
 	{
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
 		UINT32 contentImgSpriteIdx = textSpriteIdx + mTextSprite->getNumRenderElements();
@@ -82,7 +82,7 @@ namespace BansheeEngine
 			return mImageSprite->getMaterial(renderElementIdx);
 	}
 
-	UINT32 GUIButtonBase::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUIButtonBase::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
 		UINT32 contentImgSpriteIdx = textSpriteIdx + mTextSprite->getNumRenderElements();
@@ -173,7 +173,7 @@ namespace BansheeEngine
 		return 2;
 	}
 
-	void GUIButtonBase::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUIButtonBase::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
@@ -187,8 +187,8 @@ namespace BansheeEngine
 			return;
 		}
 
-		Rect2I contentBounds = getContentBounds();
-		Rect2I contentClipRect = getContentClipRect();
+		Rect2I contentBounds = getCachedContentBounds();
+		Rect2I contentClipRect = getCachedContentClipRect();
 		Rect2I textBounds = mTextSprite->getBounds(Vector2I(), Rect2I());
 
 		Vector2I textOffset;
@@ -250,7 +250,7 @@ namespace BansheeEngine
 		}
 	}
 
-	bool GUIButtonBase::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIButtonBase::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		if(ev.getType() == GUIMouseEventType::MouseOver)
 		{
@@ -301,7 +301,7 @@ namespace BansheeEngine
 		textDesc.font = _getStyle()->font;
 		textDesc.fontSize = _getStyle()->fontSize;
 
-		Rect2I textBounds = getContentBounds();
+		Rect2I textBounds = getCachedContentBounds();
 
 		textDesc.width = textBounds.width;
 		textDesc.height = textBounds.height;

+ 4 - 4
BansheeEngine/Source/BsGUIDropDownHitBox.cpp

@@ -28,9 +28,9 @@ namespace BansheeEngine
 
 	}
 
-	bool GUIDropDownHitBox::commandEvent(const GUICommandEvent& ev)
+	bool GUIDropDownHitBox::_commandEvent(const GUICommandEvent& ev)
 	{
-		bool processed = GUIElementContainer::commandEvent(ev);
+		bool processed = GUIElementContainer::_commandEvent(ev);
 
 		if(ev.getType() == GUICommandEventType::FocusGained)
 		{
@@ -50,9 +50,9 @@ namespace BansheeEngine
 		return processed;
 	}
 
-	bool GUIDropDownHitBox::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIDropDownHitBox::_mouseEvent(const GUIMouseEvent& ev)
 	{
-		bool processed = GUIElementContainer::mouseEvent(ev);
+		bool processed = GUIElementContainer::_mouseEvent(ev);
 
 		if(mCaptureMouse)
 		{

+ 31 - 13
BansheeEngine/Source/BsGUIElement.cpp

@@ -4,6 +4,7 @@
 #include "BsGUILayout.h"
 #include "BsGUIManager.h"
 #include "BsException.h"
+#include "BsGUILayoutUtility.h"
 
 namespace BansheeEngine
 {
@@ -17,7 +18,7 @@ namespace BansheeEngine
 	GUIElement::~GUIElement()
 	{ }
 
-	void GUIElement::updateRenderElements()
+	void GUIElement::_updateRenderElements()
 	{
 		updateRenderElementsInternal();
 		_markAsClean();
@@ -51,22 +52,22 @@ namespace BansheeEngine
 		_refreshStyle();
 	}
 
-	bool GUIElement::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIElement::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		return false;
 	}
 
-	bool GUIElement::textInputEvent(const GUITextInputEvent& ev)
+	bool GUIElement::_textInputEvent(const GUITextInputEvent& ev)
 	{
 		return false;
 	}
 
-	bool GUIElement::commandEvent(const GUICommandEvent& ev)
+	bool GUIElement::_commandEvent(const GUICommandEvent& ev)
 	{
 		return false;
 	}
 
-	bool GUIElement::virtualButtonEvent(const GUIVirtualButtonEvent& ev)
+	bool GUIElement::_virtualButtonEvent(const GUIVirtualButtonEvent& ev)
 	{
 		return false;
 	}
@@ -89,7 +90,7 @@ namespace BansheeEngine
 		markMeshAsDirty();
 	}
 
-	void GUIElement::_setOffset(const Vector2I& offset) 
+	void GUIElement::setOffset(const Vector2I& offset) 
 	{ 
 		if(mOffset != offset)
 		{
@@ -100,7 +101,7 @@ namespace BansheeEngine
 		}
 	}
 
-	void GUIElement::_setWidth(UINT32 width) 
+	void GUIElement::setWidth(UINT32 width) 
 	{ 
 		if(mWidth != width)
 			markContentAsDirty();
@@ -108,7 +109,7 @@ namespace BansheeEngine
 		mWidth = width; 
 	}
 
-	void GUIElement::_setHeight(UINT32 height) 
+	void GUIElement::setHeight(UINT32 height) 
 	{ 
 		if(mHeight != height)
 			markContentAsDirty();
@@ -222,7 +223,7 @@ namespace BansheeEngine
 		markContentAsDirty();
 	}
 
-	Rect2I GUIElement::getVisibleBounds() const
+	Rect2I GUIElement::getCachedVisibleBounds() const
 	{
 		Rect2I bounds = _getClippedBounds();
 		
@@ -234,7 +235,7 @@ namespace BansheeEngine
 		return bounds;
 	}
 
-	Rect2I GUIElement::getContentBounds() const
+	Rect2I GUIElement::getCachedContentBounds() const
 	{
 		Rect2I bounds;
 
@@ -248,9 +249,9 @@ namespace BansheeEngine
 		return bounds;
 	}
 
-	Rect2I GUIElement::getContentClipRect() const
+	Rect2I GUIElement::getCachedContentClipRect() const
 	{
-		Rect2I contentBounds = getContentBounds();
+		Rect2I contentBounds = getCachedContentBounds();
 		
 		// Transform into element space so we can clip it using the element clip rectangle
 		Vector2I offsetDiff = Vector2I(contentBounds.x - mOffset.x, contentBounds.y - mOffset.y);
@@ -266,7 +267,7 @@ namespace BansheeEngine
 
 	bool GUIElement::_isInBounds(const Vector2I position) const
 	{
-		Rect2I contentBounds = getVisibleBounds();
+		Rect2I contentBounds = getCachedVisibleBounds();
 
 		return contentBounds.contains(position);
 	}
@@ -314,4 +315,21 @@ namespace BansheeEngine
 
 		GUIManager::instance().queueForDestroy(element);
 	}
+
+	Rect2I GUIElement::getBounds() const
+	{
+		return GUILayoutUtility::calcBounds(this);
+	}
+
+	Rect2I GUIElement::getVisibleBounds() const
+	{
+		Rect2I bounds = getBounds();
+
+		bounds.x += mStyle->margins.left;
+		bounds.y += mStyle->margins.top;
+		bounds.width = (UINT32)std::max(0, (INT32)bounds.width - (INT32)(mStyle->margins.left + mStyle->margins.right));
+		bounds.height = (UINT32)std::max(0, (INT32)bounds.height - (INT32)(mStyle->margins.top + mStyle->margins.bottom));
+
+		return bounds;
+	}
 }

+ 4 - 4
BansheeEngine/Source/BsGUIElementContainer.cpp

@@ -10,17 +10,17 @@ namespace BansheeEngine
 	GUIElementContainer::~GUIElementContainer()
 	{ }
 
-	UINT32 GUIElementContainer::getNumRenderElements() const
+	UINT32 GUIElementContainer::_getNumRenderElements() const
 	{
 		return 0;
 	}
 
-	const GUIMaterialInfo& GUIElementContainer::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUIElementContainer::_getMaterial(UINT32 renderElementIdx) const
 	{
 		BS_EXCEPT(InvalidStateException, "Trying to retrieve a material from an element with no render elements.");
 	}
 
-	UINT32 GUIElementContainer::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUIElementContainer::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		return 0;
 	}
@@ -30,7 +30,7 @@ namespace BansheeEngine
 		mClippedBounds = Rect2I(0, 0, 0, 0); // We don't want any mouse input for this element. This is just a container.
 	}
 
-	void GUIElementContainer::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUIElementContainer::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{ }
 

+ 13 - 13
BansheeEngine/Source/BsGUIInputBox.cpp

@@ -92,7 +92,7 @@ namespace BansheeEngine
 		}
 	}
 
-	UINT32 GUIInputBox::getNumRenderElements() const
+	UINT32 GUIInputBox::_getNumRenderElements() const
 	{
 		UINT32 numElements = mImageSprite->getNumRenderElements();
 		numElements += mTextSprite->getNumRenderElements();
@@ -112,7 +112,7 @@ namespace BansheeEngine
 		return numElements;
 	}
 
-	const GUIMaterialInfo& GUIInputBox::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUIInputBox::_getMaterial(UINT32 renderElementIdx) const
 	{
 		UINT32 localRenderElementIdx;
 		Sprite* sprite = renderElemToSprite(renderElementIdx, localRenderElementIdx);
@@ -120,7 +120,7 @@ namespace BansheeEngine
 		return sprite->getMaterial(localRenderElementIdx);
 	}
 
-	UINT32 GUIInputBox::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUIInputBox::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		UINT32 localRenderElementIdx;
 		Sprite* sprite = renderElemToSprite(renderElementIdx, localRenderElementIdx);
@@ -333,7 +333,7 @@ namespace BansheeEngine
 
 	Rect2I GUIInputBox::_getTextInputRect() const
 	{
-		Rect2I textBounds = getContentBounds();
+		Rect2I textBounds = getCachedContentBounds();
 		textBounds.x -= mOffset.x;
 		textBounds.y -= mOffset.y;
 
@@ -371,7 +371,7 @@ namespace BansheeEngine
 		return false;
 	}
 
-	void GUIInputBox::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUIInputBox::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		UINT32 localRenderElementIdx;
@@ -382,7 +382,7 @@ namespace BansheeEngine
 		sprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, localRenderElementIdx, offset, clipRect);
 	}
 
-	bool GUIInputBox::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIInputBox::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		if(ev.getType() == GUIMouseEventType::MouseOver)
 		{
@@ -498,7 +498,7 @@ namespace BansheeEngine
 		return false;
 	}
 
-	bool GUIInputBox::textInputEvent(const GUITextInputEvent& ev)
+	bool GUIInputBox::_textInputEvent(const GUITextInputEvent& ev)
 	{
 		if(mSelectionShown)
 			deleteSelectedText();
@@ -530,7 +530,7 @@ namespace BansheeEngine
 		return true;
 	}
 
-	bool GUIInputBox::commandEvent(const GUICommandEvent& ev)
+	bool GUIInputBox::_commandEvent(const GUICommandEvent& ev)
 	{
 		if(ev.getType() == GUICommandEventType::Redraw)
 		{
@@ -815,7 +815,7 @@ namespace BansheeEngine
 		return false;
 	}
 
-	bool GUIInputBox::virtualButtonEvent(const GUIVirtualButtonEvent& ev)
+	bool GUIInputBox::_virtualButtonEvent(const GUIVirtualButtonEvent& ev)
 	{
 		if(ev.getButton() == mCutVB)
 		{
@@ -1037,13 +1037,13 @@ namespace BansheeEngine
 
 	Vector2I GUIInputBox::getTextOffset() const
 	{
-		Rect2I textBounds = getContentBounds();
+		Rect2I textBounds = getCachedContentBounds();
 		return Vector2I(textBounds.x, textBounds.y) + mTextOffset;
 	}
 
 	Rect2I GUIInputBox::getTextClipRect() const
 	{
-		Rect2I contentClipRect = getContentClipRect();
+		Rect2I contentClipRect = getCachedContentClipRect();
 		return Rect2I(contentClipRect.x - mTextOffset.x, contentClipRect.y - mTextOffset.y, contentClipRect.width, contentClipRect.height);
 	}
 
@@ -1054,7 +1054,7 @@ namespace BansheeEngine
 		textDesc.font = _getStyle()->font;
 		textDesc.fontSize = _getStyle()->fontSize;
 
-		Rect2I textBounds = getContentBounds();
+		Rect2I textBounds = getCachedContentBounds();
 		textDesc.width = textBounds.width;
 		textDesc.height = textBounds.height;
 		textDesc.horzAlign = _getStyle()->textHorzAlign;
@@ -1079,7 +1079,7 @@ namespace BansheeEngine
 		return _getStyle()->normal.texture;
 	}
 
-	GUIContextMenu* GUIInputBox::getContextMenu() const
+	GUIContextMenu* GUIInputBox::_getContextMenu() const
 	{
 		static bool initialized = false;
 		static GUIContextMenu mContextMenu;

+ 4 - 4
BansheeEngine/Source/BsGUILabel.cpp

@@ -23,17 +23,17 @@ namespace BansheeEngine
 		bs_delete<PoolAlloc>(mTextSprite);
 	}
 
-	UINT32 GUILabel::getNumRenderElements() const
+	UINT32 GUILabel::_getNumRenderElements() const
 	{
 		return mTextSprite->getNumRenderElements();
 	}
 
-	const GUIMaterialInfo& GUILabel::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUILabel::_getMaterial(UINT32 renderElementIdx) const
 	{
 		return mTextSprite->getMaterial(renderElementIdx);
 	}
 
-	UINT32 GUILabel::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUILabel::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		return mTextSprite->getNumQuads(renderElementIdx);
 	}
@@ -64,7 +64,7 @@ namespace BansheeEngine
 		return GUIHelper::calcOptimalContentsSize(mContent, *_getStyle(), _getLayoutOptions());
 	}
 
-	void GUILabel::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUILabel::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		mTextSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, renderElementIdx, mOffset, mClipRect);

+ 88 - 0
BansheeEngine/Source/BsGUILayoutExplicit.cpp

@@ -0,0 +1,88 @@
+#include "BsGUILayoutExplicit.h"
+#include "BsGUIElement.h"
+#include "BsGUISpace.h"
+#include "BsMath.h"
+#include "BsVector2I.h"
+
+namespace BansheeEngine
+{
+	GUILayoutExplicit::GUILayoutExplicit(GUIArea* parentArea)
+		:GUILayout(parentArea)
+	{ }
+
+	Vector2I GUILayoutExplicit::_calculateOptimalLayoutSize() const
+	{
+		return Vector2I(0, 0);
+	}
+
+	void GUILayoutExplicit::_updateOptimalLayoutSizes()
+	{
+
+	}
+
+	void GUILayoutExplicit::_getElementAreas(INT32 x, INT32 y, UINT32 width, UINT32 height, Rect2I* elementAreas, UINT32 numElements, const Vector<Vector2I>& optimalSizes) const
+	{
+		assert(mChildren.size() == numElements);
+
+		// Compute offsets and height
+		UINT32 childIdx = 0;
+		for (auto& child : mChildren)
+		{
+			if (child->_getType() == GUIElementBase::Type::Element)
+			{
+				GUIElement* element = static_cast<GUIElement*>(child);
+
+				elementAreas[childIdx].x = element->_getOffset().x;
+				elementAreas[childIdx].y = element->_getOffset().y;
+				elementAreas[childIdx].width = element->_getWidth();
+				elementAreas[childIdx].height = element->_getHeight();
+			}
+			else if (child->_getType() == GUIElementBase::Type::Layout)
+			{
+				GUILayout* layout = static_cast<GUILayout*>(child);
+
+				elementAreas[childIdx].height = height;
+				elementAreas[childIdx].width = width;
+				elementAreas[childIdx].x = x;
+				elementAreas[childIdx].y = y;
+			}
+
+			childIdx++;
+		}
+	}
+
+	void GUILayoutExplicit::_updateLayoutInternal(INT32 x, INT32 y, UINT32 width, UINT32 height, Rect2I clipRect, UINT8 widgetDepth, UINT16 areaDepth)
+	{
+		UINT32 childIdx = 0;
+
+		mActualWidth = width;
+		mActualHeight = height;
+		for (auto& child : mChildren)
+		{
+			if (child->_getType() == GUIElementBase::Type::Element)
+			{
+				GUIElement* element = static_cast<GUIElement*>(child);
+				element->_setWidgetDepth(widgetDepth);
+				element->_setAreaDepth(areaDepth);
+
+				Vector2I offset = element->_getOffset();
+				Rect2I elemClipRect(clipRect.x - offset.x, clipRect.y - offset.y, clipRect.width, clipRect.height);
+				element->_setClipRect(elemClipRect);
+
+				Rect2I newClipRect(offset.x, offset.y, element->_getWidth(), element->_getHeight());
+				newClipRect.clip(clipRect);
+				element->_updateLayoutInternal(offset.x, offset.y, element->_getWidth(), element->_getHeight(), newClipRect, widgetDepth, areaDepth);
+			}
+			else if (child->_getType() == GUIElementBase::Type::Layout)
+			{
+				GUILayout* layout = static_cast<GUILayout*>(child);
+
+				layout->_updateLayoutInternal(x, y, width, height, clipRect, widgetDepth, areaDepth);
+			}
+
+			childIdx++;
+		}
+
+		_markAsClean();
+	}
+}

+ 5 - 5
BansheeEngine/Source/BsGUILayoutX.cpp

@@ -37,7 +37,7 @@ namespace BansheeEngine
 
 	void GUILayoutX::_updateOptimalLayoutSizes()
 	{
-		// Update all children first, otherwise we can't determine out own optimal size
+		// Update all children first, otherwise we can't determine our own optimal size
 		GUIElementBase::_updateOptimalLayoutSizes();
 
 		if(mChildren.size() != mOptimalSizes.size())
@@ -347,7 +347,7 @@ namespace BansheeEngine
 			if (child->_getType() == GUIElementBase::Type::Element)
 			{
 				GUIElement* element = static_cast<GUIElement*>(child);
-				element->_setWidth(elemWidth);
+				element->setWidth(elemWidth);
 
 				UINT32 elemHeight = optimalSizes[childIdx].y;
 				const GUILayoutOptions& layoutOptions = element->_getLayoutOptions();
@@ -412,11 +412,11 @@ namespace BansheeEngine
 			if(child->_getType() == GUIElementBase::Type::Element)
 			{
 				GUIElement* element = static_cast<GUIElement*>(child);
-				element->_setWidth(childArea.width);
-				element->_setHeight(childArea.height);
+				element->setWidth(childArea.width);
+				element->setHeight(childArea.height);
 
 				Vector2I offset(childArea.x, childArea.y);
-				element->_setOffset(offset);
+				element->setOffset(offset);
 				element->_setWidgetDepth(widgetDepth);
 				element->_setAreaDepth(areaDepth);
 

+ 3 - 3
BansheeEngine/Source/BsGUILayoutY.cpp

@@ -410,11 +410,11 @@ namespace BansheeEngine
 			{
 				GUIElement* element = static_cast<GUIElement*>(child);
 
-				element->_setWidth(childArea.width);
-				element->_setHeight(childArea.height);
+				element->setWidth(childArea.width);
+				element->setHeight(childArea.height);
 
 				Vector2I offset(childArea.x, childArea.y);
-				element->_setOffset(offset);
+				element->setOffset(offset);
 				element->_setWidgetDepth(widgetDepth);
 				element->_setAreaDepth(areaDepth);
 

+ 2 - 2
BansheeEngine/Source/BsGUIListBox.cpp

@@ -63,9 +63,9 @@ namespace BansheeEngine
 		elementSelected(idx);
 	}
 
-	bool GUIListBox::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIListBox::_mouseEvent(const GUIMouseEvent& ev)
 	{
-		bool processed = GUIButtonBase::mouseEvent(ev);
+		bool processed = GUIButtonBase::_mouseEvent(ev);
 
 		if(ev.getType() == GUIMouseEventType::MouseDown)
 		{

+ 7 - 7
BansheeEngine/Source/BsGUIManager.cpp

@@ -393,7 +393,7 @@ namespace BansheeEngine
 					if(element->_isDisabled())
 						continue;
 
-					UINT32 numRenderElems = element->getNumRenderElements();
+					UINT32 numRenderElems = element->_getNumRenderElements();
 					for(UINT32 i = 0; i < numRenderElems; i++)
 					{
 						allElements.insert(GUIGroupElement(element, i));
@@ -413,7 +413,7 @@ namespace BansheeEngine
 				Rect2I tfrmedBounds = guiElem->_getClippedBounds();
 				tfrmedBounds.transform(guiElem->_getParentWidget()->SO()->getWorldTfrm());
 
-				const GUIMaterialInfo& matInfo = guiElem->getMaterial(renderElemIdx);
+				const GUIMaterialInfo& matInfo = guiElem->_getMaterial(renderElemIdx);
 
 				UINT64 materialId = matInfo.material->getInternalID(); // TODO - I group based on material ID. So if two widgets used exact copies of the same material
 				// this system won't detect it. Find a better way of determining material similarity?
@@ -493,14 +493,14 @@ namespace BansheeEngine
 					foundGroup->bounds = tfrmedBounds;
 					foundGroup->elements.push_back(GUIGroupElement(guiElem, renderElemIdx));
 					foundGroup->matInfo = matInfo;
-					foundGroup->numQuads = guiElem->getNumQuads(renderElemIdx);
+					foundGroup->numQuads = guiElem->_getNumQuads(renderElemIdx);
 				}
 				else
 				{
 					foundGroup->bounds.encapsulate(tfrmedBounds);
 					foundGroup->elements.push_back(GUIGroupElement(guiElem, renderElemIdx));
 					foundGroup->depth = std::min(foundGroup->depth, elemDepth);
-					foundGroup->numQuads += guiElem->getNumQuads(renderElemIdx);
+					foundGroup->numQuads += guiElem->_getNumQuads(renderElemIdx);
 				}
 			}
 
@@ -565,9 +565,9 @@ namespace BansheeEngine
 				UINT32 quadOffset = 0;
 				for(auto& matElement : group->elements)
 				{
-					matElement.element->fillBuffer(vertices, uvs, indices, quadOffset, group->numQuads, vertexStride, indexStride, matElement.renderElement);
+					matElement.element->_fillBuffer(vertices, uvs, indices, quadOffset, group->numQuads, vertexStride, indexStride, matElement.renderElement);
 
-					UINT32 numQuads = matElement.element->getNumQuads(matElement.renderElement);
+					UINT32 numQuads = matElement.element->_getNumQuads(matElement.renderElement);
 					UINT32 indexStart = quadOffset * 6;
 					UINT32 indexEnd = indexStart + numQuads * 6;
 					UINT32 vertOffset = quadOffset * 4;
@@ -985,7 +985,7 @@ namespace BansheeEngine
 		{
 			for(auto& elementInfo : mElementsUnderPointer)
 			{
-				GUIContextMenu* menu = elementInfo.element->getContextMenu();
+				GUIContextMenu* menu = elementInfo.element->_getContextMenu();
 
 				if(menu != nullptr)
 				{

+ 6 - 6
BansheeEngine/Source/BsGUIProgressBar.cpp

@@ -50,9 +50,9 @@ namespace BansheeEngine
 		Vector2I bgOffset(x, y);
 		Rect2I bgClipRect(clipRect.x - bgOffset.x, clipRect.y - bgOffset.y, clipRect.width, clipRect.height);
 
-		mBackground->_setOffset(bgOffset);
-		mBackground->_setWidth(width);
-		mBackground->_setHeight(height);
+		mBackground->setOffset(bgOffset);
+		mBackground->setWidth(width);
+		mBackground->setHeight(height);
 		mBackground->_setAreaDepth(areaDepth);
 		mBackground->_setWidgetDepth(widgetDepth);
 		mBackground->_setClipRect(bgClipRect);
@@ -65,9 +65,9 @@ namespace BansheeEngine
 		UINT32 maxProgressBarWidth = std::max((UINT32)0, (UINT32)(width - style->margins.left - style->margins.right));
 		UINT32 progressBarHeight = std::max((UINT32)0, (UINT32)(height - style->margins.top - style->margins.bottom)); 
 
-		mBar->_setOffset(barOffset);
-		mBar->_setWidth((UINT32)Math::floorToInt(maxProgressBarWidth * mPercent));
-		mBar->_setHeight(progressBarHeight);
+		mBar->setOffset(barOffset);
+		mBar->setWidth((UINT32)Math::floorToInt(maxProgressBarWidth * mPercent));
+		mBar->setHeight(progressBarHeight);
 		mBar->_setAreaDepth(areaDepth);
 		mBar->_setWidgetDepth(widgetDepth);
 		mBar->_setClipRect(barClipRect);

+ 7 - 7
BansheeEngine/Source/BsGUIScrollArea.cpp

@@ -169,9 +169,9 @@ namespace BansheeEngine
 				scrollBarHeight = (UINT32)std::max(0, (INT32)scrollBarHeight - (INT32)ScrollBarWidth);
 
 			Vector2I offset(x + scrollBarOffset, y);
-			mVertScroll->_setOffset(offset);
-			mVertScroll->_setWidth(ScrollBarWidth);
-			mVertScroll->_setHeight(scrollBarHeight);
+			mVertScroll->setOffset(offset);
+			mVertScroll->setWidth(ScrollBarWidth);
+			mVertScroll->setHeight(scrollBarHeight);
 			mVertScroll->_setAreaDepth(areaDepth);
 			mVertScroll->_setWidgetDepth(widgetDepth);
 
@@ -226,9 +226,9 @@ namespace BansheeEngine
 				scrollBarWidth = (UINT32)std::max(0, (INT32)scrollBarWidth - (INT32)ScrollBarWidth);
 
 			Vector2I offset(x, y + scrollBarOffset);
-			mHorzScroll->_setOffset(offset);
-			mHorzScroll->_setWidth(scrollBarWidth);
-			mHorzScroll->_setHeight(ScrollBarWidth);
+			mHorzScroll->setOffset(offset);
+			mHorzScroll->setWidth(scrollBarWidth);
+			mHorzScroll->setHeight(ScrollBarWidth);
 			mHorzScroll->_setAreaDepth(areaDepth);
 			mHorzScroll->_setWidgetDepth(widgetDepth);
 
@@ -371,7 +371,7 @@ namespace BansheeEngine
 			mHorzScroll->scroll(-percent);
 	}
 
-	bool GUIScrollArea::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIScrollArea::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		if(ev.getType() == GUIMouseEventType::MouseWheelScroll)
 		{

+ 4 - 4
BansheeEngine/Source/BsGUIScrollBar.cpp

@@ -66,17 +66,17 @@ namespace BansheeEngine
 		GUIElement::destroy(mHandleBtn);
 	}
 
-	UINT32 GUIScrollBar::getNumRenderElements() const
+	UINT32 GUIScrollBar::_getNumRenderElements() const
 	{
 		return mImageSprite->getNumRenderElements();
 	}
 
-	const GUIMaterialInfo& GUIScrollBar::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUIScrollBar::_getMaterial(UINT32 renderElementIdx) const
 	{
 		return mImageSprite->getMaterial(renderElementIdx);
 	}
 
-	UINT32 GUIScrollBar::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUIScrollBar::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		return mImageSprite->getNumQuads(renderElementIdx);
 	}
@@ -116,7 +116,7 @@ namespace BansheeEngine
 		return 3;
 	}
 
-	void GUIScrollBar::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUIScrollBar::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, renderElementIdx, mOffset, mClipRect);

+ 6 - 6
BansheeEngine/Source/BsGUISlider.cpp

@@ -58,16 +58,16 @@ namespace BansheeEngine
 		Vector2I offset(x, y);
 		Rect2I elemClipRect(clipRect.x - offset.x, clipRect.y - offset.y, clipRect.width, clipRect.height);
 
-		mBackground->_setOffset(offset);
-		mBackground->_setWidth(width);
-		mBackground->_setHeight(height);
+		mBackground->setOffset(offset);
+		mBackground->setWidth(width);
+		mBackground->setHeight(height);
 		mBackground->_setAreaDepth(areaDepth);
 		mBackground->_setWidgetDepth(widgetDepth);
 		mBackground->_setClipRect(elemClipRect);
 
-		mSliderHandle->_setOffset(offset);
-		mSliderHandle->_setWidth(width);
-		mSliderHandle->_setHeight(height);
+		mSliderHandle->setOffset(offset);
+		mSliderHandle->setWidth(width);
+		mSliderHandle->setHeight(height);
 		mSliderHandle->_setAreaDepth(areaDepth);
 		mSliderHandle->_setWidgetDepth(widgetDepth);
 		mSliderHandle->_setClipRect(elemClipRect);

+ 5 - 5
BansheeEngine/Source/BsGUISliderHandle.cpp

@@ -72,17 +72,17 @@ namespace BansheeEngine
 		return getMaxSize() - mHandleSize;
 	}
 
-	UINT32 GUISliderHandle::getNumRenderElements() const
+	UINT32 GUISliderHandle::_getNumRenderElements() const
 	{
 		return mImageSprite->getNumRenderElements();
 	}
 
-	const GUIMaterialInfo& GUISliderHandle::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUISliderHandle::_getMaterial(UINT32 renderElementIdx) const
 	{
 		return mImageSprite->getMaterial(renderElementIdx);
 	}
 
-	UINT32 GUISliderHandle::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUISliderHandle::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		return mImageSprite->getNumQuads(renderElementIdx);
 	}
@@ -135,7 +135,7 @@ namespace BansheeEngine
 		return Vector2I();
 	}
 
-	void GUISliderHandle::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUISliderHandle::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		Vector2I offset = mOffset;
@@ -154,7 +154,7 @@ namespace BansheeEngine
 			vertexStride, indexStride, renderElementIdx, offset, clipRect);
 	}
 
-	bool GUISliderHandle::mouseEvent(const GUIMouseEvent& ev)
+	bool GUISliderHandle::_mouseEvent(const GUIMouseEvent& ev)
 	{
 		if(ev.getType() == GUIMouseEventType::MouseMove)
 		{

+ 4 - 4
BansheeEngine/Source/BsGUITexture.cpp

@@ -108,17 +108,17 @@ namespace BansheeEngine
 		markContentAsDirty();
 	}
 
-	UINT32 GUITexture::getNumRenderElements() const
+	UINT32 GUITexture::_getNumRenderElements() const
 	{
 		return mImageSprite->getNumRenderElements();
 	}
 
-	const GUIMaterialInfo& GUITexture::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUITexture::_getMaterial(UINT32 renderElementIdx) const
 	{
 		return mImageSprite->getMaterial(renderElementIdx);
 	}
 
-	UINT32 GUITexture::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUITexture::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		return mImageSprite->getNumQuads(renderElementIdx);
 	}
@@ -228,7 +228,7 @@ namespace BansheeEngine
 		return optimalSize;
 	}
 
-	void GUITexture::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUITexture::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 		mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, renderElementIdx, mOffset, mClipRect);

+ 2 - 2
BansheeEngine/Source/BsGUIToggle.cpp

@@ -167,9 +167,9 @@ namespace BansheeEngine
 		}
 	}
 
-	bool GUIToggle::mouseEvent(const GUIMouseEvent& ev)
+	bool GUIToggle::_mouseEvent(const GUIMouseEvent& ev)
 	{
-		bool processed = GUIButtonBase::mouseEvent(ev);
+		bool processed = GUIButtonBase::_mouseEvent(ev);
 
 		if(ev.getType() == GUIMouseEventType::MouseUp)
 		{

+ 4 - 4
BansheeEngine/Source/BsGUIViewport.cpp

@@ -40,17 +40,17 @@ namespace BansheeEngine
 		return new (bs_alloc<GUIViewport, PoolAlloc>()) GUIViewport(getStyleName<GUIViewport>(styleName), camera, aspectRatio, fieldOfView, GUILayoutOptions::create(layoutOptions));
 	}
 
-	UINT32 GUIViewport::getNumRenderElements() const
+	UINT32 GUIViewport::_getNumRenderElements() const
 	{
 		return 0;
 	}
 
-	const GUIMaterialInfo& GUIViewport::getMaterial(UINT32 renderElementIdx) const
+	const GUIMaterialInfo& GUIViewport::_getMaterial(UINT32 renderElementIdx) const
 	{
 		BS_EXCEPT(InternalErrorException, "This element has no render element so no material can be retrieved.");
 	}
 
-	UINT32 GUIViewport::getNumQuads(UINT32 renderElementIdx) const
+	UINT32 GUIViewport::_getNumQuads(UINT32 renderElementIdx) const
 	{
 		return 0;
 	}
@@ -68,7 +68,7 @@ namespace BansheeEngine
 		return Vector2I(0, 0);
 	}
 
-	void GUIViewport::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
+	void GUIViewport::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
 		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 

+ 5 - 5
BansheeEngine/Source/BsGUIWidget.cpp

@@ -117,22 +117,22 @@ namespace BansheeEngine
 
 	bool GUIWidget::_mouseEvent(GUIElement* element, const GUIMouseEvent& ev)
 	{
-		return element->mouseEvent(ev);
+		return element->_mouseEvent(ev);
 	}
 
 	bool GUIWidget::_textInputEvent(GUIElement* element, const GUITextInputEvent& ev)
 	{
-		return element->textInputEvent(ev);
+		return element->_textInputEvent(ev);
 	}
 
 	bool GUIWidget::_commandEvent(GUIElement* element, const GUICommandEvent& ev)
 	{
-		return element->commandEvent(ev);
+		return element->_commandEvent(ev);
 	}
 
 	bool GUIWidget::_virtualButtonEvent(GUIElement* element, const GUIVirtualButtonEvent& ev)
 	{
-		return element->virtualButtonEvent(ev);
+		return element->_virtualButtonEvent(ev);
 	}
 
 	void GUIWidget::registerElement(GUIElement* elem)
@@ -207,7 +207,7 @@ namespace BansheeEngine
 				if(elem->_isContentDirty())
 				{
 					dirty = true;
-					elem->updateRenderElements();
+					elem->_updateRenderElements();
 				}
 
 				if(elem->_isMeshDirty())

+ 1 - 10
TODO.txt

@@ -7,20 +7,11 @@ Possibly set up automatic refresh in debug mode after initialization? As an ad-h
 
 <<<<<Simple stuff>>>>>>
 
-ColorPicker
- - Add slider GUI control if I don't have it already. It should be separate from the background image control.
- - Make sure I can set GUI area depth from C# (and think about how to do it neatly - probably just limit to to -128 - 127)
-
 Test file/folder open/save dialog
 
-Make sure that GUIArea depth works in C#
-
 Add a simple way to create modal dialogs (ModalDialog in C#, similar to EditorWindow)
 
-TODO: Progress bar/slider:
- - Add proper GUI styles for them
- - Test them
- - Add C# wrappers for them
+Add C# wrappers for progress bar, slider, GUILayoutExplicit and GUIElement bounds and visible bounds (with ability to set non-visible bounds)
 
 <<<<<<Handles>>>>>>>>