X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fwidgets%2Fsweeptimingwidget.cpp;h=ec404c36c96f4f251c9dcc9e5034720c907ff231;hp=ee37d8d98d55d2b2cbe879c0399a864f5dec130f;hb=7e0c99bf95836c89574b53ae3fa7840e2ddca77d;hpb=b0ddc6bcc68bf8414021838515acd0decd3f0a77 diff --git a/pv/widgets/sweeptimingwidget.cpp b/pv/widgets/sweeptimingwidget.cpp index ee37d8d9..ec404c36 100644 --- a/pv/widgets/sweeptimingwidget.cpp +++ b/pv/widgets/sweeptimingwidget.cpp @@ -18,7 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "sweeptimingwidget.h" +#include "sweeptimingwidget.hpp" + +#include #include @@ -26,6 +28,7 @@ #include +using std::abs; using std::vector; namespace pv { @@ -34,35 +37,35 @@ namespace widgets { SweepTimingWidget::SweepTimingWidget(const char *suffix, QWidget *parent) : QWidget(parent), - _suffix(suffix), - _layout(this), - _value(this), - _list(this), - _value_type(None) + suffix_(suffix), + layout_(this), + value_(this), + list_(this), + value_type_(None) { setContentsMargins(0, 0, 0, 0); - _value.setDecimals(0); - _value.setSuffix(QString::fromUtf8(suffix)); + value_.setDecimals(0); + value_.setSuffix(QString::fromUtf8(suffix)); - connect(&_list, SIGNAL(currentIndexChanged(int)), + connect(&list_, SIGNAL(currentIndexChanged(int)), this, SIGNAL(value_changed())); - connect(&_value, SIGNAL(editingFinished()), + connect(&value_, SIGNAL(editingFinished()), this, SIGNAL(value_changed())); - setLayout(&_layout); - _layout.setMargin(0); - _layout.addWidget(&_list); - _layout.addWidget(&_value); + setLayout(&layout_); + layout_.setMargin(0); + layout_.addWidget(&list_); + layout_.addWidget(&value_); show_none(); } void SweepTimingWidget::show_none() { - _value_type = None; - _value.hide(); - _list.hide(); + value_type_ = None; + value_.hide(); + list_.hide(); } void SweepTimingWidget::show_min_max_step(uint64_t min, uint64_t max, @@ -71,30 +74,29 @@ void SweepTimingWidget::show_min_max_step(uint64_t min, uint64_t max, assert(max > min); assert(step > 0); - _value_type = MinMaxStep; + value_type_ = MinMaxStep; - _value.setRange(min, max); - _value.setSingleStep(step); + value_.setRange(min, max); + value_.setSingleStep(step); - _value.show(); - _list.hide(); + value_.show(); + list_.hide(); } void SweepTimingWidget::show_list(const uint64_t *vals, size_t count) { - _value_type = List; + value_type_ = List; - _list.clear(); - for (size_t i = 0; i < count; i++) - { - char *const s = sr_si_string_u64(vals[i], _suffix); - _list.addItem(QString::fromUtf8(s), + list_.clear(); + for (size_t i = 0; i < count; i++) { + char *const s = sr_si_string_u64(vals[i], suffix_); + list_.addItem(QString::fromUtf8(s), qVariantFromValue(vals[i])); g_free(s); } - _value.hide(); - _list.show(); + value_.hide(); + list_.show(); } void SweepTimingWidget::show_125_list(uint64_t min, uint64_t max) @@ -139,18 +141,17 @@ void SweepTimingWidget::show_125_list(uint64_t min, uint64_t max) uint64_t SweepTimingWidget::value() const { - switch(_value_type) - { + switch(value_type_) { case None: return 0; case MinMaxStep: - return (uint64_t)_value.value(); + return (uint64_t)value_.value(); case List: { - const int index = _list.currentIndex(); - return (index >= 0) ? _list.itemData( + const int index = list_.currentIndex(); + return (index >= 0) ? list_.itemData( index).value() : 0; } @@ -163,11 +164,21 @@ uint64_t SweepTimingWidget::value() const void SweepTimingWidget::set_value(uint64_t value) { - _value.setValue(value); + value_.setValue(value); + + int best_match = list_.count() - 1; + int64_t best_variance = INT64_MAX; + + for (int i = 0; i < list_.count(); i++) { + const int64_t this_variance = abs( + (int64_t)value - list_.itemData(i).value()); + if (this_variance < best_variance) { + best_variance = this_variance; + best_match = i; + } + } - for (int i = 0; i < _list.count(); i++) - if (value == _list.itemData(i).value()) - _list.setCurrentIndex(i); + list_.setCurrentIndex(best_match); } } // widgets