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:
Vadim Zeitlin
2002-03-15 00:12:25 +00:00
parent 6a317e6188
commit 5057e65939
2 changed files with 60 additions and 14 deletions

View File

@@ -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
{ {

View File

@@ -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