diff options
Diffstat (limited to 'options/tie.cpp')
-rw-r--r-- | options/tie.cpp | 109 |
1 files changed, 56 insertions, 53 deletions
diff --git a/options/tie.cpp b/options/tie.cpp index baa8bb82..adf26b53 100644 --- a/options/tie.cpp +++ b/options/tie.cpp @@ -8,39 +8,45 @@ #include "tie.hpp" #include "compat/run-in-thread.hpp" +#include "compat/macros.h" + +#include "value-traits.hpp" + +#include <cmath> namespace options { -OTR_OPTIONS_EXPORT void tie_setting(value<int>& v, QComboBox* cb) +void tie_setting(value<int>& v, QComboBox* cb) { cb->setCurrentIndex(v); v = cb->currentIndex(); - base_value::connect(cb, SIGNAL(currentIndexChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), cb, SLOT(setCurrentIndex(int)), v.SAFE_CONNTYPE); + value_::connect(cb, SIGNAL(currentIndexChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); + value_::connect(&v, SIGNAL(valueChanged(int)), cb, SLOT(setCurrentIndex(int)), v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<QString>& v, QComboBox* cb) +void tie_setting(value<QString>& v, QComboBox* cb) { cb->setCurrentText(v); v = cb->currentText(); - base_value::connect(cb, SIGNAL(currentTextChanged(QString)), &v, SLOT(setValue(const QString&)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(const QString&)), cb, SLOT(setCurrentText(const QString&)), v.SAFE_CONNTYPE); + auto set_current_text = [cb, &v](const QString& str) { + cb->setCurrentText(str); + v = cb->currentText(); + }; + value_::connect(cb, &QComboBox::currentTextChanged, &v, v.value_changed<QString>(), v.DIRECT_CONNTYPE); + value_::connect(&v, v.value_changed<QString>(), cb, set_current_text, v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<QVariant>& v, QComboBox* cb) +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) - { + if (cb->itemData(k) == var) { idx = k; break; } - } cb->setCurrentIndex(idx); return idx; }; @@ -50,65 +56,65 @@ OTR_OPTIONS_EXPORT void tie_setting(value<QVariant>& v, QComboBox* cb) 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, base_value::value_changed<QVariant>(), - cb, - [cb, set_idx](const QVariant& var) { - run_in_thread_sync(cb, [&]() { - set_idx(var); - }); - }, v.DIRECT_CONNTYPE); + v = {}; + + value_::connect(cb, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + &v, [cb, &v](int idx) { v = cb->itemData(idx); }, + v.DIRECT_CONNTYPE); + value_::connect(&v, value_::value_changed<QVariant>(), + cb, [set_idx](const QVariant& var) { set_idx(var); }, + v.SAFE_CONNTYPE); } -// XXX TODO need variant with setEnabled based on lambda retval -- sh 20170524 +void tie_setting(value<bool>& v, QRadioButton* cb) +{ + cb->setChecked(v); + value_::connect(cb, SIGNAL(toggled(bool)), &v, SLOT(setValue(bool)), v.DIRECT_CONNTYPE); + value_::connect(&v, SIGNAL(valueChanged(bool)), cb, SLOT(setChecked(bool)), v.SAFE_CONNTYPE); +} -OTR_OPTIONS_EXPORT void tie_setting(value<bool>& v, QCheckBox* cb) +void tie_setting(value<bool>& v, QCheckBox* cb) { cb->setChecked(v); - base_value::connect(cb, SIGNAL(toggled(bool)), &v, SLOT(setValue(bool)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(bool)), cb, SLOT(setChecked(bool)), v.SAFE_CONNTYPE); + value_::connect(cb, SIGNAL(toggled(bool)), &v, SLOT(setValue(bool)), v.DIRECT_CONNTYPE); + value_::connect(&v, SIGNAL(valueChanged(bool)), cb, SLOT(setChecked(bool)), v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<double>& v, QDoubleSpinBox* dsb) +void tie_setting(value<double>& v, QDoubleSpinBox* dsb) { dsb->setValue(v); - base_value::connect(dsb, SIGNAL(valueChanged(double)), &v, SLOT(setValue(double)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(double)), dsb, SLOT(setValue(double)), v.SAFE_CONNTYPE); + value_::connect(dsb, SIGNAL(valueChanged(double)), &v, SLOT(setValue(double)), v.DIRECT_CONNTYPE); + value_::connect(&v, SIGNAL(valueChanged(double)), dsb, SLOT(setValue(double)), v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<int>& v, QSpinBox* sb) +void tie_setting(value<int>& v, QSpinBox* sb) { sb->setValue(v); - base_value::connect(sb, SIGNAL(valueChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), sb, SLOT(setValue(int)), v.SAFE_CONNTYPE); + value_::connect(sb, SIGNAL(valueChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); + value_::connect(&v, SIGNAL(valueChanged(int)), sb, SLOT(setValue(int)), v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<QString>& v, QLineEdit* le) +void tie_setting(value<QString>& v, QLineEdit* le) { le->setText(v); - base_value::connect(le, SIGNAL(textChanged(QString)), &v, SLOT(setValue(QString)), v.DIRECT_CONNTYPE); - base_value::connect(&v, base_value::value_changed<QString>(), le, &QLineEdit::setText, v.SAFE_CONNTYPE); + value_::connect(le, SIGNAL(textChanged(QString)), &v, SLOT(setValue(QString)), v.DIRECT_CONNTYPE); + value_::connect(&v, value_::value_changed<QString>(), le, &QLineEdit::setText, v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<QString>& v, QLabel* lb) +void tie_setting(value<QString>& v, QLabel* lb) { lb->setText(v); - base_value::connect(&v, base_value::value_changed<QString>(), lb, &QLabel::setText, v.SAFE_CONNTYPE); + value_::connect(&v, value_::value_changed<QString>(), lb, &QLabel::setText, v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<int>& v, QTabWidget* t) +void tie_setting(value<int>& v, QTabWidget* t) { t->setCurrentIndex(v); - base_value::connect(t, SIGNAL(currentChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), t, SLOT(setCurrentIndex(int)), v.SAFE_CONNTYPE); + value_::connect(t, SIGNAL(currentChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); + value_::connect(&v, SIGNAL(valueChanged(int)), t, SLOT(setCurrentIndex(int)), v.SAFE_CONNTYPE); } -OTR_OPTIONS_EXPORT void tie_setting(value<slider_value>& v, QSlider* w) +void tie_setting(value<slider_value>& v, QSlider* w) { { const int q_min = w->minimum(); @@ -118,10 +124,7 @@ OTR_OPTIONS_EXPORT void tie_setting(value<slider_value>& v, QSlider* w) v = v().update_from_slider(w->value(), q_min, q_max); } - base_value::connect(w, - &QSlider::valueChanged, - &v, - [=, &v](int pos) + value_::connect(w, &QSlider::valueChanged, &v, [=, &v](int pos) { run_in_thread_sync(w, [&]() { @@ -133,17 +136,17 @@ OTR_OPTIONS_EXPORT void tie_setting(value<slider_value>& v, QSlider* w) }, v.DIRECT_CONNTYPE); - base_value::connect(&v, - base_value::value_changed<slider_value>(), - w, - [=, &v](double) { + value_::connect(&v, + value_::value_changed<slider_value>(), + w, + [=, &v](double) { run_in_thread_sync(w, [=, &v]() { const int q_min = w->minimum(); const int q_max = w->maximum(); - const int pos = v().to_slider_pos(q_min, q_max); + const int pos = v->to_slider_pos(q_min, q_max); + v = v->update_from_slider(pos, q_min, q_max); w->setValue(pos); - v = v().update_from_slider(w->value(), q_min, q_max); }); }, v.DIRECT_CONNTYPE); |