diff options
author | Fabien Proriol <fabien.proriol@kazoe.org> | 2025-05-22 17:10:35 +0200 |
---|---|---|
committer | Fabien Proriol <fabien.proriol@kazoe.org> | 2025-05-26 10:48:46 +0200 |
commit | 2feba4447a482840e21fa2d3b33f1a5da12d09b7 (patch) | |
tree | 83a790b1ae5b5f32f5964350856a160dbed52e05 /qt/kzqsettings.cpp | |
parent | c842548fef050ac5f8b56a5fcb4f579820247434 (diff) |
qt: Add Qt Wrapper library and QML module
Diffstat (limited to 'qt/kzqsettings.cpp')
-rw-r--r-- | qt/kzqsettings.cpp | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/qt/kzqsettings.cpp b/qt/kzqsettings.cpp new file mode 100644 index 0000000..9ad4674 --- /dev/null +++ b/qt/kzqsettings.cpp @@ -0,0 +1,246 @@ +#include "kzqsettings.h" +#include "../src/kzsettings.h" +#include <qdebug.h> + +class QFileSystemWatcher; + + +QVariant toQVariant(const KzSettingValue &value, QVariant defvalue = QVariant()) +{ + if(std::holds_alternative<std::string>(value)) + { + return QString::fromStdString(std::get<std::string>(value)); + } + if(std::holds_alternative<int>(value)) + { + return std::get<int>(value); + } + if(std::holds_alternative<bool>(value)) + { + return std::get<bool>(value); + } + if(std::holds_alternative<double>(value)) + { + return std::get<double>(value); + } + return QVariant(defvalue); +} + +KzSettingValue fromQVariant(const QVariant &value) +{ + if(value.isNull()) + return KzSettingValue(); + + switch (value.userType()) + { + case QMetaType::Int: + return value.value<int>(); + + case QMetaType::QString: + return value.toString().toStdString(); + + case QMetaType::Bool: + return value.value<bool>(); + + case QMetaType::Double: + return value.value<double>(); + + default: + return false; + } +} + +QString toKeyCombined(const std::string& category, const std::string& key) +{ + QString keysig; + if(category.size()) + { + keysig.append("["); + keysig.append(QString::fromStdString(category)); + keysig.append("]"); + } + keysig.append(QString::fromStdString(key)); + return keysig; +} + +KaZoe::KzQSettings::KzQSettings(QObject *parent) + : QObject(parent) + , m_settings(new KaZoe::KzSettings()) +{ + m_settings->setNotifier([this](const std::string& category, const std::string& key, KzSettingValue value) { + emit valueChanged(toKeyCombined(category, key), toQVariant(value)); + }); +} + +KaZoe::KzQSettings::~KzQSettings() +{ +} + +QVariant KaZoe::KzQSettings::getValue(const QString &id, QVariant defvalue) +{ + KaZoe::KzSettings settings; + + QString category; + QString key = id; + if(id.contains("/")) + { + qWarning() << "OLD Syntax used for " << id; + QStringList tab = id.split("/"); + category = tab[0]; + tab.removeFirst(); + key = tab.join("/"); + } + + KzSettingValue value = settings.get(key.toStdString(), category.toStdString(), fromQVariant(defvalue)); + return toQVariant(value); +} + +bool KaZoe::KzQSettings::setValue(const QString &id, const QVariant &value) +{ + KaZoe::KzSettings settings; + bool ret; + QString key = id; + QString category; + + if(id.contains("/")) + { + qWarning() << "OLD Syntax used for " << id; + QStringList tab = id.split("/"); + category = tab[0]; + tab.removeFirst(); + key = tab.join("/"); + } + + switch (value.userType()) + { + case QMetaType::Int: + ret = settings.set(key.toStdString(), value.value<int>(), category.toStdString()); + break; + + case QMetaType::QString: + ret = settings.set(key.toStdString(), value.toString().toStdString(), category.toStdString()); + break; + + case QMetaType::Bool: + ret = settings.set(key.toStdString(), value.value<bool>(), category.toStdString()); + break; + + case QMetaType::Double: + ret = settings.set(key.toStdString(), value.value<double>(), category.toStdString()); + break; + default: + ret = false; + break; + } + + if(!ret) + { + qWarning() << "Settings ERROR: Write access not permitted for" << id << " with " << QString::fromStdString(settings.id()); + return false; + } + return true; +} + + +int KaZoe::KzQSettings::count() const +{ + if(m_settings) return m_settings->size(); + qWarning() << "Invalid object state for count"; + return -1; +} + +QVariant KaZoe::KzQSettings::get(const QString &id, const QVariant defvalue) const +{ + if(!m_settings) + { + qWarning() << "Invalid object state for get"; + return QVariant(); + } + + QString category; + QString key = id; + if(id.contains("/")) + { + qWarning() << "OLD Syntax used for " << id; + QStringList tab = id.split("/"); + category = tab[0]; + tab.removeFirst(); + key = tab.join("/"); + } + + KzSettingValue value = m_settings->get(key.toStdString(), category.toStdString(), fromQVariant(defvalue)); + return toQVariant(value); +} + +bool KaZoe::KzQSettings::set(const QString &id, const QVariant &value) +{ + if(!m_settings) + { + qWarning() << "Invalid object state for set"; + return false; + } + bool ret; + QString key = id; + QString category; + + if(id.contains("/")) + { + qWarning() << "OLD Syntax used for " << id; + QStringList tab = id.split("/"); + category = tab[0]; + tab.removeFirst(); + key = tab.join("/"); + } + + switch (value.userType()) + { + case QMetaType::Int: + ret = m_settings->set(key.toStdString(), value.value<int>(), category.toStdString()); + break; + + case QMetaType::QString: + ret = m_settings->set(key.toStdString(), value.toString().toStdString(), category.toStdString()); + break; + + case QMetaType::Bool: + ret = m_settings->set(key.toStdString(), value.value<bool>(), category.toStdString()); + break; + + case QMetaType::Double: + ret = m_settings->set(key.toStdString(), value.value<double>(), category.toStdString()); + break; + default: + ret = false; + break; + } + + if(!ret) + { + qWarning() << "Settings ERROR: Write access not permitted for" << id << " with " << QString::fromStdString(m_settings->id()); + return false; + } + + emit valueChanged(toKeyCombined(category.toStdString(), key.toStdString()), value); + return true; +} + +QStringList KaZoe::KzQSettings::keys() const +{ + if(!m_settings) + { + qWarning() << "Invalid object state for keys"; + return QStringList(); + } + + QStringList keys; + m_settings->forEach([&keys](const KzSettingKey& key, const KzSettingValue& value) { + std::string combined; + if(!key.first.empty()) + { + combined = "[" + key.first + "]"; + } + combined.append(key.second); + keys.append(QString::fromStdString(combined)); + }); + return keys; +} |