From 307c57dcc494161d019d7ee394e7cdb1912ca11f Mon Sep 17 00:00:00 2001
From: Sfan5 <sfan5@live.de>
Date: Sat, 6 Jul 2013 10:32:58 +0200
Subject: [PATCH] Use hexadecimal RRGGBB instead of colorkeys, rename getColor
 to parseColor

---
 builtin/mainmenu.lua    |  2 +-
 builtin/modstore.lua    |  8 ++--
 doc/lua_api.txt         | 18 ++-------
 src/guiFormSpecMenu.cpp | 85 +++++++++--------------------------------
 src/guiFormSpecMenu.h   |  2 +-
 5 files changed, 28 insertions(+), 87 deletions(-)

diff --git a/builtin/mainmenu.lua b/builtin/mainmenu.lua
index 56143e700..12747c8c9 100644
--- a/builtin/mainmenu.lua
+++ b/builtin/mainmenu.lua
@@ -389,7 +389,7 @@ end
 
 --------------------------------------------------------------------------------
 function menubar.refresh()
-	menubar.formspec = "box[-2,7.625;15.75,1.75;BLK]"
+	menubar.formspec = "box[-2,7.625;15.75,1.75;000000]"
 	menubar.buttons = {}
 
 	local button_base = -1.8
diff --git a/builtin/modstore.lua b/builtin/modstore.lua
index 73afc3899..1890da138 100644
--- a/builtin/modstore.lua
+++ b/builtin/modstore.lua
@@ -187,9 +187,9 @@ function modstore.getmodlist(list)
 							" of " .. (list.pagecount +1) .. "]"
 	
 	retval = retval .. "button[11.6,-0.1;0.5,0.5;btn_modstore_page_up;^]"
-	retval = retval .. "box[11.6,0.35;0.28,8.6;BLK]"
+	retval = retval .. "box[11.6,0.35;0.28,8.6;000000]"
 	local scrollbarpos = 0.35 + (8.1/list.pagecount) * list.page
-	retval = retval .. "box[11.6," ..scrollbarpos .. ";0.28,0.5;LIM]"
+	retval = retval .. "box[11.6," ..scrollbarpos .. ";0.28,0.5;32CD32]"
 	retval = retval .. "button[11.6,9.0;0.5,0.5;btn_modstore_page_down;v]"
 	
 	
@@ -210,7 +210,7 @@ function modstore.getmodlist(list)
 		if details ~= nil then
 			local screenshot_ypos = (i-1 - (list.page * modstore.modsperpage))*1.9 +0.2
 			
-			retval = retval .. "box[0," .. screenshot_ypos .. ";11.4,1.75;WHT]"
+			retval = retval .. "box[0," .. screenshot_ypos .. ";11.4,1.75;FFFFFF]"
 			
 			--screenshot
 			if details.screenshot_url ~= nil and
@@ -272,4 +272,4 @@ function modstore.get_details(modid)
 	local retval = engine.get_modstore_details(tostring(modid))
 	modstore.details_cache[modid] = retval
 	return retval
-end
\ No newline at end of file
+end
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index ebba40fbf..a9f2d0d46 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -960,7 +960,7 @@ textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]
 ^Scrollabel itemlist showing arbitrary text elements
 ^ x and y position the itemlist relative to the top left of the menu
 ^ w and h are the size of the itemlist
-^ listelements can be prepended by #colorkey (see colorkeys), 
+^ listelements can be prepended by #RRGGBB in hexadecimal format
 ^    if you want a listelement to start with # write ##
 ^ name fieldname sent to server on doubleclick value is current selected element
 
@@ -973,24 +973,12 @@ tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>;<current_tab>;<transparent>;<dr
 ^ transparent (optional) show transparent
 ^ draw_border (optional) draw border
 
-box[<X>,<Y>;<W>,<H>;<colorkey>]
+box[<X>,<Y>;<W>,<H>;<color>]
 ^ simple colored semitransparent box
 ^ x and y position the box relative to the top left of the menu
 ^ w and h are the size of box
-^ colorkey (see colorkeys)
+^ color in hexadecimal format RRGGBB
 
