2
0
Эх сурвалжийг харах

Added GUILayoutUtility wrapper

Marko Pintera 11 жил өмнө
parent
commit
d1f7bb9e26

+ 4 - 4
MBansheeEngine/GUI/GUILayoutUtility.cs

@@ -10,18 +10,18 @@ namespace BansheeEngine
     {
         public static Vector2 CalculateOptimalSize(GUIElement element)
         {
-            return Internal_CalculateOptimalSize(element);
+            return Internal_CalculateOptimalSize(element.GetCachedPtr());
         }
 
         public static RectI CalculateBounds(GUIElement element)
         {
-            return Internal_CalculateBounds(element);
+            return Internal_CalculateBounds(element.GetCachedPtr());
         }
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern Vector2 Internal_CalculateOptimalSize(GUIElement element);
+        private static extern Vector2 Internal_CalculateOptimalSize(IntPtr element);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern RectI Internal_CalculateBounds(GUIElement element);
+        private static extern RectI Internal_CalculateBounds(IntPtr element);
     }
 }

+ 5 - 0
MBansheeEngine/ScriptObject.cs

@@ -12,6 +12,11 @@ namespace BansheeEngine
             Internal_ManagedInstanceDeleted(mCachedPtr);
         }
 
+        internal IntPtr GetCachedPtr()
+        {
+            return mCachedPtr;
+        }
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_ManagedInstanceDeleted(IntPtr nativeInstance);
     }

+ 48 - 14
SBansheeEngine/Include/BsScriptGUIElement.h

@@ -5,32 +5,32 @@
 
 namespace BansheeEngine
 {
-	class BS_SCR_BE_EXPORT ScriptGUIElementBase : public ScriptObjectBase
+	class BS_SCR_BE_EXPORT ScriptGUIElementBaseTBase : public ScriptObjectBase
 	{
 	public:
-		ScriptGUIElementBase(MonoObject* instance);
-		virtual ~ScriptGUIElementBase() {}
+		ScriptGUIElementBaseTBase(MonoObject* instance);
+		virtual ~ScriptGUIElementBaseTBase() {}
 
-		GUIElement* getGUIElement() const { return (GUIElement*)mElement; }
+		GUIElementBase* getGUIElement() const { return (GUIElementBase*)mElement; }
 
-		virtual void destroy();
+		virtual void destroy() = 0;
+		virtual void setParent(GUILayout* layout) = 0;
 
 	protected:
-		void initialize(GUIElement* element);
+		void initialize(GUIElementBase* element);
 
-	private:
 		bool mIsDestroyed;
-		GUIElement* mElement;
+		GUIElementBase* mElement;
 	};
 
 	template <class Type>
-	class TScriptGUIElement : public ScriptObject<Type, ScriptGUIElementBase>
+	class TScriptGUIElementBase : public ScriptObject<Type, ScriptGUIElementBaseTBase>
 	{
 	public:
-		virtual ~TScriptGUIElement() {}
+		virtual ~TScriptGUIElementBase() {}
 
 	protected:
-		TScriptGUIElement(MonoObject* instance, GUIElement* element)
+		TScriptGUIElementBase(MonoObject* instance, GUIElementBase* element)
 			:ScriptObject(instance)
 		{ 
 			initialize(element);
@@ -47,15 +47,49 @@ namespace BansheeEngine
 		}
 	};
 
+	class BS_SCR_BE_EXPORT ScriptGUIElementTBase : public ScriptGUIElementBaseTBase
+	{
+	public:
+		ScriptGUIElementTBase(MonoObject* instance);
+		virtual ~ScriptGUIElementTBase() {}
+
+		virtual void destroy();
+		virtual void setParent(GUILayout* layout);
+	};
+
+	template <class Type>
+	class TScriptGUIElement : public ScriptObject<Type, ScriptGUIElementTBase>
+	{
+	public:
+		virtual ~TScriptGUIElement() {}
+
+	protected:
+		TScriptGUIElement(MonoObject* instance, GUIElementBase* element)
+			:ScriptObject(instance)
+		{
+			initialize(element);
+		}
+
+		void _onManagedInstanceDeleted()
+		{
+			// Elements with a GUIWidget parent are destroyed automatically when widget is destroyed, but those without one
+			// we need to destroy manually.
+			if (getGUIElement()->_getParentWidget() == nullptr)
+				destroy();
+
+			ScriptObject::_onManagedInstanceDeleted();
+		}
+	};
+
 	class BS_SCR_BE_EXPORT ScriptGUIElement : public ScriptObject<ScriptGUIElement>
 	{
 	public:
 		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "GUIElement")
 
 	private:
-		static void internal_destroy(ScriptGUIElementBase* nativeInstance);
-		static void internal_setVisible(ScriptGUIElementBase* nativeInstance, bool visible);
-		static void internal_setParent(ScriptGUIElementBase* nativeInstance, MonoObject* parentLayout);
+		static void internal_destroy(ScriptGUIElementBaseTBase* nativeInstance);
+		static void internal_setVisible(ScriptGUIElementBaseTBase* nativeInstance, bool visible);
+		static void internal_setParent(ScriptGUIElementBaseTBase* nativeInstance, MonoObject* parentLayout);
 
 		ScriptGUIElement(MonoObject* instance);
 	};

