Browse Source

added settings generator core lib classes

also, created "empty" settings generator project
pull/2/head
Skycoder42 7 years ago
parent
commit
73dfbd825d
No known key found for this signature in database GPG Key ID: 8E01AD9EF0578D2B
  1. 6
      src/mvvmcore/isettingsaccessor.cpp
  2. 39
      src/mvvmcore/isettingsaccessor.h
  3. 9
      src/mvvmcore/mvvmcore.pro
  4. 60
      src/mvvmcore/qsettingsaccessor.cpp
  5. 37
      src/mvvmcore/qsettingsaccessor.h
  6. 124
      src/mvvmcore/settingsentry.h
  7. 8
      tools/settingsgenerator/main.cpp
  8. 69
      tools/settingsgenerator/qsettingsgenerator.xsd
  9. 31
      tools/settingsgenerator/settingsgenerator.pro
  10. 9
      tools/tools.pro

6
src/mvvmcore/isettingsaccessor.cpp

@ -0,0 +1,6 @@
#include "isettingsaccessor.h"
using namespace QtMvvm;
ISettingsAccessor::ISettingsAccessor(QObject *parent) :
QObject{parent}
{}

39
src/mvvmcore/isettingsaccessor.h

@ -0,0 +1,39 @@
#ifndef QTMVVM_ISETTINGSACCESSOR_H
#define QTMVVM_ISETTINGSACCESSOR_H
#include <QtCore/qobject.h>
#include <QtCore/qstring.h>
#include <QtCore/qvariant.h>
#include "QtMvvmCore/qtmvvmcore_global.h"
namespace QtMvvm {
class Q_MVVMCORE_EXPORT ISettingsAccessor : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(ISettingsAccessor)
public:
ISettingsAccessor(QObject *parent = nullptr);
virtual bool contains(const QString &key) const = 0;
virtual QVariant load(const QString &key, const QVariant &defaultValue = {}) const = 0;
virtual void save(const QString &key, const QVariant &value) = 0;
virtual void remove(const QString &key) = 0;
public Q_SLOTS:
virtual void sync() = 0;
Q_SIGNALS:
void entryChanged(const QString &key, const QVariant &value);
void entryRemoved(const QString &key);
};
}
#define ISettingsAccessorIid "de.skycoder42.qtmvvm.core.ISettingsAccessor"
Q_DECLARE_INTERFACE(QtMvvm::ISettingsAccessor, ISettingsAccessorIid)
Q_DECLARE_METATYPE(QtMvvm::ISettingsAccessor*)
#endif // QTMVVM_ISETTINGSACCESSOR_H

9
src/mvvmcore/mvvmcore.pro

@ -22,7 +22,10 @@ HEADERS += \
settingssetuploader_p.h \
settingsviewmodel_p.h \
settingsviewmodel.h \
injection.h
injection.h \
isettingsaccessor.h \
qsettingsaccessor.h \
settingsentry.h
SOURCES += \
viewmodel.cpp \
@ -33,7 +36,9 @@ SOURCES += \
message.cpp \
ipresenter.cpp \
settingssetuploader.cpp \
settingsviewmodel.cpp
settingsviewmodel.cpp \
isettingsaccessor.cpp \
qsettingsaccessor.cpp
TRANSLATIONS += \
translations/qtmvvmcore_de.ts \

60
src/mvvmcore/qsettingsaccessor.cpp

