aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autotests/kconfig_compiler/CMakeLists.txt9
-rw-r--r--autotests/kconfig_compiler/test_state_config.kcfg14
-rw-r--r--autotests/kconfig_compiler/test_state_config.kcfgc6
-rw-r--r--autotests/kconfig_compiler/test_state_config_main.cpp41
-rw-r--r--src/kconfig_compiler/KConfigCommonStructs.h1
-rw-r--r--src/kconfig_compiler/KConfigHeaderGenerator.cpp7
-rw-r--r--src/kconfig_compiler/KConfigSourceGenerator.cpp8
-rw-r--r--src/kconfig_compiler/KConfigXmlParser.cpp1
-rw-r--r--src/kconfig_compiler/README.dox5
-rw-r--r--src/kconfig_compiler/kcfg.xsd1
10 files changed, 91 insertions, 2 deletions
diff --git a/autotests/kconfig_compiler/CMakeLists.txt b/autotests/kconfig_compiler/CMakeLists.txt
index 2a4b343b..4641c0e0 100644
--- a/autotests/kconfig_compiler/CMakeLists.txt
+++ b/autotests/kconfig_compiler/CMakeLists.txt
@@ -172,6 +172,15 @@ target_link_libraries(test13 KF5::ConfigGui)
########### next target ###############
+set(test_state_config_SRCS test_state_config_main.cpp)
+
+gen_kcfg_test_source(test_state_config test_state_config_SRCS GENERATE_MOC)
+
+ecm_add_test(TEST_NAME test_state_config ${test_state_config_SRCS})
+target_link_libraries(test_state_config KF5::ConfigGui Qt5::Test)
+
+########### next target ###############
+
set(test_emptyentries_SRCS test_emptyentries_main.cpp )
gen_kcfg_test_source(test_emptyentries test_emptyentries_SRCS GENERATE_MOC)
diff --git a/autotests/kconfig_compiler/test_state_config.kcfg b/autotests/kconfig_compiler/test_state_config.kcfg
new file mode 100644
index 00000000..9c9e96c3
--- /dev/null
+++ b/autotests/kconfig_compiler/test_state_config.kcfg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="test_statedatarc" stateConfig="true"/>
+
+ <group name="General">
+ <entry type="Int" key="SomeStateData">
+ <default>0</default>
+ </entry>
+ </group>
+
+</kcfg>
diff --git a/autotests/kconfig_compiler/test_state_config.kcfgc b/autotests/kconfig_compiler/test_state_config.kcfgc
new file mode 100644
index 00000000..35e2de7d
--- /dev/null
+++ b/autotests/kconfig_compiler/test_state_config.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler_kf5
+File=test_state_config.kcfg
+ClassName=MyStateConfig
+Singleton=false
+Mutators=true
+ItemAccessors=true
diff --git a/autotests/kconfig_compiler/test_state_config_main.cpp b/autotests/kconfig_compiler/test_state_config_main.cpp
new file mode 100644
index 00000000..07044bb5
--- /dev/null
+++ b/autotests/kconfig_compiler/test_state_config_main.cpp
@@ -0,0 +1,41 @@
+/*
+ SPDX-FileCopyrightText: 2021 Alexander Lohnau <alexander.lohnau@gmx.de>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "test_state_config.h"
+#include <QTest>
+
+class TestStateConfig : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void testStateConfig()
+ {
+ auto stateConfig = KSharedConfig::openStateConfig(QStringLiteral("test_statedatarc"));
+
+ // Clean the group at every start
+ stateConfig->deleteGroup("General");
+ stateConfig->sync();
+
+ // It should have the default value
+ QCOMPARE(MyStateConfig().someStateData(), 0);
+
+ // the updated value should be read from the generated config class
+ stateConfig->group("General").writeEntry("SomeStateData", 1);
+ QCOMPARE(MyStateConfig().someStateData(), 1);
+
+ // Make sure writing the value works as expected
+ MyStateConfig cfg;
+ cfg.setSomeStateData(2);
+ QVERIFY(cfg.isSaveNeeded());
+ cfg.save();
+ stateConfig->reparseConfiguration();
+ QCOMPARE(stateConfig->group("General").readEntry("SomeStateData", -1), 2);
+ }
+};
+QTEST_MAIN(TestStateConfig)
+
+#include "test_state_config_main.moc"
diff --git a/src/kconfig_compiler/KConfigCommonStructs.h b/src/kconfig_compiler/KConfigCommonStructs.h
index 43e981cb..bac10c70 100644
--- a/src/kconfig_compiler/KConfigCommonStructs.h
+++ b/src/kconfig_compiler/KConfigCommonStructs.h
@@ -114,6 +114,7 @@ public:
struct ParseResult {
QString cfgFileName;
bool cfgFileNameArg = false;
+ bool cfgStateConfig = false;
QList<Param> parameters;
QList<Signal> signalList;
QStringList includes;
diff --git a/src/kconfig_compiler/KConfigHeaderGenerator.cpp b/src/kconfig_compiler/KConfigHeaderGenerator.cpp
index 9938599c..ea5a2c75 100644
--- a/src/kconfig_compiler/KConfigHeaderGenerator.cpp
+++ b/src/kconfig_compiler/KConfigHeaderGenerator.cpp
@@ -324,10 +324,17 @@ void KConfigHeaderGenerator::createConstructor()
if (parseResult.cfgFileNameArg) {
if (cfg().forceStringFilename) {
stream() << " const QString &cfgfilename" << (parseResult.parameters.isEmpty() ? " = QString()" : ", ");
+ } else if (parseResult.cfgStateConfig) {
+ stream() << " KSharedConfig::Ptr config" << (parseResult.parameters.isEmpty() ? " = KSharedConfig::openStateConfig()" : ", ");
} else {
stream() << " KSharedConfig::Ptr config" << (parseResult.parameters.isEmpty() ? " = KSharedConfig::openConfig()" : ", ");
}
}
+ if (cfg().forceStringFilename && parseResult.cfgStateConfig) {
+ std::cerr << "One can not use ForceStringFilename and use the stateConfig attribute, consider "
+ "removing the ForceStringFilename kcfgc option if you want to use state data"
+ << std::endl;
+ }
bool first = true;
for (const auto &parameter : std::as_const(parseResult.parameters)) {
diff --git a/src/kconfig_compiler/KConfigSourceGenerator.cpp b/src/kconfig_compiler/KConfigSourceGenerator.cpp
index a8a05f4b..45299a4f 100644
--- a/src/kconfig_compiler/KConfigSourceGenerator.cpp
+++ b/src/kconfig_compiler/KConfigSourceGenerator.cpp
@@ -170,7 +170,9 @@ void KConfigSourceGenerator::createSingletonImplementation()
stream() << " return;\n";
stream() << " }\n";
stream() << " new " << cfg().className << "(";
- if (isString) {
+ if (parseResult.cfgStateConfig) {
+ stream() << "KSharedConfig::openStateConfig(" << arg << ")";
+ } else if (isString) {
stream() << "KSharedConfig::openConfig(" << arg << ")";
} else {
stream() << "std::move(" << arg << ")";
@@ -232,7 +234,9 @@ void KConfigSourceGenerator::createConstructorParameterList()
void KConfigSourceGenerator::createParentConstructorCall()
{
stream() << cfg().inherits << "(";
- if (!parseResult.cfgFileName.isEmpty()) {
+ if (parseResult.cfgStateConfig) {
+ stream() << " KSharedConfig::openStateConfig(QStringLiteral( \"" << parseResult.cfgFileName << "\") ";
+ } else if (!parseResult.cfgFileName.isEmpty()) {
stream() << " QStringLiteral( \"" << parseResult.cfgFileName << "\" ";
}
if (parseResult.cfgFileNameArg) {
diff --git a/src/kconfig_compiler/KConfigXmlParser.cpp b/src/kconfig_compiler/KConfigXmlParser.cpp
index 3d054522..fbcd4b92 100644
--- a/src/kconfig_compiler/KConfigXmlParser.cpp
+++ b/src/kconfig_compiler/KConfigXmlParser.cpp
@@ -522,6 +522,7 @@ void KConfigXmlParser::readGroupTag(const QDomElement &e)
void KConfigXmlParser::readKcfgfileTag(const QDomElement &e)
{
mParseResult.cfgFileName = e.attribute(QStringLiteral("name"));
+ mParseResult.cfgStateConfig = e.attribute(QStringLiteral("stateConfig")).toLower() == QLatin1String("true");
mParseResult.cfgFileNameArg = e.attribute(QStringLiteral("arg")).toLower() == QLatin1String("true");
for (QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement()) {
if (e2.tagName() == QLatin1String("parameter")) {
diff --git a/src/kconfig_compiler/README.dox b/src/kconfig_compiler/README.dox
index 671e9c5b..4c22a452 100644
--- a/src/kconfig_compiler/README.dox
+++ b/src/kconfig_compiler/README.dox
@@ -385,6 +385,11 @@ Example 1:
In this case passing "Group2" as the 'groupname' parameter to the generated class
will make it use group "Group2" for the entry "Text".
+By setting the stateConfig attribute of kcfgfile to "true", KSharedConfig::openStateConfig is used.
+This should be used when one stores volatile data, like window sizes or autocompletion texts.
+It is recommended to have at least two separate kcfg files for the different kinds of data.
+NOTE: This option is ignored when ForceStringFilename is set.
+
\subsection enums Enums
By default, if <b>GlobalEnums</b> is set to false, a separate named enum will be generated
diff --git a/src/kconfig_compiler/kcfg.xsd b/src/kconfig_compiler/kcfg.xsd
index f9175a1d..6825819b 100644
--- a/src/kconfig_compiler/kcfg.xsd
+++ b/src/kconfig_compiler/kcfg.xsd
@@ -68,6 +68,7 @@
<!-- FIXME: Are really unbounded occurrences of parameter allowed? -->
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="optional"/>
+ <xsd:attribute name="stateConfig" type="xsd:boolean" use="optional"/>
<xsd:attribute name="arg" type="xsd:boolean" use="optional"/>
</xsd:complexType>
</xsd:element>