mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-01-17 22:55:38 +00:00
Rewrote the text wrapping algorithm.
Fixes some subtle issues with newlines at the end of a word that would be at the end of a line. Still not quite perfect (sometimes goes to a new line when it's not necessary), but at least things aren't overflowing out of TextComponents anymore.
This commit is contained in:
parent
0d39586c2d
commit
4dd60c14e7
|
@ -280,56 +280,37 @@ std::string Font::wrapText(std::string text, float xLen) const
|
|||
std::string out;
|
||||
|
||||
std::string line, word, temp;
|
||||
size_t space, newline;
|
||||
size_t space;
|
||||
|
||||
Eigen::Vector2f textSize;
|
||||
|
||||
while(text.length() > 0 || !line.empty()) //while there's text or we still have text to render
|
||||
while(text.length() > 0) //while there's text or we still have text to render
|
||||
{
|
||||
space = text.find(' ', 0);
|
||||
space = text.find_first_of(" \t\n");
|
||||
if(space == std::string::npos)
|
||||
space = text.length() - 1;
|
||||
|
||||
word = text.substr(0, space + 1);
|
||||
|
||||
//check if the next word contains a newline
|
||||
newline = word.find('\n', 0);
|
||||
if(newline != std::string::npos)
|
||||
{
|
||||
//get everything up to the newline
|
||||
word = word.substr(0, newline);
|
||||
text.erase(0, newline + 1);
|
||||
}else{
|
||||
text.erase(0, space + 1);
|
||||
}
|
||||
|
||||
temp = line + word;
|
||||
|
||||
textSize = sizeText(temp);
|
||||
|
||||
//if we're on the last word and it'll fit on the line, just add it to the line
|
||||
if((textSize.x() <= xLen && text.length() == 0) || newline != std::string::npos)
|
||||
// if the word will fit on the line, add it to our line, and continue
|
||||
if(textSize.x() <= xLen)
|
||||
{
|
||||
line = temp;
|
||||
word = "";
|
||||
}
|
||||
|
||||
//if the next line will be too long or we're on the last of the text, render it
|
||||
if(textSize.x() > xLen || text.length() == 0 || newline != std::string::npos)
|
||||
{
|
||||
//output line now
|
||||
out += line + '\n';
|
||||
|
||||
//move the word we skipped to the next line
|
||||
line = word;
|
||||
continue;
|
||||
}else{
|
||||
//there's still space, continue building the line
|
||||
line = temp;
|
||||
// the next word won't fit, so break here
|
||||
out += line + '\n';
|
||||
line = word;
|
||||
}
|
||||
}
|
||||
|
||||
if(!out.empty() && newline == std::string::npos) //chop off the last newline if we added one
|
||||
out.erase(out.length() - 1, 1);
|
||||
// whatever's left should fit
|
||||
out += line;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue