From 2feba4447a482840e21fa2d3b33f1a5da12d09b7 Mon Sep 17 00:00:00 2001 From: Fabien Proriol Date: Thu, 22 May 2025 17:10:35 +0200 Subject: qt: Add Qt Wrapper library and QML module --- qt/kzqsettings.cpp | 246 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 qt/kzqsettings.cpp (limited to 'qt/kzqsettings.cpp') 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 + +class QFileSystemWatcher; + + +QVariant toQVariant(const KzSettingValue &value, QVariant defvalue = QVariant()) +{ + if(std::holds_alternative(value)) + { + return QString::fromStdString(std::get(value)); + } + if(std::holds_alternative(value)) + { + return std::get(value); + } + if(std::holds_alternative(value)) + { + return std::get(value); + } + if(std::holds_alternative(value)) + { + return std::get(value); + } + return QVariant(defvalue); +} + +KzSettingValue fromQVariant(const QVariant &value) +{ + if(value.isNull()) + return KzSettingValue(); + + switch (value.userType()) + { + case QMetaType::Int: + return value.value(); + + case QMetaType::QString: + return value.toString().toStdString(); + + case QMetaType::Bool: + return value.value(); + + case QMetaType::Double: + return value.value(); + + 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(), 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(), category.toStdString()); + break; + + case QMetaType::Double: + ret = settings.set(key.toStdString(), value.value(), 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(), 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(), category.toStdString()); + break; + + case QMetaType::Double: + ret = m_settings->set(key.toStdString(), value.value(), 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; +} -- cgit v1.2.3