瀏覽代碼

Fixed various parameter parsing issues in HString

Marko Pintera 12 年之前
父節點
當前提交
da40f950a6

+ 1 - 0
CamelotClient/Include/CmTestTextSprite.h

@@ -18,6 +18,7 @@ namespace CamelotFramework
 
 
 	private:
 	private:
 		BS::GUILabel* mLabel;
 		BS::GUILabel* mLabel;
+		HString labelString;
 
 
 		void dbgBtn();
 		void dbgBtn();
 	};
 	};

+ 18 - 5
CamelotClient/Source/CmTestTextSprite.cpp

@@ -60,18 +60,31 @@ namespace CamelotFramework
 		area->getLayout().addElement(button);
 		area->getLayout().addElement(button);
 
 
 		area->getLayout().addFlexibleSpace();
 		area->getLayout().addFlexibleSpace();
+
+		labelString = HString(L"\\{0}, {1}");
+		mLabel->setContent(GUIContent(labelString));
 	}
 	}
 
 
 	void TestTextSprite::update()
 	void TestTextSprite::update()
 	{
 	{
-		WString value = toWString(toString(Input::instance().getCursorPosition().x) + " - " + toString(Input::instance().getCursorPosition().y));
-
-		mLabel->setContent(GUIContent(HString(L"")));
+		labelString.setParameter(0, toWString(Input::instance().getCursorPosition().x));
+		//labelString.setParameter(1, toWString(Input::instance().getCursorPosition().y));
 	}
 	}
 
 
 	void TestTextSprite::dbgBtn()
 	void TestTextSprite::dbgBtn()
 	{
 	{
-		StringTable::instance().setString(L"dbgBtn", Language::Abkhazian, L"ALOALO");
-		StringTable::instance().setActiveLanguage(Language::Abkhazian);
+		static int dbg = 0;
+
+		if(dbg == 0)
+		{
+			StringTable::instance().setString(L"dbgBtn", Language::Abkhazian, L"ALOALO");
+			StringTable::instance().setActiveLanguage(Language::Abkhazian);
+		}
+		else if(dbg == 1)
+		{
+			StringTable::instance().removeString(L"dbgBtn");
+		}
+
+		dbg++;
 	}
 	}
 }
 }

+ 91 - 1
CamelotUtility/Include/CmString.h

@@ -470,10 +470,100 @@ namespace CamelotFramework
 	*/
 	*/
 	CM_UTILITY_EXPORT WString toWString(const String& source);
 	CM_UTILITY_EXPORT WString toWString(const String& source);
 
 
