X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef52f19e6ad14e3740dee3e79b8e348a70054d09..3f8cdda4851796e5f5f5bcd82d9e867a30581a6f:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 63a832d8ff..a13599bf3c 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -480,10 +480,16 @@ void wxSizerItem::SetDimension( const wxPoint& pos_, const wxSize& size_ ) break; case Item_Window: + { + // Use wxSIZE_FORCE_EVENT here since a sizer item might + // have changed alignment or some other property which would + // not change the size of the window. In such a case, no + // wxSizeEvent would normally be generated and thus the + // control wouldn't get layed out correctly here. m_window->SetSize(pos.x, pos.y, size.x, size.y, - wxSIZE_ALLOW_MINUS_ONE); + wxSIZE_ALLOW_MINUS_ONE|wxSIZE_FORCE_EVENT ); break; - + } case Item_Sizer: m_sizer->SetDimension(pos, size); break; @@ -1324,25 +1330,33 @@ 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 ( m_cols && m_rows ) { - if ( m_cols ) - { - ncols = m_cols; - nrows = (nitems + m_cols - 1) / m_cols; - } - else if ( m_rows ) - { - ncols = (nitems + m_rows - 1) / m_rows; - nrows = m_rows; - } - else // 0 columns, 0 rows? - { - wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") ); + // if both rows and columns are specified by user, use the provided + // values even if we don't have enough items but check that we don't + // have too many of them as this is going to result in problems later + ncols = m_cols; + nrows = m_rows; - nrows = ncols = 0; - } + wxASSERT_MSG( ncols*nrows >= nitems, "too many items in grid sizer" ); + } + else if ( m_cols ) + { + ncols = m_cols; + nrows = (nitems + m_cols - 1) / m_cols; + } + else if ( m_rows ) + { + ncols = (nitems + m_rows - 1) / m_rows; + nrows = m_rows; + } + else // 0 columns, 0 rows? + { + wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") ); + + nrows = + ncols = 0; } return nitems; @@ -1830,7 +1844,10 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx ) void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) { - wxCHECK_RET( idx < (size_t)GetRows(), "invalid row index" ); + 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 ); @@ -1839,7 +1856,10 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) { - wxCHECK_RET( idx < (size_t)GetCols(), "invalid column index" ); + 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 ); @@ -1973,7 +1993,7 @@ void wxBoxSizer::RecalcSizes() } // NB: wxCENTRE is used here only for backwards compatibility, // wxALIGN_CENTRE should be used in new code - else if ( flag & (wxCENTER | wxALIGN_CENTRE) ) + else if ( flag & (wxCENTER | (IsVertical() ? wxALIGN_CENTRE_HORIZONTAL : wxALIGN_CENTRE_VERTICAL))) { PosInMinorDir(posChild) += (totalMinorSize - minorSize) / 2; }