@ -0,0 +1,60 @@
#include "qsettingsaccessor.h"
using namespace QtMvvm;
namespace QtMvvm {
class QSettingsAccessorPrivate
{
public:
QSettingsAccessorPrivate(QSettings *settings);
QSettings *settings;
};
}
QSettingsAccessor::QSettingsAccessor(QObject *parent) :
QSettingsAccessor{new QSettings{}, parent}
{}
QSettingsAccessor::QSettingsAccessor(QSettings *settings, QObject *parent) :
ISettingsAccessor{parent},
d{new QSettingsAccessorPrivate{settings}}
{
d->settings->setParent(this);
}
QSettingsAccessor::~QSettingsAccessor() = default;
bool QSettingsAccessor::contains(const QString &key) const
{
return d->settings->contains(key);
}
QVariant QSettingsAccessor::load(const QString &key, const QVariant &defaultValue) const
{
return d->settings->value(key, defaultValue);
}
void QSettingsAccessor::save(const QString &key, const QVariant &value)
{
d->settings->setValue(key, value);
emit entryChanged(key, value);
}
void QSettingsAccessor::remove(const QString &key)
{
d->settings->remove(key);
emit entryRemoved(key);
}
void QSettingsAccessor::sync()
{
d->settings->sync();
}
QSettingsAccessorPrivate::QSettingsAccessorPrivate(QSettings *settings) :
settings{settings}
{}

37
src/mvvmcore/qsettingsaccessor.h

@ -0,0 +1,37 @@
#ifndef QTMVVM_QSETTINGSACCESSOR_H
#define QTMVVM_QSETTINGSACCESSOR_H
#include <QtCore/qsettings.h>
#include <QtCore/qscopedpointer.h>
#include "QtMvvmCore/qtmvvmcore_global.h"
#include "QtMvvmCore/isettingsaccessor.h"
namespace QtMvvm {
class QSettingsAccessorPrivate;
class Q_MVVMCORE_EXPORT QSettingsAccessor : public ISettingsAccessor
{
Q_OBJECT
Q_INTERFACES(QtMvvm::ISettingsAccessor)
public:
Q_INVOKABLE explicit QSettingsAccessor(QObject *parent = nullptr);
explicit QSettingsAccessor(QSettings *settings, QObject *parent = nullptr);
~QSettingsAccessor() override;
bool contains(const QString &key) const override;
QVariant load(const QString &key, const QVariant &defaultValue) const override;
void save(const QString &key, const QVariant &value) override;
void remove(const QString &key) override;
public Q_SLOTS:
void sync() override;
private:
QScopedPointer<QSettingsAccessorPrivate> d;
};
}
#endif // QTMVVM_QSETTINGSACCESSOR_H

124
src/mvvmcore/settingsentry.h

@ -0,0 +1,124 @@
#ifndef QTMVVM_SETTINGSENTRY_H
#define QTMVVM_SETTINGSENTRY_H
#include "QtMvvmCore/isettingsaccessor.h"
namespace QtMvvm {
template <typename T>
class SettingsEntry
{
Q_DISABLE_COPY(SettingsEntry)
public:
SettingsEntry() = default;
bool isSet() const;
T get() const;
void set(const T &value);
void reset();
SettingsEntry<T> &operator=(const T &value);
operator const T() const;
void addChangeCallback(const std::function<void(T)> &callback);
void addChangeCallback(QObject *scope, const std::function<void(T)> &callback);
// internal
void setup(const QString &key, ISettingsAccessor *accessor, const QVariant &defaultValue = {});
private:
QString _key;
ISettingsAccessor *_accessor = nullptr;
QVariant _default;
};
template <>
class SettingsEntry<void>
{
Q_DISABLE_COPY(SettingsEntry)
public:
SettingsEntry() = default;
// internal
void setup(const QString &, ISettingsAccessor *, const QVariant & = {}) {}
};
// ------------- Generic Implementation -------------
template<typename T>
bool SettingsEntry<T>::isSet() const
{
return _accessor->contains(_key);
}
template<typename T>
T SettingsEntry<T>::get() const
{
return _accessor->load(_key, _default).template value<T>();
}
template<typename T>
void SettingsEntry<T>::set(const T &value)
{
_accessor->save(_key, QVariant::fromValue(value));
}
template<typename T>
void SettingsEntry<T>::reset()
{
_accessor->remove(_key);
}
template<typename T>
SettingsEntry<T> &SettingsEntry<T>::operator=(const T &value)
{
set(value);
return (*this);
}
template<typename T>
void SettingsEntry<T>::addChangeCallback(const std::function<void (T)> &callback)
{
addChangeCallback(_accessor, callback);
}
template<typename T>
void SettingsEntry<T>::addChangeCallback(QObject *scope, const std::function<void (T)> &callback)
{
auto mKey = _key;
auto mDefault = _default;
QObject::connect(_accessor, &ISettingsAccessor::entryChanged,
scope, [mKey, callback](const QString &key, const QVariant &value) {
if(key == mKey)
callback(value.template value<T>());
});
QObject::connect(_accessor, &ISettingsAccessor::entryRemoved,
scope, [mKey, mDefault, callback](const QString &key) {
if(key == mKey)
callback(mDefault.template value<T>());
});
}
template<typename T>
SettingsEntry<T>::operator const T() const
{
return get();
}
template<typename T>
void SettingsEntry<T>::setup(const QString &key, ISettingsAccessor *accessor, const QVariant &defaultValue)
{
Q_ASSERT_X(accessor, Q_FUNC_INFO, "You must set a valid accessor before initializing the settings!");
_key = key;
_accessor = accessor;
_default = defaultValue;
}
}
#endif // QTMVVM_SETTINGSENTRY_H

