Page MenuHomePhorge

D346.1786311162.diff
No OneTemporary

Size
13 KB
Referenced Files
None
Subscribers
None

D346.1786311162.diff

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

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)

Event Timeline