+ int64_t range_min = 0;
+ uint64_t range_max = 0;
+
+ if (spin_box_)
+ return spin_box_;
+
+ if (!getter_)
+ return nullptr;
+
+ value_ = getter_();
+
+ GVariant *value = value_.gobj();
+ if (!value)
+ return nullptr;
+
+ spin_box_ = new QSpinBox(parent);
+ spin_box_->setSuffix(suffix_);
+
+ const GVariantType *const type = g_variant_get_type(value);
+ assert(type);
+
+ if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTE)) {
+ range_min = 0, range_max = UINT8_MAX;
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT16)) {
+ range_min = INT16_MIN, range_max = INT16_MAX;
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT16)) {
+ range_min = 0, range_max = UINT16_MAX;
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT32)) {
+ range_min = INT32_MIN, range_max = INT32_MAX;
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT32)) {
+ range_min = 0, range_max = UINT32_MAX;
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT64)) {
+ range_min = INT64_MIN, range_max = INT64_MAX;
+ } else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT64)) {
+ range_min = 0, range_max = UINT64_MAX;
+ } else {
+ // Unexpected value type.
+ assert(false);
+ }
+
+ // @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;
+
+ value_ = getter_();
+ 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);