aboutsummaryrefslogtreecommitdiff
path: root/src/irrlicht_changes/static_text.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/irrlicht_changes/static_text.cpp')
-rw-r--r--src/irrlicht_changes/static_text.cpp329
1 files changed, 151 insertions, 178 deletions
diff --git a/src/irrlicht_changes/static_text.cpp b/src/irrlicht_changes/static_text.cpp
index bf61cd64e..eb1d338dc 100644
--- a/src/irrlicht_changes/static_text.cpp
+++ b/src/irrlicht_changes/static_text.cpp
@@ -13,7 +13,7 @@
#include <SColor.h>
#if USE_FREETYPE
- #include "CGUITTFont.h"
+#include "CGUITTFont.h"
#endif
#include "util/string.h"
@@ -27,23 +27,20 @@ namespace gui
{
//! constructor
StaticText::StaticText(const EnrichedString &text, bool border,
- IGUIEnvironment* environment, IGUIElement* parent,
- s32 id, const core::rect<s32>& rectangle,
- bool background)
-: IGUIStaticText(environment, parent, id, rectangle),
- HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_UPPERLEFT),
- Border(border), WordWrap(false), Background(background),
- RestrainTextInside(true), RightToLeft(false),
- OverrideFont(0), LastBreakFont(0)
-{
- #ifdef _DEBUG
+ IGUIEnvironment *environment, IGUIElement *parent, s32 id,
+ const core::rect<s32> &rectangle, bool background) :
+ IGUIStaticText(environment, parent, id, rectangle),
+ HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_UPPERLEFT), Border(border),
+ WordWrap(false), Background(background), RestrainTextInside(true),
+ RightToLeft(false), OverrideFont(0), LastBreakFont(0)
+{
+#ifdef _DEBUG
setDebugName("StaticText");
- #endif
+#endif
setText(text);
}
-
//! destructor
StaticText::~StaticText()
{
@@ -57,23 +54,24 @@ void StaticText::draw()
if (!IsVisible)
return;
- IGUISkin* skin = Environment->getSkin();
+ IGUISkin *skin = Environment->getSkin();
if (!skin)
return;
- video::IVideoDriver* driver = Environment->getVideoDriver();
+ video::IVideoDriver *driver = Environment->getVideoDriver();
core::rect<s32> frameRect(AbsoluteRect);
// draw background
if (Background)
- driver->draw2DRectangle(getBackgroundColor(), frameRect, &AbsoluteClippingRect);
+ driver->draw2DRectangle(
+ getBackgroundColor(), frameRect, &AbsoluteClippingRect);
// draw the border
- if (Border)
- {
- skin->draw3DSunkenPane(this, 0, true, false, frameRect, &AbsoluteClippingRect);
+ if (Border) {
+ skin->draw3DSunkenPane(
+ this, 0, true, false, frameRect, &AbsoluteClippingRect);
frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
}
@@ -84,52 +82,52 @@ void StaticText::draw()
updateText();
core::rect<s32> r = frameRect;
- s32 height_line = font->getDimension(L"A").Height + font->getKerningHeight();
+ s32 height_line = font->getDimension(L"A").Height +
+ font->getKerningHeight();
s32 height_total = height_line * BrokenText.size();
- if (VAlign == EGUIA_CENTER && WordWrap)
- {
+ if (VAlign == EGUIA_CENTER && WordWrap) {
r.UpperLeftCorner.Y = r.getCenter().Y - (height_total / 2);
- }
- else if (VAlign == EGUIA_LOWERRIGHT)
- {
+ } else if (VAlign == EGUIA_LOWERRIGHT) {
r.UpperLeftCorner.Y = r.LowerRightCorner.Y - height_total;
}
- if (HAlign == EGUIA_LOWERRIGHT)
- {
- r.UpperLeftCorner.X = r.LowerRightCorner.X -
- getTextWidth();
+ if (HAlign == EGUIA_LOWERRIGHT) {
+ r.UpperLeftCorner.X = r.LowerRightCorner.X - getTextWidth();
}
irr::video::SColor previous_color(255, 255, 255, 255);
for (const EnrichedString &str : BrokenText) {
- if (HAlign == EGUIA_LOWERRIGHT)
- {
- r.UpperLeftCorner.X = frameRect.LowerRightCorner.X -
- font->getDimension(str.c_str()).Width;
+ if (HAlign == EGUIA_LOWERRIGHT) {
+ r.UpperLeftCorner.X =
+ frameRect.LowerRightCorner.X -
+ font->getDimension(str.c_str()).Width;
}
- //str = colorizeText(BrokenText[i].c_str(), colors, previous_color);
- //if (!colors.empty())
- // previous_color = colors[colors.size() - 1];
+ // str = colorizeText(BrokenText[i].c_str(), colors,
+ // previous_color); if (!colors.empty()) previous_color =
+ //colors[colors.size() - 1];
#if USE_FREETYPE
if (font->getType() == irr::gui::EGFT_CUSTOM) {
- irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
- tmp->draw(str,
- r, previous_color, // FIXME
- HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER,
- (RestrainTextInside ? &AbsoluteClippingRect : NULL));
+ irr::gui::CGUITTFont *tmp =
+ static_cast<irr::gui::CGUITTFont *>(font);
+ tmp->draw(str, r, previous_color, // FIXME
+ HAlign == EGUIA_CENTER,
+ VAlign == EGUIA_CENTER,
+ (RestrainTextInside ? &AbsoluteClippingRect
+ : NULL));
} else
#endif
{
// Draw non-colored text
- font->draw(str.c_str(),
- r, str.getDefaultColor(), // TODO: Implement colorization
- HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER,
- (RestrainTextInside ? &AbsoluteClippingRect : NULL));
+ font->draw(str.c_str(), r,
+ str.getDefaultColor(), // TODO: Implement
+ // colorization
+ HAlign == EGUIA_CENTER,
+ VAlign == EGUIA_CENTER,
+ (RestrainTextInside ? &AbsoluteClippingRect
+ : NULL));
}
-
r.LowerRightCorner.Y += height_line;
r.UpperLeftCorner.Y += height_line;
}
@@ -138,9 +136,8 @@ void StaticText::draw()
IGUIElement::draw();
}
-
//! Sets another skin independent font.
-void StaticText::setOverrideFont(IGUIFont* font)
+void StaticText::setOverrideFont(IGUIFont *font)
{
if (OverrideFont == font)
return;
@@ -157,17 +154,17 @@ void StaticText::setOverrideFont(IGUIFont* font)
}
//! Gets the override font (if any)
-IGUIFont * StaticText::getOverrideFont() const
+IGUIFont *StaticText::getOverrideFont() const
{
return OverrideFont;
}
//! Get the font which is used right now for drawing
-IGUIFont* StaticText::getActiveFont() const
+IGUIFont *StaticText::getActiveFont() const
{
- if ( OverrideFont )
+ if (OverrideFont)
return OverrideFont;
- IGUISkin* skin = Environment->getSkin();
+ IGUISkin *skin = Environment->getSkin();
if (skin)
return skin->getFont();
return 0;
@@ -180,7 +177,6 @@ void StaticText::setOverrideColor(video::SColor color)
updateText();
}
-
//! Sets another color for the text.
void StaticText::setBackgroundColor(video::SColor color)
{
@@ -188,66 +184,57 @@ void StaticText::setBackgroundColor(video::SColor color)
Background = true;
}
-
//! Sets whether to draw the background
void StaticText::setDrawBackground(bool draw)
{
Background = draw;
}
-
//! Gets the background color
video::SColor StaticText::getBackgroundColor() const
{
IGUISkin *skin = Environment->getSkin();
- return (ColoredText.hasBackground() || !skin) ?
- ColoredText.getBackground() : skin->getColor(gui::EGDC_3D_FACE);
+ return (ColoredText.hasBackground() || !skin) ? ColoredText.getBackground()
+ : skin->getColor(gui::EGDC_3D_FACE);
}
-
//! Checks if background drawing is enabled
bool StaticText::isDrawBackgroundEnabled() const
{
return Background;
}
-
//! Sets whether to draw the border
void StaticText::setDrawBorder(bool draw)
{
Border = draw;
}
-
//! Checks if border drawing is enabled
bool StaticText::isDrawBorderEnabled() const
{
return Border;
}
-
void StaticText::setTextRestrainedInside(bool restrainTextInside)
{
RestrainTextInside = restrainTextInside;
}
-
bool StaticText::isTextRestrainedInside() const
{
return RestrainTextInside;
}
-
void StaticText::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical)
{
HAlign = horizontal;
VAlign = vertical;
}
-
#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7
-const video::SColor& StaticText::getOverrideColor() const
+const video::SColor &StaticText::getOverrideColor() const
#else
video::SColor StaticText::getOverrideColor() const
#endif
@@ -255,7 +242,6 @@ video::SColor StaticText::getOverrideColor() const
return ColoredText.getDefaultColor();
}
-
//! Sets if the static text should use the overide color or the
//! color in the gui skin.
void StaticText::enableOverrideColor(bool enable)
@@ -263,13 +249,11 @@ void StaticText::enableOverrideColor(bool enable)
// TODO
}
-
bool StaticText::isOverrideColorEnabled() const
{
return true;
}
-
//! Enables or disables word wrap for using the static text as
//! multiline text control.
void StaticText::setWordWrap(bool enable)
@@ -278,29 +262,24 @@ void StaticText::setWordWrap(bool enable)
updateText();
}
-
bool StaticText::isWordWrapEnabled() const
{
return WordWrap;
}
-
void StaticText::setRightToLeft(bool rtl)
{
- if (RightToLeft != rtl)
- {
+ if (RightToLeft != rtl) {
RightToLeft = rtl;
updateText();
}
}
-
bool StaticText::isRightToLeft() const
{
return RightToLeft;
}
-
//! Breaks the single text line.
// Updates the font colors
void StaticText::updateText()
@@ -320,8 +299,8 @@ void StaticText::updateText()
// Update word wrap
- IGUISkin* skin = Environment->getSkin();
- IGUIFont* font = getActiveFont();
+ IGUISkin *skin = Environment->getSkin();
+ IGUIFont *font = getActiveFont();
if (!font)
return;
@@ -334,92 +313,96 @@ void StaticText::updateText()
s32 length = 0;
s32 elWidth = RelativeRect.getWidth();
if (Border)
- elWidth -= 2*skin->getSize(EGDS_TEXT_DISTANCE_X);
+ elWidth -= 2 * skin->getSize(EGDS_TEXT_DISTANCE_X);
wchar_t c;
- //std::vector<irr::video::SColor> colors;
+ // std::vector<irr::video::SColor> colors;
// We have to deal with right-to-left and left-to-right differently
// However, most parts of the following code is the same, it's just
// some order and boundaries which change.
- if (!RightToLeft)
- {
+ if (!RightToLeft) {
// regular (left-to-right)
- for (s32 i=0; i<size; ++i)
- {
+ for (s32 i = 0; i < size; ++i) {
c = cText.getString()[i];
bool lineBreak = false;
if (c == L'\r') // Mac or Windows breaks
{
lineBreak = true;
- //if (Text[i+1] == L'\n') // Windows breaks
+ // if (Text[i+1] == L'\n') // Windows breaks
//{
// Text.erase(i+1);
// --size;
//}
c = '\0';
- }
- else if (c == L'\n') // Unix breaks
+ } else if (c == L'\n') // Unix breaks
{
lineBreak = true;
c = '\0';
}
bool isWhitespace = (c == L' ' || c == 0);
- if ( !isWhitespace )
- {
+ if (!isWhitespace) {
// part of a word
- //word += c;
+ // word += c;
word.addChar(cText, i);
}
- if ( isWhitespace || i == (size-1))
- {
- if (word.size())
- {
+ if (isWhitespace || i == (size - 1)) {
+ if (word.size()) {
// here comes the next whitespace, look if
// we must break the last word to the next line.
- const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
- //const std::wstring sanitized = removeEscapes(word.c_str());
- const s32 wordlgth = font->getDimension(word.c_str()).Width;
-
- if (wordlgth > elWidth)
- {
- // This word is too long to fit in the available space, look for
- // the Unicode Soft HYphen (SHY / 00AD) character for a place to
- // break the word at
- int where = core::stringw(word.c_str()).findFirst( wchar_t(0x00AD) );
- if (where != -1)
- {
- EnrichedString first = word.substr(0, where);
- EnrichedString second = word.substr(where, word.size() - where);
+ const s32 whitelgth =
+ font->getDimension(whitespace.c_str())
+ .Width;
+ // const std::wstring sanitized =
+ // removeEscapes(word.c_str());
+ const s32 wordlgth =
+ font->getDimension(word.c_str())
+ .Width;
+
+ if (wordlgth > elWidth) {
+ // This word is too long to fit in the
+ // available space, look for the Unicode
+ // Soft HYphen (SHY / 00AD) character for
+ // a place to break the word at
+ int where = core::stringw(word.c_str())
+ .findFirst(wchar_t(
+ 0x00AD));
+ if (where != -1) {
+ EnrichedString first = word.substr(
+ 0, where);
+ EnrichedString second = word.substr(
+ where,
+ word.size() - where);
first.addCharNoColor(L'-');
- BrokenText.push_back(line + first);
- const s32 secondLength = font->getDimension(second.c_str()).Width;
+ BrokenText.push_back(
+ line + first);
+ const s32 secondLength =
+ font->getDimension(second.c_str())
+ .Width;
length = secondLength;
line = second;
- }
- else
- {
- // No soft hyphen found, so there's nothing more we can do
+ } else {
+ // No soft hyphen found, so
+ // there's nothing more we can do
// break to next line
if (length)
- BrokenText.push_back(line);
+ BrokenText.push_back(
+ line);
length = wordlgth;
line = word;
}
- }
- else if (length && (length + wordlgth + whitelgth > elWidth))
- {
+ } else if (length &&
+ (length + wordlgth + whitelgth >
+ elWidth)) {
// break to next line
BrokenText.push_back(line);
length = wordlgth;
line = word;
- }
- else
- {
+ } else {
// add word to line
line += whitespace;
line += word;
@@ -430,14 +413,12 @@ void StaticText::updateText()
whitespace.clear();
}
- if ( isWhitespace && c != 0)
- {
+ if (isWhitespace && c != 0) {
whitespace.addChar(cText, i);
}
// compute line break
- if (lineBreak)
- {
+ if (lineBreak) {
line += whitespace;
line += word;
BrokenText.push_back(line);
@@ -452,49 +433,45 @@ void StaticText::updateText()
line += whitespace;
line += word;
BrokenText.push_back(line);
- }
- else
- {
+ } else {
// right-to-left
- for (s32 i=size; i>=0; --i)
- {
+ for (s32 i = size; i >= 0; --i) {
c = cText.getString()[i];
bool lineBreak = false;
if (c == L'\r') // Mac or Windows breaks
{
lineBreak = true;
- //if ((i>0) && Text[i-1] == L'\n') // Windows breaks
+ // if ((i>0) && Text[i-1] == L'\n') // Windows breaks
//{
// Text.erase(i-1);
// --size;
//}
c = '\0';
- }
- else if (c == L'\n') // Unix breaks
+ } else if (c == L'\n') // Unix breaks
{
lineBreak = true;
c = '\0';
}
- if (c==L' ' || c==0 || i==0)
- {
- if (word.size())
- {
+ if (c == L' ' || c == 0 || i == 0) {
+ if (word.size()) {
// here comes the next whitespace, look if
// we must break the last word to the next line.
- const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
- const s32 wordlgth = font->getDimension(word.c_str()).Width;
-
- if (length && (length + wordlgth + whitelgth > elWidth))
- {
+ const s32 whitelgth =
+ font->getDimension(whitespace.c_str())
+ .Width;
+ const s32 wordlgth =
+ font->getDimension(word.c_str())
+ .Width;
+
+ if (length && (length + wordlgth + whitelgth >
+ elWidth)) {
// break to next line
BrokenText.push_back(line);
length = wordlgth;
line = word;
- }
- else
- {
+ } else {
// add word to line
line = whitespace + line;
line = word + line;
@@ -506,12 +483,12 @@ void StaticText::updateText()
}
if (c != 0)
- // whitespace = core::stringw(&c, 1) + whitespace;
- whitespace = cText.substr(i, 1) + whitespace;
+ // whitespace = core::stringw(&c, 1) +
+ //whitespace;
+ whitespace = cText.substr(i, 1) + whitespace;
// compute line break
- if (lineBreak)
- {
+ if (lineBreak) {
line = whitespace + line;
line = word + line;
BrokenText.push_back(line);
@@ -520,11 +497,9 @@ void StaticText::updateText()
whitespace.clear();
length = 0;
}
- }
- else
- {
+ } else {
// yippee this is a word..
- //word = core::stringw(&c, 1) + word;
+ // word = core::stringw(&c, 1) + word;
word = cText.substr(i, 1) + word;
}
}
@@ -535,9 +510,8 @@ void StaticText::updateText()
}
}
-
//! Sets the new caption of this element.
-void StaticText::setText(const wchar_t* text)
+void StaticText::setText(const wchar_t *text)
{
setText(EnrichedString(text, getOverrideColor()));
}
@@ -555,11 +529,10 @@ void StaticText::updateAbsolutePosition()
updateText();
}
-
//! Returns the height of the text in pixels when it is drawn.
s32 StaticText::getTextHeight() const
{
- IGUIFont* font = getActiveFont();
+ IGUIFont *font = getActiveFont();
if (!font)
return 0;
@@ -571,7 +544,6 @@ s32 StaticText::getTextHeight() const
return font->getDimension(BrokenText[0].c_str()).Height;
}
-
s32 StaticText::getTextWidth() const
{
IGUIFont *font = getActiveFont();
@@ -590,34 +562,34 @@ s32 StaticText::getTextWidth() const
return widest;
}
-
//! Writes attributes of the element.
//! Implement this to expose the attributes of your element for
//! scripting languages, editors, debuggers or xml serialization purposes.
-void StaticText::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const
-{
- IGUIStaticText::serializeAttributes(out,options);
-
- out->addBool ("Border", Border);
- out->addBool ("OverrideColorEnabled",true);
- out->addBool ("OverrideBGColorEnabled",ColoredText.hasBackground());
- out->addBool ("WordWrap", WordWrap);
- out->addBool ("Background", Background);
- out->addBool ("RightToLeft", RightToLeft);
- out->addBool ("RestrainTextInside", RestrainTextInside);
- out->addColor ("OverrideColor", ColoredText.getDefaultColor());
- out->addColor ("BGColor", ColoredText.getBackground());
- out->addEnum ("HTextAlign", HAlign, GUIAlignmentNames);
- out->addEnum ("VTextAlign", VAlign, GUIAlignmentNames);
+void StaticText::serializeAttributes(
+ io::IAttributes *out, io::SAttributeReadWriteOptions *options = 0) const
+{
+ IGUIStaticText::serializeAttributes(out, options);
+
+ out->addBool("Border", Border);
+ out->addBool("OverrideColorEnabled", true);
+ out->addBool("OverrideBGColorEnabled", ColoredText.hasBackground());
+ out->addBool("WordWrap", WordWrap);
+ out->addBool("Background", Background);
+ out->addBool("RightToLeft", RightToLeft);
+ out->addBool("RestrainTextInside", RestrainTextInside);
+ out->addColor("OverrideColor", ColoredText.getDefaultColor());
+ out->addColor("BGColor", ColoredText.getBackground());
+ out->addEnum("HTextAlign", HAlign, GUIAlignmentNames);
+ out->addEnum("VTextAlign", VAlign, GUIAlignmentNames);
// out->addFont ("OverrideFont", OverrideFont);
}
-
//! Reads attributes of the element
-void StaticText::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
+void StaticText::deserializeAttributes(
+ io::IAttributes *in, io::SAttributeReadWriteOptions *options = 0)
{
- IGUIStaticText::deserializeAttributes(in,options);
+ IGUIStaticText::deserializeAttributes(in, options);
Border = in->getAttributeAsBool("Border");
setWordWrap(in->getAttributeAsBool("WordWrap"));
@@ -629,8 +601,10 @@ void StaticText::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWr
if (in->getAttributeAsBool("OverrideBGColorEnabled"))
ColoredText.setBackground(in->getAttributeAsColor("BGColor"));
- setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames),
- (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames));
+ setTextAlignment((EGUI_ALIGNMENT)in->getAttributeAsEnumeration(
+ "HTextAlign", GUIAlignmentNames),
+ (EGUI_ALIGNMENT)in->getAttributeAsEnumeration(
+ "VTextAlign", GUIAlignmentNames));
// OverrideFont = in->getAttributeAsFont("OverrideFont");
}
@@ -641,5 +615,4 @@ void StaticText::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWr
} // end namespace irr
-
#endif // _IRR_COMPILE_WITH_GUI_