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