+ // Try to determine whether the values make up a range, created by e.g.
+ // std_gvar_min_max_step_thresholds()
+
+ vector<double> deltas;
+ double prev_value = 0;
+
+ for (const pair<Glib::VariantBase, QString> &v : values_) {
+ gdouble value;
+ if (v.first.is_of_type(Glib::VariantType("d"))) {
+ g_variant_get((GVariant*)(v.first.gobj()), "d", &value);
+ } else if (v.first.is_of_type(Glib::VariantType("(dd)"))) {
+ gdouble dummy;
+ g_variant_get((GVariant*)(v.first.gobj()), "(dd)", &value, &dummy);
+ } else
+ break; // Type not d or (dd), so not a range that we can handle
+ deltas.push_back(value - prev_value);
+ prev_value = value;
+ }
+
+ if (deltas.size() > 0) {
+ bool constant_delta = true;
+ double prev_delta = numeric_limits<double>::quiet_NaN();
+
+ bool skip_first = true;
+ for (double delta : deltas) {
+ // First value is incorrect, it's the delta to 0 since no
+ // previous value existed yet
+ if (skip_first) {
+ skip_first = false;
+ continue;
+ }
+ if (std::isnan(prev_delta))
+ prev_delta = delta;
+
+ // 2*DBL_EPSILON doesn't work here, so use a workaround
+ if (abs(delta - prev_delta) > (delta/10))
+ constant_delta = false;
+
+ prev_delta = delta;
+ }
+
+ if (constant_delta)
+ is_range_ = true;
+ }