Browse Source

Fixing an alloc/dealloc issue that was happening when GUI layout update was called on a layout with 0 elements

Marko Pintera 12 years ago
parent
commit
165460839a

+ 1 - 2
BansheeEngine/Include/BsGUIMenuBar.h

@@ -17,8 +17,7 @@ namespace BansheeEngine
 		GUIMenuBar(BS::GUIWidget* parent);
 		virtual ~GUIMenuBar();
 
-		void setSize(CM::UINT32 width, CM::UINT32 height);
-		void setPosition(CM::INT32 x, CM::INT32 y);
+		void setArea(CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height);
 
 		const GUIMenuItem* addMenuItem(const CM::WString& path, std::function<void()> callback);
 		const GUIMenuItem* addSeparator(const CM::WString& path);

+ 1 - 0
BansheeEngine/Include/BsPrerequisites.h

@@ -61,6 +61,7 @@ namespace BansheeEngine
 	class GUIMenuItem;
 	class GUIContent;
 	class GUIContextMenu;
+	class GUIMenuBar;
 
 	// 2D
 	class TextSprite;

+ 21 - 9
BansheeEngine/Source/BsGUILayoutX.cpp

@@ -85,14 +85,21 @@ namespace BansheeEngine
 		UINT32 numNonClampedElements = 0;
 		UINT32 numFlexibleSpaces = 0;
 
-		bool* processedElements = stackAllocN<bool>((UINT32)mChildren.size(), HID_Main);
-		memset(processedElements, 0, mChildren.size() * sizeof(bool));
+		bool* processedElements = nullptr;
+		UINT32* elementSizes = nullptr;
+		float* elementScaleWeights = nullptr;
 
-		UINT32* elementSizes = stackAllocN<UINT32>((UINT32)mChildren.size(), HID_Main);
-		memset(elementSizes, 0, mChildren.size() * sizeof(UINT32));
+		if(mChildren.size() > 0)
+		{
+			processedElements = stackAllocN<bool>((UINT32)mChildren.size(), HID_Main);
+			memset(processedElements, 0, mChildren.size() * sizeof(bool));
+
+			elementSizes = stackAllocN<UINT32>((UINT32)mChildren.size(), HID_Main);
+			memset(elementSizes, 0, mChildren.size() * sizeof(UINT32));
 
-		float* elementScaleWeights = stackAllocN<float>((UINT32)mChildren.size(), HID_Main);
-		memset(elementScaleWeights, 0, mChildren.size() * sizeof(float));
+			elementScaleWeights = stackAllocN<float>((UINT32)mChildren.size(), HID_Main);
+			memset(elementScaleWeights, 0, mChildren.size() * sizeof(float));
+		}
 
 		// Set initial sizes, count number of children per type and mark fixed elements as already processed
 		UINT32 childIdx = 0;
@@ -389,9 +396,14 @@ namespace BansheeEngine
 			childIdx++;
 		}
 
-		stackDeallocLast(elementScaleWeights, HID_Main);
-		stackDeallocLast(elementSizes, HID_Main);
-		stackDeallocLast(processedElements, HID_Main);
+		if(elementScaleWeights != nullptr)
+			stackDeallocLast(elementScaleWeights, HID_Main);
+
+		if(elementSizes != nullptr)
+			stackDeallocLast(elementSizes, HID_Main);
+
+		if(processedElements != nullptr)
+			stackDeallocLast(processedElements, HID_Main);
 
 		_markAsClean();
 	}

+ 1 - 4
BansheeEngine/Source/BsGUIMenuBar.cpp

@@ -29,14 +29,11 @@ namespace BansheeEngine
 		GUIArea::destroy(mBackgroundArea);
 	}
 
-	void GUIMenuBar::setPosition(CM::INT32 x, CM::INT32 y)
+	void GUIMenuBar::setArea(CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height)
 	{
 		mMainArea->setPosition(x, y);
 		mBackgroundArea->setPosition(x, y);
-	}
 
-	void GUIMenuBar::setSize(CM::UINT32 width, CM::UINT32 height)
-	{
 		mMainArea->setSize(width, height);
 		mBackgroundArea->setSize(width, height);
 	}

+ 1 - 0
CamelotClient/Include/BsMainEditorWindow.h

@@ -12,6 +12,7 @@ namespace BansheeEditor
 		~MainEditorWindow();
 
 	protected:
+		BS::GUIMenuBar* mMenuBar;
 		DockManager* mDockManager;
 
 		virtual void movedOrResized();

+ 8 - 2
CamelotClient/Source/BsMainEditorWindow.cpp

@@ -1,5 +1,6 @@
 #include "BsMainEditorWindow.h"
 #include "BsDockManager.h"
+#include "BsGUIMenuBar.h"
 #include "BsCamera.h"
 #include "CmSceneObject.h"
 #include "CmRenderTexture.h"
@@ -17,12 +18,16 @@ using namespace BansheeEngine;
 namespace BansheeEditor
 {
 	MainEditorWindow::MainEditorWindow(CM::RenderWindowPtr renderWindow)
-		:EditorWindowBase(renderWindow), mDockManager(cm_new<DockManager>(mGUI.get()))
+		:EditorWindowBase(renderWindow), mDockManager(cm_new<DockManager>(mGUI.get())), mMenuBar(cm_new<GUIMenuBar>(mGUI.get()))
 	{
 		UINT32 widgetWidth = (UINT32)std::max(0, (INT32)getWidth() - 2);
 		UINT32 widgetHeight = (UINT32)std::max(0, (INT32)getHeight() - 2);
 
-		mDockManager->setArea(1, 1, widgetWidth, widgetHeight);
+		UINT32 menuBarHeight = 20;
+		mMenuBar->setArea(1, 1, widgetWidth, menuBarHeight);
+
+		UINT32 dockHeight = (UINT32)std::max(0, (INT32)widgetHeight - (INT32)menuBarHeight);
+		mDockManager->setArea(1, menuBarHeight + 1, widgetWidth, dockHeight);
 
 		// DEBUG ONLY
 
@@ -59,6 +64,7 @@ namespace BansheeEditor
 	MainEditorWindow::~MainEditorWindow()
 	{
 		cm_delete(mDockManager);
+		cm_delete(mMenuBar);
 	}
 
 	void MainEditorWindow::movedOrResized()