25 QLabel* label =
new QLabel(text);
26 label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
33 VuoDoubleSpinBox* VuoInputEditorPoint4d::initSpinBox(coord whichCoord, QDialog& dialog,
double initialValue)
36 const int decimalPrecision = DBL_MAX_10_EXP + DBL_DIG;
37 spin->setDecimals(decimalPrecision);
38 spin->setFixedWidth(100);
41 spin->setSingleStep(suggestedStepForCoord[whichCoord]);
42 spin->setValue(initialValue);
49 QSlider* VuoInputEditorPoint4d::initSlider(coord whichCoord, QDialog& dialog,
double initialValue)
51 double min = suggestedMinForCoord[whichCoord];
52 double max = suggestedMaxForCoord[whichCoord];
53 double step = suggestedStepForCoord[whichCoord];
54 double range = max - min;
56 QSlider* slider =
new QSlider(&dialog);
58 slider->setOrientation(Qt::Horizontal);
59 slider->setFocusPolicy(Qt::NoFocus);
60 slider->setMinimum(0);
61 slider->setMaximum(slider->width());
62 slider->setSingleStep( fmax(1,
step * (slider->maximum() - slider->minimum()) / range ) );
75 const double max_dbl = std::numeric_limits<double>::max();
77 VuoPoint4d suggestedMin =
VuoPoint4d_make(-max_dbl, -max_dbl, -max_dbl, -max_dbl);
78 VuoPoint4d suggestedMax =
VuoPoint4d_make( max_dbl, max_dbl, max_dbl, max_dbl);
81 bool hasMinMax =
true;
82 bool tabCycleForward =
true;
88 if (json_object_object_get_ex(details,
"forwardTabTraversal", &forwardTabTraversal))
89 tabCycleForward = json_object_get_boolean(forwardTabTraversal);
93 if (json_object_object_get_ex(details,
"suggestedMin", &suggestedMinValue))
100 if (json_object_object_get_ex(details,
"suggestedMax", &suggestedMaxValue))
108 (suggestedMax.y - suggestedMin.y)/10.,
109 (suggestedMax.z - suggestedMin.z)/10.,
110 (suggestedMax.w - suggestedMin.w)/10.);
112 if (json_object_object_get_ex(details,
"suggestedStep", &suggestedStepValue))
116 suggestedMinForCoord[coord_x] = suggestedMin.x;
117 suggestedMinForCoord[coord_y] = suggestedMin.y;
118 suggestedMinForCoord[coord_z] = suggestedMin.z;
119 suggestedMinForCoord[coord_w] = suggestedMin.w;
121 suggestedMaxForCoord[coord_x] = suggestedMax.x;
122 suggestedMaxForCoord[coord_y] = suggestedMax.y;
123 suggestedMaxForCoord[coord_z] = suggestedMax.z;
124 suggestedMaxForCoord[coord_w] = suggestedMax.w;
126 suggestedStepForCoord[coord_x] = suggestedStep.x;
127 suggestedStepForCoord[coord_y] = suggestedStep.y;
128 suggestedStepForCoord[coord_z] = suggestedStep.z;
129 suggestedStepForCoord[coord_w] = suggestedStep.w;
131 spinboxForCoord[coord_x] = initSpinBox(coord_x, dialog, current.x);
132 spinboxForCoord[coord_y] = initSpinBox(coord_y, dialog, current.y);
133 spinboxForCoord[coord_z] = initSpinBox(coord_z, dialog, current.z);
134 spinboxForCoord[coord_w] = initSpinBox(coord_w, dialog, current.w);
136 connect(spinboxForCoord[coord_x],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorPoint4d::onSpinboxUpdate);
137 connect(spinboxForCoord[coord_y],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorPoint4d::onSpinboxUpdate);
138 connect(spinboxForCoord[coord_z],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorPoint4d::onSpinboxUpdate);
139 connect(spinboxForCoord[coord_w],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorPoint4d::onSpinboxUpdate);
143 sliderForCoord[coord_x] = initSlider(coord_x, dialog, current.x);
144 sliderForCoord[coord_y] = initSlider(coord_y, dialog, current.y);
145 sliderForCoord[coord_z] = initSlider(coord_z, dialog, current.z);
146 sliderForCoord[coord_w] = initSlider(coord_w, dialog, current.w);
148 connect(sliderForCoord[coord_x], &QSlider::valueChanged,
this, &VuoInputEditorPoint4d::onSliderUpdate);
149 connect(sliderForCoord[coord_y], &QSlider::valueChanged,
this, &VuoInputEditorPoint4d::onSliderUpdate);
150 connect(sliderForCoord[coord_z], &QSlider::valueChanged,
this, &VuoInputEditorPoint4d::onSliderUpdate);
151 connect(sliderForCoord[coord_w], &QSlider::valueChanged,
this, &VuoInputEditorPoint4d::onSliderUpdate);
155 QGridLayout* layout =
new QGridLayout;
156 dialog.setLayout(layout);
161 layout->setContentsMargins(4, 4, 16, 4);
162 layout->setSpacing(4);
166 layout->addWidget(
makeLabel(
"X"), row, 0, Qt::AlignHCenter);
167 layout->addWidget(spinboxForCoord[coord_x], row++, 1);
168 if(hasMinMax) layout->addWidget(sliderForCoord[coord_x], row++, 1);
170 layout->addWidget(
makeLabel(
"Y"), row, 0, Qt::AlignHCenter);
171 layout->addWidget(spinboxForCoord[coord_y], row++, 1);
172 if(hasMinMax) layout->addWidget(sliderForCoord[coord_y], row++, 1);
174 layout->addWidget(
makeLabel(
"Z"), row, 0, Qt::AlignHCenter);
175 layout->addWidget(spinboxForCoord[coord_z], row++, 1);
176 if(hasMinMax) layout->addWidget(sliderForCoord[coord_z], row++, 1);
178 layout->addWidget(
makeLabel(
"W"), row, 0, Qt::AlignHCenter);
179 layout->addWidget(spinboxForCoord[coord_w], row++, 1);
180 if(hasMinMax) layout->addWidget(sliderForCoord[coord_w], row++, 1);
183 dialog.setMaximumWidth(1);
184 dialog.setMaximumHeight(1);
195 (tabCycleForward ? spinboxForCoord[coord_x] : spinboxForCoord[coord_w])->setFocus();
196 (tabCycleForward ? spinboxForCoord[coord_x] : spinboxForCoord[coord_w])->selectAll();
199 bool VuoInputEditorPoint4d::getCoordFromQObject(QObject* sender, VuoInputEditorPoint4d::coord* whichCoord)
201 if(sender == spinboxForCoord[coord_x] || sender == sliderForCoord[coord_x])
202 *whichCoord = coord_x;
203 else if(sender == spinboxForCoord[coord_y] || sender == sliderForCoord[coord_y])
204 *whichCoord = coord_y;
205 else if(sender == spinboxForCoord[coord_z] || sender == sliderForCoord[coord_z])
206 *whichCoord = coord_z;
207 else if(sender == spinboxForCoord[coord_w] || sender == sliderForCoord[coord_w])
208 *whichCoord = coord_w;
215 void VuoInputEditorPoint4d::setCoord(coord c,
double value)
219 else if(c == coord_y)
221 else if(c == coord_z)
223 else if(c == coord_w)
230 void VuoInputEditorPoint4d::onSliderUpdate(
int sliderValue)
234 if(!getCoordFromQObject(QObject::sender(), &whichCoord))
237 QSlider *targetSlider = sliderForCoord[whichCoord];
240 targetSlider->maximum(),
241 suggestedMinForCoord[whichCoord],
242 suggestedMaxForCoord[whichCoord],
244 setCoord(whichCoord, value);
247 disconnect(spinboxForCoord[whichCoord],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorPoint4d::onSpinboxUpdate);
248 spinboxForCoord[whichCoord]->setValue( value );
249 connect(spinboxForCoord[whichCoord],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorPoint4d::onSpinboxUpdate);
251 spinboxForCoord[whichCoord]->setFocus();
252 spinboxForCoord[whichCoord]->selectAll();
260 void VuoInputEditorPoint4d::onSpinboxUpdate(QString spinboxValue)
264 if(!getCoordFromQObject(QObject::sender(), &whichCoord))
267 double value = QLocale().toDouble(spinboxValue);
268 setCoord(whichCoord, value);
270 QSlider *targetSlider = sliderForCoord[whichCoord];
272 if(targetSlider != NULL)
274 int sliderValue =
VuoDoubleSpinBox::doubleToSlider(targetSlider->minimum(), targetSlider->maximum(), suggestedMinForCoord[whichCoord], suggestedMaxForCoord[whichCoord], value);
275 disconnect(targetSlider, &QSlider::valueChanged,
this, &VuoInputEditorPoint4d::onSliderUpdate);
276 targetSlider->setValue( sliderValue );
277 connect(targetSlider, &QSlider::valueChanged,
this, &VuoInputEditorPoint4d::onSliderUpdate);
294 void VuoInputEditorPoint4d::emitValueChanged()