diff options
-rw-r--r-- | autotests/kconfig_compiler/CMakeLists.txt | 9 | ||||
-rw-r--r-- | autotests/kconfig_compiler/test_state_config.kcfg | 14 | ||||
-rw-r--r-- | autotests/kconfig_compiler/test_state_config.kcfgc | 6 | ||||
-rw-r--r-- | autotests/kconfig_compiler/test_state_config_main.cpp | 41 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigCommonStructs.h | 1 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigHeaderGenerator.cpp | 7 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigSourceGenerator.cpp | 8 | ||||
-rw-r--r-- | src/kconfig_compiler/KConfigXmlParser.cpp | 1 | ||||
-rw-r--r-- | src/kconfig_compiler/README.dox | 5 | ||||
-rw-r--r-- | src/kconfig_compiler/kcfg.xsd | 1 |
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 ¶meter : 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> |