Browse Source

Added managed GUIContent

Marko Pintera 12 years ago
parent
commit
8fa8ac5145

+ 1 - 1
BansheeEngine/Include/BsSpriteTexture.h

@@ -17,7 +17,7 @@ namespace BansheeEngine
 		const CM::HTexture& getTexture() const;
 		CM::Vector2 transformUV(const CM::Vector2& uv) const;
 
-		static HSpriteTexture dummy();
+		static const HSpriteTexture& dummy();
 		static HSpriteTexture create(const CM::HTexture& texture);
 		static HSpriteTexture create(const CM::Vector2& uvOffset, const CM::Vector2& uvScale, const CM::HTexture& texture);
 	private:

+ 2 - 8
BansheeEngine/Source/BsSpriteTexture.cpp

@@ -22,15 +22,9 @@ namespace BansheeEngine
 		return mUVOffset + uv * mUVScale;
 	}
 
-	HSpriteTexture SpriteTexture::dummy()
+	const HSpriteTexture& SpriteTexture::dummy()
 	{
-		static bool initialized = false;
-		static HSpriteTexture dummyTex;
-
-		if(!initialized)
-		{
-			dummyTex = create(Texture::dummy());
-		}
+		static HSpriteTexture dummyTex = create(Texture::dummy());
 
 		return dummyTex;
 	}

+ 1 - 9
CSharpWrap.txt

@@ -93,7 +93,6 @@ Eventually make all math classes templates that work on both doubles and floats.
 
 Implement:
  - GUIContent
- - HString
 
  - Button
  - Texture
@@ -114,20 +113,13 @@ Implement:
    - GUISkin.main <- default skin
  - GUI (Non EditorGUI version)
 
- - Implement Font
- - SpriteTexture needs to be a handle
+ - Implement C# Font
  - Implement C# SpriteTexture
 
 When loading resources I need to be able to load both project resources and engine ones. 
  - BuiltinResources can be used for accessing default resources like GUI skin textures and similar
  - They're all loaded from a special folder that is set in EditorApplication
 
-Should I make sprite texture a resource?
- - Quite probably, and will need to replace any Ptr references with handle references. I want the user
-   to be able to reference the resource in multiple locations and then he can easily edit the SpriteTexture as needed.
-
-ScriptGUILabel currently accepts a WString, while it should be accepting a HString. Check BsScriptGUILabel
-
  BsApplication::getPrimaryViewport is not implemented
 
 ----------------------------

+ 1 - 1
CamelotCore/Include/CmTexture.h

@@ -214,7 +214,7 @@ namespace CamelotFramework
 		/**
 		 * @brief	Returns a dummy 2x2 texture. Don't modify the returned texture.
 		 */
-		static HTexture dummy();
+		static const HTexture& dummy();
 
 		/************************************************************************/
 		/* 								TEXTURE VIEW                      		*/

+ 1 - 1
CamelotCore/Include/CmTextureManager.h

@@ -194,7 +194,7 @@ namespace CamelotFramework
 		 */
 		virtual PixelFormat getNativeFormat(TextureType ttype, PixelFormat format, int usage) = 0;
 
-		HTexture getDummyTexture() const { return mDummyTexture; }
+		const HTexture& getDummyTexture() const { return mDummyTexture; }
 
 	protected:
 		HTexture mDummyTexture;

+ 1 - 1
CamelotCore/Source/CmTexture.cpp

@@ -343,7 +343,7 @@ namespace CamelotFramework
 		return static_resource_cast<Texture>(Resource::_createResourceHandle(texturePtr));
 	}
 
-	HTexture Texture::dummy()
+	const HTexture& Texture::dummy()
 	{
 		return TextureManager::instance().getDummyTexture();
 	}

+ 5 - 1
CamelotUtility/Include/CmHString.h

@@ -43,9 +43,13 @@ namespace CamelotFramework
 		~HString();
 
 		operator const WString& () const;
-		void setParameter(UINT32 idx, const WString& value);
+		const WString& getValue() const;
 
+		void setParameter(UINT32 idx, const WString& value);
+		
 		boost::signals::connection addOnStringModifiedCallback(boost::function<void()> callback) const;
+
+		static const HString& dummy();
 	private:
 		std::shared_ptr<StringData> mData;
 	};

+ 12 - 0
CamelotUtility/Source/CmHString.cpp