+ 3 - 6
SBansheeEngine/Include/BsScriptGUIFixedSpace.h

@@ -1,26 +1,23 @@
 #pragma once
 
 #include "BsScriptEnginePrerequisites.h"
-#include "BsScriptObject.h"
+#include "BsScriptGUIElement.h"
 
 namespace BansheeEngine
 {
-	class BS_SCR_BE_EXPORT ScriptGUIFixedSpace : public ScriptObject<ScriptGUIFixedSpace>
+	class BS_SCR_BE_EXPORT ScriptGUIFixedSpace : public TScriptGUIElementBase<ScriptGUIFixedSpace>
 	{
 	public:
 		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "GUIFixedSpace")
 
 	private:
 		static void internal_createInstance(MonoObject* instance, MonoObject* parentLayout, UINT32 size);
-
-		static void internal_destroy(ScriptGUIFixedSpace* nativeInstance);
 		static void internal_setSize(ScriptGUIFixedSpace* nativeInstance, UINT32 size);
-		static void internal_setVisible(ScriptGUIFixedSpace* nativeInstance, bool visible);
-		static void internal_setParent(ScriptGUIFixedSpace* nativeInstance, MonoObject* parentLayout);
 
 		ScriptGUIFixedSpace(MonoObject* instance, GUIFixedSpace& fixedSpace, GUILayout* parentLayout);
 
 		void destroy();
+		void setParent(GUILayout* parentLayout);
 
 		GUIFixedSpace& mFixedSpace;
 		GUILayout* mParentLayout;

+ 3 - 6
SBansheeEngine/Include/BsScriptGUIFlexibleSpace.h

@@ -1,11 +1,11 @@
 #pragma once
 
 #include "BsScriptEnginePrerequisites.h"
-#include "BsScriptObject.h"
+#include "BsScriptGUIElement.h"
 
 namespace BansheeEngine
 {
-	class BS_SCR_BE_EXPORT ScriptGUIFlexibleSpace : public ScriptObject<ScriptGUIFlexibleSpace>
+	class BS_SCR_BE_EXPORT ScriptGUIFlexibleSpace : public TScriptGUIElementBase<ScriptGUIFlexibleSpace>
 	{
 	public:
 		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "GUIFlexibleSpace")
@@ -13,13 +13,10 @@ namespace BansheeEngine
 	private:
 		static void internal_createInstance(MonoObject* instance, MonoObject* parentLayout);
 
-		static void internal_destroy(ScriptGUIFlexibleSpace* nativeInstance);
-		static void internal_setVisible(ScriptGUIFlexibleSpace* nativeInstance, bool visible);
-		static void internal_setParent(ScriptGUIFlexibleSpace* nativeInstance, MonoObject* parentLayout);
-
 		ScriptGUIFlexibleSpace(MonoObject* instance, GUIFlexibleSpace& flexibleSpace, GUILayout* parentLayout);
 
 		void destroy();
+		void setParent(GUILayout* parentLayout);
 
 		GUIFlexibleSpace& mFlexibleSpace;
 		GUILayout* mParentLayout;

+ 3 - 6
SBansheeEngine/Include/BsScriptGUILayout.h

@@ -1,11 +1,11 @@
 #pragma once
 
 #include "BsScriptEnginePrerequisites.h"
-#include "BsScriptObject.h"
+#include "BsScriptGUIElement.h"
 
 namespace BansheeEngine
 {
-	class BS_SCR_BE_EXPORT ScriptGUILayout : public ScriptObject<ScriptGUILayout>
+	class BS_SCR_BE_EXPORT ScriptGUILayout : public TScriptGUIElementBase<ScriptGUILayout>
 	{
 	public:
 		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "GUILayout")
@@ -19,13 +19,10 @@ namespace BansheeEngine
 		static void internal_createInstanceYFromLayout(MonoObject* instance, MonoObject* parentLayout);
 		static void internal_createInstanceYFromScrollArea(MonoObject* instance, MonoObject* parentScrollArea);
 
-		static void internal_destroy(ScriptGUILayout* nativeInstance);
-		static void internal_setVisible(ScriptGUILayout* nativeInstance, bool visible);
-		static void internal_setParent(ScriptGUILayout* nativeInstance, MonoObject* parentLayout);
-
 		ScriptGUILayout(MonoObject* instance, GUILayout* layout, GUILayout* parentLayout);
 
 		void destroy();
+		void setParent(GUILayout* parentLayout);
 
 		GUILayout* mLayout;
 		GUILayout* mParentLayout;

+ 3 - 2
SBansheeEngine/Include/BsScriptGUILayoutUtility.h

@@ -2,6 +2,7 @@
 
 #include "BsScriptEnginePrerequisites.h"
 #include "BsScriptObject.h"
+#include "BsScriptGUIElement.h"
 #include "BsVector2I.h"
 #include "BsRectI.h"
 
@@ -15,7 +16,7 @@ namespace BansheeEngine
 		ScriptGUILayoutUtility();
 
 	private:
-		static Vector2I internal_CalculateOptimalSize(MonoObject* managedInstance);
-		static RectI internal_CalculateBounds(MonoObject* managedInstance);
+		static Vector2I internal_CalculateOptimalSize(ScriptGUIElementBaseTBase* guiElement);
+		static RectI internal_CalculateBounds(ScriptGUIElementBaseTBase* guiElement);
 	};
 }

+ 31 - 15
SBansheeEngine/Source/BsScriptGUIElement.cpp

@@ -11,32 +11,48 @@
 
 namespace BansheeEngine
 {
-	ScriptGUIElementBase::ScriptGUIElementBase(MonoObject* instance)
+	ScriptGUIElementBaseTBase::ScriptGUIElementBaseTBase(MonoObject* instance)
 		:ScriptObjectBase(instance), mIsDestroyed(false), mElement(nullptr)
 	{ }
 
-	ScriptGUIElement::ScriptGUIElement(MonoObject* instance)
-		:ScriptObject(instance)
-	{
 
-	}
 
-	void ScriptGUIElementBase::initialize(GUIElement* element)
+	void ScriptGUIElementBaseTBase::initialize(GUIElementBase* element)
 	{
 		mElement = element;
 	}
 
-	void ScriptGUIElementBase::destroy()
+	ScriptGUIElementTBase::ScriptGUIElementTBase(MonoObject* instance)
+		:ScriptGUIElementBaseTBase(instance)
+	{
+
+	}
+
+	void ScriptGUIElementTBase::destroy()
 	{
 		if(!mIsDestroyed)
 		{
-			GUIElement::destroy(mElement);
-			mElement = nullptr;
+			if (mElement->_getType() == GUIElementBase::Type::Element)
+			{
+				GUIElement::destroy((GUIElement*)mElement);
+				mElement = nullptr;
 
-			mIsDestroyed = true;
+				mIsDestroyed = true;
+			}
 		}
 	}
 
+	void ScriptGUIElementTBase::setParent(GUILayout* layout)
+	{
+		layout->addElement((GUIElement*)mElement);
+	}
+
+	ScriptGUIElement::ScriptGUIElement(MonoObject* instance)
+		:ScriptObject(instance)
+	{
+
+	}
+
 	void ScriptGUIElement::initRuntimeData()
 	{
 		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptGUIElement::internal_destroy);
@@ -44,12 +60,12 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_SetParent", &ScriptGUIElement::internal_setParent);
 	}
 
-	void ScriptGUIElement::internal_destroy(ScriptGUIElementBase* nativeInstance)
+	void ScriptGUIElement::internal_destroy(ScriptGUIElementBaseTBase* nativeInstance)
 	{
 		nativeInstance->destroy();
 	}
 
-	void ScriptGUIElement::internal_setVisible(ScriptGUIElementBase* nativeInstance, bool visible)
+	void ScriptGUIElement::internal_setVisible(ScriptGUIElementBaseTBase* nativeInstance, bool visible)
 	{
 		if(visible)
 			nativeInstance->getGUIElement()->enableRecursively();
@@ -57,11 +73,11 @@ namespace BansheeEngine
 			nativeInstance->getGUIElement()->disableRecursively();
 	}
 
-	void ScriptGUIElement::internal_setParent(ScriptGUIElementBase* nativeInstance, MonoObject* parentLayout)
+	void ScriptGUIElement::internal_setParent(ScriptGUIElementBaseTBase* nativeInstance, MonoObject* parentLayout)
 	{
 		ScriptGUILayout* scriptLayout = ScriptGUILayout::toNative(parentLayout);
-
 		GUILayout* nativeLayout = scriptLayout->getInternalValue();
-		nativeLayout->addElement(nativeInstance->getGUIElement());
+
+		nativeInstance->setParent(nativeLayout);
 	}
 }

