File indexing completed on 2024-12-01 05:13:04

0001 /***************************************************************************
0002  *   Copyright (C) 2005 by David Saxton                                    *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #ifndef ITEMGROUP_H
0012 #define ITEMGROUP_H
0013 
0014 #include <QPointer>
0015 
0016 class Item;
0017 class ICNDocument;
0018 class ItemDocument;
0019 class DoubleSpinBox;
0020 class ItemGroup;
0021 class MechanicsDocument;
0022 class Variant;
0023 
0024 typedef QList<QPointer<Item>> ItemList;
0025 
0026 class KtlQCanvasItem;
0027 class KtlQCanvasItemList;
0028 
0029 /**
0030 Generic base class for controlling a selection of Item. Provides
0031 some functionality such as for dealing with item data
0032 @author David Saxton
0033 */
0034 class ItemGroup : public QObject
0035 {
0036     Q_OBJECT
0037 public:
0038     ItemGroup(ItemDocument *view);
0039     ~ItemGroup() override;
0040 
0041     /**
0042      * Returns a pointer to the "active" CNItem - i.e. the last CNItem
0043      * to be added to the CNItemGroup. This will always return a pointer to
0044      * a single item, unless there are no CNItems in the group
0045      */
0046     Item *activeItem() const
0047     {
0048         return m_activeItem;
0049     }
0050     uint itemCount() const
0051     {
0052         return m_itemList.count();
0053     }
0054     virtual bool addQCanvasItem(KtlQCanvasItem *qcanvasItem) = 0;
0055     virtual void setItems(KtlQCanvasItemList list) = 0;
0056     virtual void removeQCanvasItem(KtlQCanvasItem *qcanvasItem) = 0;
0057     virtual bool contains(KtlQCanvasItem *qcanvasItem) const = 0;
0058     virtual uint count() const = 0;
0059     bool isEmpty() const
0060     {
0061         return (count() == 0);
0062     }
0063     virtual void mergeGroup(ItemGroup *group) = 0;
0064     virtual void removeAllItems() = 0;
0065     virtual void deleteAllItems() = 0;
0066     /**
0067      * Returns a list of all the Items in the group.
0068      * @param excludeParented whether to return items whose (grand-) parents are
0069      * already in the list.
0070      */
0071     ItemList items(bool excludeParented = true) const;
0072     /**
0073      * Sets the selected state of all items in the group
0074      */
0075     virtual void setSelected(bool sel) = 0;
0076 
0077     /**
0078      * Returns true iff either there are no items, or itemsAreSameType and the
0079      * value of each data (excluding hidden data) for each item is the same
0080      */
0081     bool itemsHaveSameData() const;
0082     /**
0083      * Returns truee iff either there are no items, or itemsAreSameType and the
0084      * value of the data with the given id is the same for each item
0085      */
0086     bool itemsHaveSameDataValue(const QString &id) const;
0087     /**
0088      * Returns true iff all the iff itemsHaveSameData() returns true and the
0089      * value of the data are the defaults
0090      */
0091     bool itemsHaveDefaultData() const;
0092     /**
0093      * Returns true if all the items in the group are the same (e.g.
0094      * resistors). This is checked for by looking at the ids of the items,
0095      * and seeing if the string before "__#" is the same Note: if there are zero
0096      * items in the group, then this will return true
0097      */
0098     bool itemsAreSameType() const
0099     {
0100         return b_itemsAreSameType;
0101     }
0102 
0103 public slots:
0104     /**
0105      * Align the selected items horizontally so that their positions have the
0106      * same y coordinate.
0107      */
0108     void slotAlignHorizontally();
0109     /**
0110      * Align the selected items horizontally so that their positions have the
0111      * same x coordinate.
0112      */
0113     void slotAlignVertically();
0114     /**
0115      * Distribute the selected items horizontally so that they have the same
0116      * spacing in the horizontal direction.
0117      */
0118     void slotDistributeHorizontally();
0119     /**
0120      * Distribute the selected items vertically so that they have the same
0121      * spacing in the vertical direction.
0122      */
0123     void slotDistributeVertically();
0124 
0125 signals:
0126     void itemAdded(Item *item);
0127     void itemRemoved(Item *item);
0128 
0129 protected:
0130     /**
0131      * Subclasses must call this to register the item with the data interface
0132      */
0133     void registerItem(Item *item);
0134     /**
0135      * Subclasses must call this to unregister the item with the data interface
0136      */
0137     void unregisterItem(Item *item);
0138     void updateAreSameStatus();
0139 
0140     ItemList m_itemList;
0141     bool b_itemsAreSameType;
0142     ItemDocument *p_view;
0143 
0144     ICNDocument *p_icnDocument;
0145     MechanicsDocument *p_mechanicsDocument;
0146     Item *m_activeItem;
0147 
0148 private slots:
0149     void getViewPtrs();
0150 };
0151 
0152 #endif