fix redistribution of the extra space between sizer items

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23316 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-08-31 13:29:28 +00:00
parent ccf5c8a88c
commit 85e5cfc952

View File

@@ -1317,19 +1317,12 @@ void wxBoxSizer::RecalcSizes()
return; return;
int delta = 0; int delta = 0;
int extra = 0;
if (m_stretchable) if (m_stretchable)
{ {
if (m_orient == wxHORIZONTAL) if (m_orient == wxHORIZONTAL)
{ delta = m_size.x - m_fixedWidth;
delta = (m_size.x - m_fixedWidth) / m_stretchable;
extra = (m_size.x - m_fixedWidth) % m_stretchable;
}
else else
{ delta = m_size.y - m_fixedHeight;
delta = (m_size.y - m_fixedHeight) / m_stretchable;
extra = (m_size.y - m_fixedHeight) % m_stretchable;
}
} }
wxPoint pt( m_position ); wxPoint pt( m_position );
@@ -1341,10 +1334,6 @@ void wxBoxSizer::RecalcSizes()
if (item->IsShown()) if (item->IsShown())
{ {
int weight = 1;
if (item->GetProportion())
weight = item->GetProportion();
wxSize size( item->CalcMin() ); wxSize size( item->CalcMin() );
if (m_orient == wxVERTICAL) if (m_orient == wxVERTICAL)
@@ -1352,8 +1341,9 @@ void wxBoxSizer::RecalcSizes()
wxCoord height = size.y; wxCoord height = size.y;
if (item->GetProportion()) if (item->GetProportion())
{ {
height = (delta * weight) + extra; // Because of at least one visible item has non-zero
extra = 0; // only the first item will get the remainder as extra size // proportion then m_stretchable is not zero
height = (delta * item->GetProportion()) / m_stretchable;
} }
wxPoint child_pos( pt ); wxPoint child_pos( pt );
@@ -1377,8 +1367,9 @@ void wxBoxSizer::RecalcSizes()
wxCoord width = size.x; wxCoord width = size.x;
if (item->GetProportion()) if (item->GetProportion())
{ {
width = (delta * weight) + extra; // Because of at least one visible item has non-zero
extra = 0; // only the first item will get the remainder as extra size // proportion then m_stretchable is not zero
width = (delta * item->GetProportion()) / m_stretchable;
} }
wxPoint child_pos( pt ); wxPoint child_pos( pt );
@@ -1414,10 +1405,21 @@ wxSize wxBoxSizer::CalcMin()
m_fixedWidth = 0; m_fixedWidth = 0;
m_fixedHeight = 0; m_fixedHeight = 0;
// Find how long each stretch unit needs to be
int stretchSize = 1;
wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
if (item->IsShown() && item->GetProportion() != 0)
m_stretchable += item->GetProportion();
node = node->GetNext();
}
// Total minimum size (width or height) of sizer
int maxMinSize = 0;
node = m_children.GetFirst();
while (node) while (node)
{ {
wxSizerItem *item = node->GetData(); wxSizerItem *item = node->GetData();
@@ -1426,14 +1428,18 @@ wxSize wxBoxSizer::CalcMin()
{ {
int stretch = item->GetProportion(); int stretch = item->GetProportion();
wxSize size( item->CalcMin() ); wxSize size( item->CalcMin() );
int sizePerStretch; int minSize;
// Integer division rounded up is (a + b - 1) / b // Integer division rounded up is (a + b - 1) / b
// Round up needed in order to guarantee that all
// all items will have size not less then their min size
if (m_orient == wxHORIZONTAL) if (m_orient == wxHORIZONTAL)
sizePerStretch = ( size.x + stretch - 1 ) / stretch; minSize = ( size.x*m_stretchable + stretch - 1)/stretch;
else else
sizePerStretch = ( size.y + stretch - 1 ) / stretch; minSize = ( size.y*m_stretchable + stretch - 1)/stretch;
if (sizePerStretch > stretchSize)
stretchSize = sizePerStretch; if (minSize > maxMinSize)
maxMinSize = minSize;
} }
node = node->GetNext(); node = node->GetNext();
} }
@@ -1446,29 +1452,15 @@ wxSize wxBoxSizer::CalcMin()
if (item->IsShown()) if (item->IsShown())
{ {
m_stretchable += item->GetProportion();
wxSize size( item->CalcMin() ); wxSize size( item->CalcMin() );
if (item->GetProportion() != 0) if (item->GetProportion() != 0)
{ {
if (m_orient == wxHORIZONTAL) if (m_orient == wxHORIZONTAL)
size.x = stretchSize * item->GetProportion(); size.x = (maxMinSize*item->GetProportion())/m_stretchable;
else else
size.y = stretchSize * item->GetProportion(); size.y = (maxMinSize*item->GetProportion())/m_stretchable;
}
if (m_orient == wxHORIZONTAL)
{
m_minWidth += size.x;
m_minHeight = wxMax( m_minHeight, size.y );
} }
else else
{
m_minHeight += size.y;
m_minWidth = wxMax( m_minWidth, size.x );
}
if (item->GetProportion() == 0)
{ {
if (m_orient == wxVERTICAL) if (m_orient == wxVERTICAL)
{ {
@@ -1481,6 +1473,17 @@ wxSize wxBoxSizer::CalcMin()
m_fixedHeight = wxMax( m_fixedHeight, size.y ); m_fixedHeight = wxMax( m_fixedHeight, size.y );
} }
} }
if (m_orient == wxHORIZONTAL)
{
m_minWidth += size.x;
m_minHeight = wxMax( m_minHeight, size.y );
}
else
{
m_minHeight += size.y;
m_minWidth = wxMax( m_minWidth, size.x );
}
} }
node = node->GetNext(); node = node->GetNext();
} }