canvas::Layout: remove/get child items.
This commit is contained in:
@@ -91,6 +91,36 @@ namespace canvas
|
|||||||
insertItem(index, LayoutItemRef(new SpacerItem(size_hint, max_size)));
|
insertItem(index, LayoutItemRef(new SpacerItem(size_hint, max_size)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
size_t BoxLayout::count() const
|
||||||
|
{
|
||||||
|
return _layout_items.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
LayoutItemRef BoxLayout::itemAt(size_t index)
|
||||||
|
{
|
||||||
|
if( index >= _layout_items.size() )
|
||||||
|
return LayoutItemRef();
|
||||||
|
|
||||||
|
return _layout_items[index].layout_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
LayoutItemRef BoxLayout::takeAt(size_t index)
|
||||||
|
{
|
||||||
|
if( index >= _layout_items.size() )
|
||||||
|
return LayoutItemRef();
|
||||||
|
|
||||||
|
LayoutItems::iterator it = _layout_items.begin() + index;
|
||||||
|
LayoutItemRef item = it->layout_item;
|
||||||
|
_layout_items.erase(it);
|
||||||
|
|
||||||
|
invalidate();
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void BoxLayout::setStretch(size_t index, int stretch)
|
void BoxLayout::setStretch(size_t index, int stretch)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ namespace canvas
|
|||||||
|
|
||||||
void insertSpacing(int index, int size);
|
void insertSpacing(int index, int size);
|
||||||
|
|
||||||
|
virtual size_t count() const;
|
||||||
|
virtual LayoutItemRef itemAt(size_t index);
|
||||||
|
virtual LayoutItemRef takeAt(size_t index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the stretch factor of the item at position @a index to @a stretch.
|
* Set the stretch factor of the item at position @a index to @a stretch.
|
||||||
*/
|
*/
|
||||||
@@ -86,7 +90,9 @@ namespace canvas
|
|||||||
int _padding;
|
int _padding;
|
||||||
Direction _direction;
|
Direction _direction;
|
||||||
|
|
||||||
mutable std::vector<ItemData> _layout_items;
|
typedef std::vector<ItemData> LayoutItems;
|
||||||
|
|
||||||
|
mutable LayoutItems _layout_items;
|
||||||
mutable ItemData _layout_data;
|
mutable ItemData _layout_data;
|
||||||
|
|
||||||
void updateSizeHints() const;
|
void updateSizeHints() const;
|
||||||
|
|||||||
@@ -54,6 +54,19 @@ namespace canvas
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Layout::removeItem(const LayoutItemRef& item)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
while( LayoutItemRef child = itemAt(i) )
|
||||||
|
{
|
||||||
|
if( item == child )
|
||||||
|
return (void)takeAt(i);
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void Layout::ItemData::reset()
|
void Layout::ItemData::reset()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -40,6 +40,32 @@ namespace canvas
|
|||||||
virtual void setSpacing(int spacing) = 0;
|
virtual void setSpacing(int spacing) = 0;
|
||||||
virtual int spacing() const = 0;
|
virtual int spacing() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of items.
|
||||||
|
*/
|
||||||
|
virtual size_t count() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the item at position @a index.
|
||||||
|
*
|
||||||
|
* If there is no such item the function must do nothing and return an
|
||||||
|
* empty reference.
|
||||||
|
*/
|
||||||
|
virtual LayoutItemRef itemAt(size_t index) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove and get the item at position @a index.
|
||||||
|
*
|
||||||
|
* If there is no such item the function must do nothing and return an
|
||||||
|
* empty reference.
|
||||||
|
*/
|
||||||
|
virtual LayoutItemRef takeAt(size_t index) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the given @a item from the layout.
|
||||||
|
*/
|
||||||
|
void removeItem(const LayoutItemRef& item);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum LayoutFlags
|
enum LayoutFlags
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -255,6 +255,33 @@ BOOST_AUTO_TEST_CASE( vertical_layout)
|
|||||||
vbox.setDirection(sc::BoxLayout::BottomToTop);
|
vbox.setDirection(sc::BoxLayout::BottomToTop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( boxlayout_insert_remove )
|
||||||
|
{
|
||||||
|
sc::HBoxLayout hbox;
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(hbox.count(), 0);
|
||||||
|
BOOST_CHECK(!hbox.itemAt(0));
|
||||||
|
BOOST_CHECK(!hbox.takeAt(0));
|
||||||
|
|
||||||
|
TestWidgetRef w1( new TestWidget( SGVec2i(16, 16),
|
||||||
|
SGVec2i(32, 32),
|
||||||
|
SGVec2i(9999, 32) ) ),
|
||||||
|
w2( new TestWidget(*w1) );
|
||||||
|
|
||||||
|
hbox.addItem(w1);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.count(), 1);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.itemAt(0), w1);
|
||||||
|
|
||||||
|
hbox.insertItem(0, w2);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.count(), 2);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.itemAt(0), w2);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.itemAt(1), w1);
|
||||||
|
|
||||||
|
hbox.removeItem(w2);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.count(), 1);
|
||||||
|
BOOST_CHECK_EQUAL(hbox.itemAt(0), w1);
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
BOOST_AUTO_TEST_CASE( nasal_layout )
|
BOOST_AUTO_TEST_CASE( nasal_layout )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user