diff options
| -rw-r--r-- | options/tie.cpp | 40 | ||||
| -rw-r--r-- | options/tie.hpp | 1 | ||||
| -rw-r--r-- | options/value.hpp | 7 | 
3 files changed, 46 insertions, 2 deletions
| diff --git a/options/tie.cpp b/options/tie.cpp index 7a78237f..ce0e5a35 100644 --- a/options/tie.cpp +++ b/options/tie.cpp @@ -26,6 +26,44 @@ OTR_OPTIONS_EXPORT void tie_setting(value<QString>& v, QComboBox* cb)      base_value::connect(&v, SIGNAL(valueChanged(QString)), cb, SLOT(setCurrentText(QString)), v.SAFE_CONNTYPE);  } +OTR_OPTIONS_EXPORT void tie_setting(value<QVariant>& v, QComboBox* cb) +{ +    auto set_idx = [cb](const QVariant& var) { +        const int sz = cb->count(); +        int idx = -1; + +        for (int k = 0; k < sz; k++) +        { +            if (cb->itemData(k) == var) +            { +                idx = k; +                break; +            } +        } +        cb->setCurrentIndex(idx); +        return idx; +    }; + +    const int idx = set_idx(v); + +    if (idx != -1) +        v = cb->itemData(idx); +    else +        v = QVariant(QVariant::Invalid); + +    base_value::connect(cb, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), +                        &v, [cb, &v](int idx) { +        v = cb->itemData(idx); +    }, v.DIRECT_CONNTYPE); +    base_value::connect(&v, static_cast<void(base_value::*)(const QVariant&) const>(&base_value::valueChanged), +                        cb, +                        [cb, set_idx](const QVariant& var) { +        run_in_thread_sync(cb, [&]() { +            set_idx(var); +        }); +    }, v.DIRECT_CONNTYPE); +} +  OTR_OPTIONS_EXPORT void tie_setting(value<bool>& v, QCheckBox* cb)  {      cb->setChecked(v); @@ -116,6 +154,4 @@ OTR_OPTIONS_EXPORT void tie_setting(value<slider_value>& v, QSlider* w)      v.DIRECT_CONNTYPE);  } - -  } // ns options diff --git a/options/tie.hpp b/options/tie.hpp index 1745438f..93004e0f 100644 --- a/options/tie.hpp +++ b/options/tie.hpp @@ -49,6 +49,7 @@ tie_setting(value<t>& v, QComboBox* cb)  OTR_OPTIONS_EXPORT void tie_setting(value<int>& v, QComboBox* cb);  OTR_OPTIONS_EXPORT void tie_setting(value<QString>& v, QComboBox* cb); +OTR_OPTIONS_EXPORT void tie_setting(value<QVariant>& v, QComboBox* cb);  OTR_OPTIONS_EXPORT void tie_setting(value<bool>& v, QCheckBox* cb);  OTR_OPTIONS_EXPORT void tie_setting(value<double>& v, QDoubleSpinBox* dsb);  OTR_OPTIONS_EXPORT void tie_setting(value<int>& v, QSpinBox* sb); diff --git a/options/value.hpp b/options/value.hpp index 4904c370..48f71d47 100644 --- a/options/value.hpp +++ b/options/value.hpp @@ -55,6 +55,7 @@ signals:      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<double>&);      OPENTRACK_DEFINE_SIGNAL(const QList<float>&); @@ -69,6 +70,11 @@ protected:      comparator cmp;      std::type_index type_index; +    void store(const QVariant& datum) +    { +        b->store_kv(self_name, datum); +    } +      template<typename t>      void store(const t& datum)      { @@ -82,6 +88,7 @@ public slots:      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<double>&)      OPENTRACK_DEFINE_SLOT(const QList<float>&) | 