+ 6 - 23
SBansheeEngine/Source/BsScriptGUIFixedSpace.cpp

@@ -12,7 +12,7 @@
 namespace BansheeEngine
 {
 	ScriptGUIFixedSpace::ScriptGUIFixedSpace(MonoObject* instance, GUIFixedSpace& fixedSpace, GUILayout* parentLayout)
-		:ScriptObject(instance), mFixedSpace(fixedSpace), mParentLayout(parentLayout), mIsDestroyed(false)
+		:TScriptGUIElementBase(instance, &fixedSpace), mFixedSpace(fixedSpace), mParentLayout(parentLayout), mIsDestroyed(false)
 	{
 
 	}
@@ -20,10 +20,6 @@ namespace BansheeEngine
 	void ScriptGUIFixedSpace::initRuntimeData()
 	{
 		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptGUIFixedSpace::internal_createInstance);
-
-		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptGUIFixedSpace::internal_destroy);
-		metaData.scriptClass->addInternalCall("Internal_SetVisible", &ScriptGUIFixedSpace::internal_setVisible);
-		metaData.scriptClass->addInternalCall("Internal_SetParent", &ScriptGUIFixedSpace::internal_setParent);
 		metaData.scriptClass->addInternalCall("Internal_SetSize", &ScriptGUIFixedSpace::internal_setSize);
 	}
 
