IGUIEditBox: Added setDrawBackground. Crash-fix with wordwrapping and spaces. Remove bug with spaces getting added to the end of each line. Add missing serialization for Border.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3857 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
dd3ef0fdd7
commit
7d101163aa
|
@ -1,5 +1,13 @@
|
||||||
Changes in 1.8 (??.??.2011)
|
Changes in 1.8 (??.??.2011)
|
||||||
|
|
||||||
|
- IGUIEditBox: added missing serialization for Border
|
||||||
|
|
||||||
|
- IGUIEditBox: remove bug that added spaces to the end of each line
|
||||||
|
|
||||||
|
- IGUIEditBox: fix crash that happened when wordwrapping was enabled, spaces were entered beyond the border and then cursor-key was pressed.
|
||||||
|
|
||||||
|
- IGUIEditBox::setDrawBackground added.
|
||||||
|
|
||||||
- CGUISkin::draw3DSunkenPane no longer ignores fillBackGround in non-flat mode. Also borderlines are no longer drawn overlapping to avoid ugly corners.
|
- CGUISkin::draw3DSunkenPane no longer ignores fillBackGround in non-flat mode. Also borderlines are no longer drawn overlapping to avoid ugly corners.
|
||||||
|
|
||||||
- CDummyTransformationSceneNode::clone() added.
|
- CDummyTransformationSceneNode::clone() added.
|
||||||
|
|
|
@ -51,6 +51,9 @@ namespace gui
|
||||||
/** \return true if the override color is enabled, false otherwise */
|
/** \return true if the override color is enabled, false otherwise */
|
||||||
virtual bool isOverrideColorEnabled(void) const = 0;
|
virtual bool isOverrideColorEnabled(void) const = 0;
|
||||||
|
|
||||||
|
//! Sets whether to draw the background
|
||||||
|
virtual void setDrawBackground(bool draw) = 0;
|
||||||
|
|
||||||
//! Turns the border on or off
|
//! Turns the border on or off
|
||||||
/** \param border: true if you want the border to be drawn, false if not */
|
/** \param border: true if you want the border to be drawn, false if not */
|
||||||
virtual void setDrawBorder(bool border) = 0;
|
virtual void setDrawBorder(bool border) = 0;
|
||||||
|
|
|
@ -32,7 +32,7 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border,
|
||||||
IGUIEnvironment* environment, IGUIElement* parent, s32 id,
|
IGUIEnvironment* environment, IGUIElement* parent, s32 id,
|
||||||
const core::rect<s32>& rectangle)
|
const core::rect<s32>& rectangle)
|
||||||
: IGUIEditBox(environment, parent, id, rectangle), MouseMarking(false),
|
: IGUIEditBox(environment, parent, id, rectangle), MouseMarking(false),
|
||||||
Border(border), OverrideColorEnabled(false), MarkBegin(0), MarkEnd(0),
|
Border(border), Background(true), OverrideColorEnabled(false), MarkBegin(0), MarkEnd(0),
|
||||||
OverrideColor(video::SColor(101,255,255,255)), OverrideFont(0), LastBreakFont(0),
|
OverrideColor(video::SColor(101,255,255,255)), OverrideFont(0), LastBreakFont(0),
|
||||||
Operator(0), BlinkStartTime(0), CursorPos(0), HScrollPos(0), VScrollPos(0), Max(0),
|
Operator(0), BlinkStartTime(0), CursorPos(0), HScrollPos(0), VScrollPos(0), Max(0),
|
||||||
WordWrap(false), MultiLine(false), AutoScroll(true), PasswordBox(false),
|
WordWrap(false), MultiLine(false), AutoScroll(true), PasswordBox(false),
|
||||||
|
@ -121,6 +121,11 @@ void CGUIEditBox::setDrawBorder(bool border)
|
||||||
Border = border;
|
Border = border;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Sets whether to draw the background
|
||||||
|
void CGUIEditBox::setDrawBackground(bool draw)
|
||||||
|
{
|
||||||
|
Background = draw;
|
||||||
|
}
|
||||||
|
|
||||||
//! Sets if the text should use the overide color or the color in the gui skin.
|
//! Sets if the text should use the overide color or the color in the gui skin.
|
||||||
void CGUIEditBox::enableOverrideColor(bool enable)
|
void CGUIEditBox::enableOverrideColor(bool enable)
|
||||||
|
@ -704,21 +709,25 @@ void CGUIEditBox::draw()
|
||||||
|
|
||||||
FrameRect = AbsoluteRect;
|
FrameRect = AbsoluteRect;
|
||||||
|
|
||||||
// draw the border
|
EGUI_DEFAULT_COLOR bgCol = EGDC_GRAY_EDITABLE;
|
||||||
|
if ( isEnabled() )
|
||||||
|
bgCol = focus ? EGDC_FOCUSED_EDITABLE : EGDC_EDITABLE;
|
||||||
|
|
||||||
|
if (!Border && Background)
|
||||||
|
{
|
||||||
|
skin->draw2DRectangle(this, skin->getColor(bgCol), FrameRect, &AbsoluteClippingRect);
|
||||||
|
}
|
||||||
|
|
||||||
if (Border)
|
if (Border)
|
||||||
{
|
{
|
||||||
EGUI_DEFAULT_COLOR col = EGDC_GRAY_EDITABLE;
|
// draw the border
|
||||||
if ( isEnabled() )
|
skin->draw3DSunkenPane(this, skin->getColor(bgCol), false, Background, FrameRect, &AbsoluteClippingRect);
|
||||||
col = focus ? EGDC_FOCUSED_EDITABLE : EGDC_EDITABLE;
|
|
||||||
skin->draw3DSunkenPane(this, skin->getColor(col),
|
|
||||||
false, true, FrameRect, &AbsoluteClippingRect);
|
|
||||||
|
|
||||||
FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||||
FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||||
FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||||
FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
core::rect<s32> localClipRect = FrameRect;
|
core::rect<s32> localClipRect = FrameRect;
|
||||||
localClipRect.clipAgainst(AbsoluteClippingRect);
|
localClipRect.clipAgainst(AbsoluteClippingRect);
|
||||||
|
|
||||||
|
@ -1056,7 +1065,10 @@ s32 CGUIEditBox::getCursorPos(s32 x, s32 y)
|
||||||
if (x < CurrentTextRect.UpperLeftCorner.X)
|
if (x < CurrentTextRect.UpperLeftCorner.X)
|
||||||
x = CurrentTextRect.UpperLeftCorner.X;
|
x = CurrentTextRect.UpperLeftCorner.X;
|
||||||
|
|
||||||
s32 idx = txtLine ? font->getCharacterFromPos(txtLine->c_str(), x - CurrentTextRect.UpperLeftCorner.X) : -1;
|
if ( !txtLine )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
s32 idx = font->getCharacterFromPos(txtLine->c_str(), x - CurrentTextRect.UpperLeftCorner.X);
|
||||||
|
|
||||||
// click was on or left of the line
|
// click was on or left of the line
|
||||||
if (idx != -1)
|
if (idx != -1)
|
||||||
|
@ -1104,7 +1116,7 @@ void CGUIEditBox::breakText()
|
||||||
if (c == L'\r') // Mac or Windows breaks
|
if (c == L'\r') // Mac or Windows breaks
|
||||||
{
|
{
|
||||||
lineBreak = true;
|
lineBreak = true;
|
||||||
c = ' ';
|
c = 0;
|
||||||
if (Text[i+1] == L'\n') // Windows breaks
|
if (Text[i+1] == L'\n') // Windows breaks
|
||||||
{
|
{
|
||||||
Text.erase(i+1);
|
Text.erase(i+1);
|
||||||
|
@ -1114,7 +1126,7 @@ void CGUIEditBox::breakText()
|
||||||
else if (c == L'\n') // Unix breaks
|
else if (c == L'\n') // Unix breaks
|
||||||
{
|
{
|
||||||
lineBreak = true;
|
lineBreak = true;
|
||||||
c = ' ';
|
c = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't break if we're not a multi-line edit box
|
// don't break if we're not a multi-line edit box
|
||||||
|
@ -1123,35 +1135,35 @@ void CGUIEditBox::breakText()
|
||||||
|
|
||||||
if (c == L' ' || c == 0 || i == (size-1))
|
if (c == L' ' || c == 0 || i == (size-1))
|
||||||
{
|
{
|
||||||
if (word.size())
|
// here comes the next whitespace, look if
|
||||||
|
// we can break the last word to the next line
|
||||||
|
// We also break whitespace, otherwise cursor would vanish beside the right border.
|
||||||
|
s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
|
||||||
|
s32 worldlgth = font->getDimension(word.c_str()).Width;
|
||||||
|
|
||||||
|
if (WordWrap && length + worldlgth + whitelgth > elWidth)
|
||||||
{
|
{
|
||||||
// here comes the next whitespace, look if
|
// break to next line
|
||||||
// we can break the last word to the next line.
|
length = worldlgth;
|
||||||
s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
|
BrokenText.push_back(line);
|
||||||
s32 worldlgth = font->getDimension(word.c_str()).Width;
|
BrokenTextPositions.push_back(lastLineStart);
|
||||||
|
lastLineStart = i - (s32)word.size();
|
||||||
if (WordWrap && length + worldlgth + whitelgth > elWidth)
|
line = word;
|
||||||
{
|
}
|
||||||
// break to next line
|
else
|
||||||
length = worldlgth;
|
{
|
||||||
BrokenText.push_back(line);
|
// add word to line
|
||||||
BrokenTextPositions.push_back(lastLineStart);
|
line += whitespace;
|
||||||
lastLineStart = i - (s32)word.size();
|
line += word;
|
||||||
line = word;
|
length += whitelgth + worldlgth;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// add word to line
|
|
||||||
line += whitespace;
|
|
||||||
line += word;
|
|
||||||
length += whitelgth + worldlgth;
|
|
||||||
}
|
|
||||||
|
|
||||||
word = L"";
|
|
||||||
whitespace = L"";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whitespace += c;
|
word = L"";
|
||||||
|
whitespace = L"";
|
||||||
|
|
||||||
|
|
||||||
|
if ( c )
|
||||||
|
whitespace += c;
|
||||||
|
|
||||||
// compute line break
|
// compute line break
|
||||||
if (lineBreak)
|
if (lineBreak)
|
||||||
|
@ -1183,7 +1195,8 @@ void CGUIEditBox::breakText()
|
||||||
|
|
||||||
void CGUIEditBox::setTextRect(s32 line)
|
void CGUIEditBox::setTextRect(s32 line)
|
||||||
{
|
{
|
||||||
core::dimension2du d;
|
if ( line < 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
IGUISkin* skin = Environment->getSkin();
|
IGUISkin* skin = Environment->getSkin();
|
||||||
if (!skin)
|
if (!skin)
|
||||||
|
@ -1194,6 +1207,8 @@ void CGUIEditBox::setTextRect(s32 line)
|
||||||
if (!font)
|
if (!font)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
core::dimension2du d;
|
||||||
|
|
||||||
// get text dimension
|
// get text dimension
|
||||||
const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1;
|
const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1;
|
||||||
if (WordWrap || MultiLine)
|
if (WordWrap || MultiLine)
|
||||||
|
@ -1321,6 +1336,8 @@ void CGUIEditBox::calculateScrollPos()
|
||||||
|
|
||||||
// calculate horizontal scroll position
|
// calculate horizontal scroll position
|
||||||
s32 cursLine = getLineFromPos(CursorPos);
|
s32 cursLine = getLineFromPos(CursorPos);
|
||||||
|
if ( cursLine < 0 )
|
||||||
|
return;
|
||||||
setTextRect(cursLine);
|
setTextRect(cursLine);
|
||||||
|
|
||||||
// don't do horizontal scrolling when wordwrap is enabled.
|
// don't do horizontal scrolling when wordwrap is enabled.
|
||||||
|
@ -1395,6 +1412,8 @@ void CGUIEditBox::serializeAttributes(io::IAttributes* out, io::SAttributeReadWr
|
||||||
{
|
{
|
||||||
// IGUIEditBox::serializeAttributes(out,options);
|
// IGUIEditBox::serializeAttributes(out,options);
|
||||||
|
|
||||||
|
out->addBool ("Border", Border);
|
||||||
|
out->addBool ("Background", Background);
|
||||||
out->addBool ("OverrideColorEnabled",OverrideColorEnabled );
|
out->addBool ("OverrideColorEnabled",OverrideColorEnabled );
|
||||||
out->addColor ("OverrideColor", OverrideColor);
|
out->addColor ("OverrideColor", OverrideColor);
|
||||||
// out->addFont("OverrideFont",OverrideFont);
|
// out->addFont("OverrideFont",OverrideFont);
|
||||||
|
@ -1418,6 +1437,8 @@ void CGUIEditBox::deserializeAttributes(io::IAttributes* in, io::SAttributeReadW
|
||||||
{
|
{
|
||||||
IGUIEditBox::deserializeAttributes(in,options);
|
IGUIEditBox::deserializeAttributes(in,options);
|
||||||
|
|
||||||
|
setDrawBorder( in->getAttributeAsBool("Border") );
|
||||||
|
setDrawBackground( in->getAttributeAsBool("Background") );
|
||||||
setOverrideColor(in->getAttributeAsColor("OverrideColor"));
|
setOverrideColor(in->getAttributeAsColor("OverrideColor"));
|
||||||
enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled"));
|
enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled"));
|
||||||
setMax(in->getAttributeAsInt("MaxChars"));
|
setMax(in->getAttributeAsInt("MaxChars"));
|
||||||
|
|
|
@ -44,6 +44,9 @@ namespace gui
|
||||||
/** \return true if the override color is enabled, false otherwise */
|
/** \return true if the override color is enabled, false otherwise */
|
||||||
virtual bool isOverrideColorEnabled(void) const;
|
virtual bool isOverrideColorEnabled(void) const;
|
||||||
|
|
||||||
|
//! Sets whether to draw the background
|
||||||
|
virtual void setDrawBackground(bool draw);
|
||||||
|
|
||||||
//! Turns the border on or off
|
//! Turns the border on or off
|
||||||
virtual void setDrawBorder(bool border);
|
virtual void setDrawBorder(bool border);
|
||||||
|
|
||||||
|
@ -135,6 +138,7 @@ namespace gui
|
||||||
|
|
||||||
bool MouseMarking;
|
bool MouseMarking;
|
||||||
bool Border;
|
bool Border;
|
||||||
|
bool Background;
|
||||||
bool OverrideColorEnabled;
|
bool OverrideColorEnabled;
|
||||||
s32 MarkBegin;
|
s32 MarkBegin;
|
||||||
s32 MarkEnd;
|
s32 MarkEnd;
|
||||||
|
|
|
@ -204,7 +204,7 @@ void CGUIStaticText::setTextRestrainedInside(bool restrainTextInside)
|
||||||
{
|
{
|
||||||
RestrainTextInside = restrainTextInside;
|
RestrainTextInside = restrainTextInside;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CGUIStaticText::isTextRestrainedInside() const
|
bool CGUIStaticText::isTextRestrainedInside() const
|
||||||
{
|
{
|
||||||
|
@ -334,7 +334,7 @@ void CGUIStaticText::breakText()
|
||||||
// we must break the last word to the next line.
|
// we must break the last word to the next line.
|
||||||
const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
|
const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
|
||||||
const s32 wordlgth = font->getDimension(word.c_str()).Width;
|
const s32 wordlgth = font->getDimension(word.c_str()).Width;
|
||||||
|
|
||||||
if (wordlgth > elWidth)
|
if (wordlgth > elWidth)
|
||||||
{
|
{
|
||||||
// This word is too long to fit in the available space, look for
|
// This word is too long to fit in the available space, look for
|
||||||
|
@ -347,7 +347,7 @@ void CGUIStaticText::breakText()
|
||||||
core::stringw second = word.subString(where, word.size() - where);
|
core::stringw second = word.subString(where, word.size() - where);
|
||||||
BrokenText.push_back(line + first + L"-");
|
BrokenText.push_back(line + first + L"-");
|
||||||
const s32 secondLength = font->getDimension(second.c_str()).Width;
|
const s32 secondLength = font->getDimension(second.c_str()).Width;
|
||||||
|
|
||||||
length = secondLength;
|
length = secondLength;
|
||||||
line = second;
|
line = second;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue