]> git.mxchange.org Git - simgear.git/commitdiff
canvas::Layout: remove/get child items.
authorThomas Geymayer <tomgey@gmail.com>
Wed, 11 Jun 2014 22:35:17 +0000 (00:35 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Wed, 11 Jun 2014 22:35:17 +0000 (00:35 +0200)
simgear/canvas/layout/BoxLayout.cxx
simgear/canvas/layout/BoxLayout.hxx
simgear/canvas/layout/Layout.cxx
simgear/canvas/layout/Layout.hxx
simgear/canvas/layout/canvas_layout_test.cxx

index 5ba2ad3640f3f1b6440aa1580aae3b6906a24c21..a4dbd54e109af3277b07a5387a562345cc50b79d 100644 (file)
@@ -91,6 +91,36 @@ namespace canvas
     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)
   {
index 105372743be02668b17778c61270574f53edadf8..4bf9fd1a1bda9580b3ff96aa581e63a238de95b1 100644 (file)
@@ -55,6 +55,10 @@ namespace canvas
 
       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.
        */
@@ -86,7 +90,9 @@ namespace canvas
       int _padding;
       Direction _direction;
 
-      mutable std::vector<ItemData> _layout_items;
+      typedef std::vector<ItemData> LayoutItems;
+
+      mutable LayoutItems _layout_items;
       mutable ItemData _layout_data;
 
       void updateSizeHints() const;
index 8c10a520d533b6dac918698902331658cb912ca6..a61d2780427e729c7e43ebd20760c161078349a0 100644 (file)
@@ -54,6 +54,19 @@ namespace canvas
     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()
   {
index 6d4aa57543acacd51e5a0e05d522f8c7c7a05a49..dc563023cb2402d2b527637a0cb59dfe93cba521 100644 (file)
@@ -40,6 +40,32 @@ namespace canvas
       virtual void setSpacing(int spacing) = 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:
       enum LayoutFlags
       {
index b05afd48b68a330d58f2f19c1811e0858ff30acf..4750aae879aac664ec7cc85898826a3882ca882e 100644 (file)
@@ -255,6 +255,33 @@ BOOST_AUTO_TEST_CASE( vertical_layout)
   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 )
 {