@@ -38,6 +34,11 @@ namespace BansheeEngine
 		}
 	}
 
+	void ScriptGUIFixedSpace::setParent(GUILayout* parentLayout)
+	{
+		// FixedSpace parent is static, so do nothing
+	}
+
 	void ScriptGUIFixedSpace::internal_createInstance(MonoObject* instance, MonoObject* parentLayout, UINT32 size)
 	{
 		ScriptGUILayout* scriptLayout = ScriptGUILayout::toNative(parentLayout);
@@ -47,26 +48,8 @@ namespace BansheeEngine
 		ScriptGUIFixedSpace* nativeInstance = new (bs_alloc<ScriptGUIFixedSpace>()) ScriptGUIFixedSpace(instance, space, nativeLayout);
 	}
 
-	void ScriptGUIFixedSpace::internal_destroy(ScriptGUIFixedSpace* nativeInstance)
-	{
-		nativeInstance->destroy();
-	}
-
 	void ScriptGUIFixedSpace::internal_setSize(ScriptGUIFixedSpace* nativeInstance, UINT32 size)
 	{
 		nativeInstance->mFixedSpace.setSize(size);
 	}
-
-	void ScriptGUIFixedSpace::internal_setVisible(ScriptGUIFixedSpace* nativeInstance, bool visible)
-	{
-		if(visible)
-			nativeInstance->mFixedSpace.enableRecursively();
-		else
-			nativeInstance->mFixedSpace.disableRecursively();
-	}
-
-	void ScriptGUIFixedSpace::internal_setParent(ScriptGUIFixedSpace* nativeInstance, MonoObject* parentLayout)
-	{
-		// FixedSpace parent is static, so do nothing
-	}
 }