@@ -69,6 +69,11 @@ namespace CamelotFramework
 
 	HString::operator const WString& () const 
 	{ 
+		return getValue(); 
+	}
+
+	const WString& HString::getValue() const
+	{
 		if(mData->mIsDirty)
 		{
 			if(mData->mParameters != nullptr)
@@ -99,4 +104,11 @@ namespace CamelotFramework
 	{
 		return mData->onStringModified.connect(callback);
 	}
+
+	const HString& HString::dummy()
+	{
+		static HString dummyVal;
+
+		return dummyVal;
+	}
 }

+ 1 - 1
MBansheeEditor/ProjectSelectWindow.cs

@@ -12,7 +12,7 @@ namespace BansheeEditor
         public ProjectSelectWindow()
             :base(0, 0, 200, 200)
         {
-            GUI.main.AddLabel(new HString("Test test"));
+            GUI.main.AddLabel("Test test");
         }
     }
 }

+ 71 - 0
MBansheeEngine/GUIContent.cs

@@ -0,0 +1,71 @@
+using System.Runtime.CompilerServices;
+
+namespace BansheeEngine
+{
+    public sealed class GUIContent
+    {
+		public GUIContent(HString text)
+		{
+		    _text = text;
+		}
+
+        public GUIContent(HString text, HString tooltip)
+        {
+            _text = text;
+            _tooltip = tooltip;
+        }
+
+        public GUIContent(SpriteTexture image)
+        {
+            _image = image;
+        }
+
+        public GUIContent(SpriteTexture image, HString tooltip)
+        {
+            _image = image;
+            _tooltip = tooltip;
+        }
+
+        public GUIContent(HString text, SpriteTexture image)
+        {
+            _text = text;
+            _image = image;
+        }
+
+        public GUIContent(HString text, SpriteTexture image, HString tooltip)
+        {
+            _text = text;
+            _image = image;
+            _tooltip = tooltip;
+        }
+
+        public static implicit operator GUIContent(HString text)
+        {
+            return new GUIContent(text);
+        }
+
+        public static implicit operator GUIContent(string text)
+        {
+            return new GUIContent(new HString(text));
+        }
+
+        public HString text
+        {
+            get { return _text; }
+        }
+
+        public SpriteTexture image
+        {
+            get { return _image; }
+        }
+
+        public HString getTooltip
+        {
+            get { return _tooltip; }
+        }
+
+        private HString _text;
+        private HString _tooltip;
+        private SpriteTexture _image;
+    }
+}

+ 3 - 3
MBansheeEngine/GUILabel.cs

@@ -4,12 +4,12 @@ namespace BansheeEngine
 {
     public sealed class GUILabel : ScriptObject
     {
-        internal GUILabel(GUILayout parentLayout, HString value, GUIElementStyle style, params GUIOption[] options)
+        internal GUILabel(GUILayout parentLayout, GUIContent content, GUIElementStyle style, params GUIOption[] options)
         {
-            Internal_CreateInstance(this, parentLayout, value, style, options);
+            Internal_CreateInstance(this, parentLayout, content, style, options);
         }
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_CreateInstance(GUILabel instance, GUILayout layout, HString value, GUIElementStyle style, GUIOption[] options);
+        private static extern void Internal_CreateInstance(GUILabel instance, GUILayout layout, GUIContent content, GUIElementStyle style, GUIOption[] options);
     }
 }

+ 6 - 6
MBansheeEngine/GUILayout.cs

@@ -5,19 +5,19 @@ namespace BansheeEngine
 {
     public abstract class GUILayout : ScriptObject
     {
-        public GUILabel AddLabel(HString name, GUIElementStyle style, params GUIOption[] options)
+        public GUILabel AddLabel(GUIContent content, GUIElementStyle style, params GUIOption[] options)
         {
-            return new GUILabel(this, name, style, options);
+            return new GUILabel(this, content, style, options);
         }
 
-        public GUILabel AddLabel(HString name, GUIElementStyle style)
+        public GUILabel AddLabel(GUIContent content, GUIElementStyle style)
         {
-            return new GUILabel(this, name, style, new GUIOption[0]);
+            return new GUILabel(this, content, style, new GUIOption[0]);
         }
 
-        public GUILabel AddLabel(HString name, params GUIOption[] options)
+        public GUILabel AddLabel(GUIContent content, params GUIOption[] options)
         {
-            return new GUILabel(this, name, null, options);
+            return new GUILabel(this, content, null, options);
         }
 
         [MethodImpl(MethodImplOptions.InternalCall)]

+ 15 - 0
MBansheeEngine/HString.cs

@@ -10,6 +10,18 @@ namespace BansheeEngine
             Internal_CreateInstance(this, identifier);
         }
 
+        public static implicit operator HString(string identifier)
+        {
+            return new HString(identifier);
+        }
+
+        public static implicit operator string(HString text)
+        {
+            string value;
+            Internal_GetValue(text.mCachedPtr, out value);
+            return value;
+        }
+
         public void setParameter(int idx, string value)
         {
             Internal_SetParameter(mCachedPtr, idx, value);
@@ -20,5 +32,8 @@ namespace BansheeEngine
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_SetParameter(IntPtr nativeInstance, int idx, string identifier);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_GetValue(IntPtr nativeInstance, out string value);
     }
 }

