#pragma once #include "bundle.hpp" #include "slider.hpp" #include "connector.hpp" #include "export.hpp" #include #include #include #include #include #include #define OPENTRACK_DEFINE_SLOT(t) void setValue(t datum) { store(datum); } #define OPENTRACK_DEFINE_SIGNAL(t) void valueChanged(t) const namespace options { class OTR_OPTIONS_EXPORT base_value : public QObject { Q_OBJECT friend class detail::connector; using comparator = bool(*)(const QVariant& val1, const QVariant& val2); template using signal_sig = void(base_value::*)(cv_qualified) const; public: QString name() const { return self_name; } base_value(bundle b, const QString& name, comparator cmp, std::type_index type_idx); ~base_value() override; // MSVC has ODR problems in 15.4 // no C++17 "constexpr inline" for data declarations in MSVC template constexpr static auto signal_fun() { return static_cast>(&base_value::valueChanged); } signals: OPENTRACK_DEFINE_SIGNAL(double); OPENTRACK_DEFINE_SIGNAL(float); OPENTRACK_DEFINE_SIGNAL(int); OPENTRACK_DEFINE_SIGNAL(bool); OPENTRACK_DEFINE_SIGNAL(const QString&); OPENTRACK_DEFINE_SIGNAL(const slider_value&); OPENTRACK_DEFINE_SIGNAL(const QPointF&); OPENTRACK_DEFINE_SIGNAL(const QVariant&); OPENTRACK_DEFINE_SIGNAL(const QList&); OPENTRACK_DEFINE_SIGNAL(const QList&); OPENTRACK_DEFINE_SIGNAL(const QList&); OPENTRACK_DEFINE_SIGNAL(const QList&); OPENTRACK_DEFINE_SIGNAL(const QList&); OPENTRACK_DEFINE_SIGNAL(const QList&); OPENTRACK_DEFINE_SIGNAL(const QList&); protected: bundle b; QString self_name; comparator cmp; std::type_index type_index; void store(const QVariant& datum); template void store(const t& datum) { b->store_kv(self_name, QVariant::fromValue(datum)); } public slots: OPENTRACK_DEFINE_SLOT(double) OPENTRACK_DEFINE_SLOT(int) OPENTRACK_DEFINE_SLOT(bool) OPENTRACK_DEFINE_SLOT(const QString&) OPENTRACK_DEFINE_SLOT(const slider_value&) OPENTRACK_DEFINE_SLOT(const QPointF&) OPENTRACK_DEFINE_SLOT(const QVariant&) OPENTRACK_DEFINE_SLOT(const QList&) OPENTRACK_DEFINE_SLOT(const QList&) OPENTRACK_DEFINE_SLOT(const QList&) OPENTRACK_DEFINE_SLOT(const QList&) OPENTRACK_DEFINE_SLOT(const QList&) OPENTRACK_DEFINE_SLOT(const QList&) OPENTRACK_DEFINE_SLOT(const QList&) virtual void reload() = 0; virtual void bundle_value_changed() const = 0; virtual void set_to_default() = 0; friend void ::options::detail::set_base_value_to_default(base_value* val); }; } //ns options