00001 #include "glwx.h"
00002
00003 GUIText::GUIText(const std::string &text)
00004 {
00005 fontIndex = -1;
00006 update = true;
00007
00008 color.set(1.0,1.0,1.0);
00009 scales.set(1.0f, 1.0f);
00010 setString(text);
00011 }
00012
00013 GUIText::GUIText(const GUIText & copy)
00014 {
00015 this->operator=(copy);
00016 }
00017
00018 GUIText &GUIText::operator =(const GUIText & copy)
00019 {
00020 if(this != ©)
00021 {
00022 fontIndex = copy.fontIndex;
00023 scales = copy.scales;
00024 update = copy.update;
00025 color = copy.color;
00026 size = copy.size;
00027 text = copy.text;
00028 }
00029 return *this;
00030 }
00031
00032 GUIText &GUIText::operator =(const std::string & str)
00033 {
00034 setString(str);
00035 return *this;
00036 }
00037
00038 bool GUIText::loadXMLSettings(const TiXmlElement *element)
00039 {
00040 if(!element || !element->Value() || strcmp(element->Value(), "Text"))
00041 return Logger::writeErrorLog("Need a Text node in the xml file");
00042
00043 for(const TiXmlElement *child = element->FirstChildElement();
00044 child;
00045 child = child->NextSiblingElement() )
00046 {
00047 const char * value = child->Value();
00048
00049 if(value)
00050 {
00051 if(!strcmp(value, "Color"))
00052 XMLArbiter::fillComponents3f(child, color);
00053
00054 if(!strcmp(value, "Font"))
00055 fontIndex = GUIFontManager::addFont(child);
00056 }
00057 }
00058
00059 setHeightScale(XMLArbiter::fillComponents1f(element, "hScale", 1.0f));
00060 setWidthScale(XMLArbiter::fillComponents1f(element, "wScale", 1.0f));
00061 setFontIndex(XMLArbiter::fillComponents1i(element, "fontIndex", fontIndex));
00062 setString(element->Attribute("string"));
00063
00064 return true;
00065 }
00066
00067 const std::string& GUIText::getString(){ return text; }
00068
00069 void GUIText::setString(const std::string &textArg)
00070 {
00071 if(textArg.size() && text != textArg)
00072 {
00073 text = textArg;
00074 update = true;
00075 }
00076 }
00077
00078 void GUIText::setString(const char *textArg)
00079 {
00080 if(textArg && text != textArg)
00081 {
00082 text = textArg;
00083 update = true;
00084 }
00085 }
00086
00087 void GUIText::clear()
00088 {
00089 text.clear();
00090 update = false;
00091 size.set(0,0);
00092 }
00093
00094 int GUIText::getFontIndex()
00095 {
00096 return fontIndex;
00097 }
00098
00099 void GUIText::setFontIndex(int index)
00100 {
00101 fontIndex = index;
00102 }
00103
00104 void GUIText::print(int x, int y, int startIndex, int endIndex)
00105 {
00106 if(!text.size())
00107 return;
00108
00109 endIndex = (endIndex < 0) ? int(text.size()) : endIndex;
00110 startIndex = clamp(startIndex, 0, endIndex);
00111
00112 GUIFontManager::setCurrentFont(fontIndex);
00113 GUIFont *currentFont = GUIFontManager::getCurrentFont();
00114 computeDimensions();
00115
00116 if(!currentFont && !(currentFont = GUIFontManager::getDefaultFont()))
00117 return;
00118
00119 currentFont->getFontObject()->printSubString(float(x), float(y), scales.x, scales.y,
00120 color.x, color.y, color.z,
00121 startIndex, endIndex,
00122 text);
00123 }
00124
00125 void GUIText::printCenteredX (int x, int y, int startIndex, int endIndex)
00126 {
00127 if(!text.size())
00128 return;
00129
00130 computeDimensions();
00131 print(x - size.x/2, y, startIndex, endIndex);
00132 }
00133
00134 void GUIText::printCenteredY (int x, int y, int startIndex, int endIndex)
00135 {
00136 if(!text.size())
00137 return;
00138
00139 computeDimensions();
00140 print(x, y - size.y/2, startIndex, endIndex);
00141 }
00142
00143 void GUIText::printCenteredXY(int x, int y, int startIndex, int endIndex)
00144 {
00145 if(!text.size())
00146 return;
00147
00148 computeDimensions();
00149 print(x - size.x/2, y - size.y/2, startIndex, endIndex);
00150 }
00151
00152 void GUIText::computeDimensions()
00153 {
00154 if(needUpdating())
00155 {
00156 GUIFontManager::setCurrentFont(fontIndex);
00157 GUIFont *currentFont = GUIFontManager::getCurrentFont();
00158
00159 if(!currentFont && !(currentFont = GUIFontManager::getDefaultFont()))
00160 return;
00161
00162 if(currentFont == GUIFontManager::getDefaultFont())
00163 fontIndex = GUIFontManager::findFontIndex(currentFont);
00164
00165 if(text.size())
00166 {
00167 size = currentFont->getFontObject()->getStringDimensions(text);
00168 size.x = int(float(size.x)*scales.x);
00169 }
00170 size.y = int(float(currentFont->getFontObject()->getHeight())*scales.y);
00171 forceUpdate(false);
00172 }
00173 }
00174
00175 void GUIText::setSize(const Tuple2i& sizeArg){ size = sizeArg; }
00176 void GUIText::setSize(int x, int y){ size.set(x, y); }
00177
00178 int GUIText::getHeight(){ return abs(size.y); }
00179 int GUIText::getWidth() { return abs(size.x); }
00180
00181 const Tuple2i& GUIText::getSize(){ return size; }
00182 bool GUIText::needUpdating(){ return update; }
00183
00184 void GUIText::forceUpdate(bool updateArg){ update = updateArg; }
00185 void GUIText::setColor(const Tuple3f &color){ setColor(color.x, color.y, color.z); }
00186
00187 void GUIText::setColor(float r, float g, float b)
00188 {
00189 color.set(clamp(r, 0.0f, 255.0f),
00190 clamp(g, 0.0f, 255.0f),
00191 clamp(b, 0.0f, 255.0f));
00192
00193 color.x /= (color.x > 1.0) ? 255.0f : 1.0f;
00194 color.y /= (color.y > 1.0) ? 255.0f : 1.0f;
00195 color.z /= (color.z > 1.0) ? 255.0f : 1.0f;
00196 }
00197
00198 void GUIText::setHeightScale(float hs)
00199 {
00200 scales.y = clamp(hs, 0.1f, 20.0f);
00201 }
00202 void GUIText::setWidthScale(float ws)
00203 {
00204 scales.x = clamp(ws, 0.1f, 20.0f);
00205 }
00206 void GUIText::setScales(Tuple2f scales)
00207 {
00208 setHeightScale(scales.y);
00209 setWidthScale(scales.x);
00210 }
00211
00212 float GUIText::getHeightScale()
00213 {
00214 return scales.y;
00215 }
00216
00217 float GUIText::getWidthScale()
00218 {
00219 return scales.x;
00220 }
00221
00222 const Tuple2f &GUIText::getScales()
00223 {
00224 return scales;
00225 }
00226 const Tuple3f &GUIText::getColor()
00227 {
00228 return color;
00229 }
00230