+ // @todo sigrok supports 64-bit quantities, but Qt does not have a
+ // standard widget to allow the values to be modified over the full
+ // 64-bit range on 32-bit machines. To solve the issue we need a
+ // custom widget.
+
+ range_min = max(range_min, (int64_t)INT_MIN);
+ range_max = min(range_max, (uint64_t)INT_MAX);
+
+ if (range_)
+ spin_box_->setRange((int)range_->first, (int)range_->second);
+ else
+ spin_box_->setRange((int)range_min, (int)range_max);
+
+ update_widget();
+
+ if (auto_commit)
+ connect(spin_box_, SIGNAL(valueChanged(int)),
+ this, SLOT(on_value_changed(int)));
+
+ return spin_box_;
+}
+
+void Int::update_widget()
+{
+ if (!spin_box_)
+ return;
+
+ try {
+ value_ = getter_();
+ } catch (const sigrok::Error &e) {
+ qWarning() << tr("Querying config key %1 resulted in %2").arg(name_, e.what());
+ return;
+ }
+
+ GVariant *value = value_.gobj();
+ assert(value);
+
+ const GVariantType *const type = g_variant_get_type(value);
+ assert(type);
+
+ int64_t int_val = 0;
+
+ if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTE)) {
+ int_val = g_variant_get_byte(value);
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT16)) {
+ int_val = g_variant_get_int16(value);
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT16)) {
+ int_val = g_variant_get_uint16(value);
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT32)) {
+ int_val = g_variant_get_int32(value);
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT32)) {
+ int_val = g_variant_get_uint32(value);
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT64)) {
+ int_val = g_variant_get_int64(value);
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT64)) {
+ int_val = g_variant_get_uint64(value);
+ } else {
+ // Unexpected value type.
+ assert(false);
+ }
+
+ spin_box_->setValue((int)int_val);