Browse Source

Making team alignments widget customizable

nordsoft 3 years ago
parent
commit
9b76a8000f

+ 14 - 8
client/gui/InterfaceObjectConfigurable.cpp

@@ -45,9 +45,14 @@ void InterfaceObjectConfigurable::addCallback(const std::string & callbackName,
 void InterfaceObjectConfigurable::init(const JsonNode &config)
 {
 	OBJ_CONSTRUCTION;
+	
+	for(auto & item : config["variables"].Struct())
+	{
+		variables[item.first] = item.second;
+	}
+	
 	int unnamedObjectId = 0;
 	const std::string unnamedObjectPrefix = "__widget_";
-	
 	for(const auto & item : config["items"].Vector())
 	{
 		std::string name = item["name"].isNull()
@@ -57,11 +62,6 @@ void InterfaceObjectConfigurable::init(const JsonNode &config)
 	}
 }
 
-const JsonNode & InterfaceObjectConfigurable::variable(const std::string & name) const
-{
-	return variables[name];
-}
-
 std::string InterfaceObjectConfigurable::readText(const JsonNode & config) const
 {
 	if(config.isNull())
@@ -296,7 +296,7 @@ std::shared_ptr<CAnimImage> InterfaceObjectConfigurable::buildImage(const JsonNo
 std::shared_ptr<CFilledTexture> InterfaceObjectConfigurable::buildTexture(const JsonNode & config) const
 {
 	auto image = config["image"].String();
-	auto rect = readRect(config);
+	auto rect = readRect(config["rect"]);
 	return std::make_shared<CFilledTexture>(image, rect);
 }
 
@@ -323,9 +323,15 @@ std::shared_ptr<CShowableAnim> InterfaceObjectConfigurable::buildAnimation(const
 	return anim;
 }
 
-std::shared_ptr<CIntObject> InterfaceObjectConfigurable::buildWidget(const JsonNode & config) const
+std::shared_ptr<CIntObject> InterfaceObjectConfigurable::buildWidget(JsonNode config) const
 {
 	assert(!config.isNull());
+	//overrides from variables
+	for(auto & item : config["overrides"].Struct())
+	{
+		config[item.first] = variables[item.second.String()];
+	}
+	
 	auto type = config["type"].String();
 	if(type == "picture")
 	{

+ 3 - 5
client/gui/InterfaceObjectConfigurable.h

@@ -36,6 +36,7 @@ protected:
 	void init(const JsonNode & config);
 	
 	void addCallback(const std::string & callbackName, std::function<void(int)> callback);
+	JsonNode variables;
 	
 	template<class T>
 	const std::shared_ptr<T> widget(const std::string & name) const
@@ -45,9 +46,7 @@ protected:
 			return nullptr;
 		return std::dynamic_pointer_cast<T>(iter->second);
 	}
-	
-	const JsonNode & variable(const std::string & name) const;
-	
+		
 	//basic serializers
 	Point readPosition(const JsonNode &) const;
 	Rect readRect(const JsonNode &) const;
@@ -72,11 +71,10 @@ protected:
 	
 	//composite widgets
 	virtual std::shared_ptr<CIntObject> buildCustomWidget(const JsonNode & config);
-	std::shared_ptr<CIntObject> buildWidget(const JsonNode & config) const;
+	std::shared_ptr<CIntObject> buildWidget(JsonNode config) const;
 	
 private:
 	
 	std::map<std::string, std::shared_ptr<CIntObject>> widgets;
 	std::map<std::string, std::function<void(int)>> callbacks;
-	JsonNode variables;
 };

+ 47 - 31
client/lobby/RandomMapTab.cpp

@@ -480,10 +480,11 @@ void TemplatesDropBox::setTemplate(const CRmgTemplate * tmpl)
 }
 
 TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab):
-	CIntObject(),
+	InterfaceObjectConfigurable(),
 	randomMapTab(randomMapTab)
 {
-	OBJ_CONSTRUCTION;
+	const JsonNode config(ResourceID("config/widgets/randomMapTeamsWidget.json"));
+	variables = config["variables"];
 	
 	int humanPlayers = randomMapTab.obtainMapGenOptions().getPlayerCount();
 	int cpuPlayers = randomMapTab.obtainMapGenOptions().getCompOnlyPlayerCount();
@@ -491,16 +492,47 @@ TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab):
 	? PlayerColor::PLAYER_LIMIT_I : humanPlayers + cpuPlayers;
 	assert(totalPlayers <= PlayerColor::PLAYER_LIMIT_I);
 	auto settings = randomMapTab.obtainMapGenOptions().getPlayersSettings();
+	variables["totalPlayers"].Integer() = totalPlayers;
+	
+	pos.w = variables["windowSize"]["x"].Integer() + totalPlayers * variables["cellMargin"]["x"].Integer();
+	pos.h = variables["windowSize"]["y"].Integer() + totalPlayers * variables["cellMargin"]["y"].Integer();
+	variables["backgroundRect"]["x"].Integer() = pos.x;
+	variables["backgroundRect"]["y"].Integer() = pos.y;
+	variables["backgroundRect"]["w"].Integer() = pos.w;
+	variables["backgroundRect"]["h"].Integer() = pos.h;
+	variables["okButtonPosition"]["x"].Integer() = variables["buttonsOffset"]["ok"]["x"].Integer();
+	variables["okButtonPosition"]["y"].Integer() = variables["buttonsOffset"]["ok"]["y"].Integer() + totalPlayers * variables["cellMargin"]["y"].Integer();
+	variables["cancelButtonPosition"]["x"].Integer() = variables["buttonsOffset"]["cancel"]["x"].Integer();
+	variables["cancelButtonPosition"]["y"].Integer() = variables["buttonsOffset"]["cancel"]["y"].Integer() + totalPlayers * variables["cellMargin"]["y"].Integer();
+	
+	addCallback("ok", [&](int)
+	{
+		for(int plId = 0; plId < players.size(); ++plId)
+		{
+			randomMapTab.obtainMapGenOptions().setPlayerTeam(PlayerColor(plId), TeamID(players[plId]->getSelected()));
+		}
+		randomMapTab.updateMapInfoByHost();
+		assert(GH.topInt().get() == this);
+		GH.popInt(GH.topInt());
+	});
+	
+	addCallback("cancel", [&](int)
+	{
+		assert(GH.topInt().get() == this);
+		GH.popInt(GH.topInt());
+	});
+	
+	init(config);
 	
-	pos.w = 80 + totalPlayers * 32;
-	pos.h = 80 + totalPlayers * 32;
-	background = std::make_shared<CFilledTexture>("Bl3DCvex", pos);
 	center(pos);
 	
+	OBJ_CONSTRUCTION;
+	
 	for(int plId = 0; plId < totalPlayers; ++plId)
 	{
 		players.push_back(std::make_shared<CToggleGroup>([&, totalPlayers, plId](int sel)
 		{
+			variables["player_id"].Integer() = plId;
 			SObjectConstruction obj__i(players[plId].get());
 			for(int teamId = 0; teamId < totalPlayers; ++teamId)
 			{
@@ -508,11 +540,11 @@ TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab):
 				assert(button);
 				if(sel == teamId)
 				{
-					button->addOverlay(std::make_shared<CAnimImage>("ITGFLAGS", plId, 0, 8, 8));
+					button->addOverlay(buildWidget(variables["flagsAnimation"]));
 				}
 				else
 				{
-					button->addOverlay(std::make_shared<CPicture>("TeamPlSl"));
+					button->addOverlay(buildWidget(variables["unchecked"]));
 				}
 			}
 		}));
@@ -520,12 +552,14 @@ TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab):
 		SObjectConstruction obj__i(players.back().get());
 		for(int teamId = 0; teamId < totalPlayers; ++teamId)
 		{
-			Point p(40 + plId * 32, 20 + teamId * 32);
-			placeholders.push_back(std::make_shared<CPicture>("TeamPlSl", p.x, p.y));
-			auto button = std::make_shared<CToggleButton>(p, "TeamPlSl", std::pair<std::string, std::string>{"", ""});
-			button->pos.w = 32;
-			button->pos.h = 32;
-			players.back()->addToggle(teamId, button);
+			variables["point"]["x"].Integer() = variables["cellOffset"]["x"].Integer() + plId * variables["cellMargin"]["x"].Integer();
+			variables["point"]["y"].Integer() = variables["cellOffset"]["y"].Integer() + teamId * variables["cellMargin"]["y"].Integer();
+			//Point p(40 + plId * 32, 20 + teamId * 32);
+			placeholders.push_back(buildWidget(variables["placeholder"]));
+			auto button = buildWidget(variables["button"]);
+			button->pos.w = variables["cellMargin"]["x"].Integer();
+			button->pos.h = variables["cellMargin"]["y"].Integer();
+			players.back()->addToggle(teamId, std::dynamic_pointer_cast<CToggleBase>(button));
 		}
 		
 		auto team = settings.at(PlayerColor(plId)).getTeam();
