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:
@@ -91,8 +91,9 @@ protected:
|
||||
// common part of all ctors
|
||||
void Init();
|
||||
|
||||
// the last known height of the client rect
|
||||
int m_lastClientHeight;
|
||||
// the last known size, fields widths must be updated whenever it's out of
|
||||
// date
|
||||
wxSize m_lastClientSize;
|
||||
|
||||
// the absolute widths of the status bar panes in pixels
|
||||
wxArrayInt m_widthsAbs;
|
||||
@@ -106,6 +107,9 @@ protected:
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
||||
private:
|
||||
// Update m_lastClientSize and m_widthsAbs from the current size.
|
||||
void DoUpdateFieldWidths();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBarGeneric)
|
||||
};
|
||||
|
@@ -947,11 +947,6 @@ void MyStatusBar::OnSize(wxSizeEvent& event)
|
||||
return;
|
||||
#endif
|
||||
|
||||
// TEMPORARY HACK: TODO find a more general solution
|
||||
#ifdef wxStatusBarGeneric
|
||||
wxStatusBar::OnSize(event);
|
||||
#endif
|
||||
|
||||
wxRect rect;
|
||||
if (!GetFieldRect(Field_Checkbox, rect))
|
||||
{
|
||||
|
@@ -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