18 #define DEG2RAD 0.0174532925f
19 #define RAD2DEG 57.295779513f
34 QLabel* label =
new QLabel(text);
35 label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
42 void VuoInputEditorTransform2d::setCoordMap(map<coord, double>* coordMap,
VuoTransform2d transform)
44 (*coordMap)[xTranslation] = transform.translation.x;
45 (*coordMap)[yTranslation] = transform.translation.y;
47 (*coordMap)[xScale] = transform.scale.x;
48 (*coordMap)[yScale] = transform.scale.y;
54 VuoDoubleSpinBox* VuoInputEditorTransform2d::initSpinBox(coord whichCoord, QDialog& dialog,
double initialValue)
57 const int decimalPrecision = DBL_MAX_10_EXP + DBL_DIG;
58 spin->setDecimals(decimalPrecision);
61 spin->setSingleStep(suggestedStepForCoord[whichCoord]);
62 spin->setValue(initialValue);
63 spin->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
71 QSlider* VuoInputEditorTransform2d::initSlider(coord whichCoord, QDialog& dialog,
double initialValue)
73 double min = suggestedMinForCoord[whichCoord];
74 double max = suggestedMaxForCoord[whichCoord];
75 double step = suggestedStepForCoord[whichCoord];
76 double range = max - min;
78 QSlider* slider =
new QSlider(&dialog);
80 slider->setOrientation(Qt::Horizontal);
81 slider->setFocusPolicy(Qt::NoFocus);
82 slider->setMinimum(0);
83 slider->setMaximum(slider->width());
84 slider->setSingleStep( fmax(1,
step * (slider->maximum() - slider->minimum()) / range ) );
98 bool tabCycleForward =
true;
104 setCoordMap(&suggestedMinForCoord, default_min);
105 setCoordMap(&suggestedMaxForCoord, default_max);
106 setCoordMap(&suggestedStepForCoord, default_step);
113 if (json_object_object_get_ex(details,
"forwardTabTraversal", &forwardTabTraversal))
114 tabCycleForward = json_object_get_boolean(forwardTabTraversal);
118 if (json_object_object_get_ex(details,
"suggestedMin", &suggestedMinValue))
121 setCoordMap(&suggestedMinForCoord, minTransform);
126 if (json_object_object_get_ex(details,
"suggestedMax", &suggestedMaxValue))
129 setCoordMap(&suggestedMaxForCoord, maxTransform);
134 if (json_object_object_get_ex(details,
"suggestedStep", &suggestedStepValue))
137 setCoordMap(&suggestedStepForCoord, stepTransform);
142 spinboxForCoord[xTranslation] = initSpinBox(xTranslation, dialog, currentTransform.translation.x);
143 sliderForCoord[xTranslation] = initSlider(xTranslation, dialog, currentTransform.translation.x);
144 connect(sliderForCoord[xTranslation], &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);
145 connect(spinboxForCoord[xTranslation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
148 spinboxForCoord[yTranslation] = initSpinBox(yTranslation, dialog, currentTransform.translation.y);
149 sliderForCoord[yTranslation] = initSlider(yTranslation, dialog, currentTransform.translation.y);
150 connect(sliderForCoord[yTranslation], &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);
151 connect(spinboxForCoord[yTranslation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
154 spinboxForCoord[rotation] = initSpinBox(rotation, dialog, currentTransform.
rotation *
RAD2DEG);
155 sliderForCoord[rotation] = initSlider(rotation, dialog, currentTransform.
rotation *
RAD2DEG);
156 connect(sliderForCoord[rotation], &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);
157 connect(spinboxForCoord[rotation],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
160 spinboxForCoord[xScale] = initSpinBox(xScale, dialog, currentTransform.scale.x);
161 sliderForCoord[xScale] = initSlider(xScale, dialog, currentTransform.scale.x);
162 connect(sliderForCoord[xScale], &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);
163 connect(spinboxForCoord[xScale],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
166 spinboxForCoord[yScale] = initSpinBox(yScale, dialog, currentTransform.scale.y);
167 sliderForCoord[yScale] = initSlider(yScale, dialog, currentTransform.scale.y);
168 connect(sliderForCoord[yScale], &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);
169 connect(spinboxForCoord[yScale],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
172 QGridLayout* layout =
new QGridLayout;
173 dialog.setLayout(layout);
178 layout->setContentsMargins(4, 4, 16, 4);
179 layout->setSpacing(8);
181 unsigned int row = 0;
183 layout->addWidget(
makeLabel(
"X"), row, 1, Qt::AlignHCenter);
184 layout->addWidget(
makeLabel(
"Y"), row, 2, Qt::AlignHCenter);
188 layout->addWidget(
makeLabel(
"Translation"), row, 0);
189 layout->addWidget( spinboxForCoord[xTranslation], row, 1);
190 layout->addWidget( spinboxForCoord[yTranslation], row, 2);
194 layout->addWidget( sliderForCoord[xTranslation], row, 1);
195 layout->addWidget( sliderForCoord[yTranslation], row, 2);
199 layout->addWidget(
makeLabel(
"Rotation"), row, 0);
201 QHBoxLayout* rotation_layout =
new QHBoxLayout;
202 rotation_layout->addStretch(0);
203 QVBoxLayout* rotation_vertical =
new QVBoxLayout();
204 rotation_vertical->addWidget( spinboxForCoord[rotation] );
205 rotation_vertical->addWidget( sliderForCoord[rotation] );
206 rotation_layout->addLayout(rotation_vertical);
207 rotation_layout->addStretch(0);
209 layout->addLayout(rotation_layout, row, 1, 2, 2);
213 layout->addWidget(
makeLabel(
""), row, 0);
217 layout->addWidget(
makeLabel(
"Scale"), row, 0);
218 layout->addWidget( spinboxForCoord[xScale], row, 1);
219 layout->addWidget( spinboxForCoord[yScale], row, 2);
223 layout->addWidget( sliderForCoord[xScale], row, 1);
224 layout->addWidget( sliderForCoord[yScale], row, 2);
229 dialog.setMaximumWidth(1);
230 dialog.setMaximumHeight(1);
241 (tabCycleForward ? spinboxForCoord[xTranslation] : spinboxForCoord[yScale])->setFocus();
242 (tabCycleForward ? spinboxForCoord[xTranslation] : spinboxForCoord[yScale])->selectAll();
253 void VuoInputEditorTransform2d::setTransformProperty(coord whichCoord,
double value)
255 if(whichCoord == xTranslation)
256 currentTransform.translation.x = value;
257 else if(whichCoord == yTranslation)
258 currentTransform.translation.y = value;
259 else if(whichCoord == rotation)
261 else if(whichCoord == xScale)
262 currentTransform.scale.x = value;
263 else if(whichCoord == yScale)
264 currentTransform.scale.y = value;
267 VuoInputEditorTransform2d::coord VuoInputEditorTransform2d::getCoordFromQObject(QObject* sender)
269 if( sender == sliderForCoord[xTranslation] || sender == spinboxForCoord[xTranslation] )
271 else if( sender == sliderForCoord[yTranslation] || sender == spinboxForCoord[yTranslation] )
273 else if( sender == sliderForCoord[rotation] || sender == spinboxForCoord[rotation] )
275 else if( sender == sliderForCoord[xScale] || sender == spinboxForCoord[xScale] )
277 else if( sender == sliderForCoord[yScale] || sender == spinboxForCoord[yScale] )
286 void VuoInputEditorTransform2d::onSliderUpdate(
int sliderValue)
288 coord whichCoord = getCoordFromQObject(QObject::sender());
289 QSlider *targetSlider = sliderForCoord[whichCoord];
290 double value =
VuoDoubleSpinBox::sliderToDouble(targetSlider->minimum(), targetSlider->maximum(), suggestedMinForCoord[whichCoord], suggestedMaxForCoord[whichCoord], sliderValue);
291 setTransformProperty(whichCoord, value);
294 disconnect(spinboxForCoord[whichCoord],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
295 spinboxForCoord[whichCoord]->setValue( value );
296 connect(spinboxForCoord[whichCoord],
static_cast<void (QDoubleSpinBox::*)(
const QString &)
>(&QDoubleSpinBox::valueChanged),
this, &VuoInputEditorTransform2d::onSpinboxUpdate);
298 spinboxForCoord[whichCoord]->setFocus();
299 spinboxForCoord[whichCoord]->selectAll();
307 void VuoInputEditorTransform2d::onSpinboxUpdate(QString spinboxValue)
309 coord whichCoord = getCoordFromQObject(QObject::sender());
311 double value = QLocale().toDouble(spinboxValue);
312 setTransformProperty(whichCoord, value);
314 QSlider *targetSlider = sliderForCoord[whichCoord];
315 int sliderValue =
VuoDoubleSpinBox::doubleToSlider(targetSlider->minimum(), targetSlider->maximum(), suggestedMinForCoord[whichCoord], suggestedMaxForCoord[whichCoord], value);
317 disconnect(targetSlider, &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);
318 targetSlider->setValue( sliderValue );
319 connect(targetSlider, &QSlider::valueChanged,
this, &VuoInputEditorTransform2d::onSliderUpdate);