Update the field widths on demand in wxStatusBarGeneric.

This ensures that the value returned from GetFieldRect() is always up to date,
even when this method is called from the user-defined wxEVT_SIZE handler, i.e.
before our own OnSize() could run.

Also remove the now unneeded hack with calling the base class OnSize() from
the statbar sample.

Closes #14268.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-05-05 11:22:09 +00:00
parent 71940de693
commit 8e8d910979
3 changed files with 30 additions and 22 deletions

View File

@@ -91,8 +91,9 @@ protected:
// common part of all ctors // common part of all ctors
void Init(); void Init();
// the last known height of the client rect // the last known size, fields widths must be updated whenever it's out of
int m_lastClientHeight; // date
wxSize m_lastClientSize;
// the absolute widths of the status bar panes in pixels // the absolute widths of the status bar panes in pixels
wxArrayInt m_widthsAbs; wxArrayInt m_widthsAbs;
@@ -106,6 +107,9 @@ protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
private: private:
// Update m_lastClientSize and m_widthsAbs from the current size.
void DoUpdateFieldWidths();
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBarGeneric) DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBarGeneric)
}; };

View File

@@ -947,11 +947,6 @@ void MyStatusBar::OnSize(wxSizeEvent& event)
return; return;
#endif #endif
// TEMPORARY HACK: TODO find a more general solution
#ifdef wxStatusBarGeneric
wxStatusBar::OnSize(event);
#endif
wxRect rect; wxRect rect;
if (!GetFieldRect(Field_Checkbox, rect)) if (!GetFieldRect(Field_Checkbox, rect))
{ {

View File

@@ -181,9 +181,15 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
wxStatusBarBase::SetStatusWidths(n, widths_field); wxStatusBarBase::SetStatusWidths(n, widths_field);
// update cache // update cache
int width; DoUpdateFieldWidths();
GetClientSize(&width, &m_lastClientHeight); }
m_widthsAbs = CalculateAbsWidths(width);
void wxStatusBarGeneric::DoUpdateFieldWidths()
{
m_lastClientSize = GetClientSize();
// recompute the cache of the field widths if the status bar width has changed
m_widthsAbs = CalculateAbsWidths(m_lastClientSize.x);
} }
bool wxStatusBarGeneric::ShowsSizeGrip() const bool wxStatusBarGeneric::ShowsSizeGrip() const
@@ -325,6 +331,16 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false, wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false,
wxT("invalid status bar field index") ); wxT("invalid status bar field index") );
// We can be called from the user-defined EVT_SIZE handler in which case
// the widths haven't been updated yet and we need to do it now. This is
// not very efficient as we keep testing the size but there is no other way
// to make the code needing the up-to-date fields sizes in its EVT_SIZE to
// work.
if ( GetClientSize().x != m_lastClientSize.x )
{
const_cast<wxStatusBarGeneric*>(this)->DoUpdateFieldWidths();
}
if (m_widthsAbs.IsEmpty()) if (m_widthsAbs.IsEmpty())
return false; return false;
@@ -335,7 +351,7 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
rect.y = m_borderY; rect.y = m_borderY;
rect.width = m_widthsAbs[n] - 2*m_borderX; rect.width = m_widthsAbs[n] - 2*m_borderX;
rect.height = m_lastClientHeight - 2*m_borderY; rect.height = m_lastClientSize.y - 2*m_borderY;
return true; return true;
} }
@@ -348,7 +364,7 @@ int wxStatusBarGeneric::GetFieldFromPoint(const wxPoint& pt) const
// NOTE: we explicitly don't take in count the borders since they are only // NOTE: we explicitly don't take in count the borders since they are only
// useful when rendering the status text, not for hit-test computations // useful when rendering the status text, not for hit-test computations
if (pt.y <= 0 || pt.y >= m_lastClientHeight) if (pt.y <= 0 || pt.y >= m_lastClientSize.y)
return wxNOT_FOUND; return wxNOT_FOUND;
int x = 0; int x = 0;
@@ -525,18 +541,11 @@ void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event)
#endif #endif
} }
void wxStatusBarGeneric::OnSize(wxSizeEvent& WXUNUSED(event)) void wxStatusBarGeneric::OnSize(wxSizeEvent& event)
{ {
// FIXME: workarounds for OS/2 bugs have nothing to do here (VZ) DoUpdateFieldWidths();
int width;
#ifdef __WXPM__
GetSize(&width, &m_lastClientHeight);
#else
GetClientSize(&width, &m_lastClientHeight);
#endif
// recompute the cache of the field widths if the status bar width has changed event.Skip();
m_widthsAbs = CalculateAbsWidths(width);
} }
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR