2 * This file is part of the PulseView project.
4 * Copyright (C) 2013 Joel Holdsworth <joel@airwebreathe.org.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #include "sweeptimingwidget.hpp"
34 SweepTimingWidget::SweepTimingWidget(const char *suffix
,
43 setContentsMargins(0, 0, 0, 0);
45 value_
.setDecimals(0);
46 value_
.setSuffix(QString::fromUtf8(suffix
));
48 connect(&list_
, SIGNAL(currentIndexChanged(int)),
49 this, SIGNAL(value_changed()));
50 connect(&list_
, SIGNAL(editTextChanged(const QString
&)),
51 this, SIGNAL(value_changed()));
53 connect(&value_
, SIGNAL(editingFinished()),
54 this, SIGNAL(value_changed()));
58 layout_
.addWidget(&list_
);
59 layout_
.addWidget(&value_
);
64 void SweepTimingWidget::allow_user_entered_values(bool value
)
66 list_
.setEditable(value
);
69 void SweepTimingWidget::show_none()
76 void SweepTimingWidget::show_min_max_step(uint64_t min
, uint64_t max
,
82 value_type_
= MinMaxStep
;
84 value_
.setRange(min
, max
);
85 value_
.setSingleStep(step
);
91 void SweepTimingWidget::show_list(const uint64_t *vals
, size_t count
)
96 for (size_t i
= 0; i
< count
; i
++) {
97 char *const s
= sr_si_string_u64(vals
[i
], suffix_
);
98 list_
.addItem(QString::fromUtf8(s
), QVariant::fromValue(vals
[i
]));
106 void SweepTimingWidget::show_125_list(uint64_t min
, uint64_t max
)
110 // Create a 1-2-5-10 list of entries.
111 const unsigned int FineScales
[] = {1, 2, 5};
112 uint64_t value
, decade
;
114 vector
<uint64_t> values
;
116 // Compute the starting decade
117 for (decade
= 1; decade
* 10 <= min
; decade
*= 10);
119 // Compute the first entry
120 for (fine
= 0; fine
< countof(FineScales
); fine
++)
121 if (FineScales
[fine
] * decade
>= min
)
124 assert(fine
< countof(FineScales
));
126 // Add the minimum entry if it's not on the 1-2-5 progression
127 if (min
!= FineScales
[fine
] * decade
)
128 values
.push_back(min
);
130 while ((value
= FineScales
[fine
] * decade
) < max
) {
131 values
.push_back(value
);
132 if (++fine
>= countof(FineScales
))
133 fine
= 0, decade
*= 10;
137 values
.push_back(max
);
139 // Make a C array, and give it to the sweep timing widget
140 uint64_t *const values_array
= new uint64_t[values
.size()];
141 copy(values
.begin(), values
.end(), values_array
);
142 show_list(values_array
, values
.size());
143 delete[] values_array
;
146 uint64_t SweepTimingWidget::value() const
148 switch (value_type_
) {
152 return (uint64_t)value_
.value();
155 if (list_
.isEditable()) {
157 sr_parse_sizestring(list_
.currentText().toUtf8().data(), &value
);
161 const int index
= list_
.currentIndex();
162 return (index
>= 0) ? list_
.itemData(index
).value
<uint64_t>() : 0;
165 // Unexpected value type
171 void SweepTimingWidget::set_value(uint64_t value
)
173 value_
.setValue(value
);
175 if (list_
.isEditable()) {
176 char *const s
= sr_si_string_u64(value
, suffix_
);
177 list_
.lineEdit()->setText(QString::fromUtf8(s
));
180 int best_match
= list_
.count() - 1;
181 int64_t best_variance
= INT64_MAX
;
183 for (int i
= 0; i
< list_
.count(); i
++) {
184 const int64_t this_variance
= abs(
185 (int64_t)value
- list_
.itemData(i
).value
<int64_t>());
186 if (this_variance
< best_variance
) {
187 best_variance
= this_variance
;
192 list_
.setCurrentIndex(best_match
);
196 } // namespace widgets