Browse Source

diagram rendering works

Laserlicht 1 year ago
parent
commit
0c58c9ca9c
1 changed files with 45 additions and 6 deletions
  1. 45 6
      client/mainmenu/CStatisticScreen.cpp

+ 45 - 6
client/mainmenu/CStatisticScreen.cpp

@@ -66,13 +66,18 @@ std::map<ColorRGBA, std::vector<float>> CStatisticScreen::extractData(StatisticD
 		if(tmpColor != val.player)
 		{
 			if(tmpColorSet.size())
-				plotData[graphics->playerColors[tmpColor.getNum()]] = tmpColorSet;
-			tmpColorSet.clear();
+			{
+				plotData.emplace(graphics->playerColors[tmpColor.getNum()], std::vector<float>(tmpColorSet));
+				tmpColorSet.clear();
+			}
+
 			tmpColor = val.player;
 		}
-		tmpColorSet.push_back(selector(val));
+		if(val.status == EPlayerStatus::INGAME)
+			tmpColorSet.push_back(selector(val));
 	}
-	plotData[graphics->playerColors[tmpColor.getNum()]] = tmpColorSet;
+	if(tmpColorSet.size())
+		plotData.emplace(graphics->playerColors[tmpColor.getNum()], std::vector<float>(tmpColorSet));
 
 	return plotData;
 }
@@ -90,9 +95,43 @@ LineChart::LineChart(Rect position, std::string title, std::map<ColorRGBA, std::
 
 	canvas = std::make_shared<GraphicalPrimitiveCanvas>(Rect(0, 0, pos.w, pos.h));
 
+	// additional calculations
+	float maxVal = 0;
+	int maxDay = 0;
+	for(auto & line : data)
+	{
+		for(auto & val : line.second)
+			if(maxVal < val)
+				maxVal = val;
+		if(maxDay < line.second.size())
+			maxDay = line.second.size();
+	}
+
+	// draw
+	for(auto & line : data)
+	{
+		Point lastPoint = Point(-1, -1);
+		for(int i = 0; i < line.second.size(); i++)
+		{
+			float x = ((float)chartArea.w / (float)(maxDay-1)) * (float)i;
+			float y = (float)chartArea.h - ((float)chartArea.h / maxVal) * line.second[i];
+			Point p = Point(x, y) + chartArea.topLeft();
+
+			if(lastPoint.x != -1)
+				canvas->addLine(lastPoint, p, line.first);
+
+			lastPoint = p;
+		}
+	}
+
 	// Axis
 	canvas->addLine(chartArea.topLeft() + Point(0, -10), chartArea.topLeft() + Point(0, chartArea.h + 10), Colors::WHITE);
 	canvas->addLine(chartArea.topLeft() + Point(-10, chartArea.h), chartArea.topLeft() + Point(chartArea.w + 10, chartArea.h), Colors::WHITE);
-	
-	canvas->addLine(chartArea.topLeft(), chartArea.bottomRight(), Colors::GREEN);
+
+	Point p = chartArea.topLeft() + Point(-5, chartArea.h + 10);
+	layout.push_back(std::make_shared<CLabel>(p.x, p.y, FONT_SMALL, ETextAlignment::CENTERRIGHT, Colors::WHITE, "0"));
+	p = chartArea.topLeft() + Point(chartArea.w + 10, chartArea.h + 10);
+	layout.push_back(std::make_shared<CLabel>(p.x, p.y, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(maxDay)));
+	p = chartArea.topLeft() + Point(-5, -10);
+	layout.push_back(std::make_shared<CLabel>(p.x, p.y, FONT_SMALL, ETextAlignment::CENTERRIGHT, Colors::WHITE, std::to_string((int)maxVal)));
 }