From 9a0822c445e56580fb3034224191ec825ea0274a Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 13 Oct 2017 15:05:05 +0200 Subject: options/tie: change "tie" overloads Adjust usages. There are ODR issues with MSVC and it doesn't support C++17 "static inline constexpr" _variables_. Otherwise, "signal_fun" could be a variable and not a function. The usages in accela/ewma2 dialog are more verbose now but the original API was silly. --- compat/util.hpp | 6 ++++++ filter-accela/ftnoir_filter_accela_dialog.cpp | 24 ++++++++++++------------ filter-ewma2/ftnoir_filter_ewma2_dialog.cpp | 9 +++------ gui/main-window.cpp | 6 +++--- gui/mapping-window.cpp | 4 ++-- options/base-value.hpp | 14 ++++++++++++++ options/tie.cpp | 16 ++++++++-------- options/tie.hpp | 27 ++++----------------------- tracker-pt/ftnoir_tracker_pt_dialog.cpp | 17 +++++++++++++++++ 9 files changed, 69 insertions(+), 54 deletions(-) diff --git a/compat/util.hpp b/compat/util.hpp index c0d3e3fd..41c8def9 100644 --- a/compat/util.hpp +++ b/compat/util.hpp @@ -8,6 +8,7 @@ #include "macros.hpp" #include "value-templates.hpp" +#include #include #include #include @@ -80,3 +81,8 @@ inline auto clamp(const t& val, const u& min, const w& max) using tp = decltype(val + min + max); return ::util_detail::clamp, tp>::clamp_(val, min, max); } + +template +using cv_qualified = std::conditional_t>, std::decay_t, const t&>; + + diff --git a/filter-accela/ftnoir_filter_accela_dialog.cpp b/filter-accela/ftnoir_filter_accela_dialog.cpp index 519e6e0d..c504188a 100644 --- a/filter-accela/ftnoir_filter_accela_dialog.cpp +++ b/filter-accela/ftnoir_filter_accela_dialog.cpp @@ -27,18 +27,18 @@ dialog_accela::dialog_accela() tie_setting(s.pos_deadzone, ui.trans_dz_slider); tie_setting(s.rot_nonlinearity, ui.rot_nl_slider); - tie_setting(s.rot_sensitivity, ui.rot_gain, tr("%1°"), 0, 'g', 4); - tie_setting(s.pos_sensitivity, ui.trans_gain, tr("%1mm")); - tie_setting(s.ewma, ui.ewma_label, tr("%1ms")); - tie_setting(s.rot_deadzone, ui.rot_dz, tr("%1°"), 0, 'g', 4); - tie_setting(s.pos_deadzone, ui.trans_dz, tr("%1mm")); - tie_setting(s.rot_nonlinearity, ui.rot_nl, - tr("" - "

x" - "%1" - "

" - "") - ); + tie_setting(s.rot_sensitivity, ui.rot_gain, [](const slider_value& s) { return tr("%1°").arg(s, 0, 'g', 4); }); + tie_setting(s.pos_sensitivity, ui.trans_gain, [](const slider_value& s) { return tr("%1mm").arg(s, 0, 'g', 4); }); + tie_setting(s.ewma, ui.ewma_label, [](const slider_value& s) { return tr("%1ms").arg(s); }); + tie_setting(s.rot_deadzone, ui.rot_dz, [](const slider_value& s) { return tr("%1°").arg(s, 0, 'g', 4); }); + tie_setting(s.pos_deadzone, ui.trans_dz, [](const slider_value& s) { return tr("%1mm").arg(s); }); + tie_setting(s.rot_nonlinearity, ui.rot_nl, [](const slider_value& s) { + return tr("" + "

x" + "%1" + "

