X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fwidgets%2Fsweeptimingwidget.cpp;h=d768620248003b14662a82d3f4dbde0ae5ba04a2;hp=9bb75c869a8f780c52e3e6590e2a54ebad94931e;hb=c063290ac7189bdd15221450f598504f43286b43;hpb=67d163940f97cd03137ddee93dd5aa115d0f4a5c diff --git a/pv/widgets/sweeptimingwidget.cpp b/pv/widgets/sweeptimingwidget.cpp index 9bb75c86..d7686202 100644 --- a/pv/widgets/sweeptimingwidget.cpp +++ b/pv/widgets/sweeptimingwidget.cpp @@ -14,18 +14,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ -#include "sweeptimingwidget.h" +#include "sweeptimingwidget.hpp" +#include #include - -#include +#include #include +using std::abs; using std::vector; namespace pv { @@ -34,34 +34,35 @@ namespace widgets { SweepTimingWidget::SweepTimingWidget(const char *suffix, QWidget *parent) : QWidget(parent), - _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, @@ -70,30 +71,28 @@ 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_samplerate_string(vals[i]); - _list.addItem(QString::fromUtf8(s), - qVariantFromValue(vals[i])); + 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) @@ -138,35 +137,41 @@ 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; } - default: // Unexpected value type - assert(0); + assert(false); return 0; } } 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