aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autotests/kconfigskeletontest.cpp27
-rw-r--r--src/core/kcoreconfigskeleton.cpp45
-rw-r--r--src/core/kcoreconfigskeleton.h37
-rw-r--r--src/core/kcoreconfigskeleton_p.h4
4 files changed, 113 insertions, 0 deletions
diff --git a/autotests/kconfigskeletontest.cpp b/autotests/kconfigskeletontest.cpp
index 3e37f6c5..1971da78 100644
--- a/autotests/kconfigskeletontest.cpp
+++ b/autotests/kconfigskeletontest.cpp
@@ -56,6 +56,9 @@ void KConfigSkeletonTest::init()
QCOMPARE(mMyColor, DEFAULT_SETTING2);
QCOMPARE(mMyFont, DEFAULT_SETTING3);
QCOMPARE(mMyString, DEFAULT_SETTING4);
+
+ QVERIFY(s->isDefaults());
+ QVERIFY(!s->isSaveNeeded());
}
void KConfigSkeletonTest::cleanup()
@@ -70,15 +73,27 @@ void KConfigSkeletonTest::testSimple()
mMyFont = WRITE_SETTING3;
mMyString = WRITE_SETTING4;
+ QVERIFY(s->isSaveNeeded());
+ QVERIFY(!s->isDefaults());
+
s->save();
+ QVERIFY(!s->isSaveNeeded());
+ QVERIFY(!s->isDefaults());
+
mMyBool = false;
mMyColor = QColor();
mMyString.clear();
mMyFont = QFont();
+ QVERIFY(s->isSaveNeeded());
+ QVERIFY(!s->isDefaults());
+
s->read();
+ QVERIFY(!s->isSaveNeeded());
+ QVERIFY(!s->isDefaults());
+
QCOMPARE(mMyBool, WRITE_SETTING1);
QCOMPARE(mMyColor, WRITE_SETTING2);
QCOMPARE(mMyFont, WRITE_SETTING3);
@@ -112,16 +127,28 @@ void KConfigSkeletonTest::testDefaults()
mMyFont = WRITE_SETTING3;
mMyString = WRITE_SETTING4;
+ QVERIFY(s->isSaveNeeded());
+ QVERIFY(!s->isDefaults());
+
s->save();
+ QVERIFY(!s->isSaveNeeded());
+ QVERIFY(!s->isDefaults());
+
s->setDefaults();
+ QVERIFY(s->isSaveNeeded());
+ QVERIFY(s->isDefaults());
+
QCOMPARE(mMyBool, DEFAULT_SETTING1);
QCOMPARE(mMyColor, DEFAULT_SETTING2);
QCOMPARE(mMyFont, DEFAULT_SETTING3);
QCOMPARE(mMyString, DEFAULT_SETTING4);
s->save();
+
+ QVERIFY(!s->isSaveNeeded());
+ QVERIFY(s->isDefaults());
}
void KConfigSkeletonTest::testKConfigDirty()
diff --git a/src/core/kcoreconfigskeleton.cpp b/src/core/kcoreconfigskeleton.cpp
index b3eb0019..34c58ff6 100644
--- a/src/core/kcoreconfigskeleton.cpp
+++ b/src/core/kcoreconfigskeleton.cpp
@@ -135,11 +135,31 @@ bool KConfigSkeletonItem::isImmutable() const
return d->mIsImmutable;
}
+bool KConfigSkeletonItem::isDefault() const
+{
+ return d->mIsDefaultImpl();
+}
+
+bool KConfigSkeletonItem::isSaveNeeded() const
+{
+ return d->mIsSaveNeededImpl();
+}
+
void KConfigSkeletonItem::readImmutability(const KConfigGroup &group)
{
d->mIsImmutable = group.isEntryImmutable(mKey);
}
+void KConfigSkeletonItem::setIsDefaultImpl(const std::function<bool ()> &impl)
+{
+ d->mIsDefaultImpl = impl;
+}
+
+void KConfigSkeletonItem::setIsSaveNeededImpl(const std::function<bool ()> &impl)
+{
+ d->mIsSaveNeededImpl = impl;
+}
+
KCoreConfigSkeleton::ItemString::ItemString(const QString &_group, const QString &_key,
QString &reference,
const QString &defaultValue,
@@ -1091,6 +1111,28 @@ void KCoreConfigSkeleton::read()
usrRead();
}
+bool KCoreConfigSkeleton::isDefaults() const
+{
+ KConfigSkeletonItem::List::ConstIterator it;
+ for (it = d->mItems.constBegin(); it != d->mItems.constEnd(); ++it) {
+ if (!(*it)->isDefault()) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool KCoreConfigSkeleton::isSaveNeeded() const
+{
+ KConfigSkeletonItem::List::ConstIterator it;
+ for (it = d->mItems.constBegin(); it != d->mItems.constEnd(); ++it) {
+ if ((*it)->isSaveNeeded()) {
+ return true;
+ }
+ }
+ return false;
+}
+
bool KCoreConfigSkeleton::save()
{
//qDebug();
@@ -1394,6 +1436,9 @@ KConfigCompilerSignallingItem::KConfigCompilerSignallingItem(KConfigSkeletonItem
Q_ASSERT(mTargetFunction);
Q_ASSERT(mItem);
Q_ASSERT(mObject);
+
+ setIsDefaultImpl([this] { return mItem->isDefault(); });
+ setIsSaveNeededImpl([this] { return mItem->isSaveNeeded(); });
}
KConfigCompilerSignallingItem::~KConfigCompilerSignallingItem()
diff --git a/src/core/kcoreconfigskeleton.h b/src/core/kcoreconfigskeleton.h
index 771d8cc9..6e792efd 100644
--- a/src/core/kcoreconfigskeleton.h
+++ b/src/core/kcoreconfigskeleton.h
@@ -210,6 +210,21 @@ public:
*/
bool isImmutable() const;
+ /**
+ * Indicates if the item is set to its default value.
+ *
+ * @since 5.64
+ */
+ bool isDefault() const;
+
+ /**
+ * Indicates if the item has a different value than the
+ * previously loaded value.
+ *
+ * @since 5.64
+ */
+ bool isSaveNeeded() const;
+
protected:
/**
* sets mIsImmutable to true if mKey in config is immutable
@@ -221,6 +236,11 @@ protected:
QString mKey; ///< The config key for this item
QString mName; ///< The name of this item
+ // HACK: Necessary to avoid introducing new virtuals in KConfigSkeletonItem
+ // KF6: Use proper pure virtuals in KConfigSkeletonItem
+ void setIsDefaultImpl(const std::function<bool()> &impl);
+ void setIsSaveNeededImpl(const std::function<bool()> &impl);
+
private:
KConfigSkeletonItemPrivate *const d;
};
@@ -240,6 +260,8 @@ public:
: KConfigSkeletonItem(_group, _key), mReference(reference),
mDefault(defaultValue), mLoadedValue(defaultValue)
{
+ setIsDefaultImpl([this] { return mReference == mDefault; });
+ setIsSaveNeededImpl([this] { return mReference != mLoadedValue; });
}
/**
@@ -1078,6 +1100,21 @@ public:
void read();
/**
+ * Indicates if all the registered items are set to their default value.
+ *
+ * @since 5.64
+ */
+ bool isDefaults() const;
+
+ /**
+ * Indicates if any registered item has a different value than the
+ * previously loaded value.
+ *
+ * @since 5.64
+ */
+ bool isSaveNeeded() const;
+
+ /**
* Set the config file group for subsequent addItem() calls. It is valid
* until setCurrentGroup() is called with a new argument. Call this before
* you add any items. The default value is "No Group".
diff --git a/src/core/kcoreconfigskeleton_p.h b/src/core/kcoreconfigskeleton_p.h
index 41005c6f..623bfa03 100644
--- a/src/core/kcoreconfigskeleton_p.h
+++ b/src/core/kcoreconfigskeleton_p.h
@@ -60,6 +60,10 @@ public:
QString mLabel; ///< The label for this item
QString mToolTip; ///< The ToolTip text for this item
QString mWhatsThis; ///< The What's This text for this item
+
+ // HACK: Necessary to avoid introducing new virtuals in KConfigSkeletonItem
+ std::function<bool()> mIsDefaultImpl;
+ std::function<bool()> mIsSaveNeededImpl;
};
#endif