8
tools/settingsgenerator/main.cpp

@ -0,0 +1,8 @@
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}

69
tools/settingsgenerator/qsettingsgenerator.xsd

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Type definitions -->
<xs:complexType name="Include">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute default="false" name="local" type="xs:boolean" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Param">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="key" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute default="false" name="asStr" type="xs:boolean" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Backend">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="Param" type="Param"/>
</xs:sequence>
<xs:attribute name="class" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="Node">
<xs:sequence>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="Node" type="Node"/>
<xs:element name="Entry" type="Entry"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="key" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="Entry">
<xs:complexContent>
<xs:extension base="Node">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="Code" type="xs:string"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="qmlGroupKey" type="xs:string" use="optional"/>
<xs:attribute name="default" type="xs:string" use="optional"/>
<xs:attribute default="false" name="tr" type="xs:boolean" use="optional"/>
<xs:attribute name="trcontext" type="xs:string" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Settings">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="Include" type="Include"/>
<xs:element maxOccurs="1" minOccurs="0" name="Backend" type="Backend"/>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="Node" type="Node"/>
<xs:element name="Entry" type="Entry"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="optional"/>
</xs:complexType>
<!-- root elements-->
<xs:element name="Settings" type="Settings"/>
</xs:schema>

31
tools/settingsgenerator/settingsgenerator.pro

@ -0,0 +1,31 @@
option(host_build)
QT = core
TARGET = qsettingsgenerator
VERSION = $$MODULE_VERSION
COMPANY = Skycoder42
BUNDLE_PREFIX = de.skycoder42
DEFINES += BUILD_QSETTINGSGENERATOR
DEFINES += "TARGET=\\\"$$TARGET\\\""
DEFINES += "VERSION=\\\"$$VERSION\\\""
DEFINES += "COMPANY=\\\"$$COMPANY\\\""
DEFINES += "BUNDLE_PREFIX=\\\"$$BUNDLE_PREFIX\\\""
HEADERS +=
SOURCES += \
main.cpp
load(qt_tool)
win32 {
QMAKE_TARGET_PRODUCT = "Qt Settings Builder"
QMAKE_TARGET_COMPANY = $$COMPANY
QMAKE_TARGET_COPYRIGHT = "Felix Barz"
} else:mac {
QMAKE_TARGET_BUNDLE_PREFIX = $${BUNDLE_PREFIX}.
}
DISTFILES += qsettingsgenerator.xsd

9
tools/tools.pro

@ -0,0 +1,9 @@
TEMPLATE = subdirs
SUBDIRS += \
settingsgenerator
settingsgenerator.CONFIG += no_lrelease_target
prepareRecursiveTarget(lrelease)
QMAKE_EXTRA_TARGETS += lrelease
Loading…
Cancel
Save