53void QQuickColorInputs::setColor(
const QColor &c)
55 Q_D(QQuickColorInputs);
56 if (color().rgba() == c.rgba())
62 if (c.spec() == QColor::Spec::Hsl) {
63 const auto sv = getSaturationAndValue(c.hslSaturationF(), c.lightnessF());
64 d->m_hsva.h = qBound(.0, c.hslHueF(), 1.0);
65 d->m_hsva.s = qBound(.0, sv.first, 1.0);
66 d->m_hsva.v = qBound(.0, sv.second, 1.0);
68 d->m_hsva.h = qBound(.0, c.hsvHueF(), 1.0);
69 d->m_hsva.s = qBound(.0, c.hsvSaturationF(), 1.0);
70 d->m_hsva.v = qBound(.0, c.valueF(), 1.0);
73 d->m_hsva.a = c.alphaF();
75 emit colorChanged(color());
213 Q_Q(QQuickColorInputs);
218 if (!q->delegate() || !q->contentItem()) {
219 qmlWarning(q) <<
"Both delegate and contentItem must be set before repopulating";
223 QScopedValueRollback<
bool> repopulateGuard(m_repopulating,
true);
225 auto removeAllItems = [q](){
226 while (q->count() > 0)
227 q->removeItem(q->itemAt(0));
232 static const QRegularExpressionValidator rgba_validator = QRegularExpressionValidator(QRegularExpression(s_rgba_pattern));
233 static const QRegularExpressionValidator rgb_validator = QRegularExpressionValidator(QRegularExpression(s_rgb_pattern));
234 static const QRegularExpressionValidator percentage_validator = QRegularExpressionValidator(QRegularExpression(s_percentage_pattern));
235 static const QRegularExpressionValidator degree_validator = QRegularExpressionValidator(QRegularExpression(s_degree_pattern));
236 static const QIntValidator intValdator = QIntValidator(0, 255);
238 auto addInputField = [
this, q, removeAllItems](
const QString &name,
const QValidator *validator,
239 void (QQuickColorInputsPrivate::*handler)(),
240 std::function<QString()> textConverter) {
241 const int maxLen = m_currentMode == QQuickColorInputs::Hex ? 9 : 4;
242 const QVariantMap properties = {
243 { QStringLiteral(
"objectName"), QVariant::fromValue(name) },
244 { QStringLiteral(
"validator"), QVariant::fromValue(validator) },
245 { QStringLiteral(
"horizontalAlignment"), QVariant::fromValue(
246 m_currentMode == QQuickColorInputs::Hex ? Qt::AlignLeft : Qt::AlignHCenter) },
247 { QStringLiteral(
"maximumLength"), QVariant::fromValue(maxLen) },
248 { QStringLiteral(
"text"), QVariant::fromValue(textConverter()) }
250 if (QQuickTextInput *item = createDelegateTextInputItem(q->delegate(), properties)) {
251 connect(item, &QQuickTextInput::editingFinished,
this, handler);
252 QObject::connect(q, &QQuickColorInputs::colorChanged, item, [item, textConverter](
const QColor &){ item->setText(textConverter()); });
254 insertItem(q->count(), item);
256 qCWarning(lcColorInputs) <<
"Failed to create delegate for " << name;
261 switch (m_currentMode) {
262 case QQuickColorInputs::Hex:
264 [q](){
return q->color().name(); });
266 case QQuickColorInputs::Rgb:
272 [q](){
return QString::number(qRound(q->alpha() * 100)).append(QStringLiteral(
"%")); });
274 case QQuickColorInputs::Hsv:
276 [q](){
return QString::number(qRound(q->hue() * 360)).append(QStringLiteral(
"°")); });
278 [q](){
return QString::number(qRound(q->hsvSaturation() * 100)).append(QStringLiteral(
"%")); });
280 [q](){
return QString::number(qRound(q->value() * 100)).append(QStringLiteral(
"%")); });
283 [q](){
return QString::number(qRound(q->alpha() * 100)).append(QStringLiteral(
"%")); });
285 case QQuickColorInputs::Hsl:
287 [q](){
return QString::number(qRound(q->hue() * 360)).append(QStringLiteral(
"°")); });
289 [q](){
return QString::number(qRound(q->hslSaturation() * 100)).append(QStringLiteral(
"%")); });
291 [q](){
return QString::number(qRound(q->lightness() * 100)).append(QStringLiteral(
"%")); });
294 [q](){
return QString::number(qRound(q->alpha() * 100)).append(QStringLiteral(
"%")); });
297 qCDebug(lcColorInputs) <<
"Unrecognised mode " << m_currentMode;
301 updateImplicitContentSize();
343 Q_Q(QQuickColorInputs);
344 if (
const auto textInput = qobject_cast<QQuickTextInput *>(q->QObject::sender())) {
346 const auto match = pattern.match(textInput->text());
347 if (match.hasMatch()) {
348 const auto substr = match.captured(1);
349 const qreal input =
static_cast<qreal>(qBound(0, substr.toInt(), 360)) /
static_cast<qreal>(360);
350 const QColor c = m_currentMode == QQuickColorInputs::Hsl ? QColor::fromHslF(input, q->hslSaturation(), q->lightness(), q->alpha())
351 : QColor::fromHsvF(input, q->hsvSaturation(), q->value(), q->alpha());
352 emit q->colorModified(c);