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
|
// 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)
|
||||||
};
|
};
|
||||||
|
@@ -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))
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user