1
0
forked from 0ad/0ad

# GUI bug fixes.

Fix updates of GUI text positions when an ancestor object's
size/position changes.
Fix CPos parsing to handle negative values.

This was SVN commit r7466.
This commit is contained in:
Ykkrosh 2010-04-19 19:43:05 +00:00
parent 9f1d904278
commit 0d8338c90e
7 changed files with 56 additions and 37 deletions

View File

@ -61,7 +61,7 @@ void CButton::SetupText()
if (!GetGUI())
return;
debug_assert(m_GeneratedTexts.size()>=1);
debug_assert(m_GeneratedTexts.size()==1);
CStrW font;
if (GUI<CStrW>::GetSetting(this, "font", font) != PSRETURN_OK || font.empty())

View File

@ -66,7 +66,7 @@ void CCheckBox::SetupText()
if (!GetGUI())
return;
debug_assert(m_GeneratedTexts.size()>=1);
debug_assert(m_GeneratedTexts.size()==1);
CStrW font;
if (GUI<CStrW>::GetSetting(this, "font", font) != PSRETURN_OK || font.empty())

View File

@ -130,30 +130,11 @@ void CTooltip::SetupText()
size.pixel.left -= (size.pixel.right-screenw), size.pixel.right = screenw;
GUI<CClientArea>::SetSetting(this, "size", size);
UpdateCachedSize();
}
void CTooltip::HandleMessage(const SGUIMessage &Message)
{
switch (Message.type)
{
case GUIM_SETTINGS_UPDATED:
// Don't update the text when the size changes, because the size is
// changed whenever the text is updated ( => infinite recursion)
if (/*Message.value == "size" ||*/ Message.value == "caption" ||
Message.value == "font" || Message.value == "buffer_zone")
{
SetupText();
}
break;
case GUIM_LOAD:
SetupText();
break;
default:
break;
}
IGUITextOwner::HandleMessage(Message);
}
void CTooltip::Draw()
@ -165,6 +146,14 @@ void CTooltip::Draw()
CGUISpriteInstance *sprite;
GUI<CGUISpriteInstance>::GetSettingPointer(this, "sprite", sprite);
// Normally IGUITextOwner will handle this updating but since SetupText can modify the position
// we need to call it now *before* we do the rest of the drawing
if (!m_GeneratedTextsValid)
{
SetupText();
m_GeneratedTextsValid = true;
}
GetGUI()->DrawSprite(*sprite, 0, z, m_CachedActualSize);
CColor color;

View File

@ -160,14 +160,23 @@ bool __ParseString<CSize>(const CStr& Value, CSize &Output)
template <>
bool __ParseString<CPos>(const CStr& Value, CPos &Output)
{
CSize temp;
if (__ParseString<CSize>(Value, temp))
{
Output = CPos(temp);
return true;
}
else
CParser& parser (CParserCache::Get("_[-$arg(_minus)]$value_[-$arg(_minus)]$value_"));
CParserLine line;
line.ParseString(parser, Value);
if (!line.m_ParseOK)
return false;
float x, y;
if (!line.GetArgFloat(0, x))
return false;
if (!line.GetArgFloat(1, y))
return false;
Output.x = x;
Output.y = y;
return true;
}
template <>

View File

@ -239,7 +239,7 @@ public:
* is not wanted in real time, therefore it is cached, update
* the cached size with this function.
*/
void UpdateCachedSize();
virtual void UpdateCachedSize();
/**
* Should be called every time the settings has been updated

View File

@ -26,7 +26,7 @@ IGUITextOwner
//-------------------------------------------------------------------
// Constructor / Destructor
//-------------------------------------------------------------------
IGUITextOwner::IGUITextOwner()
IGUITextOwner::IGUITextOwner() : m_GeneratedTextsValid(false)
{
}
@ -60,22 +60,33 @@ void IGUITextOwner::HandleMessage(const SGUIMessage &Message)
Message.value == "font" || Message.value == "textcolor" ||
Message.value == "buffer_zone")
{
SetupText();
m_GeneratedTextsValid = false;
}
break;
case GUIM_LOAD:
SetupText();
break;
default:
break;
}
}
void IGUITextOwner::Draw(const int &index, const CColor &color, const CPos &pos,
void IGUITextOwner::UpdateCachedSize()
{
// If an ancestor's size changed, this will let us intercept the change and
// update our text positions
IGUIObject::UpdateCachedSize();
m_GeneratedTextsValid = false;
}
void IGUITextOwner::Draw(const int &index, const CColor &color, const CPos &pos,
const float &z, const CRect &clipping)
{
if (!m_GeneratedTextsValid)
{
SetupText();
m_GeneratedTextsValid = true;
}
if (index < 0 || index >= (int)m_GeneratedTexts.size())
{
debug_warn(L"Trying to draw a Text Index within a IGUITextOwner that doesn't exist");

View File

@ -73,6 +73,11 @@ public:
*/
virtual void HandleMessage(const SGUIMessage &Message);
/**
* @see IGUIObject#UpdateCachedSize()
*/
virtual void UpdateCachedSize();
/**
* Draws the Text.
*
@ -92,6 +97,11 @@ protected:
*/
virtual void SetupText()=0;
/**
* Whether the cached text is currently valid (if not then SetupText will be called by Draw)
*/
bool m_GeneratedTextsValid;
/**
* Texts that are generated and ready to be rendered.
*/