namespace canvas
{
- //----------------------------------------------------------------------------
- void Layout::update()
- {
- if( !(_flags & (LAYOUT_DIRTY | SIZE_INFO_DIRTY)) )
- return;
-
- doLayout(_geometry);
-
- _flags &= ~LAYOUT_DIRTY;
- }
-
- //----------------------------------------------------------------------------
- void Layout::invalidate()
- {
- LayoutItem::invalidate();
- _flags |= LAYOUT_DIRTY;
- }
-
- //----------------------------------------------------------------------------
- void Layout::setGeometry(const SGRecti& geom)
- {
- if( geom == _geometry )
- return;
-
- _geometry = geom;
- _flags |= LAYOUT_DIRTY;
-
- update();
- }
-
//----------------------------------------------------------------------------
void Layout::removeItem(const LayoutItemRef& item)
{
}
}
+ //----------------------------------------------------------------------------
+ void Layout::clear()
+ {
+ while( itemAt(0) )
+ takeAt(0);
+ }
+
//----------------------------------------------------------------------------
void Layout::ItemData::reset()
{
padding = 0;
size = 0;
stretch = 0;
+ visible = false;
+ has_hfw = false;
done = false;
}
//----------------------------------------------------------------------------
- void Layout::safeAdd(int& a, int b)
+ int Layout::ItemData::hfw(int w) const
+ {
+ if( has_hfw )
+ return layout_item->heightForWidth(w);
+ else
+ return layout_item->sizeHint().y();
+ }
+
+ //----------------------------------------------------------------------------
+ int Layout::ItemData::mhfw(int w) const
{
- if( SGLimits<int>::max() - b < a )
- a = SGLimits<int>::max();
+ if( has_hfw )
+ return layout_item->minimumHeightForWidth(w);
else
- a += b;
+ return layout_item->minimumSize().y();
+ }
+
+ //----------------------------------------------------------------------------
+ void Layout::contentsRectChanged(const SGRecti& rect)
+ {
+ doLayout(rect);
+
+ _flags &= ~LAYOUT_DIRTY;
}
//----------------------------------------------------------------------------
void Layout::distribute(std::vector<ItemData>& items, const ItemData& space)
{
const int num_children = static_cast<int>(items.size());
- _num_not_done = num_children;
+ _num_not_done = 0;
SG_LOG( SG_GUI,
SG_DEBUG,
- "Layout::distribute(" << num_children << " items)" );
+ "Layout::distribute(" << space.size << "px for "
+ << num_children << " items, s.t."
+ << " min=" << space.min_size
+ << ", hint=" << space.size_hint
+ << ", max=" << space.max_size << ")" );
if( space.size < space.min_size )
{
for(int i = 0; i < num_children; ++i)
{
ItemData& d = items[i];
+ if( !d.visible )
+ continue;
+
d.size = less_then_hint ? d.min_size : d.size_hint;
d.padding = d.padding_orig;
d.done = d.size >= (less_then_hint ? d.size_hint : d.max_size);
+ SG_LOG(
+ SG_GUI,
+ SG_DEBUG,
+ i << ") initial=" << d.size
+ << ", min=" << d.min_size
+ << ", hint=" << d.size_hint
+ << ", max=" << d.max_size
+ );
+
if( d.done )
- {
- _num_not_done -= 1;
continue;
- }
+ _num_not_done += 1;
if( d.stretch > 0 )
{
for(int i = 0; i < num_children; ++i)
{
ItemData& d = items[i];
+ if( !d.visible )
+ continue;
SG_LOG(
SG_GUI,
else
{
_space_left = space.size - space.max_size;
+ for(int i = 0; i < num_children; ++i)
+ {
+ if( items[i].visible )
+ _num_not_done += 1;
+ }
+
for(int i = 0; i < num_children; ++i)
{
ItemData& d = items[i];
+ if( !d.visible )
+ continue;
+
d.size = d.max_size;
// Add superfluous space as padding
for(int i = 0; i < num_children; ++i)
{
ItemData const& d = items[i];
- SG_LOG( SG_GUI,
- SG_DEBUG,
- i << ") pad=" << d.padding
- << ", size = " << d.size );
+ if( d.visible )
+ SG_LOG(SG_GUI, SG_DEBUG, i << ") pad=" << d.padding
+ << ", size= " << d.size);
+ else
+ SG_LOG(SG_GUI, SG_DEBUG, i << ") [hidden]");
}
}