2 * This file is part of the PulseView project.
4 * Copyright (C) 2012 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/>.
35 Enum::Enum(QString name, QString desc,
36 vector<pair<Glib::VariantBase, QString> > values,
37 Getter getter, Setter setter) :
38 Property(name, desc, getter, setter),
44 QWidget* Enum::get_widget(QWidget *parent, bool auto_commit)
52 Glib::VariantBase variant = getter_();
56 selector_ = new QComboBox(parent);
57 for (unsigned int i = 0; i < values_.size(); i++) {
58 const pair<Glib::VariantBase, QString> &v = values_[i];
59 selector_->addItem(v.second, qVariantFromValue(v.first));
65 connect(selector_, SIGNAL(currentIndexChanged(int)),
66 this, SLOT(on_current_item_changed(int)));
71 void Enum::update_widget()
76 Glib::VariantBase variant = getter_();
77 assert(variant.gobj());
79 for (unsigned int i = 0; i < values_.size(); i++) {
80 const pair<Glib::VariantBase, QString> &v = values_[i];
82 // g_variant_equal() doesn't handle floating point properly
83 if (v.first.is_of_type(Glib::VariantType("d"))) {
85 g_variant_get(variant.gobj(), "d", &a);
86 g_variant_get((GVariant*)(v.first.gobj()), "d", &b);
87 if (abs(a - b) <= 2 * DBL_EPSILON)
88 selector_->setCurrentIndex(i);
90 // Check for "(dd)" type and handle it if it's found
91 if (v.first.is_of_type(Glib::VariantType("(dd)"))) {
92 gdouble a1, a2, b1, b2;
93 g_variant_get(variant.gobj(), "(dd)", &a1, &a2);
94 g_variant_get((GVariant*)(v.first.gobj()), "(dd)", &b1, &b2);
95 if ((abs(a1 - b1) <= 2 * DBL_EPSILON) && \
96 (abs(a2 - b2) <= 2 * DBL_EPSILON))
97 selector_->setCurrentIndex(i);
100 // Handle all other types
101 if (v.first.equal(variant))
102 selector_->setCurrentIndex(i);
114 const int index = selector_->currentIndex();
118 setter_(selector_->itemData(index).value<Glib::VariantBase>());
121 void Enum::on_current_item_changed(int)