return m_window->IsShown();
case Item_Sizer:
+ {
// arbitrarily decide that if at least one of our elements is
// shown, so are we (this arbitrariness is the reason for
// deprecating this function)
+ for ( wxSizerItemList::compatibility_iterator
+ node = m_sizer->GetChildren().GetFirst();
+ node;
+ node = node->GetNext() )
{
- // Some apps (such as dialog editors) depend on an empty sizer still
- // being laid out correctly and reporting the correct size and position.
- if (m_sizer->GetChildren().GetCount() == 0)
+ if ( node->GetData()->IsShown() )
return true;
-
- for ( wxSizerItemList::compatibility_iterator
- node = m_sizer->GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- if ( node->GetData()->IsShown() )
- return true;
- }
}
return false;
+ }
case Item_Spacer:
return m_spacer->IsShown();
m_totalProportion = 0;
m_minSize = wxSize(0, 0);
- // calculate the minimal sizes for all items and count sum of proportions
+ // The minimal size for the sizer should be big enough to allocate its
+ // element at least its minimal size but also, and this is the non trivial
+ // part, to respect the children proportion. To satisfy the latter
+ // condition we must find the greatest min-size-to-proportion ratio for all
+ // elements with non-zero proportion.
+ float maxMinSizeToProp = 0.;
for ( wxSizerItemList::const_iterator i = m_children.begin();
i != m_children.end();
++i )
continue;
const wxSize sizeMinThis = item->CalcMin();
- SizeInMajorDir(m_minSize) += GetSizeInMajorDir(sizeMinThis);
+ if ( const int propThis = item->GetProportion() )
+ {
+ float minSizeToProp = GetSizeInMajorDir(sizeMinThis);
+ minSizeToProp /= propThis;
+
+ if ( minSizeToProp > maxMinSizeToProp )
+ maxMinSizeToProp = minSizeToProp;
+
+ m_totalProportion += item->GetProportion();
+ }
+ else // fixed size item
+ {
+ // Just account for its size directly
+ SizeInMajorDir(m_minSize) += GetSizeInMajorDir(sizeMinThis);
+ }
+
+ // In the transversal direction we just need to find the maximum.
if ( GetSizeInMinorDir(sizeMinThis) > GetSizeInMinorDir(m_minSize) )
SizeInMinorDir(m_minSize) = GetSizeInMinorDir(sizeMinThis);
-
- m_totalProportion += item->GetProportion();
}
+ // Using the max ratio ensures that the min size is big enough for all
+ // items to have their min size and satisfy the proportions among them.
+ SizeInMajorDir(m_minSize) += maxMinSizeToProp*m_totalProportion;
+
return m_minSize;
}