File indexing completed on 2024-04-21 07:38:02

0001 /*
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003     SPDX-FileCopyrightText: 2014 Inge Wallin <inge@lysator.liu.se>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 /** \file itemgroup.h
0009  *  \brief Contains the ItemGroup object.
0010  */
0011 
0012 #ifndef STEPCORE_ITEMGROUP_H
0013 #define STEPCORE_ITEMGROUP_H
0014 
0015 
0016 #include <vector> // XXX: Replace if Qt is enabled.
0017 
0018 #include "types.h"
0019 #include "item.h"
0020 
0021 
0022 namespace StepCore
0023 {
0024 
0025 
0026 /** \ingroup world
0027  *  \brief Groups several items together
0028  */
0029 class ItemGroup : public Item
0030 {
0031     STEPCORE_OBJECT(ItemGroup)
0032 
0033 public:
0034     /** Constructs empty group */
0035     explicit ItemGroup(const QString& name = QString()) : Item(name) {}
0036     /** Constructs a copy of the group (deep copy) */
0037     ItemGroup(const ItemGroup& group);
0038     /** Destroys the group and all its subitems */
0039     ~ItemGroup();
0040 
0041     /** Assignment operator (deep copy)
0042      *  \warning Do not call this on groups already attached to the world */
0043     ItemGroup& operator=(const ItemGroup& group);
0044 
0045     /** Get list of all direct child items in the ItemGroup */
0046     const ItemList& items() const  { return _items; }
0047 
0048     bool contains(const Item* item) const { return std::find(_items.begin(), _items.end(), item) != _items.end(); }
0049 
0050     /** Get list of all items in the ItemGroup
0051      *  \note This operation takes long time since it
0052      *        recursively traverses all child groups */
0053     ItemList allItems() const { ItemList l; allItems(&l); return l; }
0054     /** Get list of all items in the ItemGroup
0055      *  \param items Array to store items
0056      *  \note This operation takes long time since it
0057      *        recursively traverses all child groups */
0058     void allItems(ItemList* items) const;
0059 
0060     /** Add new item to the group */
0061     virtual void addItem(Item* item);
0062     /** Remove item from the group (you should delete item yourself) */
0063     virtual void removeItem(Item* item);
0064     /** Delete item from the group (it actually deletes item) */
0065     virtual void deleteItem(Item* item) { removeItem(item); delete item; }
0066 
0067     /** Deletes all items */
0068     void clear();
0069 
0070     /** Finds direct child item in items() */
0071     int  childItemIndex(const Item* item) const;
0072     /** Get direct child count */
0073     int  childItemCount() const { return _items.size(); }
0074     /** Get direct child item by its index */
0075     Item* childItem(int index) const { return _items[index]; }
0076     /** Get direct child item by its name */
0077     Item* childItem(const QString& name) const;
0078     /** Get any descendant item by its name */
0079     Item* item(const QString& name) const;
0080 
0081     /** Recursively call setWorld for all children objects */
0082     void setWorld(World* world) override;
0083     /** Recursively call worldItemRemoved for all children objects */
0084     void worldItemRemoved(Item* item) override;
0085     
0086 private:
0087     ItemList  _items;
0088 };
0089 
0090 
0091 } // namespace StepCore
0092 
0093 
0094 #endif