5#include "ui_qtgradienteditor.h"
8#include <QtCore/qtimer.h>
12using namespace Qt::StringLiterals;
17 QtGradientStopsController *
q_ptr =
nullptr;
63 Ui::QtGradientEditor *
m_ui =
nullptr;
70 m_ui->hueColorLine->setColorComponent(QtColorLine::Hue);
71 m_ui->saturationColorLine->setColorComponent(QtColorLine::Saturation);
72 m_ui->valueColorLine->setColorComponent(QtColorLine::Value);
73 m_ui->alphaColorLine->setColorComponent(QtColorLine::Alpha);
75 m_model =
new QtGradientStopsModel(
this);
76 m_ui->gradientStopsWidget->setGradientStopsModel(
m_model);
79 connect(
m_model, &QtGradientStopsModel::stopMoved,
80 this, &QtGradientStopsControllerPrivate::slotStopMoved);
87 connect(
m_model, &QtGradientStopsModel::stopAdded,
92 connect(
m_ui->hueColorLine, &QtColorLine::colorChanged,
94 connect(
m_ui->saturationColorLine, &QtColorLine::colorChanged,
96 connect(
m_ui->valueColorLine, &QtColorLine::colorChanged,
98 connect(
m_ui->alphaColorLine, &QtColorLine::colorChanged,
100 connect(
m_ui->colorButton, &QtColorButton::colorChanged,
103 connect(
m_ui->hueSpinBox, &QSpinBox::valueChanged,
105 connect(
m_ui->saturationSpinBox, &QSpinBox::valueChanged,
107 connect(
m_ui->valueSpinBox, &QSpinBox::valueChanged,
109 connect(
m_ui->alphaSpinBox, &QSpinBox::valueChanged,
112 connect(
m_ui->positionSpinBox, &QDoubleSpinBox::valueChanged,
115 connect(
m_ui->zoomSpinBox, &QSpinBox::valueChanged,
117 connect(
m_ui->zoomInButton, &QToolButton::clicked,
119 connect(
m_ui->zoomOutButton, &QToolButton::clicked,
121 connect(
m_ui->zoomAllButton, &QToolButton::clicked,
123 connect(
m_ui->gradientStopsWidget, &QtGradientStopsWidget::zoomChanged,
126 connect(
m_ui->hsvRadioButton, &QRadioButton::clicked,
128 connect(
m_ui->rgbRadioButton, &QRadioButton::clicked,
132 m_ui->zoomInButton->setIcon(QIcon(
":/qt-project.org/qtgradienteditor/images/zoomin.png"_L1));
133 m_ui->zoomOutButton->setIcon(QIcon(
":/qt-project.org/qtgradienteditor/images/zoomout.png"_L1));
139 m_ui->positionLabel->setEnabled(enable);
140 m_ui->colorLabel->setEnabled(enable);
141 m_ui->hLabel->setEnabled(enable);
142 m_ui->sLabel->setEnabled(enable);
143 m_ui->vLabel->setEnabled(enable);
144 m_ui->aLabel->setEnabled(enable);
145 m_ui->hueLabel->setEnabled(enable);
146 m_ui->saturationLabel->setEnabled(enable);
147 m_ui->valueLabel->setEnabled(enable);
148 m_ui->alphaLabel->setEnabled(enable);
150 m_ui->positionSpinBox->setEnabled(enable);
151 m_ui->colorButton->setEnabled(enable);
153 m_ui->hueColorLine->setEnabled(enable);
154 m_ui->saturationColorLine->setEnabled(enable);
155 m_ui->valueColorLine->setEnabled(enable);
156 m_ui->alphaColorLine->setEnabled(enable);
158 m_ui->hueSpinBox->setEnabled(enable);
159 m_ui->saturationSpinBox->setEnabled(enable);
160 m_ui->valueSpinBox->setEnabled(enable);
161 m_ui->alphaSpinBox->setEnabled(enable);
166 PositionColorMap data;
167 for (QtGradientStop *stop : stops)
168 data[stop->position()] = stop->color();
174 QGradientStops stops;
175 for (
auto itData = data.cbegin(), cend = data.cend(); itData != cend; ++itData)
176 stops << std::pair<qreal, QColor>(itData.key(), itData.value());
182 m_ui->gradientStopsWidget->setZoom(zoom);
183 m_ui->zoomSpinBox->blockSignals(
true);
184 m_ui->zoomSpinBox->setValue(qRound(zoom * 100));
185 m_ui->zoomSpinBox->blockSignals(
false);
186 bool zoomInEnabled =
true;
187 bool zoomOutEnabled =
true;
188 bool zoomAllEnabled =
true;
190 zoomAllEnabled =
false;
191 zoomOutEnabled =
false;
192 }
else if (zoom >= 100) {
193 zoomInEnabled =
false;
195 m_ui->zoomInButton->setEnabled(zoomInEnabled);
196 m_ui->zoomOutButton->setEnabled(zoomOutEnabled);
197 m_ui->zoomAllButton->setEnabled(zoomAllEnabled);
202 QString h = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"H");
203 QString s = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"S");
204 QString v = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"V");
206 m_ui->hLabel->setText(h);
207 m_ui->sLabel->setText(s);
208 m_ui->vLabel->setText(v);
210 h = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Hue");
211 s = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Sat");
212 v = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Val");
214 const QString hue = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Hue");
215 const QString saturation = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Saturation");
216 const QString value = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Value");
218 m_ui->hLabel->setToolTip(hue);
219 m_ui->hueLabel->setText(h);
220 m_ui->hueColorLine->setToolTip(hue);
221 m_ui->hueColorLine->setColorComponent(QtColorLine::Hue);
223 m_ui->sLabel->setToolTip(saturation);
224 m_ui->saturationLabel->setText(s);
225 m_ui->saturationColorLine->setToolTip(saturation);
226 m_ui->saturationColorLine->setColorComponent(QtColorLine::Saturation);
228 m_ui->vLabel->setToolTip(value);
229 m_ui->valueLabel->setText(v);
230 m_ui->valueColorLine->setToolTip(value);
231 m_ui->valueColorLine->setColorComponent(QtColorLine::Value);
238 QString r = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"R");
239 QString g = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"G");
240 QString b = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"B");
242 m_ui->hLabel->setText(r);
243 m_ui->sLabel->setText(g);
244 m_ui->vLabel->setText(b);
246 QString red = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Red");
247 QString green = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Green");
248 QString blue = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Blue");
250 m_ui->hLabel->setToolTip(red);
251 m_ui->hueLabel->setText(red);
252 m_ui->hueColorLine->setToolTip(red);
253 m_ui->hueColorLine->setColorComponent(QtColorLine::Red);
255 m_ui->sLabel->setToolTip(green);
256 m_ui->saturationLabel->setText(green);
257 m_ui->saturationColorLine->setToolTip(green);
258 m_ui->saturationColorLine->setColorComponent(QtColorLine::Green);
260 m_ui->vLabel->setToolTip(blue);
261 m_ui->valueLabel->setText(blue);
262 m_ui->valueColorLine->setToolTip(blue);
263 m_ui->valueColorLine->setColorComponent(QtColorLine::Blue);
270 m_ui->hueSpinBox->blockSignals(
true);
271 m_ui->saturationSpinBox->blockSignals(
true);
272 m_ui->valueSpinBox->blockSignals(
true);
273 m_ui->alphaSpinBox->blockSignals(
true);
274 if (
m_ui->hsvRadioButton->isChecked()) {
275 if (
m_ui->hueSpinBox->maximum() != 359)
276 m_ui->hueSpinBox->setMaximum(359);
277 if (
m_ui->hueSpinBox->value() != color.hue())
278 m_ui->hueSpinBox->setValue(color.hue());
279 if (
m_ui->saturationSpinBox->value() != color.saturation())
280 m_ui->saturationSpinBox->setValue(color.saturation());
281 if (
m_ui->valueSpinBox->value() != color.value())
282 m_ui->valueSpinBox->setValue(color.value());
284 if (
m_ui->hueSpinBox->maximum() != 255)
285 m_ui->hueSpinBox->setMaximum(255);
286 if (
m_ui->hueSpinBox->value() != color.red())
287 m_ui->hueSpinBox->setValue(color.red());
288 if (
m_ui->saturationSpinBox->value() != color.green())
289 m_ui->saturationSpinBox->setValue(color.green());
290 if (
m_ui->valueSpinBox->value() != color.blue())
291 m_ui->valueSpinBox->setValue(color.blue());
293 m_ui->alphaSpinBox->setValue(color.alpha());
294 m_ui->hueSpinBox->blockSignals(
false);
295 m_ui->saturationSpinBox->blockSignals(
false);
296 m_ui->valueSpinBox->blockSignals(
false);
297 m_ui->alphaSpinBox->blockSignals(
false);
308 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
312 m_ui->saturationColorLine->setColor(stop
->color());
320 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
322 PositionColorMap stops = stopsData(m_model->stops());
323 stops.remove(stop->position());
326 QGradientStops gradStops = makeGradientStops(stops);
327 emit q_ptr->gradientStopsChanged(gradStops);
332 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
334 PositionColorMap stops = stopsData(m_model->stops());
335 const qreal pos1 = stop1->position();
336 const qreal pos2 = stop2->position();
340 QGradientStops gradStops = makeGradientStops(stops);
341 emit q_ptr->gradientStopsChanged(gradStops);
346 PositionColorMap stops = stopsData(m_model->stops());
347 stops[stop->position()] = stop
->color();
349 QGradientStops gradStops = makeGradientStops(stops);
350 emit q_ptr->gradientStopsChanged(gradStops);
355 PositionColorMap stops = stopsData(m_model->stops());
356 stops.remove(stop->position());
358 QGradientStops gradStops = makeGradientStops(stops);
359 emit q_ptr->gradientStopsChanged(gradStops);
366 m_ui->colorButton->setColor(newColor);
367 m_ui->hueColorLine->setColor(newColor);
368 m_ui->saturationColorLine->setColor(newColor);
369 m_ui->valueColorLine->setColor(newColor);
370 m_ui->alphaColorLine->setColor(newColor);
374 PositionColorMap stops = stopsData(m_model->stops());
375 stops[stop->position()] = newColor;
377 QGradientStops gradStops = makeGradientStops(stops);
378 emit q_ptr->gradientStopsChanged(gradStops);
385 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
396 const qreal pos = current->position();
402 const qreal minPos = pos - first->position() - 0.0004999;
403 const qreal maxPos = pos + 1.0 - last->position() + 0.0004999;
410 if (first->position() == 0.0)
412 if (last->position() == 1.0)
416 const int spinMin = qRound(
m_ui->positionSpinBox->minimum() * 1000);
417 const int spinMax = qRound(
m_ui->positionSpinBox->maximum() * 1000);
419 const int newMin = qRound(min * 1000);
420 const int newMax = qRound(max * 1000);
422 m_ui->positionSpinBox->blockSignals(
true);
423 if (spinMin != newMin || spinMax != newMax) {
424 m_ui->positionSpinBox->setRange(
double(newMin) / 1000,
double(newMax) / 1000);
426 if (
m_ui->positionSpinBox->value() != pos)
427 m_ui->positionSpinBox->setValue(pos);
428 m_ui->positionSpinBox->blockSignals(
false);
437 const auto stops =
m_model->selectedStops();
438 for (QtGradientStop *s : stops) {
440 m_model->changeStop(s, color);
450 const auto stops =
m_model->selectedStops();
451 for (QtGradientStop *s : stops) {
453 QColor c = s->color();
454 if (m_ui->hsvRadioButton->isChecked())
455 c.setHsvF(color.hueF(), c.saturationF(), c.valueF(), c.alphaF());
457 c.setRgbF(color.redF(), c.greenF(), c.blueF(), c.alphaF());
458 m_model->changeStop(s, c);
465 QColor c = m_ui->hueColorLine->color();
466 if (
m_ui->hsvRadioButton->isChecked())
467 c.setHsvF(qreal(color) / 360.0, c.saturationF(), c.valueF(), c.alphaF());
479 const auto stops =
m_model->selectedStops();
480 for (QtGradientStop *s : stops) {
482 QColor c = s->color();
483 if (m_ui->hsvRadioButton->isChecked()) {
484 c.setHsvF(c.hueF(), color.saturationF(), c.valueF(), c.alphaF());
486 if (hue == 360 || hue == -1)
487 c.setHsvF(0.0, c.saturationF(), c.valueF(), c.alphaF());
489 c.setRgbF(c.redF(), color.greenF(), c.blueF(), c.alphaF());
491 m_model->changeStop(s, c);
498 QColor c = m_ui->saturationColorLine->color();
499 if (
m_ui->hsvRadioButton->isChecked())
500 c.setHsvF(c.hueF(), qreal(color) / 255, c.valueF(), c.alphaF());
512 const auto stops =
m_model->selectedStops();
513 for (QtGradientStop *s : stops) {
515 QColor c = s->color();
516 if (m_ui->hsvRadioButton->isChecked()) {
517 c.setHsvF(c.hueF(), c.saturationF(), color.valueF(), c.alphaF());
519 if (hue == 360 || hue == -1)
520 c.setHsvF(0.0, c.saturationF(), c.valueF(), c.alphaF());
522 c.setRgbF(c.redF(), c.greenF(), color.blueF(), c.alphaF());
524 m_model->changeStop(s, c);
531 QColor c = m_ui->valueColorLine->color();
532 if (
m_ui->hsvRadioButton->isChecked())
533 c.setHsvF(c.hueF(), c.saturationF(), qreal(color) / 255, c.alphaF());
545 const auto stops =
m_model->selectedStops();
546 for (QtGradientStop *s : stops) {
548 QColor c = s->color();
549 if (m_ui->hsvRadioButton->isChecked()) {
550 c.setHsvF(c.hueF(), c.saturationF(), c.valueF(), color.alphaF());
552 if (hue == 360 || hue == -1)
553 c.setHsvF(0.0, c.saturationF(), c.valueF(), c.alphaF());
555 c.setRgbF(c.redF(), c.greenF(), c.blueF(), color.alphaF());
557 m_model->changeStop(s, c);
564 QColor c = m_ui->alphaColorLine->color();
565 if (
m_ui->hsvRadioButton->isChecked())
566 c.setHsvF(c.hueF(), c.saturationF(), c.valueF(), qreal(color) / 255);
588 double newZoom =
m_ui->gradientStopsWidget->zoom() * 2;
596 double newZoom =
m_ui->gradientStopsWidget->zoom() / 2;
613 : QObject(parent), d_ptr(
new QtGradientStopsControllerPrivate())
629 d_ptr->m_model->clear();
631 for (
const std::pair<qreal, QColor> &pair : stops) {
632 QtGradientStop *stop = d_ptr->m_model->addStop(pair.first, pair.second);
637 d_ptr->m_model->setCurrentStop(first);
642 QGradientStops stops;
643 const auto stopsList = d_ptr->m_model->stops().values();
644 for (
const QtGradientStop *stop : stopsList)
645 stops.append({stop->position(), stop->color()});
651 return d_ptr->m_spec;
656 if (d_ptr->m_spec == spec)
659 d_ptr->m_spec = spec;
660 if (d_ptr->m_spec == QColor::Rgb) {
661 d_ptr->m_ui->rgbRadioButton->setChecked(
true);
662 d_ptr->slotRgbClicked();
664 d_ptr->m_ui->hsvRadioButton->setChecked(
true);
665 d_ptr->slotHsvClicked();
671#include "qtgradientstopscontroller.moc"
void slotChangeAlphaColor(QColor color)
void slotChangeZoom(int value)
void slotChangeHueColor(QColor color)
void setUi(Ui::QtGradientEditor *ui)
void setColorSpinBoxes(QColor color)
QGradientStops makeGradientStops(const PositionColorMap &data) const
void updateZoom(double zoom)
void slotZoomChanged(double zoom)
void slotChangeColor(QColor color)
void slotChangeHue(int color)
void slotChangePosition(double value)
void slotChangeAlpha(int color)
PositionColorMap stopsData(const PositionStopMap &stops) const
void slotStopChanged(QtGradientStop *stop, QColor newColor)
void slotCurrentStopChanged(QtGradientStop *stop)
void slotChangeSaturationColor(QColor color)
QtGradientStopsModel * m_model
void slotChangeSaturation(int color)
void slotStopRemoved(QtGradientStop *stop)
void slotStopsSwapped(QtGradientStop *stop1, QtGradientStop *stop2)
void slotStopAdded(QtGradientStop *stop)
void slotStopSelected(QtGradientStop *stop, bool selected)
void slotStopMoved(QtGradientStop *stop, qreal newPos)
void slotChangeValueColor(QColor color)
void slotUpdatePositionSpinBox()
Ui::QtGradientEditor * m_ui
void enableCurrent(bool enable)
void slotChangeValue(int color)
void setUi(Ui::QtGradientEditor *editor)
QColor::Spec spec() const
void setGradientStops(const QGradientStops &stops)
~QtGradientStopsController() override
QGradientStops gradientStops() const
void stopSelected(QtGradientStop *stop, bool selected)
void changeStop(QtGradientStop *stop, QColor newColor)
QtGradientStop * currentStop() const
void stopChanged(QtGradientStop *stop, const QColor &newColor)
QtGradientStop * firstSelected() const
void moveStops(double newPosition)
void stopRemoved(QtGradientStop *stop)
void currentStopChanged(QtGradientStop *stop)
void stopsSwapped(QtGradientStop *stop1, QtGradientStop *stop2)
QtGradientStop * lastSelected() const
Combined button and popup list for selecting options.