-Available colorkeys:
-- YLW yellow
-- GRN green
-- LIM lime
-- ORN orange
-- RED red
-- BLU blue
-- CYN cyan
-- BLK black
-- BRN brown
-- WHT white
-- GRY grey
 
 Inventory location:
 
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp
index 0aa2c2dcd..3a3a9433e 100644
--- a/src/guiFormSpecMenu.cpp
+++ b/src/guiFormSpecMenu.cpp
@@ -663,15 +663,13 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
 				}
 				else {
 					std::wstring toadd = narrow_to_wide(items[i].c_str() + 4);
-					std::string color = items[i].substr(1,3);
+					std::string color = items[i].substr(1,6);
 
 					e->addItem(toadd.c_str());
 
-					bool valid_color = true;
+					irr::video::SColor toset;
 
-					irr::video::SColor toset = getColor(color,valid_color);
-
-					if (valid_color)
+					if (parseColor(color,toset))
 						e->setItemOverrideColor(i,toset);
 				}
 			}
@@ -1335,11 +1333,9 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element) {
 		geom.X = stof(v_geom[0]) * (float)spacing.X;
 		geom.Y = stof(v_geom[1]) * (float)spacing.Y;
 
-		bool valid_color = false;
+		irr::video::SColor color;
 
-		irr::video::SColor color = getColor(color_str,valid_color);
-
-		if (valid_color) {
+		if (parseColor(color_str,color)) {
 			BoxDrawSpec spec(pos,geom,color);
 
 			m_boxes.push_back(spec);
@@ -2520,65 +2516,22 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
 	return Parent ? Parent->OnEvent(event) : false;
 }
 
-irr::video::SColor GUIFormSpecMenu::getColor(std::string color,bool& valid_color) {
+bool GUIFormSpecMenu::parseColor(std::string color, irr::video::SColor& outcolor) {
+	outcolor = irr::video::SColor(0,0,0,0);
 
-	if (color == "YLW") {
-		valid_color = true;
-		return irr::video::SColor(255,255,255,0);
-	}
+	if(color.size() != 6) return false;
+	if(!string_allowed(color, "0123456789abcdefABCDEF")) return false;
 
-	if (color == "GRN") {
-		valid_color = true;
-		return irr::video::SColor(255,34,249,34);
-	}
+	unsigned int r, g, b;
+	std::istringstream iss("");
+	iss.str(color.substr(0, 1));
+	iss >> std::hex >> r;
+	iss.str(color.substr(2, 1));
+	iss >> std::hex >> g;
+	iss.str(color.substr(4, 1));
+	iss >> std::hex >> b;
 
-	if (color == "LIM") {
-		valid_color = true;
-		return irr::video::SColor(255,50,205,50);
-	}
-
-	if (color == "RED") {
-		valid_color = true;
-		return irr::video::SColor(255,255,0,0);
-	}
-
-	if (color == "ORN") {
-		valid_color = true;
-		return irr::video::SColor(255,255,140,0);
-	}
-
-	if (color == "BLU") {
-		valid_color = true;
-		return irr::video::SColor(255,0,0,255);
-	}
-
-	if (color == "CYN") {
-		valid_color = true;
-		return irr::video::SColor(255,0,255,255);
-	}
-
-	if (color == "BLK") {
-		valid_color = true;
-		return irr::video::SColor(255,0,0,0);
-	}
-
-	if (color == "BRN") {
-		valid_color = true;
-		return irr::video::SColor(255,139,69,19);
-	}
-
-	if (color == "WHT") {
-		valid_color = true;
-		return irr::video::SColor(255,255,255,255);
-	}
-
-	if (color == "GRY") {
-		valid_color = true;
-		return irr::video::SColor(255,205,201,201);
-	}
-
-	valid_color = false;
-
-	return irr::video::SColor(0,0,0,0);
+	outcolor = irr::video::SColor(255,r,g,b);
+	return true;
 }
 
diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h
index f5a273668..60d170fda 100644
--- a/src/guiFormSpecMenu.h
+++ b/src/guiFormSpecMenu.h
@@ -321,7 +321,7 @@ private:
 	void parseTabHeader(parserData* data,std::string element);
 	void parseBox(parserData* data,std::string element);
 
-	irr::video::SColor getColor(std::string color,bool& valid_color);
+	bool parseColor(std::string color, irr::video::SColor& outcolor);
 };
 
 class FormspecFormSource: public IFormSource