reduced flicker in the statusbar when resizing the window
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14596 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -127,12 +127,16 @@ wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const
|
|||||||
|
|
||||||
if ( m_statusWidths == NULL )
|
if ( m_statusWidths == NULL )
|
||||||
{
|
{
|
||||||
// default: all fields have the same width
|
if ( m_nFields )
|
||||||
int nWidth = widthTotal / m_nFields;
|
|
||||||
for ( int i = 0; i < m_nFields; i++ )
|
|
||||||
{
|
{
|
||||||
widths.Add(nWidth);
|
// default: all fields have the same width
|
||||||
|
int nWidth = widthTotal / m_nFields;
|
||||||
|
for ( int i = 0; i < m_nFields; i++ )
|
||||||
|
{
|
||||||
|
widths.Add(nWidth);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
//else: we're empty anyhow
|
||||||
}
|
}
|
||||||
else // have explicit status widths
|
else // have explicit status widths
|
||||||
{
|
{
|
||||||
|
@@ -124,7 +124,7 @@ void wxStatusBarUniv::DoDraw(wxControlRenderer *renderer)
|
|||||||
if ( IsExposed(rect) )
|
if ( IsExposed(rect) )
|
||||||
{
|
{
|
||||||
wxTopLevelWindow *parentTLW = wxDynamicCast(GetParent(), wxTopLevelWindow);
|
wxTopLevelWindow *parentTLW = wxDynamicCast(GetParent(), wxTopLevelWindow);
|
||||||
|
|
||||||
// the size grip may be drawn only on the last field and only if we
|
// the size grip may be drawn only on the last field and only if we
|
||||||
// have the corresponding style and even then only if we really can
|
// have the corresponding style and even then only if we really can
|
||||||
// resize this frame
|
// resize this frame
|
||||||
@@ -208,13 +208,41 @@ void wxStatusBarUniv::SetStatusWidths(int n, const int widths[])
|
|||||||
|
|
||||||
void wxStatusBarUniv::OnSize(wxSizeEvent& event)
|
void wxStatusBarUniv::OnSize(wxSizeEvent& event)
|
||||||
{
|
{
|
||||||
// invalidate the widths, we'll have to recalc them
|
// we don't need to refresh the fields whose width didn't change, so find
|
||||||
m_widthsAbs.Empty();
|
// the first field whose width did change and refresh starting from it
|
||||||
|
int field;
|
||||||
|
if ( m_statusWidths )
|
||||||
|
{
|
||||||
|
for ( field = 0; field < m_nFields; field++ )
|
||||||
|
{
|
||||||
|
if ( m_statusWidths[field] < 0 )
|
||||||
|
{
|
||||||
|
// var width field
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // all fields have the same width
|
||||||
|
{
|
||||||
|
// hence all fields widths have changed
|
||||||
|
field = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// refresh entirely, shouldn't matter much as the statusbar is quick to
|
if ( field < m_nFields )
|
||||||
// redraw and it would be difficult to avoid it as we'd need to find out
|
{
|
||||||
// which fields exactly were affected...
|
// call this before invalidating the old widths as we want to use them,
|
||||||
Refresh();
|
// not the new ones
|
||||||
|
wxRect rect = DoGetFieldRect(field);
|
||||||
|
|
||||||
|
// invalidate the widths, we'll have to recalc them
|
||||||
|
m_widthsAbs.Empty();
|
||||||
|
|
||||||
|
// refresh everything after the first invalid field
|
||||||
|
rect.y = 0;
|
||||||
|
rect.SetRight(event.GetSize().x);
|
||||||
|
rect.height = event.GetSize().y;
|
||||||
|
RefreshRect(rect);
|
||||||
|
}
|
||||||
|
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
@@ -228,11 +256,25 @@ bool wxStatusBarUniv::GetFieldRect(int n, wxRect& rect) const
|
|||||||
// GetFieldRect() is called from the derived class OnSize() handler, then
|
// GetFieldRect() is called from the derived class OnSize() handler, then
|
||||||
// our geometry info is wrong as our OnSize() didn't invalidate m_widthsAbs
|
// our geometry info is wrong as our OnSize() didn't invalidate m_widthsAbs
|
||||||
// yet - so recalc it just in case
|
// yet - so recalc it just in case
|
||||||
|
wxConstCast(this, wxStatusBarUniv)->m_widthsAbs.Empty();
|
||||||
|
|
||||||
|
rect = DoGetFieldRect(n);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxStatusBarUniv::DoGetFieldRect(int n) const
|
||||||
|
{
|
||||||
wxStatusBarUniv *self = wxConstCast(this, wxStatusBarUniv);
|
wxStatusBarUniv *self = wxConstCast(this, wxStatusBarUniv);
|
||||||
self->m_widthsAbs.Empty();
|
|
||||||
|
|
||||||
wxCoord borderBetweenFields;
|
wxCoord borderBetweenFields;
|
||||||
rect = self->GetTotalFieldRect(&borderBetweenFields);
|
wxRect rect = self->GetTotalFieldRect(&borderBetweenFields);
|
||||||
|
|
||||||
|
// it's the caller responsability to check this, if unsure - call
|
||||||
|
// GetFieldRect() instead
|
||||||
|
wxCHECK_MSG( !m_widthsAbs.IsEmpty(), rect,
|
||||||
|
_T("can't be called if we don't have the widths") );
|
||||||
|
|
||||||
for ( int i = 0; i <= n; i++ )
|
for ( int i = 0; i <= n; i++ )
|
||||||
{
|
{
|
||||||
rect.width = m_widthsAbs[i];
|
rect.width = m_widthsAbs[i];
|
||||||
@@ -241,7 +283,7 @@ bool wxStatusBarUniv::GetFieldRect(int n, wxRect& rect) const
|
|||||||
rect.x += rect.width + borderBetweenFields;
|
rect.x += rect.width + borderBetweenFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCoord wxStatusBarUniv::GetHeight() const
|
wxCoord wxStatusBarUniv::GetHeight() const
|
||||||
|
Reference in New Issue
Block a user