111 , m_gradientStopsController(
new QtGradientStopsController(
this))
112 , m_gradient(QLinearGradient())
117 setType(QGradient::LinearGradient);
123 setStartLinear(QPointF(0, 0));
124 setEndLinear(QPointF(1, 1));
125 setCentralRadial(QPointF(0.5, 0.5));
126 setFocalRadial(QPointF(0.5, 0.5));
127 setRadiusRadial(0.5);
128 setCentralConical(QPointF(0.5, 0.5));
132 icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowRight), QIcon::Normal, QIcon::Off);
133 icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowLeft), QIcon::Normal, QIcon::On);
134 m_ui.detailsButton->setIcon(icon);
136 connect(m_ui.detailsButton, &QAbstractButton::clicked,
139 this, &QtGradientEditorPrivate::slotGradientStopsChanged);
141 QIcon iconLinear(
":/qt-project.org/qtgradienteditor/images/typelinear.png"_L1);
142 QIcon iconRadial(
":/qt-project.org/qtgradienteditor/images/typeradial.png"_L1);
143 QIcon iconConical(
":/qt-project.org/qtgradienteditor/images/typeconical.png"_L1);
145 m_ui.typeComboBox->addItem(iconLinear, QtGradientEditor::tr(
"Linear"));
146 m_ui.typeComboBox->addItem(iconRadial, QtGradientEditor::tr(
"Radial"));
147 m_ui.typeComboBox->addItem(iconConical, QtGradientEditor::tr(
"Conical"));
149 m_ui.linearButton->setIcon(iconLinear);
150 m_ui.radialButton->setIcon(iconRadial);
151 m_ui.conicalButton->setIcon(iconConical);
153 m_typeGroup =
new QButtonGroup(
this);
154 m_typeGroup->addButton(m_ui.linearButton, 0);
155 m_typeGroup->addButton(m_ui.radialButton, 1);
156 m_typeGroup->addButton(m_ui.conicalButton, 2);
158 connect(m_typeGroup, &QButtonGroup::idClicked,
160 connect(m_ui.typeComboBox, &QComboBox::activated,
163 QIcon iconPad(
":/qt-project.org/qtgradienteditor/images/spreadpad.png"_L1);
164 QIcon iconRepeat(
":/qt-project.org/qtgradienteditor/images/spreadrepeat.png"_L1);
165 QIcon iconReflect(
":/qt-project.org/qtgradienteditor/images/spreadreflect.png"_L1);
167 m_ui.spreadComboBox->addItem(iconPad, QtGradientEditor::tr(
"Pad"));
168 m_ui.spreadComboBox->addItem(iconRepeat, QtGradientEditor::tr(
"Repeat"));
169 m_ui.spreadComboBox->addItem(iconReflect, QtGradientEditor::tr(
"Reflect"));
171 m_ui.padButton->setIcon(iconPad);
172 m_ui.repeatButton->setIcon(iconRepeat);
173 m_ui.reflectButton->setIcon(iconReflect);
175 m_spreadGroup =
new QButtonGroup(
this);
176 m_spreadGroup->addButton(m_ui.padButton, 0);
177 m_spreadGroup->addButton(m_ui.repeatButton, 1);
178 m_spreadGroup->addButton(m_ui.reflectButton, 2);
179 connect(m_spreadGroup, &QButtonGroup::idClicked,
181 connect(m_ui.spreadComboBox, &QComboBox::activated,
184 connect(m_ui.gradientWidget, &QtGradientWidget::startLinearChanged,
185 this, &QtGradientEditorPrivate::startLinearChanged);
186 connect(m_ui.gradientWidget, &QtGradientWidget::endLinearChanged,
187 this, &QtGradientEditorPrivate::endLinearChanged);
188 connect(m_ui.gradientWidget, &QtGradientWidget::centralRadialChanged,
189 this, &QtGradientEditorPrivate::centralRadialChanged);
190 connect(m_ui.gradientWidget, &QtGradientWidget::focalRadialChanged,
191 this, &QtGradientEditorPrivate::focalRadialChanged);
192 connect(m_ui.gradientWidget, &QtGradientWidget::radiusRadialChanged,
193 this, &QtGradientEditorPrivate::radiusRadialChanged);
194 connect(m_ui.gradientWidget, &QtGradientWidget::centralConicalChanged,
195 this, &QtGradientEditorPrivate::centralConicalChanged);
196 connect(m_ui.gradientWidget, &QtGradientWidget::angleConicalChanged,
197 this, &QtGradientEditorPrivate::angleConicalChanged);
199 QGradientStops stops = gradient().stops();
201 m_ui.gradientWidget->setGradientStops(stops);
206 QGradient *gradient =
nullptr;
207 switch (m_ui.gradientWidget->gradientType()) {
208 case QGradient::LinearGradient:
209 gradient =
new QLinearGradient(m_ui.gradientWidget->startLinear(),
210 m_ui.gradientWidget->endLinear());
212 case QGradient::RadialGradient:
213 gradient =
new QRadialGradient(m_ui.gradientWidget->centralRadial(),
214 m_ui.gradientWidget->radiusRadial(),
215 m_ui.gradientWidget->focalRadial());
217 case QGradient::ConicalGradient:
218 gradient =
new QConicalGradient(m_ui.gradientWidget->centralConical(),
219 m_ui.gradientWidget->angleConical());
226 gradient->setStops(m_ui.gradientWidget->gradientStops());
227 gradient->setSpread(m_ui.gradientWidget->gradientSpread());
228 gradient->setCoordinateMode(QGradient::StretchToDeviceMode);
229 QGradient gr = *gradient;
263 QHBoxLayout *hboxLayout =
new QHBoxLayout();
264 hboxLayout->setObjectName(QString::fromUtf8(
"hboxLayout"));
265 hboxLayout->addWidget(m_ui.typeComboBox);
266 hboxLayout->addWidget(m_ui.spreadComboBox);
267 QHBoxLayout *typeLayout =
new QHBoxLayout();
268 typeLayout->setSpacing(0);
269 typeLayout->addWidget(m_ui.linearButton);
270 typeLayout->addWidget(m_ui.radialButton);
271 typeLayout->addWidget(m_ui.conicalButton);
272 hboxLayout->addLayout(typeLayout);
273 QHBoxLayout *spreadLayout =
new QHBoxLayout();
274 spreadLayout->setSpacing(0);
275 spreadLayout->addWidget(m_ui.padButton);
276 spreadLayout->addWidget(m_ui.repeatButton);
277 spreadLayout->addWidget(m_ui.reflectButton);
278 hboxLayout->addLayout(spreadLayout);
279 hboxLayout->addItem(
new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
280 hboxLayout->addWidget(m_ui.detailsButton);
281 m_gridLayout->addLayout(hboxLayout, 0, 0, 1, 2);
285 m_gridLayout->addWidget(m_ui.frame, 1, 0, span, 2);
291 m_gridLayout->addWidget(m_ui.gradientStopsWidget, row, 0, span, 2);
292 QHBoxLayout *hboxLayout1 =
new QHBoxLayout();
293 hboxLayout1->setObjectName(QString::fromUtf8(
"hboxLayout1"));
294 hboxLayout1->addWidget(m_ui.colorLabel);
295 hboxLayout1->addWidget(m_ui.colorButton);
296 hboxLayout1->addWidget(m_ui.hsvRadioButton);
297 hboxLayout1->addWidget(m_ui.rgbRadioButton);
298 hboxLayout1->addItem(
new QSpacerItem(16, 23, QSizePolicy::Expanding, QSizePolicy::Minimum));
302 m_gridLayout->addLayout(hboxLayout1, 3 + addRow, 0, 1, 2);
303 m_gridLayout->addWidget(m_ui.hLabel, 4 + addRow, 0, 1, 1);
304 m_gridLayout->addWidget(m_ui.frame_2, 4 + addRow, 1, 1, 1);
305 m_gridLayout->addWidget(m_ui.sLabel, 5 + addRow, 0, 1, 1);
306 m_gridLayout->addWidget(m_ui.frame_5, 5 + addRow, 1, 1, 1);
307 m_gridLayout->addWidget(m_ui.vLabel, 6 + addRow, 0, 1, 1);
308 m_gridLayout->addWidget(m_ui.frame_3, 6 + addRow, 1, 1, 1);
309 m_gridLayout->addWidget(m_ui.aLabel, 7 + addRow, 0, 1, 1);
310 m_gridLayout->addWidget(m_ui.frame_4, 7 + addRow, 1, 1, 1);
319 QGridLayout *gridLayout = m_gridLayout;
323 if (!m_hiddenWidget) {
324 m_hiddenWidget =
new QWidget();
325 m_hiddenLayout =
new QGridLayout(m_hiddenWidget);
326 m_hiddenLayout->setContentsMargins(0, 0, 0, 0);
327 m_hiddenLayout->setSizeConstraint(QLayout::SetFixedSize);
329 gridLayout = m_hiddenLayout;
331 gridLayout->addWidget(m_ui.label1, 1, col + 0, 1, 1);
332 gridLayout->addWidget(m_ui.spinBox1, 1, col + 1, 1, 1);
333 gridLayout->addWidget(m_ui.label2, 2, col + 0, 1, 1);
334 gridLayout->addWidget(m_ui.spinBox2, 2, col + 1, 1, 1);
335 gridLayout->addWidget(m_ui.label3, 3, col + 0, 1, 1);
336 gridLayout->addWidget(m_ui.spinBox3, 3, col + 1, 1, 1);
337 gridLayout->addWidget(m_ui.label4, 4, col + 0, 1, 1);
338 gridLayout->addWidget(m_ui.spinBox4, 4, col + 1, 1, 1);
339 gridLayout->addWidget(m_ui.label5, 5, col + 0, 1, 1);
340 gridLayout->addWidget(m_ui.spinBox5, 5, col + 1, 1, 1);
341 gridLayout->addItem(
new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 6, col + 0, 1, 1);
342 gridLayout->addWidget(m_ui.line1Widget, 7, col + 0, 1, 2);
343 gridLayout->addWidget(m_ui.zoomLabel, 8, col + 0, 1, 1);
344 gridLayout->addWidget(m_ui.zoomWidget, 8, col + 1, 1, 1);
345 gridLayout->addWidget(m_ui.zoomButtonsWidget, 9, col + 0, 1, 1);
346 gridLayout->addWidget(m_ui.zoomAllButton, 9, col + 1, 1, 1);
347 gridLayout->addItem(
new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Preferred), 10, col + 0, 1, 1);
348 gridLayout->addWidget(m_ui.line2Widget, 11, col + 0, 1, 2);
349 gridLayout->addWidget(m_ui.positionLabel, 12, col + 0, 1, 1);
350 gridLayout->addWidget(m_ui.positionWidget, 12, col + 1, 1, 1);
351 gridLayout->addWidget(m_ui.hueLabel, 13, col + 0, 1, 1);
352 gridLayout->addWidget(m_ui.hueWidget, 13, col + 1, 1, 1);
353 gridLayout->addWidget(m_ui.saturationLabel, 14, col + 0, 1, 1);
354 gridLayout->addWidget(m_ui.saturationWidget, 14, col + 1, 1, 1);
355 gridLayout->addWidget(m_ui.valueLabel, 15, col + 0, 1, 1);
356 gridLayout->addWidget(m_ui.valueWidget, 15, col + 1, 1, 1);
357 gridLayout->addWidget(m_ui.alphaLabel, 16, col + 0, 1, 1);
358 gridLayout->addWidget(m_ui.alphaWidget, 16, col + 1, 1, 1);
361 if (m_hiddenLayout) {
362 delete m_hiddenLayout;
365 if (m_hiddenWidget) {
366 delete m_hiddenWidget;
406 bool blocked = m_ui.detailsButton->signalsBlocked();
407 m_ui.detailsButton->blockSignals(
true);
408 m_ui.detailsButton->setChecked(details);
409 m_ui.detailsButton->blockSignals(blocked);
411 bool updates = q_ptr->updatesEnabled();
412 q_ptr->setUpdatesEnabled(
false);
415 m_gridLayout->setEnabled(
false);
424 emit q_ptr->aboutToShowDetails(details, extensionWidthHint());
427 m_gridLayout =
new QGridLayout(q_ptr);
428 m_gridLayout->setEnabled(
false);
429 m_gridLayout->setObjectName(QString::fromUtf8(
"gridLayout"));
430 m_gridLayout->setContentsMargins(0, 0, 0, 0);
432 m_ui.label4->setVisible(row4Visible());
433 m_ui.label5->setVisible(row5Visible());
434 m_ui.spinBox4->setVisible(row4Visible());
435 m_ui.spinBox5->setVisible(row5Visible());
438 m_gridLayout->setEnabled(
true);
440 q_ptr->setUpdatesEnabled(updates);
478 m_ui.spinBox1->disconnect(
this);
479 m_ui.spinBox2->disconnect(
this);
480 m_ui.spinBox3->disconnect(
this);
481 m_ui.spinBox4->disconnect(
this);
482 m_ui.spinBox5->disconnect(
this);
489 ena = m_gridLayout->isEnabled();
490 m_gridLayout->setEnabled(
false);
493 bool spreadEnabled =
true;
495 if (type == QGradient::LinearGradient) {
496 startLinearXSpinBox = m_ui.spinBox1;
497 setupSpinBox(startLinearXSpinBox, &QtGradientEditorPrivate::slotStartLinearXChanged);
498 m_ui.label1->setText(QCoreApplication::translate(
"QtGradientEditor",
"Start X"));
500 startLinearYSpinBox = m_ui.spinBox2;
501 setupSpinBox(startLinearYSpinBox, &QtGradientEditorPrivate::slotStartLinearYChanged);
502 m_ui.label2->setText(QCoreApplication::translate(
"QtGradientEditor",
"Start Y"));
504 endLinearXSpinBox = m_ui.spinBox3;
505 setupSpinBox(endLinearXSpinBox, &QtGradientEditorPrivate::slotEndLinearXChanged);
506 m_ui.label3->setText(QCoreApplication::translate(
"QtGradientEditor",
"Final X"));
508 endLinearYSpinBox = m_ui.spinBox4;
509 setupSpinBox(endLinearYSpinBox, &QtGradientEditorPrivate::slotEndLinearYChanged);
510 m_ui.label4->setText(QCoreApplication::translate(
"QtGradientEditor",
"Final Y"));
512 setStartLinear(m_ui.gradientWidget->startLinear());
513 setEndLinear(m_ui.gradientWidget->endLinear());
514 }
else if (type == QGradient::RadialGradient) {
515 centralRadialXSpinBox = m_ui.spinBox1;
516 setupSpinBox(centralRadialXSpinBox, &QtGradientEditorPrivate::slotCentralRadialXChanged);
517 m_ui.label1->setText(QCoreApplication::translate(
"QtGradientEditor",
"Central X"));
519 centralRadialYSpinBox = m_ui.spinBox2;
520 setupSpinBox(centralRadialYSpinBox, &QtGradientEditorPrivate::slotCentralRadialYChanged);
521 m_ui.label2->setText(QCoreApplication::translate(
"QtGradientEditor",
"Central Y"));
523 focalRadialXSpinBox = m_ui.spinBox3;
524 setupSpinBox(focalRadialXSpinBox, &QtGradientEditorPrivate::slotFocalRadialXChanged);
525 m_ui.label3->setText(QCoreApplication::translate(
"QtGradientEditor",
"Focal X"));
527 focalRadialYSpinBox = m_ui.spinBox4;
528 setupSpinBox(focalRadialYSpinBox, &QtGradientEditorPrivate::slotFocalRadialYChanged);
529 m_ui.label4->setText(QCoreApplication::translate(
"QtGradientEditor",
"Focal Y"));
531 radiusRadialSpinBox = m_ui.spinBox5;
532 setupSpinBox(radiusRadialSpinBox, &QtGradientEditorPrivate::slotRadiusRadialChanged, 2.0);
533 m_ui.label5->setText(QCoreApplication::translate(
"QtGradientEditor",
"Radius"));
535 setCentralRadial(m_ui.gradientWidget->centralRadial());
536 setFocalRadial(m_ui.gradientWidget->focalRadial());
537 setRadiusRadial(m_ui.gradientWidget->radiusRadial());
538 }
else if (type == QGradient::ConicalGradient) {
539 centralConicalXSpinBox = m_ui.spinBox1;
540 setupSpinBox(centralConicalXSpinBox, &QtGradientEditorPrivate::slotCentralConicalXChanged);
541 m_ui.label1->setText(QCoreApplication::translate(
"QtGradientEditor",
"Central X"));
543 centralConicalYSpinBox = m_ui.spinBox2;
544 setupSpinBox(centralConicalYSpinBox, &QtGradientEditorPrivate::slotCentralConicalYChanged);
545 m_ui.label2->setText(QCoreApplication::translate(
"QtGradientEditor",
"Central Y"));
547 angleConicalSpinBox = m_ui.spinBox3;
548 setupSpinBox(angleConicalSpinBox, &QtGradientEditorPrivate::slotAngleConicalChanged, 360.0, 1.0, 1);
549 m_ui.label3->setText(QCoreApplication::translate(
"QtGradientEditor",
"Angle"));
551 setCentralConical(m_ui.gradientWidget->centralConical());
552 setAngleConical(m_ui.gradientWidget->angleConical());
554 spreadEnabled =
false;
556 m_ui.spreadComboBox->setEnabled(spreadEnabled);
557 m_ui.padButton->setEnabled(spreadEnabled);
558 m_ui.repeatButton->setEnabled(spreadEnabled);
559 m_ui.reflectButton->setEnabled(spreadEnabled);
561 m_ui.label4->setVisible(row4Visible());
562 m_ui.spinBox4->setVisible(row4Visible());
563 m_ui.label5->setVisible(row5Visible());
564 m_ui.spinBox5->setVisible(row5Visible());
567 m_gridLayout->setEnabled(ena);
814void QtGradientEditor::setGradient(
const QGradient &grad)
816 if (grad == gradient())
819 QGradient::Type type = grad.type();
822 case QGradient::LinearGradient: idx = 0;
break;
823 case QGradient::RadialGradient: idx = 1;
break;
824 case QGradient::ConicalGradient: idx = 2;
break;
827 d_ptr->setType(type);
828 d_ptr->m_ui.typeComboBox->setCurrentIndex(idx);
829 d_ptr->m_ui.gradientWidget->setGradientType(type);
830 d_ptr->m_typeGroup->button(idx)->setChecked(
true);
832 QGradient::Spread spread = grad.spread();
834 case QGradient::PadSpread: idx = 0;
break;
835 case QGradient::RepeatSpread: idx = 1;
break;
836 case QGradient::ReflectSpread: idx = 2;
break;
837 default: idx = 0;
break;
839 d_ptr->m_ui.spreadComboBox->setCurrentIndex(idx);
840 d_ptr->m_ui.gradientWidget->setGradientSpread(spread);
841 d_ptr->m_spreadGroup->button(idx)->setChecked(
true);
843 if (type == QGradient::LinearGradient) {
844 const QLinearGradient *gr =
static_cast<
const QLinearGradient *>(&grad);
845 d_ptr->setStartLinear(gr->start());
846 d_ptr->setEndLinear(gr->finalStop());
847 d_ptr->m_ui.gradientWidget->setStartLinear(gr->start());
848 d_ptr->m_ui.gradientWidget->setEndLinear(gr->finalStop());
849 }
else if (type == QGradient::RadialGradient) {
850 const QRadialGradient *gr =
static_cast<
const QRadialGradient *>(&grad);
851 d_ptr->setCentralRadial(gr->center());
852 d_ptr->setFocalRadial(gr->focalPoint());
853 d_ptr->setRadiusRadial(gr->radius());
854 d_ptr->m_ui.gradientWidget->setCentralRadial(gr->center());
855 d_ptr->m_ui.gradientWidget->setFocalRadial(gr->focalPoint());
856 d_ptr->m_ui.gradientWidget->setRadiusRadial(gr->radius());
857 }
else if (type == QGradient::ConicalGradient) {
858 const QConicalGradient *gr =
static_cast<
const QConicalGradient *>(&grad);
859 d_ptr->setCentralConical(gr->center());
860 d_ptr->setAngleConical(gr->angle());
861 d_ptr->m_ui.gradientWidget->setCentralConical(gr->center());
862 d_ptr->m_ui.gradientWidget->setAngleConical(gr->angle());
865 d_ptr->m_gradientStopsController->setGradientStops(grad.stops());
866 d_ptr->m_ui.gradientWidget->setGradientStops(grad.stops());
867 d_ptr->updateGradient(
false);