+	/** Converts a float to a WString. */
+    CM_UTILITY_EXPORT WString toWString(float val, unsigned short precision = 6, 
+        unsigned short width = 0, char fill = ' ', 
+        std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+    /** Converts a Radian to a WString. */
+    CM_UTILITY_EXPORT WString toWString(Radian val, unsigned short precision = 6, 
+        unsigned short width = 0, char fill = ' ', 
+        std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+    /** Converts a Degree to a WString. */
+    CM_UTILITY_EXPORT WString toWString(Degree val, unsigned short precision = 6, 
+        unsigned short width = 0, char fill = ' ', 
+        std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+    /** Converts an int to a WString. */
+    CM_UTILITY_EXPORT WString toWString(int val, unsigned short width = 0, 
+        char fill = ' ', 
+        std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+    /** Converts an unsigned int to a WString. */
+    CM_UTILITY_EXPORT WString toWString(unsigned int val, 
+        unsigned short width = 0, char fill = ' ', 
+        std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+	/** Converts a long to a WString. */
+	CM_UTILITY_EXPORT WString toWString(long val, 
+		unsigned short width = 0, char fill = ' ', 
+		std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+    /** Converts an unsigned long to a WString. */
+    CM_UTILITY_EXPORT WString toWString(unsigned long val, 
+        unsigned short width = 0, char fill = ' ', 
+        std::ios::fmtflags flags = std::ios::fmtflags(0) );
+
+    /** Converts a boolean to a WString. 
+    @param yesNo If set to true, result is 'yes' or 'no' instead of 'true' or 'false'
+    */
+    CM_UTILITY_EXPORT WString toWString(bool val, bool yesNo = false);
+
+	/** Converts a Vector2 to a WString. 
+    @remarks
+        Format is "x y" (i.e. 2x float values, space delimited)
+    */
+    CM_UTILITY_EXPORT WString toWString(const Vector2& val);
+
+    /** Converts a Vector3 to a WString. 
+    @remarks
+        Format is "x y z" (i.e. 3x float values, space delimited)
+    */
+    CM_UTILITY_EXPORT WString toWString(const Vector3& val);
+
+	/** Converts a Vector4 to a WString. 
+    @remarks
+        Format is "x y z w" (i.e. 4x float values, space delimited)
+    */
+    CM_UTILITY_EXPORT WString toWString(const Vector4& val);
+
+    /** Converts a Matrix3 to a WString. 
+    @remarks
+        Format is "00 01 02 10 11 12 20 21 22" where '01' means row 0 column 1 etc.
+    */
+    CM_UTILITY_EXPORT WString toWString(const Matrix3& val);
+
+    /** Converts a Matrix4 to a WString. 
+    @remarks
+        Format is "00 01 02 03 10 11 12 13 20 21 22 23 30 31 32 33" where 
+        '01' means row 0 column 1 etc.
+    */
+    CM_UTILITY_EXPORT WString toWString(const Matrix4& val);
+
+    /** Converts a Quaternion to a WString. 
+    @remarks
+        Format is "w x y z" (i.e. 4x float values, space delimited)
+    */
+    CM_UTILITY_EXPORT WString toWString(const Quaternion& val);
+
+    /** Converts a ColourValue to a WString. 
+    @remarks
+        Format is "r g b a" (i.e. 4x float values, space delimited). 
+    */
+    CM_UTILITY_EXPORT WString toWString(const Color& val);
+
+    /** Converts a StringVector to a WString.
+    @remarks
+        Strings must not contain spaces since space is used as a delimiter in
+        the output.
+    */
+    CM_UTILITY_EXPORT WString toWString(const Vector<CamelotFramework::WString>::type& val);
+
 	/**
 	/**
 	* @brief	Converts a wide string to a narrow string.
 	* @brief	Converts a wide string to a narrow string.
 	*/
 	*/
-	CM_UTILITY_EXPORT WString toWString(const String& source);
+	CM_UTILITY_EXPORT String toString(const WString& source);
 
 
 	/** Converts a float to a String. */
 	/** Converts a float to a String. */
     CM_UTILITY_EXPORT String toString(float val, unsigned short precision = 6, 
     CM_UTILITY_EXPORT String toString(float val, unsigned short precision = 6, 

+ 183 - 0
CamelotUtility/Source/CmString.cpp

@@ -149,6 +149,189 @@ namespace CamelotFramework
 		return WString(source.begin(), source.end());
 		return WString(source.begin(), source.end());
 	}
 	}
 
 
+	WString toWString(float val, unsigned short precision, 
+		unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		WStringStream stream;
+		stream.precision(precision);
+		stream.width(width);
+		stream.fill(fill);
+		if (flags)
+			stream.setf(flags);
+		stream << val;
+		return stream.str();
+	}
+
+	WString toWString(Radian val, unsigned short precision, 
+		unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		return toWString(val.valueAngleUnits(), precision, width, fill, flags);
+	}
+
+	WString toWString(Degree val, unsigned short precision, 
+		unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		return toWString(val.valueAngleUnits(), precision, width, fill, flags);
+	}
+
+	WString toWString(int val, 
+		unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		WStringStream stream;
+		stream.width(width);
+		stream.fill(fill);
+		if (flags)
+			stream.setf(flags);
+		stream << val;
+		return stream.str();
+	}
+
+	WString toWString(unsigned int val, unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		WStringStream stream;
+		stream.width(width);
+		stream.fill(fill);
+		if (flags)
+			stream.setf(flags);
+		stream << val;
+		return stream.str();
+	}
+
+	WString toWString(long val, 
+		unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		WStringStream stream;
+		stream.width(width);
+		stream.fill(fill);
+		if (flags)
+			stream.setf(flags);
+		stream << val;
+		return stream.str();
+	}
+
+	WString toWString(unsigned long val, unsigned short width, char fill, std::ios::fmtflags flags)
+	{
+		WStringStream stream;
+		stream.width(width);
+		stream.fill(fill);
+		if (flags)
+			stream.setf(flags);
+		stream << val;
+		return stream.str();
+	}
+
+	WString toWString(const Vector2& val)
+	{
+		WStringStream stream;
+		stream << val.x << L" " << val.y;
+		return stream.str();
+	}
+
+	WString toWString(const Vector3& val)
+	{
+		WStringStream stream;
+		stream << val.x << L" " << val.y << L" " << val.z;
+		return stream.str();
+	}
+
+	WString toWString(const Vector4& val)
+	{
+		WStringStream stream;
+		stream << val.x << L" " << val.y << L" " << val.z << L" " << val.w;
+		return stream.str();
+	}
+
+	WString toWString(const Matrix3& val)
+	{
+		WStringStream stream;
+		stream << val[0][0] << L" " 
+			<< val[0][1] << L" "             
+			<< val[0][2] << L" "             
+			<< val[1][0] << L" "             
+			<< val[1][1] << L" "             
+			<< val[1][2] << L" "             
+			<< val[2][0] << L" "             
+			<< val[2][1] << L" "             
+			<< val[2][2];
+		return stream.str();
+	}
+
+	WString toWString(bool val, bool yesNo)
+	{
+		if (val)
+		{
+			if (yesNo)
+			{
+				return L"yes";
+			}
+			else
+			{
+				return L"true";
+			}
+		}
+		else
+			if (yesNo)
+			{
+				return L"no";
+			}
+			else
+			{
+				return L"false";
+			}
+	}
+
+	WString toWString(const Matrix4& val)
+	{
+		WStringStream stream;
+		stream << val[0][0] << L" " 
+			<< val[0][1] << L" "             
+			<< val[0][2] << L" "             
+			<< val[0][3] << L" "             
+			<< val[1][0] << L" "             
+			<< val[1][1] << L" "             
+			<< val[1][2] << L" "             
+			<< val[1][3] << L" "             
+			<< val[2][0] << L" "             
+			<< val[2][1] << L" "             
+			<< val[2][2] << L" "             
+			<< val[2][3] << L" "             
+			<< val[3][0] << L" "             
+			<< val[3][1] << L" "             
+			<< val[3][2] << L" "             
+			<< val[3][3];
+		return stream.str();
+	}
+
+	WString toWString(const Quaternion& val)
+	{
+		WStringStream stream;
+		stream  << val.w << L" " << val.x << L" " << val.y << L" " << val.z;
+		return stream.str();
+	}
+
+	WString toWString(const Color& val)
+	{
+		WStringStream stream;
+		stream << val.r << L" " << val.g << L" " << val.b << L" " << val.a;
+		return stream.str();
+	}
+
+	WString toWString(const Vector<CamelotFramework::WString>::type& val)
+	{
+		WStringStream stream;
+		Vector<CamelotFramework::WString>::type::const_iterator i, iend, ibegin;
+		ibegin = val.begin();
+		iend = val.end();
+		for (i = ibegin; i != iend; ++i)
+		{
+			if (i != ibegin)
+				stream << L" ";
+
+			stream << *i; 
+		}
+		return stream.str();
+	}
+
 	String toString(const WString& source)
 	String toString(const WString& source)
 	{
 	{
 		return String(source.begin(), source.end());
 		return String(source.begin(), source.end());

+ 16 - 6
CamelotUtility/Source/CmStringTable.cpp

@@ -51,13 +51,21 @@ namespace CamelotFramework
 		INT32 lastBracket = -1;
 		INT32 lastBracket = -1;
 		WStringStream bracketChars;
 		WStringStream bracketChars;
 		WStringStream cleanString;
 		WStringStream cleanString;
+		bool escaped = false;
 		UINT32 numRemovedChars = 0;
 		UINT32 numRemovedChars = 0;
 		for(UINT32 i = 0; i < (UINT32)_string.size(); i++)
 		for(UINT32 i = 0; i < (UINT32)_string.size(); i++)
 		{
 		{
+			if(_string[i] == '\\' && !escaped)
+			{
+				numRemovedChars++;
+				escaped = true;
+				continue;
+			}
+
 			if(lastBracket == -1)
 			if(lastBracket == -1)
 			{
 			{
 				// If current char is non-escaped opening bracket start parameter definition
 				// If current char is non-escaped opening bracket start parameter definition
-				if(_string[i] == '{' && (i == 0 || _string[i - 1] != '\\')) 
+				if(_string[i] == '{' && !escaped) 
 					lastBracket = i;
 					lastBracket = i;
 				else
 				else
 					cleanString<<_string[i];
 					cleanString<<_string[i];
@@ -69,13 +77,13 @@ namespace CamelotFramework
 				else
 				else
 				{
 				{
 					// If current char is non-escaped closing bracket end parameter definition
 					// If current char is non-escaped closing bracket end parameter definition
-					UINT32 numParamChars = (UINT32)bracketChars.gcount();
-					if(_string[i] == '}' && numParamChars > 0 && (i == 0 || _string[i - 1] != '\\')) 
+					UINT32 numParamChars = (UINT32)bracketChars.tellp();
+					if(_string[i] == '}' && numParamChars > 0 && !escaped) 
 					{
 					{
-						UINT32 paramIdx = parseUnsignedInt(bracketChars.str());
-						paramOffsets.push_back(ParamOffset(i - numRemovedChars, paramIdx));
+						numRemovedChars += numParamChars + 2; // +2 for open and closed brackets
 
 
-						numRemovedChars += numParamChars;
+						UINT32 paramIdx = parseUnsignedInt(bracketChars.str());
+						paramOffsets.push_back(ParamOffset(paramIdx, i + 1 - numRemovedChars));
 					}
 					}
 					else
 					else
 					{
 					{
@@ -88,6 +96,8 @@ namespace CamelotFramework
 					bracketChars.clear();
 					bracketChars.clear();
 				}
 				}
 			}
 			}
+
+			escaped = false;
 		}
 		}
 
 
 		string = cleanString.str();
 		string = cleanString.str();