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:
@@ -181,9 +181,15 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
|
||||
wxStatusBarBase::SetStatusWidths(n, widths_field);
|
||||
|
||||
// update cache
|
||||
int width;
|
||||
GetClientSize(&width, &m_lastClientHeight);
|
||||
m_widthsAbs = CalculateAbsWidths(width);
|
||||
DoUpdateFieldWidths();
|
||||
}
|
||||
|
||||
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
|
||||
@@ -325,6 +331,16 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
|
||||
wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false,
|
||||
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())
|
||||
return false;
|
||||
|
||||
@@ -335,7 +351,7 @@ bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
|
||||
|
||||
rect.y = m_borderY;
|
||||
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;
|
||||
}
|
||||
@@ -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
|
||||
// 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;
|
||||
|
||||
int x = 0;
|
||||
@@ -525,18 +541,11 @@ void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event)
|
||||
#endif
|
||||
}
|
||||
|
||||
void wxStatusBarGeneric::OnSize(wxSizeEvent& WXUNUSED(event))
|
||||
void wxStatusBarGeneric::OnSize(wxSizeEvent& event)
|
||||
{
|
||||
// FIXME: workarounds for OS/2 bugs have nothing to do here (VZ)
|
||||
int width;
|
||||
#ifdef __WXPM__
|
||||
GetSize(&width, &m_lastClientHeight);
|
||||
#else
|
||||
GetClientSize(&width, &m_lastClientHeight);
|
||||
#endif
|
||||
DoUpdateFieldWidths();
|
||||
|
||||
// recompute the cache of the field widths if the status bar width has changed
|
||||
m_widthsAbs = CalculateAbsWidths(width);
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
#endif // wxUSE_STATUSBAR
|
||||
|
Reference in New Issue
Block a user