Bladeren bron

Merge pull request #1675 from rilian-la-te/scholar-infobox

Fix #1385 and similar
Ivan Savenko 2 jaren geleden
bovenliggende
commit
e1310f88e3

+ 11 - 5
client/CPlayerInterface.cpp

@@ -1053,11 +1053,17 @@ void CPlayerInterface::showInfoDialog(EInfoWindowMode type, const std::string &t
 	{
 		return;
 	}
-	std::vector<std::shared_ptr<CComponent>> intComps;
-	for (auto & component : components)
-		intComps.push_back(std::make_shared<CComponent>(component));
-	showInfoDialog(text,intComps,soundID);
-
+	std::vector<Component> vect = components; //I do not know currently how to avoid copy here
+	do
+	{
+		std::vector<Component> sender = {vect.begin(), vect.begin() + std::min(vect.size(), static_cast<size_t>(8))};
+		std::vector<std::shared_ptr<CComponent>> intComps;
+		for (auto & component : sender)
+			intComps.push_back(std::make_shared<CComponent>(component));
+		showInfoDialog(text,intComps,soundID);
+		vect.erase(vect.begin(), vect.begin() + std::min(vect.size(), static_cast<size_t>(8)));
+	}
+	while(!vect.empty());
 }
 
 void CPlayerInterface::showInfoDialog(const std::string & text, std::shared_ptr<CComponent> component)

+ 1 - 12
client/adventureMap/CInfoBar.cpp

@@ -217,17 +217,6 @@ CInfoBar::VisibleComponentInfo::VisibleComponentInfo(const std::vector<Component
 		text = std::make_shared<CTextBox>(message, textRect, 0, font, ETextAlignment::CENTER, Colors::WHITE);
 }
 
-int CInfoBar::getEstimatedComponentHeight(int numComps) const
-{
-	if (numComps > 8) //Bigger than 8 components - return invalid value
-		return std::numeric_limits<int>::max();
-	else if (numComps > 2)
-		return 160; // 32px * 1 row + 20 to offset
-	else if (numComps)
-		return 118; // 118 px to offset
-	return 0;
-}
-
 void CInfoBar::playNewDaySound()
 {
 	if(LOCPLINT->cb->getDate(Date::DAY_OF_WEEK) != 1) // not first day of the week
@@ -402,7 +391,7 @@ void CInfoBar::pushComponents(const std::vector<Component> & components, std::st
 
 void CInfoBar::prepareComponents(const std::vector<Component> & components, std::string message, int timer)
 {
-	auto imageH = getEstimatedComponentHeight(components.size()) + (components.empty() ? 0 : 2 * CInfoBar::offset);
+	auto imageH = CMessage::getEstimatedComponentHeight(components.size()) + (components.empty() ? 0 : 2 * CInfoBar::offset);
 	auto textH = CMessage::guessHeight(message,CInfoBar::data_width - 2 * CInfoBar::offset, FONT_SMALL);
 	auto tinyH = CMessage::guessHeight(message,CInfoBar::data_width - 2 * CInfoBar::offset, FONT_TINY);
 	auto header = CMessage::guessHeader(message);

+ 0 - 3
client/adventureMap/CInfoBar.h

@@ -189,8 +189,5 @@ public:
 
 	/// check if infobar is showed something about pickups
 	bool showingComponents();
-
-	/// get estimated component height for InfoBar
-	int getEstimatedComponentHeight(int numComps) const;
 };
 

+ 11 - 0
client/windows/CMessage.cpp

@@ -221,6 +221,17 @@ int CMessage::guessHeight(const std::string & txt, int width, EFonts font)
 	return lineHeight * (int)lines.size();
 }
 
+int CMessage::getEstimatedComponentHeight(int numComps)
+{
+	if (numComps > 8) //Bigger than 8 components - return invalid value
+		return std::numeric_limits<int>::max();
+	else if (numComps > 2)
+		return 160; // 32px * 1 row + 20 to offset
+	else if (numComps)
+		return 118; // 118 px to offset
+	return 0;
+}
+
 void CMessage::drawIWindow(CInfoWindow * ret, std::string text, PlayerColor player)
 {
 	bool blitOr = false;

+ 1 - 0
client/windows/CMessage.h

@@ -38,6 +38,7 @@ public:
 	/// For convenience
 	static int guessHeight(const std::string & string, int width, EFonts fnt);
 
+	static int getEstimatedComponentHeight(int numComps);
 	/// constructor
 	static void init();
 	/// destructor