فهرست منبع

support for predefined colors

Laserlicht 2 سال پیش
والد
کامیت
f5505c9f6d
4فایلهای تغییر یافته به همراه224 افزوده شده و 13 حذف شده
  1. 15 9
      client/widgets/TextControls.cpp
  2. 35 4
      client/windows/CMessage.cpp
  3. 4 0
      client/windows/CMessage.h
  4. 170 0
      config/textColors.json

+ 15 - 9
client/widgets/TextControls.cpp

@@ -154,11 +154,13 @@ void CTextContainer::blitLine(Canvas & to, Rect destRect, std::string what)
 	delimitersCount *= f->getStringWidth(delimeters)/2;
 	delimitersCount *= f->getStringWidth(delimeters)/2;
 
 
 	std::smatch match;
 	std::smatch match;
-	std::regex expr("\\{(#[0-9a-fA-F]{6})");
+	std::regex expr("\\{(.*?)\\|");
 	std::string::const_iterator searchStart( what.cbegin() );
 	std::string::const_iterator searchStart( what.cbegin() );
 	while(std::regex_search(searchStart, what.cend(), match, expr))
 	while(std::regex_search(searchStart, what.cend(), match, expr))
 	{
 	{
-		delimitersCount += f->getStringWidth(match[1].str());
+		std::string colorText = match[1].str();
+		if(CMessage::parseColor(colorText).a != Colors::TRANSPARENCY.ALPHA_TRANSPARENT)
+			delimitersCount += f->getStringWidth(colorText + "|");
 		searchStart = match.suffix().first;
 		searchStart = match.suffix().first;
 	}
 	}
 
 
@@ -201,15 +203,19 @@ void CTextContainer::blitLine(Canvas & to, Rect destRect, std::string what)
 			if(currDelimeter % 2) // Enclosed in {} text - set to yellow or defined color
 			if(currDelimeter % 2) // Enclosed in {} text - set to yellow or defined color
 			{
 			{
 				std::smatch match;
 				std::smatch match;
-   				std::regex expr("^#([0-9a-fA-F]{6})");
+   				std::regex expr("^(.*?)\\|");
 				if(std::regex_search(toPrint, match, expr))
 				if(std::regex_search(toPrint, match, expr))
 				{
 				{
-					ui8 rgb[3] = {0, 0, 0}; 
-					std::string tmp = boost::algorithm::unhex(match[1].str()); 
-					std::copy(tmp.begin(), tmp.end(), rgb);
-
-					toPrint = toPrint.substr(7, toPrint.length() - 6);
-					to.drawText(where, font, ColorRGBA(rgb[0], rgb[1], rgb[2]), ETextAlignment::TOPLEFT, toPrint);
+					std::string colorText = match[1].str();
+					ColorRGBA color = CMessage::parseColor(colorText);
+					
+					if(color.a != Colors::TRANSPARENCY.ALPHA_TRANSPARENT)
+					{
+						toPrint = toPrint.substr(colorText.length() + 1, toPrint.length() - colorText.length());
+						to.drawText(where, font, color, ETextAlignment::TOPLEFT, toPrint);
+					}
+					else
+						to.drawText(where, font, Colors::YELLOW, ETextAlignment::TOPLEFT, toPrint);
 				}
 				}
 				else
 				else
 					to.drawText(where, font, Colors::YELLOW, ETextAlignment::TOPLEFT, toPrint);
 					to.drawText(where, font, Colors::YELLOW, ETextAlignment::TOPLEFT, toPrint);

+ 35 - 4
client/windows/CMessage.cpp

@@ -14,6 +14,7 @@
 #include "../CGameInfo.h"
 #include "../CGameInfo.h"
 #include "../../lib/CGeneralTextHandler.h"
 #include "../../lib/CGeneralTextHandler.h"
 #include "../../lib/TextOperations.h"
 #include "../../lib/TextOperations.h"
+#include "../../lib/JsonNode.h"
 
 
 #include "../windows/InfoWindows.h"
 #include "../windows/InfoWindows.h"
 #include "../widgets/Buttons.h"
 #include "../widgets/Buttons.h"
@@ -152,12 +153,16 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineWi
 				opened=true;
 				opened=true;
 
 
 				std::smatch match;
 				std::smatch match;
-   				std::regex expr("^\\{(#[0-9a-fA-F]{6})$");
-				std::string tmp = text.substr(currPos, 8);
+   				std::regex expr("^\\{(.*?)\\|");
+				std::string tmp = text.substr(currPos);
 				if(std::regex_search(tmp, match, expr))
 				if(std::regex_search(tmp, match, expr))
 				{
 				{
-					color = match[1].str();
-					currPos += 7;
+					std::string colorText = match[1].str();
+					if(CMessage::parseColor(colorText).a != Colors::TRANSPARENCY.ALPHA_TRANSPARENT)
+					{
+						color = colorText + "|";
+						currPos += colorText.length() + 1;
+					}
 				}
 				}
 			}
 			}
 			else if (text[currPos]=='}')
 			else if (text[currPos]=='}')
