From 22990b680c003c37f531dd9d48619e0c812ee485 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Fri, 20 Jul 2012 17:43:38 +0100 Subject: [PATCH] Prevent the multiline update for labels from going out of bounds --- src/interface/Label.cpp | 65 ++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/src/interface/Label.cpp b/src/interface/Label.cpp index 35b20007e..76ea45f84 100644 --- a/src/interface/Label.cpp +++ b/src/interface/Label.cpp @@ -48,40 +48,51 @@ void Label::SetText(std::string text) void Label::updateMultiline() { - char * rawText = new char[text.length()+1]; - std::copy(text.begin(), text.end(), rawText); - rawText[text.length()] = 0; - int lines = 1; - int currentWidth = 0; - char * lastSpace = NULL; - char * currentWord = rawText; - char * nextSpace; - while(true) + if(text.length()>0) { - nextSpace = strchr(currentWord+1, ' '); - if(nextSpace) - nextSpace[0] = 0; - int width = Graphics::textwidth(currentWord); - if(width+currentWidth > Size.X-6) + char * rawText = new char[text.length()+1]; + std::copy(text.begin(), text.end(), rawText); + rawText[text.length()] = 0; + + int currentWidth = 0; + char * lastSpace = NULL; + char * currentWord = rawText; + char * nextSpace; + while(true) { - currentWidth = width; - currentWord[0] = '\n'; - lines++; + nextSpace = strchr(currentWord+1, ' '); + if(nextSpace) + nextSpace[0] = 0; + int width = Graphics::textwidth(currentWord); + if(width+currentWidth > Size.X-6) + { + currentWidth = width; + currentWord[0] = '\n'; + lines++; + } + else + currentWidth += width; + if(nextSpace) + nextSpace[0] = ' '; + if(!currentWord[0] || !currentWord[1] || !(currentWord = strchr(currentWord+1, ' '))) + break; } - else - currentWidth += width; - if(nextSpace) - nextSpace[0] = ' '; - if(!(currentWord = strchr(currentWord+1, ' '))) - break; + if(autoHeight) + { + Size.Y = lines*12; + } + textLines = std::string(rawText); + delete[] rawText; } - if(autoHeight) + else { - Size.Y = lines*12; + if(autoHeight) + { + Size.Y = 12; + } + textLines = std::string(""); } - textLines = std::string(rawText); - delete[] rawText; } std::string Label::GetText()