X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/97800f661840d18c39e38ef821a3310f70fb767e..0bd2681966523df88ad5cf8e505b532843e58d74:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 4c54b27d06..1df3fd4885 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -522,6 +522,9 @@ wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item ) if ( item->GetWindow() ) item->GetWindow()->SetContainingSizer( this ); + if ( item->GetSizer() ) + item->GetSizer()->SetContainingWindow( m_containingWindow ); + return item; } @@ -1352,6 +1355,8 @@ void wxFlexGridSizer::RecalcSizes() AdjustForGrowables(sz); wxSizerItemList::const_iterator i = m_children.begin(); + const wxSizerItemList::const_iterator end = m_children.end(); + int y = 0; for ( int r = 0; r < nrows; r++ ) { @@ -1359,7 +1364,12 @@ void wxFlexGridSizer::RecalcSizes() { // this row is entirely hidden, skip it for ( int c = 0; c < ncols; c++ ) + { + if ( i == end ) + return; + ++i; + } continue; } @@ -1370,22 +1380,13 @@ void wxFlexGridSizer::RecalcSizes() h = hrow; int x = 0; - for ( int c = 0; c < ncols; c++, ++i ) + for ( int c = 0; c < ncols && i != end; c++, ++i ) { const int wcol = m_colWidths[c]; if ( wcol == -1 ) continue; - // check if there are any remaining children: it may happen that - // the last row is incomplete - if ( i == m_children.end() ) - { - wxASSERT_MSG( r == nrows - 1, _T("too few items") ); - - return; - } - int w = sz.x - x; // max possible value, ensure we don't overflow if ( wcol < w ) w = wcol; @@ -1395,6 +1396,9 @@ void wxFlexGridSizer::RecalcSizes() x += wcol + m_hgap; } + if ( i == end ) + return; + y += hrow + m_vgap; } } @@ -1660,13 +1664,14 @@ void wxBoxSizer::RecalcSizes() // the amount of free space which we should redistribute among the // stretchable items (i.e. those with non zero proportion) - const int delta = SizeInMajorDir(m_size) - SizeInMajorDir(m_minSize); + int delta = SizeInMajorDir(m_size) - SizeInMajorDir(m_minSize); // the position at which we put the next child wxPoint pt(m_position); const wxCoord totalMinorSize = SizeInMinorDir(m_size); + int totalProportion = m_totalProportion; for ( wxSizerItemList::const_iterator i = m_children.begin(); i != m_children.end(); ++i ) @@ -1681,11 +1686,15 @@ void wxBoxSizer::RecalcSizes() // adjust the size in the major direction using the proportion wxCoord majorSize = SizeInMajorDir(sizeThis); - if ( item->GetProportion() ) + const int propItem = item->GetProportion(); + if ( propItem ) { - // as at least one visible item has non-zero proportion the total - // proportion must be non zero - majorSize += (delta * item->GetProportion()) / m_totalProportion; + const int deltaItem = (delta * propItem) / totalProportion; + + majorSize += deltaItem; + + delta -= deltaItem; + totalProportion -= propItem; } @@ -1968,7 +1977,7 @@ void wxStdDialogButtonSizer::Realize() Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); } - // according to HIG, in explicit apply windows the order is: + // according to HIG, in explicit apply windows the order is: // [ Help Apply Cancel OK ] if (m_buttonApply) Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3);