25 QLabel* label =
new QLabel(text);
26 label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
33 VuoDoubleSpinBox* VuoInputEditorRange::initSpinBox(QDialog& dialog,
double initialValue,
double min,
double max,
double step)
36 const int decimalPrecision = DBL_MAX_10_EXP + DBL_DIG;
37 spin->setDecimals(decimalPrecision);
40 spin->setSingleStep(
step);
41 spin->setValue(initialValue);
42 spin->setFixedWidth(100);
49 QSlider* VuoInputEditorRange::initSlider(QSlider* slider,
double initialValue,
double min,
double max,
double step)
51 double range = max - min;
52 slider->setOrientation(Qt::Horizontal);
53 slider->setFocusPolicy(Qt::NoFocus);
54 slider->setMinimum(0);
55 slider->setMaximum(slider->width());
56 slider->setSingleStep( fmax(1,
step * (slider->maximum() - slider->minimum()) / range ) );
70 const double max_dbl = std::numeric_limits<double>::max();
76 bool hasMinMax =
true;
86 if (json_object_object_get_ex(details,
"suggestedMin", &suggestedMinValue))
93 if (json_object_object_get_ex(details,
"suggestedMax", &suggestedMaxValue))
100 if (json_object_object_get_ex(details,
"suggestedStep", &suggestedStepValue))
105 if (json_object_object_get_ex(details,
"requireMin", &requireMinValue))
110 if (json_object_object_get_ex(details,
"requireMax", &requireMaxValue))
114 spinbox_min = initSpinBox(dialog, current.minimum, suggestedMin.minimum, suggestedMax.minimum, suggestedStep.minimum);
119 spinbox_min->setSpecialValueText(
"-∞");
120 connect(spinbox_min,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorRange::onSpinboxUpdate);
123 spinbox_max = initSpinBox(dialog, current.maximum, suggestedMin.maximum, suggestedMax.maximum, suggestedStep.maximum);
139 connect(spinbox_max,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorRange::onSpinboxUpdate);
144 slider_min =
new QSlider(&dialog);
145 slider_max =
new QSlider(&dialog);
147 slider_min = initSlider(slider_min, current.minimum, suggestedMin.minimum, suggestedMax.minimum, suggestedStep.minimum);
148 slider_max = initSlider(slider_max, current.maximum, suggestedMin.maximum, suggestedMax.maximum, suggestedStep.maximum);
150 connect(slider_min, &QSlider::valueChanged,
this, &VuoInputEditorRange::onSliderUpdate);
151 connect(slider_max, &QSlider::valueChanged,
this, &VuoInputEditorRange::onSliderUpdate);
155 QGridLayout* layout =
new QGridLayout;
156 dialog.setLayout(layout);
161 layout->setContentsMargins(4, 4, 12, 4);
162 layout->setSpacing(4);
163 layout->setHorizontalSpacing(8);
171 toggle_hasMin =
new QCheckBox(
"Minimum");
173 toggle_hasMin->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
174 connect(toggle_hasMin, &QCheckBox::stateChanged,
this, &VuoInputEditorRange::setHasMinBound);
175 layout->addWidget(toggle_hasMin, row, 0);
176 setHasMinBound(toggle_hasMin->isChecked() ? Qt::Checked : Qt::Unchecked);
180 layout->addWidget(
makeLabel(
"Minimum"), row, 0);
183 spinbox_min->setEnabled(toggle_hasMin == NULL || toggle_hasMin->isChecked());
184 layout->addWidget(spinbox_min, row++, 1);
188 slider_min->setEnabled(toggle_hasMin == NULL || toggle_hasMin->isChecked());
189 layout->addWidget(slider_min, row++, 1);
197 toggle_hasMax =
new QCheckBox(
"Maximum");
199 toggle_hasMax->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
200 connect(toggle_hasMax, &QCheckBox::stateChanged,
this, &VuoInputEditorRange::setHasMaxBound);
201 layout->addWidget(toggle_hasMax, row, 0);
202 setHasMaxBound(toggle_hasMax->isChecked() ? Qt::Checked : Qt::Unchecked);
206 layout->addWidget(
makeLabel(
"Maximum"), row, 0);
209 spinbox_max->setEnabled(toggle_hasMax == NULL || toggle_hasMax->isChecked());
210 layout->addWidget(spinbox_max, row++, 1);
214 slider_max->setEnabled(toggle_hasMax == NULL || toggle_hasMax->isChecked());
215 layout->addWidget(slider_max, row, 1);
219 dialog.setMaximumWidth(1);
220 dialog.setMaximumHeight(1);
226 spinbox_min->setFocus();
229 void VuoInputEditorRange::setHasMinBound(
int state)
231 if(state == Qt::Unchecked)
234 lastValue.minimum = current.minimum;
241 current.minimum = fmin(fmax(suggestedMin.minimum, 0.), current.maximum);
243 current.minimum = lastValue.minimum;
246 spinbox_min->setValue(current.minimum);
248 spinbox_min->setEnabled(state != Qt::Unchecked);
249 if(slider_min) slider_min->setEnabled(state != Qt::Unchecked);
252 void VuoInputEditorRange::setHasMaxBound(
int state)
254 if(state == Qt::Unchecked)
256 lastValue.maximum = current.maximum;
258 spinbox_max->setSpecialValueText(
"∞");
260 spinbox_max->setValue(current.maximum);
261 spinbox_max->setEnabled(
false);
262 if(slider_max) slider_max->setEnabled(
false);
267 current.maximum = fmax(fmin(suggestedMax.maximum, 1), current.minimum);
269 current.maximum = lastValue.maximum;
271 spinbox_max->setSpecialValueText(
"");
272 spinbox_max->setMinimum(current.minimum);
273 spinbox_max->setValue(current.maximum);
274 spinbox_max->setEnabled(
true);
275 if(slider_max) slider_max->setEnabled(
true);
279 void VuoInputEditorRange::setMinimumValue(
double value)
281 current.minimum = value;
285 void VuoInputEditorRange::setMaximumValue(
double value)
287 current.maximum = value;
294 void VuoInputEditorRange::onSliderUpdate(
int sliderValue)
296 if(QObject::sender() == NULL)
299 bool isMin = (QObject::sender() == spinbox_min || QObject::sender() == slider_min);
301 QSlider* slider = isMin ? slider_min : slider_max;
305 isMin ? suggestedMin.minimum : suggestedMin.maximum,
306 isMin ? suggestedMax.minimum : suggestedMax.maximum,
309 setMinimumValue(val);
311 setMaximumValue(val);
316 disconnect(spinbox,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorRange::onSpinboxUpdate);
317 spinbox->setValue( isMin ? current.minimum : current.maximum );
318 connect(spinbox,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorRange::onSpinboxUpdate);
321 spinbox->selectAll();
329 void VuoInputEditorRange::onSpinboxUpdate(
double value)
331 if(QObject::sender() == NULL)
334 bool isMin = (QObject::sender() == spinbox_min || QObject::sender() == slider_min);
337 setMinimumValue(value);
339 setMaximumValue(value);
341 QSlider* slider = isMin ? slider_min : slider_max;
348 isMin ? suggestedMin.minimum : suggestedMin.maximum,
349 isMin ? suggestedMax.minimum : suggestedMax.maximum,
352 disconnect(slider, &QSlider::valueChanged,
this, &VuoInputEditorRange::onSliderUpdate);
353 slider->setValue( sliderValue );
354 connect(slider, &QSlider::valueChanged,
this, &VuoInputEditorRange::onSliderUpdate);