#pragma once #include "bundle.hpp" #include "slider.hpp" #include "connector.hpp" #include "metatype.hpp" #include "export.hpp" #include "compat/macros.hpp" #include "value-traits.hpp" #include #include #include #include #include #include #define OTR_OPTIONS_SLOT(t) void setValue(t datum) noexcept { store_(datum); } #define OTR_OPTIONS_SIGNAL(t) void valueChanged(t) const namespace options { class OTR_OPTIONS_EXPORT value_ : public QObject { Q_OBJECT template using signal_sig = void(value_::*)(cv_qualified) const; public: QString name() const { return self_name; } value_(bundle const& b, const QString& name) noexcept; ~value_() override; // no C++17 "constexpr inline" for data declarations in MSVC template static constexpr auto value_changed() { return static_cast>(&value_::valueChanged); } signals: OTR_OPTIONS_SIGNAL(double); OTR_OPTIONS_SIGNAL(float); OTR_OPTIONS_SIGNAL(int); OTR_OPTIONS_SIGNAL(bool); OTR_OPTIONS_SIGNAL(const QString&); OTR_OPTIONS_SIGNAL(const slider_value&); OTR_OPTIONS_SIGNAL(const QPointF&); OTR_OPTIONS_SIGNAL(const QVariant&); OTR_OPTIONS_SIGNAL(const QList&); OTR_OPTIONS_SIGNAL(const QList&); OTR_OPTIONS_SIGNAL(const QList&); OTR_OPTIONS_SIGNAL(const QList&); OTR_OPTIONS_SIGNAL(const QList&); OTR_OPTIONS_SIGNAL(const QList&); OTR_OPTIONS_SIGNAL(const QList&); protected: bundle b; QString self_name; virtual void store_variant(QVariant&&) noexcept = 0; virtual void store_variant(const QVariant&) noexcept = 0; template void store_(const t& datum) { using traits = detail::value_traits; store_variant(traits::qvariant_from_value(datum)); } public slots: OTR_OPTIONS_SLOT(double) OTR_OPTIONS_SLOT(int) OTR_OPTIONS_SLOT(bool) OTR_OPTIONS_SLOT(const QString&) OTR_OPTIONS_SLOT(const slider_value&) OTR_OPTIONS_SLOT(const QPointF&) OTR_OPTIONS_SLOT(const QVariant&) OTR_OPTIONS_SLOT(const QList&) OTR_OPTIONS_SLOT(const QList&) OTR_OPTIONS_SLOT(const QList&) OTR_OPTIONS_SLOT(const QList&) OTR_OPTIONS_SLOT(const QList&) OTR_OPTIONS_SLOT(const QList&) OTR_OPTIONS_SLOT(const QList&) virtual void set_to_default() noexcept = 0; virtual void notify() const = 0; virtual QVariant get_variant() const noexcept = 0; }; } //ns options