+ 1 - 0
MBansheeEngine/MBansheeEngine.csproj

@@ -48,6 +48,7 @@
     <Compile Include="GUI.cs" />
     <Compile Include="GUIArea.cs" />
     <Compile Include="GUIBase.cs" />
+    <Compile Include="GUIContent.cs" />
     <Compile Include="GUIElementStateStyle.cs" />
     <Compile Include="GUIElementStyle.cs" />
     <Compile Include="GUILabel.cs" />

+ 24 - 0
SBansheeEngine/Include/BsScriptGUIContent.h

@@ -0,0 +1,24 @@
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+
+namespace BansheeEngine
+{
+	class BS_SCR_BE_EXPORT ScriptGUIContent : public ScriptObject<ScriptGUIContent>
+	{
+	public:
+		static void initMetaData();
+
+		static const CM::HString& getText(MonoObject* instance);
+		static const CM::HString& getTooltip(MonoObject* instance);
+		static const HSpriteTexture& getImage(MonoObject* instance);
+
+	private:
+		static void initRuntimeData();
+
+		static MonoField* mTextField;
+		static MonoField* mTooltipField;
+		static MonoField* mImageField;
+	};
+}

+ 1 - 1
SBansheeEngine/Include/BsScriptGUILabel.h

@@ -14,7 +14,7 @@ namespace BansheeEngine
 		void* getNativeRaw() const { return mLabel; }
 
 	private:
-		static void internal_createInstance(MonoObject* instance, MonoObject* parentLayout, MonoObject* label, MonoObject* style, MonoArray* guiOptions);
+		static void internal_createInstance(MonoObject* instance, MonoObject* parentLayout, MonoObject* content, MonoObject* style, MonoArray* guiOptions);
 		static void internal_destroyInstance(ScriptGUILabel* nativeInstance);
 
 		static void initRuntimeData();

+ 1 - 0
SBansheeEngine/Include/BsScriptHString.h

@@ -18,6 +18,7 @@ namespace BansheeEngine
 		static void internal_createInstance(MonoObject* instance, MonoString* identifier);
 		static void internal_destroyInstance(ScriptHString* nativeInstance);
 		static void internal_setParameter(CM::HString* nativeInstance, CM::UINT32 idx, MonoString* value);
+		static void internal_getValue(CM::HString* nativeInstance, MonoString** value);
 
 		static void initRuntimeData();
 

+ 2 - 0
SBansheeEngine/SBansheeEngine.vcxproj

@@ -240,6 +240,7 @@
     <ClInclude Include="Include\BsScriptSpriteTexture.h" />
     <ClInclude Include="Include\BsScriptStringTable.h" />
     <ClInclude Include="Include\BsScriptTexture2D.h" />
+    <ClInclude Include="Include\BsScriptGUIContent.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsScriptEnginePlugin.cpp" />
@@ -254,6 +255,7 @@
     <ClCompile Include="Source\BsScriptSpriteTexture.cpp" />
     <ClCompile Include="Source\BsScriptStringTable.cpp" />
     <ClCompile Include="Source\BsScriptTexture2D.cpp" />
+    <ClCompile Include="Source\BsScriptGUIContent.cpp" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 6 - 0
SBansheeEngine/SBansheeEngine.vcxproj.filters

@@ -57,6 +57,9 @@
     <ClInclude Include="Include\BsScriptHString.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsScriptGUIContent.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsScriptTexture2D.cpp">
@@ -95,5 +98,8 @@
     <ClCompile Include="Source\BsScriptStringTable.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsScriptGUIContent.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 66 - 0
SBansheeEngine/Source/BsScriptGUIContent.cpp

