X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec07419336652454bc305659e9cd9b8fc767f3bd..476768356c3e7662e29a50c59ebbe38456f8e200:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 206f09a255..65d2f3d9cb 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -17,7 +17,6 @@ #pragma hdrstop #endif -#include "wx/display.h" #include "wx/sizer.h" #include "wx/private/flagscheck.h" @@ -32,6 +31,7 @@ #include "wx/toplevel.h" #endif // WX_PRECOMP +#include "wx/display.h" #include "wx/listimpl.cpp" @@ -1324,10 +1324,17 @@ wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const { - int nitems = m_children.GetCount(); - if ( nitems) + const int nitems = m_children.GetCount(); + if ( nitems ) { - if ( m_cols ) + if ( m_cols && m_rows ) + { + // if both rows and columns are specified by user, use the provided + // values even if we don't have enough items + ncols = m_cols; + nrows = m_rows; + } + else if ( m_cols ) { ncols = m_cols; nrows = (nitems + m_cols - 1) / m_cols; @@ -1341,7 +1348,8 @@ int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const { wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") ); - nrows = ncols = 0; + nrows = + ncols = 0; } } @@ -1631,11 +1639,9 @@ wxSize wxFlexGridSizer::CalcMin() m_rowHeights.assign(nrows, -1); m_colWidths.assign(ncols, -1); - // n is the index of the item in left-to-right top-to-bottom order - size_t n = 0; for ( wxSizerItemList::iterator i = m_children.begin(); i != m_children.end(); - ++i, ++n ) + ++i) { wxSizerItem * const item = *i; if ( item->IsShown() ) @@ -1789,21 +1795,21 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz) { const int col = n % ncols; didAdjustMinSize |= (*i)->InformFirstDirection(wxHORIZONTAL, m_colWidths[col], sz.y - m_calculatedMinSize.y); - } + } // Only redo if info was actually used if( didAdjustMinSize ) - { - DoAdjustForGrowables - ( - sz.x - m_calculatedMinSize.x, - m_growableCols, - m_colWidths, - m_growMode == wxFLEX_GROWMODE_SPECIFIED ? &m_growableColsProportions - : NULL - ); + { + DoAdjustForGrowables + ( + sz.x - m_calculatedMinSize.x, + m_growableCols, + m_colWidths, + m_growMode == wxFLEX_GROWMODE_SPECIFIED ? &m_growableColsProportions + : NULL + ); + } } -} if ( (m_flexDirection & wxVERTICAL) || (m_growMode != wxFLEX_GROWMODE_NONE) ) { @@ -1832,7 +1838,11 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx ) void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) { - wxASSERT_MSG( !IsRowGrowable( idx ), + int nrows, ncols; + CalcRowsCols(nrows, ncols); + wxCHECK_RET( idx < (size_t)nrows, "invalid row index" ); + + wxASSERT_MSG( !IsRowGrowable( idx ), "AddGrowableRow() called for growable row" ); m_growableRows.Add( idx ); m_growableRowsProportions.Add( proportion ); @@ -1840,7 +1850,11 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) { - wxASSERT_MSG( !IsColGrowable( idx ), + int nrows, ncols; + CalcRowsCols(nrows, ncols); + wxCHECK_RET( idx < (size_t)ncols, "invalid column index" ); + + wxASSERT_MSG( !IsColGrowable( idx ), "AddGrowableCol() called for growable column" ); m_growableCols.Add( idx ); m_growableColsProportions.Add( proportion );