File indexing completed on 2024-07-21 12:34:30

0001 /* This file is part of the KDE project
0002    Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
0003    Copyright (C) 2004 Alexander Dymo <cloudtemple@mskat.net>
0004    Copyright (C) 2004-2017 Jarosław Staniek <staniek@kde.org>
0005 
0006    This library is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU Library General Public
0008    License as published by the Free Software Foundation; either
0009    version 2 of the License, or (at your option) any later version.
0010 
0011    This library is distributed in the hope that it will be useful,
0012    but WITHOUT ANY WARRANTY; without even the implied warranty of
0013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014    Library General Public License for more details.
0015 
0016    You should have received a copy of the GNU Library General Public License
0017    along with this library; see the file COPYING.LIB.  If not, write to
0018    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0019  * Boston, MA 02110-1301, USA.
0020 */
0021 
0022 #ifndef KPROPERTY_SET_P_H
0023 #define KPROPERTY_SET_P_H
0024 
0025 #include "KPropertySet.h"
0026 #include "kproperty_debug.h"
0027 
0028 class KPROPERTYCORE_EXPORT KPropertySetPrivate
0029 {
0030 public:
0031     explicit KPropertySetPrivate(KPropertySet *set, bool isOwnProperty);
0032 
0033     ~KPropertySetPrivate();
0034 
0035     //! Asccessor within the KProperty*
0036     inline static KPropertySetPrivate* d(KPropertySet *set) { return set->d; }
0037     inline static const KPropertySetPrivate* d(const KPropertySet *set) { return set->d; }
0038 
0039     inline int visiblePropertiesCount() const { return m_visiblePropertiesCount; }
0040 
0041     inline KProperty* property(const QByteArray &name) const {
0042         return m_hash.value(name.toLower());
0043     }
0044 
0045     inline KProperty& propertyOrNull(const QByteArray &name) const
0046     {
0047         KProperty *p = property(name);
0048         if (p)
0049             return *p;
0050         m_nonConstNull.setName(nullptr); //to ensure returned property is null
0051         kprWarning() << "PROPERTY" << name << "NOT FOUND";
0052         return m_nonConstNull;
0053     }
0054 
0055     void addProperty(KProperty *property, const QByteArray &group/*, bool updateSortingKey*/);
0056 
0057     void removeProperty(KProperty *property);
0058 
0059     void clear();
0060 
0061     inline int count() const { return m_list.count(); }
0062 
0063     inline bool isEmpty() const { return m_list.isEmpty(); }
0064 
0065     /*! @return @c true if there are groups explicitly defined.
0066      In this case groups are displayed by the property editor.
0067      If there is only one "common" group, it means that all properties belong to this group,
0068      and no groups are displayed.
0069      @since 3.1 */
0070     bool hasGroups() const;
0071 
0072     inline QByteArray groupForProperty(const KProperty *property) const {
0073         return m_groupForProperties.value(const_cast<KProperty*>(property));
0074     }
0075 
0076     inline void setGroupCaption(const QByteArray &group, const QString &caption)
0077     {
0078         m_groupCaptions.insert(group.toLower(), caption);
0079     }
0080 
0081     inline void addPropertyToGroup(KProperty *property, const QByteArray &groupLower) {
0082         m_groupForProperties.insert(property, groupLower);
0083     }
0084 
0085     inline void removePropertyFromGroup(KProperty *property) {
0086         m_groupForProperties.remove(property);
0087     }
0088 
0089     //! Copy all attributes except complex ones
0090     void copyAttributesFrom(const KPropertySetPrivate &other);
0091 
0092     //! Copy all properties from the other set
0093     void copyPropertiesFrom(
0094         const QList<KProperty*>::ConstIterator& constBegin,
0095         const QList<KProperty*>::ConstIterator& constEnd, const KPropertySet & set);
0096 
0097     QList<QByteArray> groupNames() const
0098     {
0099         return m_groupNames;
0100     }
0101 
0102     /*! Add property to a group.*/
0103     void addToGroup(const QByteArray &group, KProperty *property);
0104 
0105     /*! Remove property from a group.*/
0106     void removeFromGroup(KProperty *property);
0107 
0108     /*! Used to declare that \a property wants to be informed
0109      that the set has been cleared (all properties are deleted) */
0110     void informAboutClearing(bool* cleared);
0111 
0112     /*! Helper for Private class. */
0113     void addRelatedProperty(KProperty *p1, KProperty *p2) const;
0114 
0115     inline QList<KProperty*>::ConstIterator listConstIterator() const {
0116         return m_list.constBegin();
0117     }
0118 
0119     inline QList<KProperty*>::ConstIterator listConstEnd() const {
0120         return m_list.constEnd();
0121     }
0122 
0123     /*! @return index of property @a property within its parent or group. */
0124     int indexOfProperty(const KProperty *property) const;
0125 
0126     /*! @return index of property @a property within its group. */
0127     int indexOfPropertyInGroup(const KProperty *property) const;
0128 
0129     QString groupCaption(const QByteArray &group) const;
0130 
0131     inline void setGroupIconName(const QByteArray &group, const QString& iconName)
0132     {
0133         m_groupIconNames.insert(group.toLower(), iconName);
0134     }
0135 
0136     inline QString groupIconName(const QByteArray &group) const
0137     {
0138         return m_groupIconNames.value(group);
0139     }
0140 
0141     inline QByteArray previousSelection() const
0142     {
0143         return m_prevSelection;
0144     }
0145 
0146     inline void setPreviousSelection(const QByteArray &prevSelection)
0147     {
0148         m_prevSelection = prevSelection;
0149     }
0150 
0151     inline QList<QByteArray> *propertyNamesForGroup(const QByteArray &group)
0152     {
0153         return m_propertiesOfGroup.value(group);
0154     }
0155 
0156     inline QByteArray groupName(int index) const
0157     {
0158         return m_groupNames.value(index);
0159     }
0160 
0161     inline int indexOfGroup(const QByteArray &group) const
0162     {
0163         return m_groupNames.indexOf(group);
0164     }
0165 
0166     bool readOnly = false;
0167 
0168 private:
0169     KPropertySet *q;
0170 
0171     //groups of properties:
0172     // list of group name: (list of property names)
0173     QMap<QByteArray, QList<QByteArray>* > m_propertiesOfGroup;
0174     QList<QByteArray> m_groupNames;
0175     QHash<QByteArray, QString> m_groupCaptions;
0176     QHash<QByteArray, QString> m_groupIconNames;
0177     // map of property: group
0178 
0179     bool m_ownProperty;
0180     QByteArray m_prevSelection;
0181 
0182     mutable KProperty m_nonConstNull;
0183 
0184     //! A list of properties, preserving their order, owner of KProperty objects
0185     QList<KProperty*> m_list;
0186     //! A hash of properties in form name -> property
0187     QHash<QByteArray, KProperty*> m_hash;
0188     QHash<KProperty*, QByteArray> m_groupForProperties;
0189     int m_visiblePropertiesCount = 0; //!< Cache for optimization,
0190                                        //!< used by @ref bool KPropertySet::hasVisibleProperties()
0191     //! Used in KPropertySetPrivate::informAboutClearing(bool&) to declare that the property wants
0192     //! to be informed that the set has been cleared (all properties are deleted)
0193     bool* m_informAboutClearing = nullptr;
0194 };
0195 
0196 #endif