@@ -0,0 +1,66 @@
+#include "BsScriptGUIContent.h"
+#include "BsScriptMeta.h"
+#include "BsMonoField.h"
+#include "BsMonoClass.h"
+#include "BsMonoManager.h"
+#include "BsMonoUtil.h"
+#include "BsScriptHString.h"
+#include "BsScriptGUIContent.h"
+#include "BsScriptSpriteTexture.h"
+#include "BsSpriteTexture.h"
+
+using namespace CamelotFramework;
+
+namespace BansheeEngine
+{
+	MonoField* ScriptGUIContent::mTextField;
+	MonoField* ScriptGUIContent::mTooltipField;
+	MonoField* ScriptGUIContent::mImageField;
+
+	void ScriptGUIContent::initMetaData()
+	{
+		metaData = ScriptMeta("MBansheeEngine", "BansheeEngine", "GUIContent", &ScriptGUIContent::initRuntimeData);
+
+		MonoManager::registerScriptType(&metaData);
+	}
+
+	void ScriptGUIContent::initRuntimeData()
+	{
+		mTextField = &metaData.scriptClass->getField("_text");
+		mTooltipField = &metaData.scriptClass->getField("_tooltip");
+		mImageField = &metaData.scriptClass->getField("_image");
+	}
+
+	const CM::HString& ScriptGUIContent::getText(MonoObject* instance)
+	{
+		MonoObject* textManaged = (MonoObject*)mTextField->getValue(instance);
+
+		if(textManaged == nullptr)
+			return HString::dummy();
+
+		ScriptHString* textScript = ScriptHString::toNative(textManaged);
+		return textScript->getInternalValue();
+	}
+
+	const CM::HString& ScriptGUIContent::getTooltip(MonoObject* instance)
+	{
+		MonoObject* tooltipManaged = (MonoObject*)mTooltipField->getValue(instance);
+
+		if(tooltipManaged == nullptr)
+			return HString::dummy();
+
+		ScriptHString* tooltipScript = ScriptHString::toNative(tooltipManaged);
+		return tooltipScript->getInternalValue();
+	}
+
+	const HSpriteTexture& ScriptGUIContent::getImage(MonoObject* instance)
+	{
+		MonoObject* imageManaged = (MonoObject*)mImageField->getValue(instance);
+
+		if(imageManaged == nullptr)
+			return SpriteTexture::dummy();
+
+		ScriptSpriteTexture* imageScript = ScriptSpriteTexture::toNative(imageManaged);
+		return imageScript->getInternalValue();
+	}
+}

+ 4 - 3
SBansheeEngine/Source/BsScriptGUILabel.cpp

@@ -12,6 +12,7 @@
 #include "BsScriptGUILayout.h"
 #include "BsScriptGUIArea.h"
 #include "BsScriptHString.h"
+#include "BsScriptGUIContent.h"
 
 using namespace CamelotFramework;
 
@@ -35,10 +36,9 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptGUILabel::internal_destroyInstance);
 	}
 
-	void ScriptGUILabel::internal_createInstance(MonoObject* instance, MonoObject* parentLayout, MonoObject* label, MonoObject* style, MonoArray* guiOptions)
+	void ScriptGUILabel::internal_createInstance(MonoObject* instance, MonoObject* parentLayout, MonoObject* content, MonoObject* style, MonoArray* guiOptions)
 	{
 		ScriptGUILayout* scriptLayout = ScriptGUILayout::toNative(parentLayout);
-		ScriptHString* nativeLabel = ScriptHString::toNative(label);
 		GUIOptions options;
 
 		UINT32 arrayLen = (UINT32)mono_array_length(guiOptions);
@@ -50,7 +50,8 @@ namespace BansheeEngine
 		if(style != nullptr)
 			elemStyle = ScriptGUIElementStyle::toNative(style)->getInternalValue();
 
-		GUILabel* guiLabel = GUILabel::create(scriptLayout->getParentArea()->getParentWidget(), nativeLabel->getInternalValue(), options, elemStyle); // TODO - Use proper HString
+		GUIContent nativeContent(ScriptGUIContent::getText(content), ScriptGUIContent::getImage(content), ScriptGUIContent::getTooltip(content));
+		GUILabel* guiLabel = GUILabel::create(scriptLayout->getParentArea()->getParentWidget(), nativeContent, options, elemStyle); // TODO - Use proper HString
 		GUILayout* nativeLayout = scriptLayout->getInternalValue();
 		nativeLayout->addElement(guiLabel);
 

+ 7 - 1
SBansheeEngine/Source/BsScriptHString.cpp

@@ -25,12 +25,13 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptHString::internal_createInstance);
 		metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptHString::internal_destroyInstance);
 		metaData.scriptClass->addInternalCall("Internal_SetParameter", &ScriptHString::internal_setParameter);
+		metaData.scriptClass->addInternalCall("Internal_GetValue", &ScriptHString::internal_getValue);
 	}
 
 	void ScriptHString::internal_createInstance(MonoObject* instance, MonoString* identifier)
 	{
 		HString string(MonoUtil::monoToWString(identifier));
-
+		
 		ScriptHString* nativeInstance = new (cm_alloc<ScriptHString>()) ScriptHString(string);
 		nativeInstance->createInstance(instance);
 
@@ -47,4 +48,9 @@ namespace BansheeEngine
 	{
 		nativeInstance->setParameter(idx, MonoUtil::monoToWString(value));
 	}
+
+	void ScriptHString::internal_getValue(CM::HString* nativeInstance, MonoString** value)
+	{
+		*value = MonoUtil::wstringToMono(MonoManager::instance().getDomain(), nativeInstance->getValue());
+	}
 }