# 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:
parent
9f1d904278
commit
0d8338c90e
@ -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())
|
||||
|
@ -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())
|
||||
|
@ -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;
|
||||
|
@ -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 <>
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
@ -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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user