28 #include <QHBoxLayout> 32 #include <libsigrokcxx/libsigrokcxx.hpp> 39 using std::numeric_limits;
47 vector<pair<Glib::VariantBase, QString> > values,
49 Property(name, desc, getter, setter),
53 slider_layout_widget_(nullptr),
55 slider_label_(nullptr)
60 vector<double> deltas;
61 double prev_value = 0;
63 for (
const pair<Glib::VariantBase, QString> &v :
values_) {
65 if (v.first.is_of_type(Glib::VariantType(
"d"))) {
66 g_variant_get((GVariant*)(v.first.gobj()),
"d", &value);
67 }
else if (v.first.is_of_type(Glib::VariantType(
"(dd)"))) {
69 g_variant_get((GVariant*)(v.first.gobj()),
"(dd)", &value, &dummy);
72 deltas.push_back(value - prev_value);
76 if (deltas.size() > 0) {
77 bool constant_delta =
true;
78 double prev_delta = numeric_limits<double>::quiet_NaN();
80 bool skip_first =
true;
81 for (
double delta : deltas) {
88 if (std::isnan(prev_delta))
92 if (abs(delta - prev_delta) > (delta/10))
93 constant_delta =
false;
108 Glib::VariantBase variant;
112 }
catch (
const sigrok::Error &
e) {
113 qWarning() << tr(
"Querying config key %1 resulted in %2").arg(
name_, e.what());
128 slider_->setOrientation(Qt::Horizontal);
143 connect(
slider_, SIGNAL(valueChanged(
int)),
154 for (
unsigned int i = 0; i <
values_.size(); i++) {
155 const pair<Glib::VariantBase, QString> &v =
values_[i];
156 selector_->addItem(v.second, QVariant::fromValue(v.first));
162 connect(
selector_, SIGNAL(currentIndexChanged(
int)),
171 Glib::VariantBase variant;
175 }
catch (
const sigrok::Error &
e) {
176 qWarning() << tr(
"Querying config key %1 resulted in %2").arg(
name_, e.what());
180 assert(variant.gobj());
188 for (
unsigned int i = 0; i <
values_.size(); i++) {
189 const pair<Glib::VariantBase, QString> &v =
values_[i];
192 if (v.first.is_of_type(Glib::VariantType(
"d"))) {
194 g_variant_get(variant.gobj(),
"d", &a);
195 g_variant_get((GVariant*)(v.first.gobj()),
"d", &b);
197 if (abs(a - b) <= 2 * DBL_EPSILON) {
203 if (v.first.is_of_type(Glib::VariantType(
"(dd)"))) {
204 gdouble a1, a2, b1, b2;
205 g_variant_get(variant.gobj(),
"(dd)", &a1, &a2);
206 g_variant_get((GVariant*)(v.first.gobj()),
"(dd)", &b1, &b2);
208 if ((abs(a1 - b1) <= 2 * DBL_EPSILON) && \
209 (abs(a2 - b2) <= 2 * DBL_EPSILON)) {
215 qWarning() <<
"Enum property" <<
name() <<
"encountered unsupported type";
226 for (
unsigned int i = 0; i <
values_.size(); i++) {
227 const pair<Glib::VariantBase, QString> &v =
values_[i];
230 if (v.first.is_of_type(Glib::VariantType(
"d"))) {
232 g_variant_get(variant.gobj(),
"d", &a);
233 g_variant_get((GVariant*)(v.first.gobj()),
"d", &b);
234 if (abs(a - b) <= 2 * DBL_EPSILON)
238 if (v.first.is_of_type(Glib::VariantType(
"(dd)"))) {
239 gdouble a1, a2, b1, b2;
240 g_variant_get(variant.gobj(),
"(dd)", &a1, &a2);
241 g_variant_get((GVariant*)(v.first.gobj()),
"(dd)", &b1, &b2);
242 if ((abs(a1 - b1) <= 2 * DBL_EPSILON) && \
243 (abs(a2 - b2) <= 2 * DBL_EPSILON))
248 if (v.first.equal(variant))
272 const int index =
selector_->currentIndex();
void on_current_index_changed(int)
T value(details::expression_node< T > *n)
Enum(QString name, QString desc, vector< pair< Glib::VariantBase, QString > > values, Getter getter, Setter setter)
const QString & name() const
void on_value_changed(int)
QWidget * slider_layout_widget_
QWidget * get_widget(QWidget *parent, bool auto_commit)
const vector< pair< Glib::VariantBase, QString > > values_
function< Glib::VariantBase()> Getter
function< void(Glib::VariantBase)> Setter