Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85631271
D346.1786311162.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
13 KB
Referenced Files
None
Subscribers
None
D346.1786311162.diff
View Options
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -104,6 +104,17 @@
SOURCES ${kazvqmlmodule_SRCS}
)
+kconfig_target_kcfg_file(kazvqmlmodule
+ FILE kazv-settings.kcfg
+ CLASS_NAME KazvSettings
+ MUTATORS
+)
+kconfig_target_kcfg_file(kazvqmlmodule
+ FILE kazv-sessions-settings.kcfg
+ CLASS_NAME KazvSessionsSettings
+ MUTATORS
+)
+
target_link_libraries(kazvqmlmodule PUBLIC
libkazv::kazvall
Qt${QT_MAJOR_VERSION}::Core
@@ -119,6 +130,7 @@
Qt${QT_MAJOR_VERSION}::Sql
Qt${QT_MAJOR_VERSION}::HttpServer
KF${KF_MAJOR_VERSION}::ConfigCore
+ KF${KF_MAJOR_VERSION}::ConfigGui
KF${KF_MAJOR_VERSION}::Notifications
KF${KF_MAJOR_VERSION}::CoreAddons
QCoro::Core
diff --git a/src/kazv-config.hpp b/src/kazv-config.hpp
--- a/src/kazv-config.hpp
+++ b/src/kazv-config.hpp
@@ -47,4 +47,7 @@
* otherwise the return value of cacheDirectory() will be an invalid path
**/
void setCacheDirectory(QString cacheDirectory);
+
+private:
+ void migrateOldConfig();
};
diff --git a/src/kazv-config.cpp b/src/kazv-config.cpp
--- a/src/kazv-config.cpp
+++ b/src/kazv-config.cpp
@@ -7,39 +7,52 @@
#include <kazv-defs.hpp>
#include "kazv-config.hpp"
+#include "kazv-sessions-settings.h"
+#include "kazv-settings.h"
+
#include <KSharedConfig>
#include <KConfigGroup>
+#include <QFile>
+#include <QStandardPaths>
+
+#include <memory>
using namespace Qt::Literals::StringLiterals;
struct KazvConfigPrivate
{
- KSharedConfigPtr sessionrc{KSharedConfig::openConfig(u"kazvsessionrc"_s)};
- KConfigGroup sessionGroup{sessionrc, u"Sessions"_s};
+ std::unique_ptr<KazvSessionsSettings> sessionsSettings{
+ std::make_unique<KazvSessionsSettings>()
+ };
- KSharedConfigPtr shortcutsrc{KSharedConfig::openConfig(u"kazv/shortcutsrc"_s)};
- KConfigGroup shortcutsGroup{shortcutsrc, u"Shortcuts"_s};
+ std::unique_ptr<KazvSettings> settings{std::make_unique<KazvSettings>()};
- KSharedConfigPtr cacheDirectoryrc{KSharedConfig::openConfig(u"kazv/cacheDirectoryrc"_s)};
- KConfigGroup cacheDirectoryGroup{cacheDirectoryrc, u"CacheDirectory"_s};
+ // KConfigXT can't read/write groups directly;
+ // openConfig() returns the same kazvrc instance KazvSettings uses.
+ KSharedConfigPtr appConfig{KSharedConfig::openConfig(u"kazv/kazvrc"_s)};
+ KConfigGroup shortcutsGroup{appConfig, u"Shortcuts"_s};
};
KazvConfig::KazvConfig(QObject *parent)
: QObject(parent)
, m_d(new KazvConfigPrivate)
{
+ migrateOldConfig();
+ m_d->sessionsSettings->load();
+ m_d->settings->load();
}
KazvConfig::~KazvConfig() = default;
QString KazvConfig::lastSession() const
{
- return m_d->sessionGroup.readEntry("lastSession", QString());
+ return m_d->sessionsSettings->lastSession();
}
void KazvConfig::setLastSession(QString session)
{
- m_d->sessionGroup.writeEntry("lastSession", session);
+ m_d->sessionsSettings->setLastSession(session);
+ m_d->sessionsSettings->save();
}
QStringList KazvConfig::shortcutForAction(QString actionName) const
@@ -50,14 +63,73 @@
void KazvConfig::setShortcutForAction(QString actionName, QStringList shortcut)
{
m_d->shortcutsGroup.writeEntry(actionName, shortcut);
+ m_d->appConfig->sync();
}
QString KazvConfig::cacheDirectory() const
{
- return m_d->cacheDirectoryGroup.readEntry("cacheDirectory", QString());
+ return m_d->settings->cacheDirectory();
}
void KazvConfig::setCacheDirectory(QString cacheDirectory)
{
- m_d->cacheDirectoryGroup.writeEntry("cacheDirectory", cacheDirectory);
+ m_d->settings->setCacheDirectory(cacheDirectory);
+ m_d->settings->save();
+}
+
+void KazvConfig::migrateOldConfig()
+{
+ KSharedConfigPtr appConfig = m_d->appConfig;
+
+ const QString cacheDirectoryrcPath =
+ QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) +
+ u"/"_s + u"kazv/cacheDirectoryrc"_s;
+ if (QFile::exists(cacheDirectoryrcPath)) {
+ const auto oldConfig = KSharedConfig::openConfig(u"kazv/cacheDirectoryrc"_s);
+ const KConfigGroup oldGroup{oldConfig, u"CacheDirectory"_s};
+ KConfigGroup generalGroup = appConfig->group(u"General"_s);
+ const QString key = u"cacheDirectory"_s;
+ if (oldGroup.hasKey(key) && !generalGroup.hasKey(key)) {
+ generalGroup.writeEntry(key, oldGroup.readEntry(key, QString()));
+ }
+
+ if (appConfig->sync()) {
+ QFile::remove(cacheDirectoryrcPath);
+ }
+ }
+
+ const QString shortcutsrcPath =
+ QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) +
+ u"/"_s + u"kazv/shortcutsrc"_s;
+ if (QFile::exists(shortcutsrcPath)) {
+ const auto oldConfig = KSharedConfig::openConfig(u"kazv/shortcutsrc"_s);
+ const KConfigGroup oldGroup{oldConfig, u"Shortcuts"_s};
+ KConfigGroup newGroup = appConfig->group(u"Shortcuts"_s);
+ const QStringList keys = oldGroup.keyList();
+ for (const QString &key : keys) {
+ if (oldGroup.hasKey(key) && !newGroup.hasKey(key)) {
+ newGroup.writeEntry(key, oldGroup.readEntry(key, QStringList()));
+ }
+ }
+ if (appConfig->sync()) {
+ QFile::remove(shortcutsrcPath);
+ }
+ }
+
+ const QString sessionrcPath =
+ QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) +
+ u"/"_s + u"kazvsessionrc"_s;
+ if (QFile::exists(sessionrcPath)) {
+ const auto oldConfig = KSharedConfig::openConfig(u"kazvsessionrc"_s);
+ const KConfigGroup oldGroup{oldConfig, u"Sessions"_s};
+ const KSharedConfigPtr newSessionConfig = KSharedConfig::openConfig(u"kazv/kazvsessionrc"_s);
+ KConfigGroup newGroup = newSessionConfig->group(u"Sessions"_s);
+ const QString key = u"lastSession"_s;
+ if (oldGroup.hasKey(key) && !newGroup.hasKey(key)) {
+ newGroup.writeEntry(key, oldGroup.readEntry(key, QString()));
+ }
+ if (newSessionConfig->sync()) {
+ QFile::remove(sessionrcPath);
+ }
+ }
}
diff --git a/src/kazv-sessions-settings.kcfg b/src/kazv-sessions-settings.kcfg
new file mode 100644
--- /dev/null
+++ b/src/kazv-sessions-settings.kcfg
@@ -0,0 +1,12 @@
+<?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="kazv/kazvsessionrc" />
+ <group name="Sessions">
+ <entry name="lastSession" type="String">
+ <label>The last (most recent) session to load at startup.</label>
+ </entry>
+ </group>
+</kcfg>
diff --git a/src/kazv-settings.kcfg b/src/kazv-settings.kcfg
new file mode 100644
--- /dev/null
+++ b/src/kazv-settings.kcfg
@@ -0,0 +1,12 @@
+<?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="kazv/kazvrc" />
+ <group name="General">
+ <entry name="cacheDirectory" type="String">
+ <label>Directory for storing the cached files.</label>
+ </entry>
+ </group>
+</kcfg>
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -37,6 +37,7 @@
kazv-file-test.cpp
db-store-test.cpp
sso-login-process-test.cpp
+ kazv-config-test.cpp
LINK_LIBRARIES Qt${QT_MAJOR_VERSION}::Test kazvtestlib
)
diff --git a/src/tests/kazv-config-test.cpp b/src/tests/kazv-config-test.cpp
new file mode 100644
--- /dev/null
+++ b/src/tests/kazv-config-test.cpp
@@ -0,0 +1,190 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2026 nannanko <nannanko@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#include <kazv-defs.hpp>
+
+#include "kazv-config.hpp"
+
+#include <KConfigGroup>
+#include <KSharedConfig>
+
+#include <QDir>
+#include <QFile>
+#include <QMap>
+#include <QObject>
+#include <QStandardPaths>
+#include <QStringList>
+#include <QTemporaryDir>
+#include <QVariant>
+#include <QtTest>
+
+using namespace Qt::Literals::StringLiterals;
+
+namespace
+{
+ QString configDir()
+ {
+ return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
+ }
+
+ QString configFilePath(const QString &relativePath)
+ {
+ return configDir() + u"/"_s + relativePath;
+ }
+
+ // Creates a config file by the same way the old kazv code did
+ void writeOldConfig(const QString &configName,
+ const QString &groupName,
+ const QMap<QString, QVariant> &entries)
+ {
+ const KSharedConfigPtr config = KSharedConfig::openConfig(configName);
+ KConfigGroup group = config->group(groupName);
+ for (auto it = entries.cbegin(); it != entries.cend(); ++it) {
+ group.writeEntry(it.key(), it.value());
+ }
+ QVERIFY(config->sync());
+ }
+}
+
+class KazvConfigTest : public QObject
+{
+ Q_OBJECT
+
+private:
+ QTemporaryDir m_configHome;
+
+private Q_SLOTS:
+ void initTestCase();
+ void cleanup();
+ void testMigrateCacheDirectory();
+ void testMigrateShortcuts();
+ void testMigratePreservesExistingNewConfig();
+ void testMigrateShortcutsPreservesExistingNewConfig();
+ void testMigrateLastSession();
+ void testMigrateLastSessionPreservesExistingNewConfig();
+ void testNoOldConfig();
+};
+
+void KazvConfigTest::initTestCase()
+{
+ // Redirect all config locations to a temporary directory, so that
+ // the migration code never touches the user's real configuration.
+ QVERIFY(m_configHome.isValid());
+ QVERIFY(qputenv("XDG_CONFIG_HOME", m_configHome.path().toUtf8()));
+ QCOMPARE(configDir(), m_configHome.path());
+}
+
+void KazvConfigTest::cleanup()
+{
+ const QStringList configFiles = {
+ u"kazv/kazvrc"_s,
+ u"kazv/kazvsessionrc"_s,
+ u"kazv/cacheDirectoryrc"_s,
+ u"kazv/shortcutsrc"_s,
+ u"kazvsessionrc"_s,
+ };
+ for (const QString &relativePath : configFiles) {
+ QFile::remove(configFilePath(relativePath));
+ }
+}
+
+void KazvConfigTest::testMigrateCacheDirectory()
+{
+ writeOldConfig(u"kazv/cacheDirectoryrc"_s, u"CacheDirectory"_s,
+ {{u"cacheDirectory"_s, u"/tmp/kazv-cache"_s}});
+
+ KazvConfig config;
+ QCOMPARE(config.cacheDirectory(), u"/tmp/kazv-cache"_s);
+
+ // The old config file should be removed after a successful migration.
+ QVERIFY(!QFile::exists(configFilePath(u"kazv/cacheDirectoryrc"_s)));
+}
+
+void KazvConfigTest::testMigrateShortcuts()
+{
+ writeOldConfig(u"kazv/shortcutsrc"_s, u"Shortcuts"_s,
+ {{u"switch-account"_s,
+ QVariant::fromValue(QStringList{u"Meta+Tab"_s, u"Alt+1"_s})},
+ {u"hard-logout"_s, QVariant::fromValue(QStringList{u"Ctrl+L"_s})}});
+
+ KazvConfig config;
+ QCOMPARE(config.shortcutForAction(u"switch-account"_s),
+ (QStringList{u"Meta+Tab"_s, u"Alt+1"_s}));
+ QCOMPARE(config.shortcutForAction(u"hard-logout"_s),
+ QStringList{u"Ctrl+L"_s});
+
+ QVERIFY(!QFile::exists(configFilePath(u"kazv/shortcutsrc"_s)));
+}
+
+void KazvConfigTest::testMigratePreservesExistingNewConfig()
+{
+ {
+ KazvConfig config;
+ config.setCacheDirectory(u"/new/cache"_s);
+ }
+
+ writeOldConfig(u"kazv/cacheDirectoryrc"_s, u"CacheDirectory"_s,
+ {{u"cacheDirectory"_s, u"/old/cache"_s}});
+
+ KazvConfig config;
+ QCOMPARE(config.cacheDirectory(), u"/new/cache"_s);
+
+ QVERIFY(!QFile::exists(configFilePath(u"kazv/cacheDirectoryrc"_s)));
+}
+
+void KazvConfigTest::testMigrateShortcutsPreservesExistingNewConfig()
+{
+ {
+ KazvConfig config;
+ config.setShortcutForAction(u"switch-account"_s, (QStringList{u"Ctrl+K"_s}));
+ }
+
+ writeOldConfig(u"kazv/shortcutsrc"_s, u"Shortcuts"_s,
+ {{u"switch-account"_s, QVariant::fromValue(QStringList{u"Ctrl+J"_s})},
+ {u"hard-logout"_s, QVariant::fromValue(QStringList{u"Ctrl+L"_s})}});
+
+ KazvConfig config;
+ QCOMPARE(config.shortcutForAction(u"switch-account"_s), (QStringList{u"Ctrl+K"_s}));
+ QCOMPARE(config.shortcutForAction(u"hard-logout"_s), (QStringList{u"Ctrl+L"_s}));
+
+ QVERIFY(!QFile::exists(configFilePath(u"kazv/shortcutsrc"_s)));
+}
+
+void KazvConfigTest::testMigrateLastSession()
+{
+ writeOldConfig(u"kazvsessionrc"_s, u"Sessions"_s,
+ {{u"lastSession"_s, u"session1"_s}});
+
+ KazvConfig config;
+ QCOMPARE(config.lastSession(), u"session1"_s);
+
+ QVERIFY(!QFile::exists(configFilePath(u"kazvsessionrc"_s)));
+}
+
+void KazvConfigTest::testMigrateLastSessionPreservesExistingNewConfig()
+{
+ writeOldConfig(u"kazv/kazvsessionrc"_s, u"Sessions"_s,
+ {{u"lastSession"_s, u"newsession"_s}});
+ writeOldConfig(u"kazvsessionrc"_s, u"Sessions"_s,
+ {{u"lastSession"_s, u"oldsession"_s}});
+
+ KazvConfig config;
+ QCOMPARE(config.lastSession(), u"newsession"_s);
+
+ QVERIFY(!QFile::exists(configFilePath(u"kazvsessionrc"_s)));
+}
+
+void KazvConfigTest::testNoOldConfig()
+{
+ KazvConfig config;
+ QCOMPARE(config.cacheDirectory(), QString());
+ QCOMPARE(config.shortcutForAction(u"switch-account"_s), QStringList());
+ QCOMPARE(config.lastSession(), QString());
+}
+
+QTEST_MAIN(KazvConfigTest)
+
+#include "kazv-config-test.moc"
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Aug 9, 2:32 PM (22 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1725041
Default Alt Text
D346.1786311162.diff (13 KB)
Attached To
Mode
D346: Port to KConfigXT
Attached
Detach File
Event Timeline
Log In to Comment