+ 6 - 23
SBansheeEngine/Source/BsScriptGUIFlexibleSpace.cpp

@@ -12,7 +12,7 @@
 namespace BansheeEngine
 {
 	ScriptGUIFlexibleSpace::ScriptGUIFlexibleSpace(MonoObject* instance, GUIFlexibleSpace& flexibleSpace, GUILayout* parentLayout)
-		:ScriptObject(instance), mFlexibleSpace(flexibleSpace), mParentLayout(parentLayout), mIsDestroyed(false)
+		:TScriptGUIElementBase(instance, &flexibleSpace), mFlexibleSpace(flexibleSpace), mParentLayout(parentLayout), mIsDestroyed(false)
 	{
 
 	}
@@ -20,10 +20,6 @@ namespace BansheeEngine
 	void ScriptGUIFlexibleSpace::initRuntimeData()
 	{
 		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptGUIFlexibleSpace::internal_createInstance);
-
-		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptGUIFlexibleSpace::internal_destroy);
-		metaData.scriptClass->addInternalCall("Internal_SetVisible", &ScriptGUIFlexibleSpace::internal_setVisible);
-		metaData.scriptClass->addInternalCall("Internal_SetParent", &ScriptGUIFlexibleSpace::internal_setParent);
 	}
 
 	void ScriptGUIFlexibleSpace::destroy()
@@ -37,6 +33,11 @@ namespace BansheeEngine
 		}
 	}
 
+	void ScriptGUIFlexibleSpace::setParent(GUILayout* parentLayout)
+	{
+		// FlexibleSpace parent is static, so do nothing
+	}
+
 	void ScriptGUIFlexibleSpace::internal_createInstance(MonoObject* instance, MonoObject* parentLayout)
 	{
 		ScriptGUILayout* scriptLayout = ScriptGUILayout::toNative(parentLayout);
@@ -45,22 +46,4 @@ namespace BansheeEngine
 
 		ScriptGUIFlexibleSpace* nativeInstance = new (bs_alloc<ScriptGUIFlexibleSpace>()) ScriptGUIFlexibleSpace(instance, space, nativeLayout);
 	}
-
-	void ScriptGUIFlexibleSpace::internal_destroy(ScriptGUIFlexibleSpace* nativeInstance)
-	{
-		nativeInstance->destroy();
-	}
-
-	void ScriptGUIFlexibleSpace::internal_setVisible(ScriptGUIFlexibleSpace* nativeInstance, bool visible)
-	{
-		if(visible)
-			nativeInstance->mFlexibleSpace.enableRecursively();
-		else
-			nativeInstance->mFlexibleSpace.disableRecursively();
-	}
-
-	void ScriptGUIFlexibleSpace::internal_setParent(ScriptGUIFlexibleSpace* nativeInstance, MonoObject* parentLayout)
-	{
-		// FlexibleSpace parent is static, so do nothing
-	}
 }

