aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickdialogs/quickdialogsquickimpl/qquickcolorinputs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quickdialogs/quickdialogsquickimpl/qquickcolorinputs.cpp')
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qquickcolorinputs.cpp511
1 files changed, 511 insertions, 0 deletions
diff --git a/src/quickdialogs/quickdialogsquickimpl/qquickcolorinputs.cpp b/src/quickdialogs/quickdialogsquickimpl/qquickcolorinputs.cpp
new file mode 100644
index 0000000000..61605681cb
--- /dev/null
+++ b/src/quickdialogs/quickdialogsquickimpl/qquickcolorinputs.cpp
@@ -0,0 +1,511 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qquickcolorinputs_p.h"
+
+#include <QtCore/QRegularExpression>
+
+QT_BEGIN_NAMESPACE
+
+QQuickColorInputs::QQuickColorInputs() = default;
+
+QColor QQuickColorInputs::color() const
+{
+ return QColor::fromHsvF(m_hsva.h, m_hsva.s, m_hsva.v, m_hsva.a);
+}
+
+void QQuickColorInputs::setColor(const QColor &c)
+{
+ if (color().rgba() == c.rgba())
+ return;
+
+ // If we get a QColor from an Hsv or Hsl color system,
+ // we want to get the raw values without the risk of QColor converting them,
+ // and possible deleting relevant information for achromatic cases.
+ if (c.spec() == QColor::Spec::Hsl) {
+ const auto sv = getSaturationAndValue(c.hslSaturationF(), c.lightnessF());
+ m_hsva.h = qBound(.0, c.hslHueF(), 1.0);
+ m_hsva.s = qBound(.0, sv.first, 1.0);
+ m_hsva.v = qBound(.0, sv.second, 1.0);
+ } else {
+ m_hsva.h = qBound(.0, c.hsvHueF(), 1.0);
+ m_hsva.s = qBound(.0, c.hsvSaturationF(), 1.0);
+ m_hsva.v = qBound(.0, c.valueF(), 1.0);
+ }
+
+ m_hsva.a = c.alphaF();
+
+ emit colorChanged(color());
+}
+
+int QQuickColorInputs::red() const
+{
+ return color().red();
+}
+
+int QQuickColorInputs::green() const
+{
+ return color().green();
+}
+
+int QQuickColorInputs::blue() const
+{
+ return color().blue();
+}
+
+qreal QQuickColorInputs::alpha() const
+{
+ return m_hsva.a;
+}
+
+qreal QQuickColorInputs::hue() const
+{
+ return m_hsva.h;
+}
+
+qreal QQuickColorInputs::hslSaturation() const
+{
+ return getSaturationAndLightness(m_hsva.s, m_hsva.v).first;
+}
+
+qreal QQuickColorInputs::hsvSaturation() const
+{
+ return m_hsva.s;
+}
+
+qreal QQuickColorInputs::value() const
+{
+ return m_hsva.v;
+}
+
+qreal QQuickColorInputs::lightness() const
+{
+ return getSaturationAndLightness(m_hsva.s, m_hsva.v).second;
+}
+
+bool QQuickColorInputs::showAlpha() const
+{
+ return m_showAlpha;
+}
+
+void QQuickColorInputs::setShowAlpha(bool showAlpha)
+{
+ if (m_showAlpha == showAlpha)
+ return;
+
+ m_showAlpha = showAlpha;
+ emit showAlphaChanged(m_showAlpha);
+}
+
+QQuickTextInput *QQuickColorInputs::hexInput() const
+{
+ return m_hexInput;
+}
+
+void QQuickColorInputs::setHexInput(QQuickTextInput *hexInput)
+{
+ if (m_hexInput == hexInput)
+ return;
+
+ if (m_hexInput)
+ disconnect(m_hexInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHexChanged);
+
+ m_hexInput = hexInput;
+
+ if (m_hexInput)
+ connect(m_hexInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHexChanged);
+
+ emit hexInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::redInput() const
+{
+ return m_redInput;
+}
+
+void QQuickColorInputs::setRedInput(QQuickTextInput *redInput)
+{
+ if (m_redInput == redInput)
+ return;
+
+ if (m_redInput)
+ disconnect(m_redInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleRedChanged);
+
+ m_redInput = redInput;
+
+ if (m_redInput)
+ connect(m_redInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleRedChanged);
+
+ emit redInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::greenInput() const
+{
+ return m_greenInput;
+}
+
+void QQuickColorInputs::setGreenInput(QQuickTextInput *greenInput)
+{
+ if (m_greenInput == greenInput)
+ return;
+
+ if (m_greenInput)
+ disconnect(m_greenInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleGreenChanged);
+
+ m_greenInput = greenInput;
+
+ if (m_greenInput)
+ connect(m_greenInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleGreenChanged);
+
+ emit greenInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::blueInput() const
+{
+ return m_blueInput;
+}
+
+void QQuickColorInputs::setBlueInput(QQuickTextInput *blueInput)
+{
+ if (m_blueInput == blueInput)
+ return;
+
+ if (m_blueInput)
+ disconnect(m_blueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleBlueChanged);
+
+ m_blueInput = blueInput;
+
+ if (m_blueInput)
+ connect(m_blueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleBlueChanged);
+
+ emit blueInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::hsvHueInput() const
+{
+ return m_hsvHueInput;
+}
+
+void QQuickColorInputs::setHsvHueInput(QQuickTextInput *hsvHueInput)
+{
+ if (m_hsvHueInput == hsvHueInput)
+ return;
+
+ if (m_hsvHueInput)
+ disconnect(m_hsvHueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHsvHueChanged);
+
+ m_hsvHueInput = hsvHueInput;
+
+ if (m_hsvHueInput)
+ connect(m_hsvHueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHsvHueChanged);
+
+ emit hsvHueInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::hslHueInput() const
+{
+ return m_hslHueInput;
+}
+
+void QQuickColorInputs::setHslHueInput(QQuickTextInput *hslHueInput)
+{
+ if (m_hslHueInput == hslHueInput)
+ return;
+
+ if (m_hslHueInput)
+ disconnect(m_hslHueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHslHueChanged);
+
+ m_hslHueInput = hslHueInput;
+
+ if (m_hslHueInput)
+ connect(m_hslHueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHslHueChanged);
+
+ emit hslHueInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::hsvSaturationInput() const
+{
+ return m_hsvSaturationInput;
+}
+
+void QQuickColorInputs::setHsvSaturationInput(QQuickTextInput *hsvSaturationInput)
+{
+ if (m_hsvSaturationInput == hsvSaturationInput)
+ return;
+
+ if (m_hsvSaturationInput)
+ disconnect(m_hsvSaturationInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHsvSaturationChanged);
+
+ m_hsvSaturationInput = hsvSaturationInput;
+
+ if (m_hsvSaturationInput)
+ connect(m_hsvSaturationInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHsvSaturationChanged);
+
+ emit hsvSaturationInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::hslSaturationInput() const
+{
+ return m_hslSaturationInput;
+}
+
+void QQuickColorInputs::setHslSaturationInput(QQuickTextInput *hslSaturationInput)
+{
+ if (m_hslSaturationInput == hslSaturationInput)
+ return;
+
+ if (m_hslSaturationInput)
+ disconnect(m_hslSaturationInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHslSaturationChanged);
+
+ m_hslSaturationInput = hslSaturationInput;
+
+ if (m_hslSaturationInput)
+ connect(m_hslSaturationInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHslSaturationChanged);
+
+ emit hslSaturationInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::valueInput() const
+{
+ return m_valueInput;
+}
+
+void QQuickColorInputs::setValueInput(QQuickTextInput *valueInput)
+{
+ if (m_valueInput == valueInput)
+ return;
+
+ if (m_valueInput)
+ disconnect(m_valueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleValueChanged);
+
+ m_valueInput = valueInput;
+
+ if (m_valueInput)
+ connect(m_valueInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleValueChanged);
+
+ emit valueInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::lightnessInput() const
+{
+ return m_lightnessInput;
+}
+
+void QQuickColorInputs::setLightnessInput(QQuickTextInput *lightnessInput)
+{
+ if (m_lightnessInput == lightnessInput)
+ return;
+
+ if (m_lightnessInput)
+ disconnect(m_lightnessInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleLightnessChanged);
+
+ m_lightnessInput = lightnessInput;
+
+ if (m_lightnessInput)
+ connect(m_lightnessInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleLightnessChanged);
+
+ emit lightnessInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::rgbAlphaInput() const
+{
+ return m_rgbAlphaInput;
+}
+
+void QQuickColorInputs::setRgbAlphaInput(QQuickTextInput *alphaInput)
+{
+ if (alphaInput == m_rgbAlphaInput)
+ return;
+
+ if (m_rgbAlphaInput) {
+ disconnect(m_rgbAlphaInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleRgbAlphaChanged);
+ disconnect(this, &QQuickColorInputs::showAlphaChanged, m_rgbAlphaInput, &QQuickTextInput::setVisible);
+ }
+
+ m_rgbAlphaInput = alphaInput;
+
+ if (m_rgbAlphaInput) {
+ connect(m_rgbAlphaInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleRgbAlphaChanged);
+ connect(this, &QQuickColorInputs::showAlphaChanged, m_rgbAlphaInput, &QQuickTextInput::setVisible);
+ m_rgbAlphaInput->setVisible(showAlpha());
+ }
+
+ emit rgbAlphaInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::hsvAlphaInput() const
+{
+ return m_hsvAlphaInput;
+}
+
+void QQuickColorInputs::setHsvAlphaInput(QQuickTextInput *alphaInput)
+{
+ if (alphaInput == m_hsvAlphaInput)
+ return;
+
+ if (m_hsvAlphaInput) {
+ disconnect(m_hsvAlphaInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHsvAlphaChanged);
+ disconnect(this, &QQuickColorInputs::showAlphaChanged, m_hsvAlphaInput, &QQuickTextInput::setVisible);
+ }
+
+ m_hsvAlphaInput = alphaInput;
+
+ if (m_hsvAlphaInput) {
+ connect(m_hsvAlphaInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHsvAlphaChanged);
+ connect(this, &QQuickColorInputs::showAlphaChanged, m_hsvAlphaInput, &QQuickTextInput::setVisible);
+ m_hsvAlphaInput->setVisible(showAlpha());
+ }
+
+ emit hsvAlphaInputChanged();
+}
+
+QQuickTextInput *QQuickColorInputs::hslAlphaInput() const
+{
+ return m_hslAlphaInput;
+}
+
+void QQuickColorInputs::setHslAlphaInput(QQuickTextInput *alphaInput)
+{
+ if (alphaInput == m_hslAlphaInput)
+ return;
+
+ if (m_hslAlphaInput) {
+ disconnect(m_hslAlphaInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHslAlphaChanged);
+ disconnect(this, &QQuickColorInputs::showAlphaChanged, m_hslAlphaInput, &QQuickTextInput::setVisible);
+ }
+
+ m_hslAlphaInput = alphaInput;
+
+ if (m_hslAlphaInput) {
+ connect(m_hslAlphaInput, &QQuickTextInput::editingFinished, this, &QQuickColorInputs::handleHslAlphaChanged);
+ connect(this, &QQuickColorInputs::showAlphaChanged, m_hslAlphaInput, &QQuickTextInput::setVisible);
+ m_hslAlphaInput->setVisible(showAlpha());
+ }
+
+ emit hslAlphaInputChanged();
+}
+
+void QQuickColorInputs::handleHexChanged()
+{
+ emit colorModified(QColor::fromString(m_hexInput->text()));
+}
+
+void QQuickColorInputs::handleRedChanged()
+{
+ QColor c = color();
+ c.setRed(qBound(0, m_redInput->text().toInt(), 255));
+ emit colorModified(c);
+}
+
+void QQuickColorInputs::handleGreenChanged()
+{
+ QColor c = color();
+ c.setGreen(qBound(0, m_greenInput->text().toInt(), 255));
+ emit colorModified(c);
+}
+
+void QQuickColorInputs::handleBlueChanged()
+{
+ QColor c = color();
+ c.setBlue(qBound(0, m_blueInput->text().toInt(), 255));
+ emit colorModified(c);
+}
+
+static QString s_percentage_pattern = QString::fromUtf8("^(\\d+)%?$");
+static QString s_degree_pattern = QString::fromUtf8("(\\d+)°?$");
+
+void QQuickColorInputs::handleHsvHueChanged()
+{
+ const QRegularExpression pattern(s_degree_pattern);
+ const auto match = pattern.match(m_hsvHueInput->text());
+ if (match.hasMatch()) {
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 360)) / static_cast<qreal>(360);
+ emit colorModified(QColor::fromHsvF(input, hsvSaturation(), value(), alpha()));
+ }
+}
+
+void QQuickColorInputs::handleHslHueChanged()
+{
+ const QRegularExpression pattern(s_degree_pattern);
+ const auto match = pattern.match(m_hslHueInput->text());
+ if (match.hasMatch()) {
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 360)) / static_cast<qreal>(360);
+ emit colorModified(QColor::fromHslF(input, hslSaturation(), lightness(), alpha()));
+ }
+}
+
+void QQuickColorInputs::handleHsvSaturationChanged()
+{
+ const QRegularExpression pattern(s_percentage_pattern);
+ const auto match = pattern.match(m_hsvSaturationInput->text());
+ if (match.hasMatch()) {
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 100)) / static_cast<qreal>(100);
+ emit colorModified(QColor::fromHsvF(hue(), input, value(), alpha()));
+ }
+}
+
+void QQuickColorInputs::handleHslSaturationChanged()
+{
+ const QRegularExpression pattern(s_percentage_pattern);
+ const auto match = pattern.match(m_hslSaturationInput->text());
+ if (match.hasMatch()) {
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 100)) / static_cast<qreal>(100);
+ emit colorModified(QColor::fromHslF(hue(), input, lightness(), alpha()));
+ }
+}
+
+void QQuickColorInputs::handleValueChanged()
+{
+ const QRegularExpression pattern(s_percentage_pattern);
+ const auto match = pattern.match(m_valueInput->text());
+ if (match.hasMatch()) {
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 100)) / static_cast<qreal>(100);
+ emit colorModified(QColor::fromHsvF(hue(), hsvSaturation(), input, alpha()));
+ }
+}
+
+void QQuickColorInputs::handleLightnessChanged()
+{
+ const QRegularExpression pattern(s_percentage_pattern);
+ const auto match = pattern.match(m_lightnessInput->text());
+ if (match.hasMatch()) {
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 100)) / static_cast<qreal>(100);
+ emit colorModified(QColor::fromHslF(hue(), hslSaturation(), input, alpha()));
+ }
+}
+
+void QQuickColorInputs::handleRgbAlphaChanged()
+{
+ handleAlphaChanged(m_rgbAlphaInput->text());
+}
+
+void QQuickColorInputs::handleHsvAlphaChanged()
+{
+ handleAlphaChanged(m_hsvAlphaInput->text());
+}
+
+void QQuickColorInputs::handleHslAlphaChanged()
+{
+ handleAlphaChanged(m_hslAlphaInput->text());
+}
+
+void QQuickColorInputs::handleAlphaChanged(const QString &input)
+{
+ const QRegularExpression pattern(s_percentage_pattern);
+ const auto match = pattern.match(input);
+ if (match.hasMatch()) {
+ QColor c = color();
+ const auto substr = match.captured(1);
+ const qreal input = static_cast<qreal>(qBound(0, substr.toInt(), 100)) / static_cast<qreal>(100);
+ c.setAlphaF(input);
+ emit colorModified(c);
+ }
+}
+
+QT_END_NAMESPACE