22#include "KPropertySet.h" 
   23#include "KPropertySet_p.h" 
   24#include "KProperty_p.h" 
   28KPropertySetPrivate::KPropertySetPrivate(
KPropertySet *set, 
bool isOwnProperty)
 
   29    : q(set), m_ownProperty(isOwnProperty)
 
   31    m_groupCaptions.insert(
"common", 
QObject::tr(
"General", 
"General properties"));
 
   34KPropertySetPrivate::~KPropertySetPrivate()
 
   41        kprWarning() << 
"property == 0";
 
   45        kprWarning() << 
"COULD NOT ADD NULL PROPERTY";
 
   51        addRelatedProperty(p, property);
 
   54        m_list.append(property);
 
   55        m_hash.insert(property->
name().
toLower(), property);
 
   57            m_visiblePropertiesCount++;
 
   59        addToGroup(realGroup, property);
 
   62    property->d->addSet(q);
 
   65        property->setSortingKey(count());
 
   69void KPropertySetPrivate::removeProperty(
KProperty *property)
 
   74    if (!m_list.removeOne(property)) {
 
   75        kprDebug() << 
"The property set does not contain property" << property;
 
   82            m_visiblePropertiesCount--;
 
   85            emit q->aboutToDeleteProperty(*q, *p);
 
   91void KPropertySetPrivate::clear()
 
   93    if (m_informAboutClearing) {
 
   94        *m_informAboutClearing = 
true;
 
   96    m_informAboutClearing = 
nullptr;
 
   97    emit q->aboutToBeCleared();
 
   98    m_visiblePropertiesCount = 0;
 
   99    qDeleteAll(m_propertiesOfGroup);
 
  100    m_propertiesOfGroup.clear();
 
  101    m_groupNames.clear();
 
  102    m_groupForProperties.clear();
 
  103    m_groupCaptions.clear();
 
  104    m_groupIconNames.clear();
 
  110void KPropertySetPrivate::copyAttributesFrom(
const KPropertySetPrivate &other)
 
  118    m_propertiesOfGroup.clear();
 
  119    m_groupForProperties.clear();
 
  120    m_visiblePropertiesCount = 0;
 
  121    m_informAboutClearing = 
nullptr;
 
  124void KPropertySetPrivate::copyPropertiesFrom(
 
  130        addProperty(prop, set.d->groupForProperty( *it )
 
  142    if (!property || group.
isEmpty()) {
 
  147    if (groupForProperty(property) == groupLower) {
 
  148        kprWarning() << 
"Group" << group << 
"already contains property" << 
property->name();
 
  152    if (!propertiesOfGroup) {
 
  154        m_propertiesOfGroup.insert(groupLower, propertiesOfGroup);
 
  155        m_groupNames.append(groupLower);
 
  158    addPropertyToGroup(property, groupLower);
 
  161void KPropertySetPrivate::removeFromGroup(
KProperty *property)
 
  166    const QByteArray group(groupForProperty(property));
 
  171    if (propertiesOfGroup) {
 
  173        if (propertiesOfGroup->
isEmpty()) {
 
  175            m_propertiesOfGroup.take(group);
 
  176            delete propertiesOfGroup;
 
  177            const int i = m_groupNames.
indexOf(group);
 
  179                m_groupNames.removeAt(i);
 
  183    removePropertyFromGroup(property);
 
  186bool KPropertySetPrivate::hasGroups()
 const 
  188    return m_groupNames.count() > 1 || (m_groupNames.count() == 1 && m_groupNames.first() != 
"common");
 
  191void KPropertySetPrivate::informAboutClearing(
bool* cleared)
 
  195    m_informAboutClearing = cleared;
 
  200    p1->d->addRelatedProperty(p2);
 
  203int KPropertySetPrivate::indexOfProperty(
const KProperty *property)
 const 
  206    if (parentProperty) {
 
  209        const int index = children->
indexOf(parentProperty);
 
  210        Q_ASSERT(index != -1);
 
  213    return indexOfPropertyInGroup(property);
 
  216int KPropertySetPrivate::indexOfPropertyInGroup(
const KProperty *property)
 const 
  220    if (!propertiesOfGroup) {
 
  223    return propertiesOfGroup->
indexOf(property->
name());
 
  229    if (!result.isEmpty())
 
  236KPropertySelector::KPropertySelector()
 
  240KPropertySelector::~KPropertySelector()
 
  246typedef QPair<KProperty*, QString> Iterator_PropertyAndString;
 
  248static inline bool Iterator_propertyAndStringLessThan(
 
  249    const Iterator_PropertyAndString &n1, 
const Iterator_PropertyAndString &n2)
 
  259    explicit Private(KPropertySetIterator *iter) : q(iter)
 
  262    Private(KPropertySetIterator *iter, 
const Private &other)
 
  272#define KPropertySetIteratorPrivateArgs(o) std::tie(o.set, o.iterator, o.end, o.selector, o.order, o.sorted) 
  273    void copy(
const Private &other) {
 
  274        KPropertySetIteratorPrivateArgs((*
this)) = KPropertySetIteratorPrivateArgs(other);
 
  277        return KPropertySetIteratorPrivateArgs((*
this)) == KPropertySetIteratorPrivateArgs(other);
 
  280    void skipNotAcceptable()
 
  285        if (q->current() && !(*selector)( *q->current() )) {
 
  292    const KPropertySet *set;
 
  295    KPropertySelector *selector;
 
  297    QList<KProperty*> sorted; 
 
  300    KPropertySetIterator * 
const q;
 
  304    : d(new Private(this))
 
  307    d->iterator = KPropertySetPrivate::d(&set)->listConstIterator();
 
  308    d->end = KPropertySetPrivate::d(&set)->listConstEnd();
 
  309    d->selector = 
nullptr;
 
 
  315    : d(new Private(this))
 
  318    d->iterator = KPropertySetPrivate::d(&set)->listConstIterator();
 
  319    d->end = KPropertySetPrivate::d(&set)->listConstEnd();
 
  320    d->selector = selector.
clone();
 
  322    d->skipNotAcceptable();
 
 
  326    : d(new Private(this, *set.d))
 
 
  332    if (
this != &other) {
 
 
  340    return *d == *other.d;
 
 
  343KPropertySetIterator::~KPropertySetIterator()
 
  350    if (d->order == 
order)
 
  358        d->
iterator = KPropertySetPrivate::d(d->set)->listConstIterator();
 
  359        d->end = KPropertySetPrivate::d(d->set)->listConstEnd();
 
  360        for (; d->iterator!=d->end; ++d->iterator) {
 
  364                captionOrName = prop->
caption();
 
  369            propertiesAndStrings.
append( qMakePair(prop, captionOrName) );
 
  371        std::sort(propertiesAndStrings.
begin(), propertiesAndStrings.
end(),
 
  372                  Iterator_propertyAndStringLessThan);
 
  374        foreach (
const Iterator_PropertyAndString& propertyAndString, propertiesAndStrings) {
 
  375            d->sorted.append(propertyAndString.first);
 
  378        d->iterator = d->sorted.constBegin();
 
  379        d->end = d->sorted.constEnd();
 
  385        d->iterator = KPropertySetPrivate::d(d->set)->listConstIterator();
 
  386        d->end = KPropertySetPrivate::d(d->set)->listConstEnd();
 
  388    d->skipNotAcceptable();
 
 
  396KProperty* KPropertySetIterator::current()
 const 
  398    return d->iterator == d->end ? nullptr : *d->iterator;
 
  401void KPropertySetIterator::operator ++()
 
  410        if ((*d->selector)( *current() ))
 
  419        , d(new KPropertySetPrivate(this, true))
 
 
  426        , d(new KPropertySetPrivate(this, true))
 
 
  434        , d(new KPropertySetPrivate(this, propertyOwner))
 
 
  438KPropertySet::~KPropertySet()
 
  477    const KProperty *
property = d->property(propertyName);
 
 
  483    return d->groupForProperty(&
property);
 
  488    return d->groupNames();
 
 
  499    d->setGroupCaption(group, caption);
 
 
  504    return d->groupCaption(group);
 
 
  509    d->setGroupIconName(group, iconName);
 
 
  514    return d->groupIconName(group);
 
 
  540    return d->visiblePropertiesCount() > 0;
 
 
  558    if (d->readOnly != readOnly) {
 
  559        d->readOnly = readOnly;
 
 
  567    return d->property(name);
 
 
  573    return d->propertyOrNull(name);
 
 
  586    return d->propertyOrNull(name);
 
 
  596    d->copyAttributesFrom(*set.d);
 
  597    d->copyPropertiesFrom(set.d->listConstIterator(), set.d->listConstEnd(), set);
 
 
  604    return p ? p->
value() : defaultValue;
 
 
  622    dbg.
nospace() << 
"KPropertySet(";
 
  624        dbg.
space() << 
"<EMPTY>)";
 
  627    dbg.
nospace() << 
" PROPERTIES(" << set.
count() << 
"):\n";
 
  632    for ( ; it.current(); ++it) {
 
  639        dbg.
nospace() << *it.current();
 
  647    return d->previousSelection();
 
 
  652    d->setPreviousSelection(prevSelection);
 
 
  659        result.
insert(it.current()->name(), it.current()->value());
 
 
  667        it.current()->clearModifiedFlag();
 
 
  674        if (it.current()->isModified()) {
 
 
An interface for functor selecting properties.
 
virtual KPropertySelector * clone() const =0
Creates a deep copy of the selector.
 
A class to iterate over a KPropertySet.
 
KPropertySetIterator(const KPropertySet &set)
Creates iterator for set set of properties.
 
void setOrder(Order order)
Sets order for properties. Restarts the iterator.
 
KPropertySetIterator & operator=(const KPropertySetIterator &other)
Assigns other to this KPropertySetIterator.
 
Order
Ordering options for properties.
 
@ AlphabeticalByName
alphabetical order (case-insensitively by name)
 
@ Insertion
insertion order
 
@ Alphabetical
alphabetical order (case-insensitively by captions)
 
bool operator==(const KPropertySetIterator &other) const
 
QVariant propertyValue(const QByteArray &name, const QVariant &defaultValue=QVariant()) const
 
KPropertySet & operator=(const KPropertySet &set)
 
void addProperty(KProperty *property, const QByteArray &group="common")
 
bool hasProperties(const KPropertySelector &selector) const
 
KProperty & property(const QByteArray &name) const
 
void changeProperty(const QByteArray &property, const QVariant &value)
 
KPropertySet(QObject *parent=nullptr)
Constructs a new property set object.
 
void changePropertyIfExists(const QByteArray &property, const QVariant &value)
 
QByteArray previousSelection() const
 
QString groupCaption(const QByteArray &group) const
 
QString groupIconName(const QByteArray &group) const
 
QByteArray groupNameForProperty(const QByteArray &propertyName) const
 
QMap< QByteArray, QVariant > propertyValues() const
 
void readOnlyFlagChanged()
 
void setGroupCaption(const QByteArray &group, const QString &caption)
 
bool hasVisibleProperties() const
 
QList< QByteArray > propertyNamesForGroup(const QByteArray &group) const
 
void setGroupIconName(const QByteArray &group, const QString &iconName)
 
bool isModified() const
Returns true if at least one property in this set is modified, i.e.
 
QList< QByteArray > groupNames() const
 
void removeProperty(KProperty *property)
 
void clearModifiedFlags()
Clears "modified" flag of all properties in this set, i.e.
 
KProperty & operator[](const QByteArray &name) const
 
void setReadOnly(bool readOnly)
 
bool contains(const QByteArray &name) const
 
void setPreviousSelection(const QByteArray &prevSelection)
Sets previous section.
 
The base class representing a single property.
 
bool setValue(const QVariant &value, ValueOptions options=ValueOptions())
Sets value of the property.
 
const QList< KProperty * > * children() const
 
KProperty * parent() const
 
const QList< QKeySequence > & end()
 
const QList< QKeySequence > & copy()
 
bool operator==(const StyleDelim &l, const StyleDelim &r)
 
bool isEmpty() const const
 
QByteArray toLower() const const
 
void append(QList< T > &&value)
 
qsizetype indexOf(const AT &value, qsizetype from) const const
 
bool isEmpty() const const
 
void removeAt(qsizetype i)
 
T value(qsizetype i) const const
 
iterator insert(const Key &key, const T &value)
 
QObject * parent() const const
 
void setObjectName(QAnyStringView name)
 
QString tr(const char *sourceText, const char *disambiguation, int n)
 
int compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs)
 
bool isEmpty() const const