]> sigrok.org Git - pulseview.git/blobdiff - pv/widgets/sweeptimingwidget.cpp
Fix clazy warnings regarding range-for references
[pulseview.git] / pv / widgets / sweeptimingwidget.cpp
index 9bb75c869a8f780c52e3e6590e2a54ebad94931e..12f5969eb707c9997c212e1d39f838541c1f5588 100644 (file)
  * 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 <http://www.gnu.org/licenses/>.
  */
 
-#include "sweeptimingwidget.h"
+#include "sweeptimingwidget.hpp"
 
+#include <cassert>
+#include <cstdlib>
 #include <vector>
 
-#include <assert.h>
-
 #include <extdef.h>
 
+using std::abs;
 using std::vector;
 
 namespace pv {
@@ -34,34 +34,43 @@ 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(&list_, SIGNAL(editTextChanged(const QString&)),
                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::allow_user_entered_values(bool value)
+{
+       list_.setEditable(value);
+}
+
 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 +79,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,36 +145,53 @@ 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(
-                       index).value<uint64_t>() : 0;
+               if (list_.isEditable()) {
+                       uint64_t value;
+                       sr_parse_sizestring(list_.currentText().toUtf8().data(), &value);
+                       return value;
+               }
+
+               const int index = list_.currentIndex();
+               return (index >= 0) ? list_.itemData(index).value<uint64_t>() : 0;
        }
-
        default:
                // Unexpected value type
-               assert(0);
+               assert(false);
                return 0;
        }
 }
 
 void SweepTimingWidget::set_value(uint64_t value)
 {
-       _value.setValue(value);
+       value_.setValue(value);
 
-       for (int i = 0; i < _list.count(); i++)
-               if (value == _list.itemData(i).value<uint64_t>())
-                       _list.setCurrentIndex(i);
+       if (list_.isEditable()) {
+               char *const s = sr_si_string_u64(value, suffix_);
+               list_.lineEdit()->setText(QString::fromUtf8(s));
+               g_free(s);
+       } else {
+               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<int64_t>());
+                       if (this_variance < best_variance) {
+                               best_variance = this_variance;
+                               best_match = i;
+                       }
+               }
+
+               list_.setCurrentIndex(best_match);
+       }
 }
 
-} // widgets
-} // pv
+}  // namespace widgets
+}  // namespace pv