@@ -534,22 +568,4 @@ TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab):
 		else
 			players.back()->setSelected(team.getNum());
 	}
-	
-	buttonOk = std::make_shared<CButton>(Point(40, 40 + totalPlayers * 32), "MUBCHCK.DEF", CGI->generaltexth->zelp[560], [&]()
-	{
-		for(int plId = 0; plId < players.size(); ++plId)
-		{
-			randomMapTab.obtainMapGenOptions().setPlayerTeam(PlayerColor(plId), TeamID(players[plId]->getSelected()));
-		}
-		randomMapTab.updateMapInfoByHost();
-		assert(GH.topInt().get() == this);
-		GH.popInt(GH.topInt());
-	});
-	buttonCancel = std::make_shared<CButton>(Point(120, 40 + totalPlayers * 32), "MUBCANC.DEF", CGI->generaltexth->zelp[561], [&]()
-	{
-		assert(GH.topInt().get() == this);
-		GH.popInt(GH.topInt());
-	}, SDLK_ESCAPE);
-	
-	
 }

+ 2 - 2
client/lobby/RandomMapTab.h

@@ -87,7 +87,7 @@ private:
 	
 };
 
-class TeamAlignmentsWidget: public CIntObject
+class TeamAlignmentsWidget: public InterfaceObjectConfigurable
 {
 public:
 	TeamAlignmentsWidget(RandomMapTab & randomMapTab);
@@ -100,5 +100,5 @@ private:
 	std::shared_ptr<CLabelGroup> labels;
 	std::shared_ptr<CButton> buttonOk, buttonCancel;
 	std::vector<std::shared_ptr<CToggleGroup>> players;
-	std::vector<std::shared_ptr<CPicture>> placeholders;
+	std::vector<std::shared_ptr<CIntObject>> placeholders;
 };