mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	support for predefined colors
This commit is contained in:
		| @@ -154,11 +154,13 @@ void CTextContainer::blitLine(Canvas & to, Rect destRect, std::string what) | ||||
| 	delimitersCount *= f->getStringWidth(delimeters)/2; | ||||
|  | ||||
| 	std::smatch match; | ||||
| 	std::regex expr("\\{(#[0-9a-fA-F]{6})"); | ||||
| 	std::regex expr("\\{(.*?)\\|"); | ||||
| 	std::string::const_iterator searchStart( what.cbegin() ); | ||||
| 	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; | ||||
| 	} | ||||
|  | ||||
| @@ -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 | ||||
| 			{ | ||||
| 				std::smatch match; | ||||
|    				std::regex expr("^#([0-9a-fA-F]{6})"); | ||||
|    				std::regex 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); | ||||
| 					std::string colorText = match[1].str(); | ||||
| 					ColorRGBA color = CMessage::parseColor(colorText); | ||||
| 					 | ||||
| 					toPrint = toPrint.substr(7, toPrint.length() - 6); | ||||
| 					to.drawText(where, font, ColorRGBA(rgb[0], rgb[1], rgb[2]), ETextAlignment::TOPLEFT, toPrint); | ||||
| 					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 | ||||
| 					to.drawText(where, font, Colors::YELLOW, ETextAlignment::TOPLEFT, toPrint); | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
| #include "../CGameInfo.h" | ||||
| #include "../../lib/CGeneralTextHandler.h" | ||||
| #include "../../lib/TextOperations.h" | ||||
| #include "../../lib/JsonNode.h" | ||||
|  | ||||
| #include "../windows/InfoWindows.h" | ||||
| #include "../widgets/Buttons.h" | ||||
| @@ -152,12 +153,16 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineWi | ||||
| 				opened=true; | ||||
|  | ||||
| 				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)) | ||||
| 				{ | ||||
| 					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]=='}') | ||||
| @@ -222,6 +227,32 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineWi | ||||
| 	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) | ||||
| { | ||||
| 	size_t begin = 0; | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
| struct SDL_Surface; | ||||
| class CInfoWindow; | ||||
| class CComponent; | ||||
| class ColorRGBA; | ||||
|  | ||||
|  | ||||
| /// Class which draws formatted text messages and generates chat windows | ||||
| @@ -32,6 +33,9 @@ public: | ||||
| 	/// split text in lines | ||||
| 	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 | ||||
| 	static std::string guessHeader(const std::string & msg); | ||||
|  | ||||
|   | ||||
							
								
								
									
										170
									
								
								config/textColors.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								config/textColors.json
									
									
									
									
									
										Normal file
									
								
							| @@ -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" | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user