12#define IS_FINITE(value) (::abs(value) != INT_MAX)
25void VuoInputEditorIntegerRange::setupSpinBox(
VuoSpinBox* spin,
int min,
int max,
int step,
int value)
29 spin->setMinimum( -INT_MAX );
30 spin->setMaximum( INT_MAX );
31 spin->setSingleStep(
step);
32 spin->setValue(value);
40 bool hasMin =
false, hasMax =
false;
46 if (json_object_object_get_ex(details,
"suggestedMin", &suggestedMinValue))
54 if (json_object_object_get_ex(details,
"suggestedMax", &suggestedMaxValue))
62 if (json_object_object_get_ex(details,
"suggestedStep", &suggestedStepValue))
66 return hasMin && hasMax;
79 bool hasMinMax =
getDetails(details, &suggestedMin, &suggestedMax, &suggestedStep);
81 bool tabCycleForward =
true;
86 if (json_object_object_get_ex(details,
"forwardTabTraversal", &forwardTabTraversal))
87 tabCycleForward = json_object_get_boolean(forwardTabTraversal);
90 QGridLayout* layout =
new QGridLayout;
95 layout->setContentsMargins(4, 6, 12, hasMinMax ? 6 : 4);
96 layout->setSpacing(8);
101 currentValue.minimum = -INT_MAX;
103 currentValue.maximum = INT_MAX;
105 lastValue.minimum =
IS_FINITE(currentValue.minimum) ? currentValue.minimum : (
IS_FINITE(suggestedMin.minimum) ? suggestedMin.minimum : 0 );
106 lastValue.maximum =
IS_FINITE(currentValue.maximum) ? currentValue.maximum : (
IS_FINITE(suggestedMin.maximum) ? suggestedMin.maximum : 10 );
110 checkbox_minimum =
new QCheckBox(
"Minimum");
111 checkbox_minimum->setChecked(
IS_FINITE(currentValue.minimum) );
112 checkbox_minimum->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
113 connect(checkbox_minimum, &QCheckBox::stateChanged,
this, &VuoInputEditorIntegerRange::setMinBound);
115 layout->addWidget(checkbox_minimum, 0, 0 );
118 setupSpinBox(spinbox_minimum, suggestedMin.minimum,
MIN(suggestedMax.minimum, currentValue.maximum), suggestedStep.minimum, currentValue.minimum);
119 spinbox_minimum->installEventFilter(
this);
120 connect(spinbox_minimum,
static_cast<void (QSpinBox::*)(
const QString &)
>(&QSpinBox::valueChanged),
this, &VuoInputEditorIntegerRange::setMinimum);
122 spinbox_minimum->setEnabled( checkbox_minimum->isChecked() );
124 layout->addWidget( spinbox_minimum, 0, 1 );
129 checkbox_maximum =
new QCheckBox(
"Maximum");
130 checkbox_maximum->setChecked(
IS_FINITE(currentValue.maximum) );
131 checkbox_maximum->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
132 connect(checkbox_maximum, &QCheckBox::stateChanged,
this, &VuoInputEditorIntegerRange::setMaxBound);
134 layout->addWidget(checkbox_maximum, 1, 0 );
137 setupSpinBox(spinbox_maximum,
MAX(suggestedMin.maximum, currentValue.minimum), suggestedMax.maximum, suggestedStep.maximum, currentValue.maximum);
138 spinbox_maximum->installEventFilter(
this);
139 connect(spinbox_maximum,
static_cast<void (QSpinBox::*)(
const QString &)
>(&QSpinBox::valueChanged),
this, &VuoInputEditorIntegerRange::setMaximum);
141 spinbox_maximum->setEnabled( checkbox_maximum->isChecked() );
143 layout->addWidget( spinbox_maximum, 1, 1 );
146 setMinBound(checkbox_minimum->isChecked() ? Qt::Checked : Qt::Unchecked);
147 setMaxBound(checkbox_maximum->isChecked() ? Qt::Checked : Qt::Unchecked);
149 dialog.setLayout(layout);
152 dialog.setMaximumWidth(178);
153 dialog.setMaximumHeight(32);
160 (tabCycleForward ? spinbox_minimum : spinbox_maximum)->setFocus();
161 (tabCycleForward ? spinbox_minimum : spinbox_maximum)->selectAll();
169void VuoInputEditorIntegerRange::setMinBound(
int state)
171 if(state == Qt::Unchecked)
173 lastValue.minimum = currentValue.minimum;
174 spinbox_minimum->setValue( -INT_MAX );
175 spinbox_minimum->setSpecialValueText(
"-∞");
176 spinbox_minimum->setEnabled(
false);
183 lastValue.minimum = 0;
184 lastValue.minimum =
MIN(lastValue.minimum, currentValue.maximum);
185 spinbox_minimum->setValue( lastValue.minimum );
187 spinbox_minimum->setSpecialValueText(
"");
188 spinbox_minimum->setEnabled(
true);
197void VuoInputEditorIntegerRange::setMaxBound(
int state)
199 if(state == Qt::Unchecked)
201 lastValue.maximum = currentValue.maximum;
202 spinbox_maximum->setMinimum(INT_MAX);
203 spinbox_maximum->setValue( INT_MAX );
204 spinbox_maximum->setSpecialValueText(
"∞");
205 spinbox_maximum->setEnabled(
false);
212 lastValue.maximum = 10;
213 lastValue.maximum =
MAX(lastValue.maximum, currentValue.minimum);
214 spinbox_maximum->setMinimum(suggestedMin.maximum);
215 spinbox_maximum->setValue( lastValue.maximum );
217 spinbox_maximum->setSpecialValueText(
"");
218 spinbox_maximum->setEnabled(
true);
227void VuoInputEditorIntegerRange::setMinimum(QString newLineEditText)
230 double newLineEditValue = QLocale().toDouble(newLineEditText, &ok);
233 currentValue.minimum = newLineEditValue;
244void VuoInputEditorIntegerRange::setMaximum(QString newLineEditText)
247 double newLineEditValue = QLocale().toDouble(newLineEditText, &ok);
250 currentValue.maximum = newLineEditValue;
280 if (event->type() == QEvent::KeyPress && spin)
283 QKeyEvent *keyEvent = (QKeyEvent *)(event);
285 if (keyEvent->key() == Qt::Key_Up)
287 if(spin == spinbox_minimum)
288 spin->setValue(
MIN(spin->value() + spin->singleStep(),
MIN(suggestedMax.minimum, currentValue.maximum)) );
289 else if(spin == spinbox_maximum)
290 spin->setValue(
MIN(spin->value() + spin->singleStep(), suggestedMax.minimum) );
294 else if (keyEvent->key() == Qt::Key_Down)
296 if(spin == spinbox_minimum)
297 spin->setValue(
MAX(spin->value() - spin->singleStep(), suggestedMin.minimum) );
298 else if(spin == spinbox_maximum)
299 spin->setValue(
MAX(spin->value() - spin->singleStep(),
MAX(suggestedMin.maximum, currentValue.minimum)) );