12 #define DEG2RAD 0.0174532925f
13 #define RAD2DEG 57.295779513f
28 QLabel* label =
new QLabel(text);
29 label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
36 void VuoInputEditorTransform::setCoordMap(map<coord, double>* coordMap,
VuoTransform transform)
38 (*coordMap)[xTranslation] = transform.translation.x;
39 (*coordMap)[yTranslation] = transform.translation.y;
40 (*coordMap)[zTranslation] = transform.translation.z;
43 (*coordMap)[xRotation] =
RAD2DEG * rotation.x;
44 (*coordMap)[yRotation] =
RAD2DEG * rotation.y;
45 (*coordMap)[zRotation] =
RAD2DEG * rotation.z;
47 (*coordMap)[xScale] = transform.scale.x;
48 (*coordMap)[yScale] = transform.scale.y;
49 (*coordMap)[zScale] = transform.scale.z;
55 VuoDoubleSpinBox* VuoInputEditorTransform::initSpinBox(coord whichCoord, QDialog& dialog,
double initialValue)
58 const int decimalPrecision = DBL_MAX_10_EXP + DBL_DIG;
59 spin->setDecimals(decimalPrecision);
62 spin->setSingleStep(suggestedStepForCoord[whichCoord]);
63 spin->setValue(initialValue);
70 QSlider* VuoInputEditorTransform::initSlider(coord whichCoord, QDialog& dialog,
double initialValue)
72 double min = suggestedMinForCoord[whichCoord];
73 double max = suggestedMaxForCoord[whichCoord];
74 double step = suggestedStepForCoord[whichCoord];
75 double range = max - min;
77 QSlider* slider =
new QSlider(&dialog);
79 slider->setOrientation(Qt::Horizontal);
80 slider->setFocusPolicy(Qt::NoFocus);
81 slider->setMinimum(0);
82 slider->setMaximum(slider->width());
83 slider->setSingleStep( fmax(1,
step * (slider->maximum() - slider->minimum()) / range ) );
97 bool tabCycleForward =
true;
103 setCoordMap(&suggestedMinForCoord, default_min);
104 setCoordMap(&suggestedMaxForCoord, default_max);
105 setCoordMap(&suggestedStepForCoord, default_step);
112 if (json_object_object_get_ex(details,
"forwardTabTraversal", &forwardTabTraversal))
113 tabCycleForward = json_object_get_boolean(forwardTabTraversal);
117 if (json_object_object_get_ex(details,
"suggestedMin", &suggestedMinValue))
120 setCoordMap(&suggestedMinForCoord, minTransform);
125 if (json_object_object_get_ex(details,
"suggestedMax", &suggestedMaxValue))
128 setCoordMap(&suggestedMaxForCoord, maxTransform);
133 if (json_object_object_get_ex(details,
"suggestedStep", &suggestedStepValue))
136 setCoordMap(&suggestedStepForCoord, stepTransform);
141 spinboxForCoord[xTranslation] = initSpinBox(xTranslation, dialog, currentTransform.translation.x);
142 sliderForCoord[xTranslation] = initSlider(xTranslation, dialog, currentTransform.translation.x);
143 connect(sliderForCoord[xTranslation], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
144 connect(spinboxForCoord[xTranslation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
147 spinboxForCoord[yTranslation] = initSpinBox(yTranslation, dialog, currentTransform.translation.y);
148 sliderForCoord[yTranslation] = initSlider(yTranslation, dialog, currentTransform.translation.y);
149 connect(sliderForCoord[yTranslation], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
150 connect(spinboxForCoord[yTranslation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
153 spinboxForCoord[zTranslation] = initSpinBox(zTranslation, dialog, currentTransform.translation.z);
154 sliderForCoord[zTranslation] = initSlider(zTranslation, dialog, currentTransform.translation.z);
155 connect(sliderForCoord[zTranslation], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
156 connect(spinboxForCoord[zTranslation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
160 spinboxForCoord[xRotation] = initSpinBox(xRotation, dialog, rotation.x *
RAD2DEG);
161 sliderForCoord[xRotation] = initSlider(xRotation, dialog, rotation.x *
RAD2DEG);
162 connect(sliderForCoord[xRotation], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
163 connect(spinboxForCoord[xRotation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
166 spinboxForCoord[yRotation] = initSpinBox(yRotation, dialog, rotation.y *
RAD2DEG);
167 sliderForCoord[yRotation] = initSlider(yRotation, dialog, rotation.y *
RAD2DEG);
168 connect(sliderForCoord[yRotation], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
169 connect(spinboxForCoord[yRotation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
172 spinboxForCoord[zRotation] = initSpinBox(zRotation, dialog, rotation.z *
RAD2DEG);
173 sliderForCoord[zRotation] = initSlider(zRotation, dialog, rotation.z *
RAD2DEG);
174 connect(sliderForCoord[zRotation], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
175 connect(spinboxForCoord[zRotation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
178 spinboxForCoord[xScale] = initSpinBox(xScale, dialog, currentTransform.scale.x);
179 sliderForCoord[xScale] = initSlider(xScale, dialog, currentTransform.scale.x);
180 connect(sliderForCoord[xScale], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
181 connect(spinboxForCoord[xScale],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
184 spinboxForCoord[yScale] = initSpinBox(yScale, dialog, currentTransform.scale.y);
185 sliderForCoord[yScale] = initSlider(yScale, dialog, currentTransform.scale.y);
186 connect(sliderForCoord[yScale], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
187 connect(spinboxForCoord[yScale],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
190 spinboxForCoord[zScale] = initSpinBox(zScale, dialog, currentTransform.scale.z);
191 sliderForCoord[zScale] = initSlider(zScale, dialog, currentTransform.scale.z);
192 connect(sliderForCoord[zScale], &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
193 connect(spinboxForCoord[zScale],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
196 QGridLayout* layout =
new QGridLayout;
197 dialog.setLayout(layout);
202 layout->setContentsMargins(4, 4, 16, 4);
203 layout->setSpacing(8);
205 unsigned int row = 0;
207 layout->addWidget(
makeLabel(
"X"), row, 1, Qt::AlignHCenter);
208 layout->addWidget(
makeLabel(
"Y"), row, 2, Qt::AlignHCenter);
209 layout->addWidget(
makeLabel(
"Z"), row, 3, Qt::AlignHCenter);
213 layout->addWidget(
makeLabel(
"Translation"), row, 0);
214 layout->addWidget( spinboxForCoord[xTranslation], row, 1);
215 layout->addWidget( spinboxForCoord[yTranslation], row, 2);
216 layout->addWidget( spinboxForCoord[zTranslation], row, 3);
220 layout->addWidget( sliderForCoord[xTranslation], row, 1);
221 layout->addWidget( sliderForCoord[yTranslation], row, 2);
222 layout->addWidget( sliderForCoord[zTranslation], row, 3);
226 layout->addWidget(
makeLabel(
"Rotation"), row, 0);
227 layout->addWidget( spinboxForCoord[xRotation], row, 1);
228 layout->addWidget( spinboxForCoord[yRotation], row, 2);
229 layout->addWidget( spinboxForCoord[zRotation], row, 3);
233 layout->addWidget( sliderForCoord[xRotation], row, 1);
234 layout->addWidget( sliderForCoord[yRotation], row, 2);
235 layout->addWidget( sliderForCoord[zRotation], row, 3);
241 layout->addWidget(
makeLabel(
"Scale"), row, 0);
242 layout->addWidget( spinboxForCoord[xScale], row, 1);
243 layout->addWidget( spinboxForCoord[yScale], row, 2);
244 layout->addWidget( spinboxForCoord[zScale], row, 3);
248 layout->addWidget( sliderForCoord[xScale], row, 1);
249 layout->addWidget( sliderForCoord[yScale], row, 2);
250 layout->addWidget( sliderForCoord[zScale], row, 3);
254 dialog.setMaximumWidth(1);
255 dialog.setMaximumHeight(1);
266 (tabCycleForward ? spinboxForCoord[xTranslation] : spinboxForCoord[zScale])->setFocus();
267 (tabCycleForward ? spinboxForCoord[xTranslation] : spinboxForCoord[zScale])->selectAll();
278 void VuoInputEditorTransform::setTransformProperty(coord whichCoord,
double value)
280 if(whichCoord == xTranslation)
281 currentTransform.translation.x = value;
282 else if(whichCoord == yTranslation)
283 currentTransform.translation.y = value;
284 else if(whichCoord == zTranslation)
285 currentTransform.translation.z = value;
286 else if(whichCoord == xRotation || whichCoord == yRotation || whichCoord == zRotation)
290 if(whichCoord == xRotation)
292 else if(whichCoord == yRotation)
294 else if(whichCoord == zRotation)
299 else if(whichCoord == xScale)
300 currentTransform.scale.x = value;
301 else if(whichCoord == yScale)
302 currentTransform.scale.y = value;
303 else if(whichCoord == zScale)
304 currentTransform.scale.z = value;
307 VuoInputEditorTransform::coord VuoInputEditorTransform::getCoordFromQObject(QObject* sender)
309 if( sender == sliderForCoord[xTranslation] || sender == spinboxForCoord[xTranslation] )
311 else if( sender == sliderForCoord[yTranslation] || sender == spinboxForCoord[yTranslation] )
313 else if( sender == sliderForCoord[zTranslation] || sender == spinboxForCoord[zTranslation] )
315 else if( sender == sliderForCoord[xRotation] || sender == spinboxForCoord[xRotation] )
317 else if( sender == sliderForCoord[yRotation] || sender == spinboxForCoord[yRotation] )
319 else if( sender == sliderForCoord[zRotation] || sender == spinboxForCoord[zRotation] )
321 else if( sender == sliderForCoord[xScale] || sender == spinboxForCoord[xScale] )
323 else if( sender == sliderForCoord[yScale] || sender == spinboxForCoord[yScale] )
325 else if( sender == sliderForCoord[zScale] || sender == spinboxForCoord[zScale] )
334 void VuoInputEditorTransform::onSliderUpdate(
int sliderValue)
336 coord whichCoord = getCoordFromQObject(QObject::sender());
337 QSlider *targetSlider = sliderForCoord[whichCoord];
338 double value =
VuoDoubleSpinBox::sliderToDouble(targetSlider->minimum(), targetSlider->maximum(), suggestedMinForCoord[whichCoord], suggestedMaxForCoord[whichCoord], sliderValue);
339 setTransformProperty(whichCoord, value);
342 disconnect(spinboxForCoord[whichCoord],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
343 spinboxForCoord[whichCoord]->setValue( value );
344 connect(spinboxForCoord[whichCoord],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform::onSpinboxUpdate);
346 spinboxForCoord[whichCoord]->setFocus();
347 spinboxForCoord[whichCoord]->selectAll();
355 void VuoInputEditorTransform::onSpinboxUpdate(QString spinboxValue)
357 coord whichCoord = getCoordFromQObject(QObject::sender());
359 double value = QLocale().toDouble(spinboxValue);
360 setTransformProperty(whichCoord, value);
362 QSlider *targetSlider = sliderForCoord[whichCoord];
363 int sliderValue =
VuoDoubleSpinBox::doubleToSlider(targetSlider->minimum(), targetSlider->maximum(), suggestedMinForCoord[whichCoord], suggestedMaxForCoord[whichCoord], value);
365 disconnect(targetSlider, &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);
366 targetSlider->setValue( sliderValue );
367 connect(targetSlider, &QSlider::valueChanged,
this, &VuoInputEditorTransform::onSliderUpdate);