+ 6 - 23
SBansheeEngine/Source/BsScriptGUILayout.cpp

@@ -12,7 +12,7 @@
 namespace BansheeEngine
 {
 	ScriptGUILayout::ScriptGUILayout(MonoObject* instance, GUILayout* layout, GUILayout* parentLayout)
-		:ScriptObject(instance), mLayout(layout), mParentLayout(parentLayout), mIsDestroyed(false)
+		:TScriptGUIElementBase(instance, layout), mLayout(layout), mParentLayout(parentLayout), mIsDestroyed(false)
 	{
 
 	}
@@ -23,10 +23,6 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_CreateInstanceXFromLayout", &ScriptGUILayout::internal_createInstanceXFromLayout);
 		metaData.scriptClass->addInternalCall("Internal_CreateInstanceYFromLayout", &ScriptGUILayout::internal_createInstanceYFromLayout);
 		metaData.scriptClass->addInternalCall("Internal_CreateInstanceYFromScrollArea", &ScriptGUILayout::internal_createInstanceYFromScrollArea);
-
-		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptGUILayout::internal_destroy);
-		metaData.scriptClass->addInternalCall("Internal_SetVisible", &ScriptGUILayout::internal_setVisible);
-		metaData.scriptClass->addInternalCall("Internal_SetParent", &ScriptGUILayout::internal_setParent);
 	}
 
 	void ScriptGUILayout::destroy()
@@ -43,6 +39,11 @@ namespace BansheeEngine
 		}
 	}
 
+	void ScriptGUILayout::setParent(GUILayout* parentLayout)
+	{
+		// FixedSpace parent is static, so do nothing
+	}
+
 	void ScriptGUILayout::internal_createInstanceXFromArea(MonoObject* instance, MonoObject* parentArea)
 	{
 		ScriptGUIArea* scriptArea = ScriptGUIArea::toNative(parentArea);
@@ -82,22 +83,4 @@ namespace BansheeEngine
 		ScriptGUILayout* nativeInstance = new (bs_alloc<ScriptGUILayout>()) 
 			ScriptGUILayout(instance, nativeLayout, nativeLayout);
 	}
-
-	void ScriptGUILayout::internal_destroy(ScriptGUILayout* nativeInstance)
-	{
-		nativeInstance->destroy();
-	}
-
-	void ScriptGUILayout::internal_setVisible(ScriptGUILayout* nativeInstance, bool visible)
-	{
-		if(visible)
-			nativeInstance->getInternalValue()->enableRecursively();
-		else
-			nativeInstance->getInternalValue()->disableRecursively();
-	}
-
-	void ScriptGUILayout::internal_setParent(ScriptGUILayout* nativeInstance, MonoObject* parentLayout)
-	{
-		// Layout parent is static, so do nothing
-	}
 }

+ 4 - 11
SBansheeEngine/Source/BsScriptGUILayoutUtility.cpp

@@ -19,20 +19,13 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_CalculateBounds", &ScriptGUILayoutUtility::internal_CalculateBounds);
 	}
 
-	Vector2I ScriptGUILayoutUtility::internal_CalculateOptimalSize(MonoObject* managedInstance)
+	Vector2I ScriptGUILayoutUtility::internal_CalculateOptimalSize(ScriptGUIElementBaseTBase* guiElement)
 	{
-		//ScriptGUIElementBase::
-
-		//ScriptGUIElement* scriptGUIElement = ScriptGUIElement::toNative(managedInstance);
-		//GUIElementBase* element = scriptGUIElement->
-
-		// TODO
-		return Vector2I();
+		return GUILayoutUtility::calcOptimalSize(guiElement->getGUIElement());
 	}
 
-	RectI ScriptGUILayoutUtility::internal_CalculateBounds(MonoObject* managedInstance)
+	RectI ScriptGUILayoutUtility::internal_CalculateBounds(ScriptGUIElementBaseTBase* guiElement)
 	{
-		// TODO
-		return RectI();
+		return GUILayoutUtility::calcArea(guiElement->getGUIElement());
 	}
 }