@@ -222,6 +227,32 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineWi
 	return ret;
 	return ret;
 }
 }
 
 
+ColorRGBA CMessage::parseColor(std::string text)
+{
+	std::smatch match;
+	std::regex expr("^#([0-9a-fA-F]{6})$");
+	ui8 rgb[3] = {0, 0, 0};
+	if(std::regex_search(text, match, expr))
+	{
+		std::string tmp = boost::algorithm::unhex(match[1].str()); 
+		std::copy(tmp.begin(), tmp.end(), rgb);
+		return ColorRGBA(rgb[0], rgb[1], rgb[2]);
+	}
+
+	const JsonNode config(JsonPath::builtin("CONFIG/textColors"));
+	auto colors = config["colors"].Struct();
+	for(auto & color : colors) {
+		if(boost::algorithm::to_lower_copy(color.first) == boost::algorithm::to_lower_copy(text))
+		{
+			std::string tmp = boost::algorithm::unhex(color.second.String()); 
+			std::copy(tmp.begin(), tmp.end(), rgb);
+			return ColorRGBA(rgb[0], rgb[1], rgb[2]);
+		}
+	}
+
+	return Colors::TRANSPARENCY;
+}
+
 std::string CMessage::guessHeader(const std::string & msg)
 std::string CMessage::guessHeader(const std::string & msg)
 {
 {
 	size_t begin = 0;
 	size_t begin = 0;

+ 4 - 0
client/windows/CMessage.h

@@ -15,6 +15,7 @@
 struct SDL_Surface;
 struct SDL_Surface;
 class CInfoWindow;
 class CInfoWindow;
 class CComponent;
 class CComponent;
+class ColorRGBA;
 
 
 
 
 /// Class which draws formatted text messages and generates chat windows
 /// Class which draws formatted text messages and generates chat windows
@@ -32,6 +33,9 @@ public:
 	/// split text in lines
 	/// split text in lines
 	static std::vector<std::string> breakText(std::string text, size_t maxLineWidth, EFonts font);
 	static std::vector<std::string> breakText(std::string text, size_t maxLineWidth, EFonts font);
 
 
+	/// parse color
+	static ColorRGBA parseColor(std::string text);
+
 	/// Try to guess a header of a message
 	/// Try to guess a header of a message
 	static std::string guessHeader(const std::string & msg);
 	static std::string guessHeader(const std::string & msg);
 
 

+ 170 - 0
config/textColors.json

@@ -0,0 +1,170 @@
+{
+	"colors": {
+		"r":						"F80000",
+		"g":						"00FC00",
+		"b":						"0000F8",
+		"y":						"F8FC00",
+		"o":						"F88000",
+		"p":						"F800F8",
+		"c":						"00FCF8",
+		"k":						"000000",
+		"w":						"FFFFFF",
+		"Regular":					"F8F0D8",
+		"Highlight":				"E8D478",
+		"H3Red":					"F80000",
+		"H3Cyan":					"00FCF8",
+		"H3Green":					"00FC00",
+		"H3Blue":					"0000F8",
+		"H3Yellow":					"F8FC00",
+		"H3Orange":					"F88000",
+		"H3Purple":					"F800F8",
+		"H3Pink":					"C07888",
+		"AliceBlue":				"F0F8FF",
+		"AntiqueWhite":				"FAEBD7",
+		"Aqua":						"00FFFF",
+		"Aquamarine":				"7FFFD4",
+		"Azure":					"F0FFFF",
+		"Beige":					"F5F5DC",
+		"Bisque":					"FFE4C4",
+		"Black":					"000000",
+		"BlanchedAlmond":			"FFEBCD",
+		"Blue":						"0000FF",
+		"BlueViolet":				"8A2BE2",
+		"Brown":					"A52A2A",
+		"BurlyWood":				"DEB887",
+		"CadetBlue":				"5F9EA0",
+		"Chartreuse":				"7FFF00",
+		"Chocolate":				"D2691E",
+		"Coral":					"FF7F50",
+		"CornflowerBlue":			"6495ED",
+		"Cornsilk":					"FFF8DC",
+		"Crimson":					"DC143C",
+		"Cyan":						"00FFFF",
+		"DarkBlue":					"00008B",
+		"DarkCyan":					"008B8B",
+		"DarkGoldenRod":			"B8860B",
+		"DarkGray":					"A9A9A9",
+		"DarkGrey":					"A9A9A9",
+		"DarkGreen":				"A9A9A9",
+		"DarkKhaki":				"006400",
+		"DarkMagenta":				"8B008B",
+		"DarkOliveGreen":			"556B2F",
+		"Darkorange":				"FF8C00",
+		"DarkOrchid":				"9932CC",
+		"DarkRed":					"8B0000",
+		"DarkSalmon":				"E9967A",
+		"DarkSeaGreen":				"8FBC8F",
+		"DarkSlateBlue":			"483D8B",
+		"DarkSlateGray":			"2F4F4F",
+		"DarkSlateGrey":			"2F4F4F",
+		"DarkTurquoise":			"00CED1",
+		"DarkViolet":				"9400D3",
+		"DeepPink":					"FF1493",
+		"DeepSkyBlue":				"00BFFF",
+		"DimGray":					"696969",
+		"DimGrey":					"696969",
+		"DodgerBlue":				"1E90FF",
+		"FireBrick":				"B22222",
+		"FloralWhite":				"FFFAF0",
+		"ForestGreen":				"228B22",
+		"Fuchsia":					"FF00FF",
+		"Gainsboro":				"DCDCDC",
+		"GhostWhite":				"F8F8FF",
+		"Gold":						"FFD700",
+		"GoldenRod":				"DAA520",
+		"Gray":						"808080",
+		"Grey":						"808080",
+		"Green":					"008000",
+		"GreenYellow":				"ADFF2F",
+		"HoneyDew":					"F0FFF0",
+		"HotPink":					"FF69B4",
+		"IndianRed":				"CD5C5C",
+		"Indigo":					"4B0082",
+		"Ivory":					"FFFFF0",
+		"Khaki":					"F0E68C",
+		"Lavender":					"E6E6FA",
+		"LavenderBlush":			"FFF0F5",
+		"LawnGreen":				"7CFC00",
+		"LemonChiffon":				"FFFACD",
+		"LightBlue":				"ADD8E6",
+		"LightCoral":				"F08080",
+		"LightCyan":				"E0FFFF",
+		"LightGoldenRodYellow":		"FAFAD2",
+		"LightGray":				"D3D3D3",
+		"LightGrey":				"D3D3D3",
+		"LightGreen":				"90EE90",
+		"LightPink":				"FFB6C1",
+		"LightSalmon":				"FFA07A",
+		"LightSeaGreen":			"20B2AA",
+		"LightSkyBlue":				"87CEFA",
+		"LightSlateGray":			"778899",
+		"LightSlateGrey":			"778899",
+		"LightSteelBlue":			"B0C4DE",
+		"LightYellow":				"FFFFE0",
+		"Lime":						"00FF00",
+		"LimeGreen":				"32CD32",
+		"Linen":					"FAF0E6",
+		"Magenta":					"FF00FF",
+		"Maroon":					"800000",
+		"MediumAquaMarine":			"66CDAA",
+		"MediumBlue":				"0000CD",
+		"MediumOrchid":				"BA55D3",
+		"MediumPurple":				"9370D8",
+		"MediumSeaGreen":			"3CB371",
+		"MediumSlateBlue":			"7B68EE",
+		"MediumSpringGreen":		"00FA9A",
+		"MediumTurquoise":			"48D1CC",
+		"MediumVioletRed":			"C71585",
+		"MidnightBlue":				"191970",
+		"MintCream":				"F5FFFA",
+		"MistyRose":				"FFE4E1",
+		"Moccasin":					"FFE4B5",
+		"NavajoWhite":				"FFDEAD",
+		"Navy":						"000080",
+		"OldLace":					"FDF5E6",
+		"Olive":					"808000",
+		"OliveDrab":				"6B8E23",
+		"Orange":					"FFA500",
+		"OrangeRed":				"FF4500",
+		"Orchid":					"DA70D6",
+		"PaleGoldenRod":			"EEE8AA",
+		"PaleGreen":				"98FB98",
+		"PaleTurquoise":			"AFEEEE",
+		"PaleVioletRed":			"D87093",
+		"PapayaWhip":				"FFEFD5",
+		"PeachPuff":				"FFDAB9",
+		"Peru":						"CD853F",
+		"Pink":						"FFC0CB",
+		"Plum":						"DDA0DD",
+		"PowderBlue":				"B0E0E6",
+		"Purple":					"800080",
+		"Red":						"FF0000",
+		"RosyBrown":				"BC8F8F",
+		"RoyalBlue":				"4169E1",
+		"SaddleBrown":				"8B4513",
+		"Salmon":					"FA8072",
+		"SandyBrown":				"F4A460",
+		"SeaGreen":					"2E8B57",
+		"SeaShell":					"FFF5EE",
+		"Sienna":					"A0522D",
+		"Silver":					"C0C0C0",
+		"SkyBlue":					"87CEEB",
+		"SlateBlue":				"6A5ACD",
+		"SlateGray":				"708090",
+		"SlateGrey":				"708090",
+		"Snow":						"FFFAFA",
+		"SpringGreen":				"00FF7F",
+		"SteelBlue":				"4682B4",
+		"Tan":						"D2B48C",
+		"Teal":						"008080",
+		"Thistle":					"D8BFD8",
+		"Tomato":					"FF6347",
+		"Turquoise":				"40E0D0",
+		"Violet":					"EE82EE",
+		"Wheat":					"F5DEB3",
+		"White":					"FFFFFF",
+		"WhiteSmoke":				"F5F5F5",
+		"Yellow":					"FFFF00",
+		"YellowGreen":				"9ACD32"
+	}
+}