" + "").arg(s); + }); //#define SPLINE_ROT_DEBUG //#define SPLINE_TRANS_DEBUG diff --git a/filter-ewma2/ftnoir_filter_ewma2_dialog.cpp b/filter-ewma2/ftnoir_filter_ewma2_dialog.cpp index 55e9782e..da572ce4 100644 --- a/filter-ewma2/ftnoir_filter_ewma2_dialog.cpp +++ b/filter-ewma2/ftnoir_filter_ewma2_dialog.cpp @@ -20,16 +20,13 @@ dialog_ewma::dialog_ewma() tie_setting(s.kSmoothingScaleCurve, ui.powCurve); tie_setting(s.kSmoothingScaleCurve, ui.curve_label, - [](auto& x) { return x * 100; }, - "%1%", 0, 'f', 2); + [](auto& x) { return QStringLiteral("%1%").arg(x * 100, 0, 'f', 2); }); tie_setting(s.kMinSmoothing, ui.min_label, - [](auto& x) { return x * 100; }, - "%1%", 0, 'f', 2); + [](auto& x) { return QStringLiteral("%1%").arg(x * 100, 0, 'f', 2);}); tie_setting(s.kMaxSmoothing, ui.max_label, - [](auto& x) { return x * 100; }, - "%1%", 0, 'f', 2); + [](auto& x) { return QStringLiteral("%1%").arg(x * 100, 0, 'f', 2);}); connect(ui.minSmooth, &QSlider::valueChanged, this, [&](int v) -> void { if (ui.maxSmooth->value() < v) ui.maxSmooth->setValue(v); }); diff --git a/gui/main-window.cpp b/gui/main-window.cpp index 51e22861..6a7be89f 100644 --- a/gui/main-window.cpp +++ b/gui/main-window.cpp @@ -115,17 +115,17 @@ MainWindow::MainWindow() : // dylibs { connect(&m.tracker_dll, - static_cast(&base_value::valueChanged), + base_value::signal_fun(), this, [&](const QString&) { if (pTrackerDialog) pTrackerDialog = nullptr; save_modules(); }); connect(&m.protocol_dll, - static_cast(&base_value::valueChanged), + base_value::signal_fun(), this, [&](const QString&) { if (pProtocolDialog) pProtocolDialog = nullptr; save_modules(); }); connect(&m.filter_dll, - static_cast(&base_value::valueChanged), + base_value::signal_fun(), this, [&](const QString&) { if (pFilterDialog) pFilterDialog = nullptr; save_modules(); }); } diff --git a/gui/mapping-window.cpp b/gui/mapping-window.cpp index 0d2c9fbb..127929fe 100644 --- a/gui/mapping-window.cpp +++ b/gui/mapping-window.cpp @@ -109,14 +109,14 @@ void MapWidget::load() if (altp) { connect(&axis.opts.altp, - static_cast(&base_value::valueChanged), + base_value::signal_fun(), this, [&](bool f) -> void {qfc.setEnabled(f); qfc.force_redraw();}); qfc.setEnabled(axis.opts.altp); qfc.force_redraw(); } - connect(&axis.opts.clamp, static_cast(&base_value::valueChanged), + connect(&axis.opts.clamp, base_value::signal_fun(), &qfc, [i, &conf, &qfc](int value) { conf.set_max_input(value); qfc.reload_spline(); diff --git a/options/base-value.hpp b/options/base-value.hpp index 4f90e3fc..5106908d 100644 --- a/options/base-value.hpp +++ b/options/base-value.hpp @@ -22,13 +22,25 @@ 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); @@ -80,6 +92,8 @@ public slots: 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 diff --git a/options/tie.cpp b/options/tie.cpp index 3cb32319..162a0f56 100644 --- a/options/tie.cpp +++ b/options/tie.cpp @@ -22,8 +22,8 @@ OTR_OPTIONS_EXPORT void tie_setting(value& v, QComboBox* cb) { cb->setCurrentText(v); v = cb->currentText(); - base_value::connect(cb, SIGNAL(currentTextChanged(QString)), &v, SLOT(setValue(QString)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(QString)), cb, SLOT(setCurrentText(QString)), v.SAFE_CONNTYPE); + 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); } OTR_OPTIONS_EXPORT void tie_setting(value& v, QComboBox* cb) @@ -55,7 +55,7 @@ OTR_OPTIONS_EXPORT void tie_setting(value& v, QComboBox* cb) &v, [cb, &v](int idx) { v = cb->itemData(idx); }, v.DIRECT_CONNTYPE); - base_value::connect(&v, static_cast(&base_value::valueChanged), + base_value::connect(&v, base_value::signal_fun(), cb, [cb, set_idx](const QVariant& var) { run_in_thread_sync(cb, [&]() { @@ -91,21 +91,21 @@ OTR_OPTIONS_EXPORT void tie_setting(value& v, QSlider* sl) { sl->setValue(v); v = sl->value(); - base_value::connect(sl, SIGNAL(valueChanged(int)), &v, SLOT(setValue(int)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(int)), sl, SLOT(setValue(int)), v.SAFE_CONNTYPE); + base_value::connect(sl, &QSlider::valueChanged, &v, base_value::signal_fun(), v.DIRECT_CONNTYPE); + base_value::connect(&v, base_value::signal_fun(), sl, &QSlider::setValue, v.SAFE_CONNTYPE); } OTR_OPTIONS_EXPORT void tie_setting(value& v, QLineEdit* le) { le->setText(v); base_value::connect(le, SIGNAL(textChanged(QString)), &v, SLOT(setValue(QString)), v.DIRECT_CONNTYPE); - base_value::connect(&v, SIGNAL(valueChanged(QString)),le, SLOT(setText(QString)), v.SAFE_CONNTYPE); + base_value::connect(&v, base_value::signal_fun(), le, &QLineEdit::setText, v.SAFE_CONNTYPE); } OTR_OPTIONS_EXPORT void tie_setting(value& v, QLabel* lb) { lb->setText(v); - base_value::connect(&v, SIGNAL(valueChanged(QString)), lb, SLOT(setText(QString)), v.SAFE_CONNTYPE); + base_value::connect(&v, base_value::signal_fun(), lb, &QLabel::setText, v.SAFE_CONNTYPE); } OTR_OPTIONS_EXPORT void tie_setting(value& v, QTabWidget* t) @@ -141,7 +141,7 @@ OTR_OPTIONS_EXPORT void tie_setting(value& v, QSlider* w) v.DIRECT_CONNTYPE); base_value::connect(&v, - static_cast(&base_value::valueChanged), + base_value::signal_fun(), w, [=, &v](double) { run_in_thread_sync(w, [=, &v]() diff --git a/options/tie.hpp b/options/tie.hpp index 92e98680..0a4ace74 100644 --- a/options/tie.hpp +++ b/options/tie.hpp @@ -52,36 +52,17 @@ tie_setting(value& v, QComboBox* cb) v.SAFE_CONNTYPE); } -template -void tie_setting(value& v, QLabel* lb, const QString& format, const xs&... args) +template +void tie_setting(value& v, QLabel* lb, F&& fun) { - auto closure = [=](const t& x) { lb->setText(format.arg(x, args...)); }; + auto closure = [=](cv_qualified x) { lb->setText(fun(x)); }; closure(v()); - base_value::connect(&v, static_cast(&base_value::valueChanged), + base_value::connect(&v, base_value::signal_fun(), lb, closure, v.SAFE_CONNTYPE); } -template -decltype((void)((std::declval())(std::declval()))) -tie_setting(value& v, QLabel* lb, F&& fun, const QString& fmt, const xs&... args) -{ - auto closure = [=](const t& x) { lb->setText(fmt.arg(fun(x), args...)); }; - - closure(v()); - base_value::connect(&v, static_cast(&base_value::valueChanged), - lb, closure, - v.SAFE_CONNTYPE); -} - -template -decltype((void)((std::declval())(std::declval()))) -tie_setting(value& v, QLabel* lb, F&& fun) -{ - tie_setting(v, lb, fun, QStringLiteral("%1")); -} - OTR_OPTIONS_EXPORT void tie_setting(value& v, QComboBox* cb); OTR_OPTIONS_EXPORT void tie_setting(value& v, QComboBox* cb); OTR_OPTIONS_EXPORT void tie_setting(value& v, QComboBox* cb); diff --git a/tracker-pt/ftnoir_tracker_pt_dialog.cpp b/tracker-pt/ftnoir_tracker_pt_dialog.cpp index 6b31ac8a..a4b8c668 100644 --- a/tracker-pt/ftnoir_tracker_pt_dialog.cpp +++ b/tracker-pt/ftnoir_tracker_pt_dialog.cpp @@ -93,6 +93,23 @@ TrackerDialog_PT::TrackerDialog_PT() ui.blob_color->setItemData(k, int(color_types[k])); tie_setting(s.blob_color, ui.blob_color); + + tie_setting(s.threshold, ui.threshold_value_display, [this](int x) { + if (!s.auto_threshold) + return tr("Brightness %1/255").arg(x); + else + { + CamInfo info; + int w = 640, h = 480; + + if (tracker && tracker->get_cam_info(&info) && info.res_x * info.res_y != 0) + w = info.res_x, h = info.res_y; + + double value = PointExtractor::threshold_radius_value(w, h, x); + + return tr("LED radius %1 pixels").arg(value, 0, 'f', 2); + } + }); } void TrackerDialog_PT::startstop_trans_calib(bool start) -- cgit v1.2.3