6#include "ui_qtgradienteditor.h"
9#include <QtCore/qtimer.h>
13using namespace Qt::StringLiterals;
18 QtGradientStopsController *
q_ptr =
nullptr;
64 Ui::QtGradientEditor *
m_ui =
nullptr;
71 m_ui->hueColorLine->setColorComponent(QtColorLine::Hue);
72 m_ui->saturationColorLine->setColorComponent(QtColorLine::Saturation);
73 m_ui->valueColorLine->setColorComponent(QtColorLine::Value);
74 m_ui->alphaColorLine->setColorComponent(QtColorLine::Alpha);
76 m_model =
new QtGradientStopsModel(
this);
77 m_ui->gradientStopsWidget->setGradientStopsModel(
m_model);
80 connect(
m_model, &QtGradientStopsModel::stopMoved,
81 this, &QtGradientStopsControllerPrivate::slotStopMoved);
88 connect(
m_model, &QtGradientStopsModel::stopAdded,
93 connect(
m_ui->hueColorLine, &QtColorLine::colorChanged,
95 connect(
m_ui->saturationColorLine, &QtColorLine::colorChanged,
97 connect(
m_ui->valueColorLine, &QtColorLine::colorChanged,
99 connect(
m_ui->alphaColorLine, &QtColorLine::colorChanged,
101 connect(
m_ui->colorButton, &QtColorButton::colorChanged,
104 connect(
m_ui->hueSpinBox, &QSpinBox::valueChanged,
106 connect(
m_ui->saturationSpinBox, &QSpinBox::valueChanged,
108 connect(
m_ui->valueSpinBox, &QSpinBox::valueChanged,
110 connect(
m_ui->alphaSpinBox, &QSpinBox::valueChanged,
113 connect(
m_ui->positionSpinBox, &QDoubleSpinBox::valueChanged,
116 connect(
m_ui->zoomSpinBox, &QSpinBox::valueChanged,
118 connect(
m_ui->zoomInButton, &QToolButton::clicked,
120 connect(
m_ui->zoomOutButton, &QToolButton::clicked,
122 connect(
m_ui->zoomAllButton, &QToolButton::clicked,
124 connect(
m_ui->gradientStopsWidget, &QtGradientStopsWidget::zoomChanged,
127 connect(
m_ui->hsvRadioButton, &QRadioButton::clicked,
129 connect(
m_ui->rgbRadioButton, &QRadioButton::clicked,
133 m_ui->zoomInButton->setIcon(QIcon(
":/qt-project.org/qtgradienteditor/images/zoomin.png"_L1));
134 m_ui->zoomOutButton->setIcon(QIcon(
":/qt-project.org/qtgradienteditor/images/zoomout.png"_L1));
140 m_ui->positionLabel->setEnabled(enable);
141 m_ui->colorLabel->setEnabled(enable);
142 m_ui->hLabel->setEnabled(enable);
143 m_ui->sLabel->setEnabled(enable);
144 m_ui->vLabel->setEnabled(enable);
145 m_ui->aLabel->setEnabled(enable);
146 m_ui->hueLabel->setEnabled(enable);
147 m_ui->saturationLabel->setEnabled(enable);
148 m_ui->valueLabel->setEnabled(enable);
149 m_ui->alphaLabel->setEnabled(enable);
151 m_ui->positionSpinBox->setEnabled(enable);
152 m_ui->colorButton->setEnabled(enable);
154 m_ui->hueColorLine->setEnabled(enable);
155 m_ui->saturationColorLine->setEnabled(enable);
156 m_ui->valueColorLine->setEnabled(enable);
157 m_ui->alphaColorLine->setEnabled(enable);
159 m_ui->hueSpinBox->setEnabled(enable);
160 m_ui->saturationSpinBox->setEnabled(enable);
161 m_ui->valueSpinBox->setEnabled(enable);
162 m_ui->alphaSpinBox->setEnabled(enable);
167 PositionColorMap data;
168 for (QtGradientStop *stop : stops)
169 data[stop->position()] = stop->color();
175 QGradientStops stops;
176 for (
auto itData = data.cbegin(), cend = data.cend(); itData != cend; ++itData)
177 stops << std::pair<qreal, QColor>(itData.key(), itData.value());
183 m_ui->gradientStopsWidget->setZoom(zoom);
184 m_ui->zoomSpinBox->blockSignals(
true);
185 m_ui->zoomSpinBox->setValue(qRound(zoom * 100));
186 m_ui->zoomSpinBox->blockSignals(
false);
187 bool zoomInEnabled =
true;
188 bool zoomOutEnabled =
true;
189 bool zoomAllEnabled =
true;
191 zoomAllEnabled =
false;
192 zoomOutEnabled =
false;
193 }
else if (zoom >= 100) {
194 zoomInEnabled =
false;
196 m_ui->zoomInButton->setEnabled(zoomInEnabled);
197 m_ui->zoomOutButton->setEnabled(zoomOutEnabled);
198 m_ui->zoomAllButton->setEnabled(zoomAllEnabled);
203 QString h = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"H");
204 QString s = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"S");
205 QString v = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"V");
207 m_ui->hLabel->setText(h);
208 m_ui->sLabel->setText(s);
209 m_ui->vLabel->setText(v);
211 h = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Hue");
212 s = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Sat");
213 v = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Val");
215 const QString hue = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Hue");
216 const QString saturation = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Saturation");
217 const QString value = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Value");
219 m_ui->hLabel->setToolTip(hue);
220 m_ui->hueLabel->setText(h);
221 m_ui->hueColorLine->setToolTip(hue);
222 m_ui->hueColorLine->setColorComponent(QtColorLine::Hue);
224 m_ui->sLabel->setToolTip(saturation);
225 m_ui->saturationLabel->setText(s);
226 m_ui->saturationColorLine->setToolTip(saturation);
227 m_ui->saturationColorLine->setColorComponent(QtColorLine::Saturation);
229 m_ui->vLabel->setToolTip(value);
230 m_ui->valueLabel->setText(v);
231 m_ui->valueColorLine->setToolTip(value);
232 m_ui->valueColorLine->setColorComponent(QtColorLine::Value);
239 QString r = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"R");
240 QString g = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"G");
241 QString b = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"B");
243 m_ui->hLabel->setText(r);
244 m_ui->sLabel->setText(g);
245 m_ui->vLabel->setText(b);
247 QString red = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Red");
248 QString green = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Green");
249 QString blue = QCoreApplication::translate(
"qdesigner_internal::QtGradientStopsController",
"Blue");
251 m_ui->hLabel->setToolTip(red);
252 m_ui->hueLabel->setText(red);
253 m_ui->hueColorLine->setToolTip(red);
254 m_ui->hueColorLine->setColorComponent(QtColorLine::Red);
256 m_ui->sLabel->setToolTip(green);
257 m_ui->saturationLabel->setText(green);
258 m_ui->saturationColorLine->setToolTip(green);
259 m_ui->saturationColorLine->setColorComponent(QtColorLine::Green);
261 m_ui->vLabel->setToolTip(blue);
262 m_ui->valueLabel->setText(blue);
263 m_ui->valueColorLine->setToolTip(blue);
264 m_ui->valueColorLine->setColorComponent(QtColorLine::Blue);
271 m_ui->hueSpinBox->blockSignals(
true);
272 m_ui->saturationSpinBox->blockSignals(
true);
273 m_ui->valueSpinBox->blockSignals(
true);
274 m_ui->alphaSpinBox->blockSignals(
true);
275 if (
m_ui->hsvRadioButton->isChecked()) {
276 if (
m_ui->hueSpinBox->maximum() != 359)
277 m_ui->hueSpinBox->setMaximum(359);
278 if (
m_ui->hueSpinBox->value() != color.hue())
279 m_ui->hueSpinBox->setValue(color.hue());
280 if (
m_ui->saturationSpinBox->value() != color.saturation())
281 m_ui->saturationSpinBox->setValue(color.saturation());
282 if (
m_ui->valueSpinBox->value() != color.value())
283 m_ui->valueSpinBox->setValue(color.value());
285 if (
m_ui->hueSpinBox->maximum() != 255)
286 m_ui->hueSpinBox->setMaximum(255);
287 if (
m_ui->hueSpinBox->value() != color.red())
288 m_ui->hueSpinBox->setValue(color.red());
289 if (
m_ui->saturationSpinBox->value() != color.green())
290 m_ui->saturationSpinBox->setValue(color.green());
291 if (
m_ui->valueSpinBox->value() != color.blue())
292 m_ui->valueSpinBox->setValue(color.blue());
294 m_ui->alphaSpinBox->setValue(color.alpha());
295 m_ui->hueSpinBox->blockSignals(
false);
296 m_ui->saturationSpinBox->blockSignals(
false);
297 m_ui->valueSpinBox->blockSignals(
false);
298 m_ui->alphaSpinBox->blockSignals(
false);
309 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
313 m_ui->saturationColorLine->setColor(stop
->color());
321 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
323 PositionColorMap stops = stopsData(m_model->stops());
324 stops.remove(stop->position());
327 QGradientStops gradStops = makeGradientStops(stops);
328 emit q_ptr->gradientStopsChanged(gradStops);
333 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
335 PositionColorMap stops = stopsData(m_model->stops());
336 const qreal pos1 = stop1->position();
337 const qreal pos2 = stop2->position();
341 QGradientStops gradStops = makeGradientStops(stops);
342 emit q_ptr->gradientStopsChanged(gradStops);
347 PositionColorMap stops = stopsData(m_model->stops());
348 stops[stop->position()] = stop
->color();
350 QGradientStops gradStops = makeGradientStops(stops);
351 emit q_ptr->gradientStopsChanged(gradStops);
356 PositionColorMap stops = stopsData(m_model->stops());
357 stops.remove(stop->position());
359 QGradientStops gradStops = makeGradientStops(stops);
360 emit q_ptr->gradientStopsChanged(gradStops);
367 m_ui->colorButton->setColor(newColor);
368 m_ui->hueColorLine->setColor(newColor);
369 m_ui->saturationColorLine->setColor(newColor);
370 m_ui->valueColorLine->setColor(newColor);
371 m_ui->alphaColorLine->setColor(newColor);
375 PositionColorMap stops = stopsData(m_model->stops());
376 stops[stop->position()] = newColor;
378 QGradientStops gradStops = makeGradientStops(stops);
379 emit q_ptr->gradientStopsChanged(gradStops);
386 QTimer::singleShot(0,
this, &QtGradientStopsControllerPrivate::slotUpdatePositionSpinBox);
397 const qreal pos = current->position();
403 const qreal minPos = pos - first->position() - 0.0004999;
404 const qreal maxPos = pos + 1.0 - last->position() + 0.0004999;
411 if (first->position() == 0.0)
413 if (last->position() == 1.0)
417 const int spinMin = qRound(
m_ui->positionSpinBox->minimum() * 1000);
418 const int spinMax = qRound(
m_ui->positionSpinBox->maximum() * 1000);
420 const int newMin = qRound(min * 1000);
421 const int newMax = qRound(max * 1000);
423 m_ui->positionSpinBox->blockSignals(
true);
424 if (spinMin != newMin || spinMax != newMax) {
425 m_ui->positionSpinBox->setRange(
double(newMin) / 1000,
double(newMax) / 1000);
427 if (
m_ui->positionSpinBox->value() != pos)
428 m_ui->positionSpinBox->setValue(pos);
429 m_ui->positionSpinBox->blockSignals(
false);
438 const auto stops =
m_model->selectedStops();
439 for (QtGradientStop *s : stops) {
441 m_model->changeStop(s, color);
451 const auto stops =
m_model->selectedStops();
452 for (QtGradientStop *s : stops) {
454 QColor c = s->color();
455 if (m_ui->hsvRadioButton->isChecked())
456 c.setHsvF(color.hueF(), c.saturationF(), c.valueF(), c.alphaF());
458 c.setRgbF(color.redF(), c.greenF(), c.blueF(), c.alphaF());
459 m_model->changeStop(s, c);
466 QColor c = m_ui->hueColorLine->color();
467 if (
m_ui->hsvRadioButton->isChecked())
468 c.setHsvF(qreal(color) / 360.0, c.saturationF(), c.valueF(), c.alphaF());
480 const auto stops =
m_model->selectedStops();
481 for (QtGradientStop *s : stops) {
483 QColor c = s->color();
484 if (m_ui->hsvRadioButton->isChecked()) {
485 c.setHsvF(c.hueF(), color.saturationF(), c.valueF(), c.alphaF());
487 if (hue == 360 || hue == -1)
488 c.setHsvF(0.0, c.saturationF(), c.valueF(), c.alphaF());
490 c.setRgbF(c.redF(), color.greenF(), c.blueF(), c.alphaF());
492 m_model->changeStop(s, c);
499 QColor c = m_ui->saturationColorLine->color();
500 if (
m_ui->hsvRadioButton->isChecked())
501 c.setHsvF(c.hueF(), qreal(color) / 255, c.valueF(), c.alphaF());
513 const auto stops =
m_model->selectedStops();
514 for (QtGradientStop *s : stops) {
516 QColor c = s->color();
517 if (m_ui->hsvRadioButton->isChecked()) {
518 c.setHsvF(c.hueF(), c.saturationF(), color.valueF(), c.alphaF());
520 if (hue == 360 || hue == -1)
521 c.setHsvF(0.0, c.saturationF(), c.valueF(), c.alphaF());
523 c.setRgbF(c.redF(), c.greenF(), color.blueF(), c.alphaF());
525 m_model->changeStop(s, c);
532 QColor c = m_ui->valueColorLine->color();
533 if (
m_ui->hsvRadioButton->isChecked())
534 c.setHsvF(c.hueF(), c.saturationF(), qreal(color) / 255, c.alphaF());
546 const auto stops =
m_model->selectedStops();
547 for (QtGradientStop *s : stops) {
549 QColor c = s->color();
550 if (m_ui->hsvRadioButton->isChecked()) {
551 c.setHsvF(c.hueF(), c.saturationF(), c.valueF(), color.alphaF());
553 if (hue == 360 || hue == -1)
554 c.setHsvF(0.0, c.saturationF(), c.valueF(), c.alphaF());
556 c.setRgbF(c.redF(), c.greenF(), c.blueF(), color.alphaF());
558 m_model->changeStop(s, c);
565 QColor c = m_ui->alphaColorLine->color();
566 if (
m_ui->hsvRadioButton->isChecked())
567 c.setHsvF(c.hueF(), c.saturationF(), c.valueF(), qreal(color) / 255);
589 double newZoom =
m_ui->gradientStopsWidget->zoom() * 2;
597 double newZoom =
m_ui->gradientStopsWidget->zoom() / 2;
614 : QObject(parent), d_ptr(
new QtGradientStopsControllerPrivate())
630 d_ptr->m_model->clear();
632 for (
const std::pair<qreal, QColor> &pair : stops) {
633 QtGradientStop *stop = d_ptr->m_model->addStop(pair.first, pair.second);
638 d_ptr->m_model->setCurrentStop(first);
643 QGradientStops stops;
644 const auto stopsList = d_ptr->m_model->stops().values();
645 for (
const QtGradientStop *stop : stopsList)
646 stops.append({stop->position(), stop->color()});
652 return d_ptr->m_spec;
657 if (d_ptr->m_spec == spec)
660 d_ptr->m_spec = spec;
661 if (d_ptr->m_spec == QColor::Rgb) {
662 d_ptr->m_ui->rgbRadioButton->setChecked(
true);
663 d_ptr->slotRgbClicked();
665 d_ptr->m_ui->hsvRadioButton->setChecked(
true);
666 d_ptr->slotHsvClicked();
672#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.