6#include "colordialog.h"
8#include "colordialog_p.h"
10#include "absolutecolor.h"
11#include "chromahuediagram.h"
12#include "cielchd50values.h"
13#include "colorpatch.h"
14#include "constpropagatingrawpointer.h"
15#include "constpropagatinguniquepointer.h"
16#include "gradientslider.h"
18#include "helperconstants.h"
19#include "helperconversion.h"
20#include "helperqttypes.h"
21#include "initializetranslation.h"
22#include "lchadouble.h"
24#include "multispinbox.h"
25#include "multispinboxsection.h"
26#include "oklchvalues.h"
28#include "rgbcolorspace.h"
29#include "rgbcolorspacefactory.h"
30#include "screencolorpicker.h"
32#include "swatchbook.h"
33#include "wheelcolorpicker.h"
38#include <qapplication.h>
39#include <qboxlayout.h>
40#include <qbytearray.h>
42#include <qcoreapplication.h>
43#include <qcoreevent.h>
46#include <qdialogbuttonbox.h>
47#include <qfontmetrics.h>
48#include <qformlayout.h>
50#include <qguiapplication.h>
52#include <qkeysequence.h>
60#include <qpushbutton.h>
61#include <qregularexpression.h>
62#include <qscopedpointer.h>
64#include <qsharedpointer.h>
67#include <qsizepolicy.h>
69#include <qstringbuilder.h>
70#include <qstringliteral.h>
71#include <qtabwidget.h>
72#include <qtoolbutton.h>
73#include <qvalidator.h>
74#include <qversionnumber.h>
79#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
80#include <qcontainerfwd.h>
81#include <qobjectdefs.h>
83#include <qstringlist.h>
86#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
87#include <qstylehints.h>
100QString ColorDialogPrivate::translateColorModel(cmsColorSpaceSignature model)
115 case cmsSigYCbCrData:
136 case cmsSigNamedData:
137 case cmsSig2colorData:
138 case cmsSig3colorData:
139 case cmsSig4colorData:
140 case cmsSig5colorData:
141 case cmsSig6colorData:
142 case cmsSig7colorData:
143 case cmsSig8colorData:
144 case cmsSig9colorData:
145 case cmsSig10colorData:
146 case cmsSig11colorData:
147 case cmsSig12colorData:
148 case cmsSig13colorData:
149 case cmsSig14colorData:
150 case cmsSig15colorData:
153 case cmsSig1colorData:
206void ColorDialogPrivate::retranslateUi()
209 const QPair<QString, QString> percentageInSpinbox =
210 getPrefixSuffix(
tr(
"%1%"));
213 const QPair<QString, QString> arcDegreeInSpinbox =
214 getPrefixSuffix(
tr(
"%1°"));
218 m_rgbColorSpace->profileName().toHtmlEscaped();
222 profileInfo.
append(tableRow.
arg(
tr(
"Name:"), name));
225 const QString maximumCielchD50Chroma =
226 tr(
"%L1 (estimated)")
227 .
arg(m_rgbColorSpace->profileMaximumCielchD50Chroma(),
234 tableRow.
arg(
tr(
"Maximum CIELCh-D50 chroma:"), maximumCielchD50Chroma));
236 const QString maximumOklchChroma =
237 tr(
"%L1 (estimated)")
238 .
arg(m_rgbColorSpace->profileMaximumOklchChroma(),
245 tableRow.
arg(
tr(
"Maximum Oklch chroma:"), maximumOklchChroma));
247 switch (m_rgbColorSpace->profileClass()) {
248 case cmsSigDisplayClass:
250 profileClass =
tr(
"Display profile");
252 case cmsSigAbstractClass:
257 case cmsSigColorSpaceClass:
258 case cmsSigInputClass:
259 case cmsSigLinkClass:
260 case cmsSigNamedColorClass:
261 case cmsSigOutputClass:
269 tableRow.
arg(
tr(
"Profile class:"), profileClass));
272 translateColorModel(m_rgbColorSpace->profileColorModel());
278 profileInfo.
append(tableRow.
arg(
tr(
"Color model:"), colorModel));
281 m_rgbColorSpace->profileManufacturer().toHtmlEscaped();
287 profileInfo.
append(tableRow.
arg(
tr(
"Manufacturer:"), manufacturer));
290 m_rgbColorSpace->profileModel().toHtmlEscaped();
296 profileInfo.
append(tableRow.
arg(
tr(
"Device model:"), (model)));
299 m_rgbColorSpace->profileCreationDateTime();
300 if (!creationDateTime.
isNull()) {
310 tableRow.
arg(
tr(
"Created:"), (creationDateTimeString)));
312 const QVersionNumber iccVersion = m_rgbColorSpace->profileIccVersion();
318 const bool hasMatrixShaper =
319 m_rgbColorSpace->profileHasMatrixShaper();
321 m_rgbColorSpace->profileHasClut();
322 if (hasMatrixShaper || hasClut) {
323 const QString matrixShaperString = tableRow.
arg(
328 tr(
"Implementation:"));
329 if (hasMatrixShaper && hasClut) {
335 matrixShaperString.
arg(
tr(
"Matrices and color lookup tables")));
336 }
else if (hasMatrixShaper) {
341 profileInfo.
append(matrixShaperString.
arg(
tr(
"Matrices")));
342 }
else if (hasClut) {
348 matrixShaperString.
arg(
tr(
"Color lookup tables")));
351 const QString pcsColorModelText =
352 translateColorModel(m_rgbColorSpace->profilePcsColorModel());
353 if (!pcsColorModelText.
isEmpty()) {
359 tableRow.
arg(
tr(
"PCS color model:"), pcsColorModelText));
361 const QString copyright = m_rgbColorSpace->profileCopyright();
366 profileInfo.
append(tableRow.
arg(
tr(
"Copyright:"), copyright));
368 const qint64 fileSize =
369 m_rgbColorSpace->profileFileSize();
375 QLocale().formattedDataSize(fileSize)));
378 m_rgbColorSpace->profileAbsoluteFilePath();
382 profileInfo.
append(tableRow.
arg(
tr(
"File name:"), fileName));
385 m_rgbGroupBox->setToolTip(
QString());
387 const QString tableString = QStringLiteral(
389 "<table border=\"0\" cellpadding=\"2\" cellspacing=\"0\">"
392 m_rgbGroupBox->setToolTip(richTextMarker
398 tr(
"Color space information"),
404 m_ciehlcD50SpinBoxLabel->setText(
tr(
"CIEHL&C D50:"));
408 m_oklchSpinBoxLabel->setText(
tr(
"O&klch:"));
411 m_rgbSpinBoxLabel->setText(
tr(
"&RGB:"));
414 m_rgbLineEditLabel->setText(
tr(
"He&x:"));
416 const int swatchBookIndex = m_tabWidget->indexOf(m_swatchBookWrapperWidget);
417 if (swatchBookIndex >= 0) {
421 const auto mnemonic =
tr(
"&Basic colors");
422 m_tabWidget->setTabToolTip(
424 richTextMarker + fromMnemonicToRichText(mnemonic));
427 const int hueFirstIndex = m_tabWidget->indexOf(m_hueFirstWrapperWidget);
428 if (hueFirstIndex >= 0) {
432 const auto mnemonic =
tr(
"&Hue-based");
433 m_tabWidget->setTabToolTip(
435 richTextMarker + fromMnemonicToRichText(mnemonic));
438 const int lightnessFirstIndex =
439 m_tabWidget->indexOf(m_lightnessFirstWrapperWidget);
440 if (lightnessFirstIndex >= 0) {
446 const auto mnemonic =
tr(
"&Lightness-based");
447 m_tabWidget->setTabToolTip(
449 richTextMarker + fromMnemonicToRichText(mnemonic));
452 const int numericIndex =
453 m_tabWidget->indexOf(m_numericalWidget);
454 if (numericIndex >= 0) {
458 const auto mnemonic =
tr(
"&Numeric");
459 m_tabWidget->setTabToolTip(
461 richTextMarker + fromMnemonicToRichText(mnemonic));
466 m_hslSpinBoxLabel->setText(
tr(
"HS&L:"));
470 m_hsvSpinBoxLabel->setText(
tr(
"HS&V/HSB:"));
473 m_hwbSpinBoxLabel->setText(
tr(
"H&WB:"));
476 m_buttonOK->setText(
tr(
"&OK"));
479 m_buttonCancel->setText(
tr(
"&Cancel"));
481 m_rgbSpinBox->setToolTip(
483 +
tr(
"<p>Red: 0–255</p>"
484 "<p>Green: 0–255</p>"
485 "<p>Blue: 0–255</p>"));
488 m_rgbLineEdit->setToolTip(
490 +
tr(
"<p>Hexadecimal color code, as used in HTML: #RRGGBB</p>"
491 "<p>RR: two-digit code for red: 00–FF</p>"
492 "<p>GG: two-digit code for green: 00–FF</p>"
493 "<p>BB: two-digit code for blue: 00–FF</p>"));
502 m_hslSpinBox->setToolTip(richTextMarker
503 +
tr(
"<p>Hue: 0°–360°</p>"
504 "<p>HSL-Saturation: 0%–100%</p>"
505 "<p>Lightness: 0%–100%</p>"));
516 m_hwbSpinBox->setToolTip(richTextMarker
517 +
tr(
"<p>Hue: 0°–360°</p>"
518 "<p>Whiteness: 0%–100%</p>"
519 "<p>Blackness: 0%–100%</p>"));
529 m_hsvSpinBox->setToolTip(richTextMarker
530 +
tr(
"<p>Hue: 0°–360°</p>"
531 "<p>HSV/HSB-Saturation: 0%–100%</p>"
532 "<p>Brightness/Value: 0%–100%</p>"));
534 m_alphaSpinBox->setPrefix(percentageInSpinbox.first);
535 m_alphaSpinBox->setSuffix(percentageInSpinbox.second);
540 m_lchLightnessSelector->setAccessibleName(
tr(
"Lightness"));
544 m_ciehlcD50SpinBox->setToolTip(richTextMarker
545 +
tr(
"<p>Hue: 0°–360°</p>"
546 "<p>Lightness: 0%–100%</p>"
547 "<p>Chroma: 0–%L1</p>")
548 .arg(CielchD50Values::maximumChroma));
550 constexpr double maxOklchChroma = OklchValues::maximumChroma;
553 m_oklchSpinBox->setToolTip(richTextMarker
554 +
tr(
"<p>Lightness: %L1–%L2</p>"
555 "<p>Chroma: %L3–%L4</p>"
556 "<p>Hue: 0°–360°</p>"
557 "<p>Whitepoint: D65</p>")
558 .arg(0., 0,
'f', okdecimals)
559 .arg(1., 0,
'f', okdecimals)
560 .arg(0., 0,
'f', okdecimals)
561 .arg(maxOklchChroma, 0,
'f', okdecimals));
567 const QString opacityLabel =
tr(
"Op&acity:");
568 m_alphaGradientSlider->setAccessibleName(opacityLabel);
569 m_alphaLabel->setText(opacityLabel);
573 m_hslSpinBox->sectionConfigurations();
574 if (hslSections.
count() != 3) {
576 <<
"Expected 3 sections in HSV MultiSpinBox, but got"
577 << hslSections.
count()
578 <<
"instead. This is a bug in libperceptualcolor.";
580 hslSections[0].setPrefix(arcDegreeInSpinbox.first);
581 hslSections[0].setSuffix(
582 arcDegreeInSpinbox.second + m_multispinboxSectionSeparator);
583 hslSections[1].setPrefix(
584 m_multispinboxSectionSeparator + percentageInSpinbox.first);
585 hslSections[1].setSuffix(
586 percentageInSpinbox.second + m_multispinboxSectionSeparator);
587 hslSections[2].setPrefix(
588 m_multispinboxSectionSeparator + percentageInSpinbox.first);
589 hslSections[2].setSuffix(percentageInSpinbox.second);
590 m_hslSpinBox->setSectionConfigurations(hslSections);
595 m_hwbSpinBox->sectionConfigurations();
596 if (hwbSections.
count() != 3) {
598 <<
"Expected 3 sections in HSV MultiSpinBox, but got"
599 << hwbSections.
count()
600 <<
"instead. This is a bug in libperceptualcolor.";
602 hwbSections[0].setPrefix(arcDegreeInSpinbox.first);
603 hwbSections[0].setSuffix(
604 arcDegreeInSpinbox.second + m_multispinboxSectionSeparator);
605 hwbSections[1].setPrefix(
606 m_multispinboxSectionSeparator + percentageInSpinbox.first);
607 hwbSections[1].setSuffix(
608 percentageInSpinbox.second + m_multispinboxSectionSeparator);
609 hwbSections[2].setPrefix(
610 m_multispinboxSectionSeparator + percentageInSpinbox.first);
611 hwbSections[2].setSuffix(
612 percentageInSpinbox.second);
613 m_hwbSpinBox->setSectionConfigurations(hwbSections);
618 m_hsvSpinBox->sectionConfigurations();
619 if (hsvSections.
count() != 3) {
621 <<
"Expected 3 sections in HSV MultiSpinBox, but got"
622 << hsvSections.
count()
623 <<
"instead. This is a bug in libperceptualcolor.";
625 hsvSections[0].setPrefix(arcDegreeInSpinbox.first);
626 hsvSections[0].setSuffix(
627 arcDegreeInSpinbox.second + m_multispinboxSectionSeparator);
628 hsvSections[1].setPrefix(
629 m_multispinboxSectionSeparator + percentageInSpinbox.first);
630 hsvSections[1].setSuffix(
631 percentageInSpinbox.second + m_multispinboxSectionSeparator);
632 hsvSections[2].setPrefix(
633 m_multispinboxSectionSeparator + percentageInSpinbox.first);
634 hsvSections[2].setSuffix(percentageInSpinbox.second);
635 m_hsvSpinBox->setSectionConfigurations(hsvSections);
640 m_ciehlcD50SpinBox->sectionConfigurations();
641 if (ciehlcD50Sections.
count() != 3) {
643 <<
"Expected 3 sections in HLC MultiSpinBox, but got"
644 << ciehlcD50Sections.
count()
645 <<
"instead. This is a bug in libperceptualcolor.";
647 ciehlcD50Sections[0].setPrefix(arcDegreeInSpinbox.first);
648 ciehlcD50Sections[0].setSuffix(
649 arcDegreeInSpinbox.second + m_multispinboxSectionSeparator);
650 ciehlcD50Sections[1].setPrefix(
651 m_multispinboxSectionSeparator + percentageInSpinbox.first);
652 ciehlcD50Sections[1].setSuffix(
653 percentageInSpinbox.second + m_multispinboxSectionSeparator);
654 ciehlcD50Sections[2].setPrefix(m_multispinboxSectionSeparator);
655 ciehlcD50Sections[2].setSuffix(
QString());
656 m_ciehlcD50SpinBox->setSectionConfigurations(ciehlcD50Sections);
661 m_oklchSpinBox->sectionConfigurations();
662 if (oklchSections.
count() != 3) {
664 <<
"Expected 3 sections in HLC MultiSpinBox, but got"
665 << oklchSections.
count()
666 <<
"instead. This is a bug in libperceptualcolor.";
668 oklchSections[0].setPrefix(
QString());
669 oklchSections[0].setSuffix(m_multispinboxSectionSeparator);
670 oklchSections[1].setPrefix(m_multispinboxSectionSeparator);
671 oklchSections[1].setSuffix(m_multispinboxSectionSeparator);
672 oklchSections[2].setPrefix(
673 m_multispinboxSectionSeparator + arcDegreeInSpinbox.first);
674 oklchSections[2].setSuffix(arcDegreeInSpinbox.second);
675 m_oklchSpinBox->setSectionConfigurations(oklchSections);
678 if (m_screenColorPickerButton) {
683 const auto mnemonic =
tr(
"&Pick screen color");
684 m_screenColorPickerButton->setToolTip(
685 richTextMarker + fromMnemonicToRichText(mnemonic));
686 m_screenColorPickerButton->setShortcut(
695 const auto gamutMnemonic =
696 tr(
"Click to snap to nearest in-&gamut color");
698 richTextMarker + fromMnemonicToRichText(gamutMnemonic);
700 m_ciehlcD50SpinBoxGamutAction->setToolTip(gamutTooltip);
701 m_ciehlcD50SpinBoxGamutAction->setShortcut(gamutShortcut);
702 m_oklchSpinBoxGamutAction->setToolTip(gamutTooltip);
703 m_oklchSpinBoxGamutAction->setShortcut(gamutShortcut);
723void ColorDialogPrivate::reloadIcons()
726 label->setText(QStringLiteral(
"abc"));
731 m_currentIconThemeType = newType;
734 {QStringLiteral(
"paint-swatch"),
737 QStringLiteral(
"palette"),
738 QStringLiteral(
"palette-symbolic")};
739 const int swatchBookIndex =
740 m_tabWidget->indexOf(m_swatchBookWrapperWidget);
741 if (swatchBookIndex >= 0) {
742 m_tabWidget->setTabIcon(swatchBookIndex,
743 qIconFromTheme(swatchBookIcons,
744 QStringLiteral(
"color-swatch"),
750 QStringLiteral(
"color-mode-hue-shift-positive"),
752 const int hueFirstIndex =
753 m_tabWidget->indexOf(m_hueFirstWrapperWidget);
754 if (hueFirstIndex >= 0) {
755 m_tabWidget->setTabIcon(hueFirstIndex,
756 qIconFromTheme(hueFirstIcons,
757 QStringLiteral(
"steering-wheel"),
763 QStringLiteral(
"brightness-high"),
765 const int lightnessFirstIndex =
766 m_tabWidget->indexOf(m_lightnessFirstWrapperWidget);
767 if (lightnessFirstIndex >= 0) {
768 m_tabWidget->setTabIcon(lightnessFirstIndex,
769 qIconFromTheme(lightnessFirstIcons,
770 QStringLiteral(
"brightness-2"),
776 QStringLiteral(
"black_sum"),
778 const int numericIndex =
779 m_tabWidget->indexOf(m_numericalWidget);
780 if (numericIndex >= 0) {
781 m_tabWidget->setTabIcon(numericIndex,
782 qIconFromTheme(numericIcons,
783 QStringLiteral(
"123"),
790 QStringLiteral(
"data-warning"),
791 QStringLiteral(
"dialog-warning-symbolic"),
793 const QIcon gamutIcon = qIconFromTheme(gamutIconNames,
794 QStringLiteral(
"eye-exclamation"),
796 m_ciehlcD50SpinBoxGamutAction->setIcon(gamutIcon);
797 m_oklchSpinBoxGamutAction->setIcon(gamutIcon);
801 QStringLiteral(
"color-picker"),
802 QStringLiteral(
"gtk-color-picker"),
803 QStringLiteral(
"tool_color_picker"),
805 if (!m_screenColorPickerButton.
isNull()) {
806 m_screenColorPickerButton->setIcon(
807 qIconFromTheme(candidates,
808 QStringLiteral(
"color-picker"),
834 m_rgbColorSpace = colorSpace;
836 m_wcsBasicDefaultColor = m_wcsBasicColors.value(4, 2);
839 m_swatchBookBasicColors =
new SwatchBook(m_rgbColorSpace,
841 Qt::Orientation::Horizontal);
843 swatchBookInnerLayout->
addWidget(m_swatchBookBasicColors);
846 swatchBookOuterLayout->
addLayout(swatchBookInnerLayout);
848 m_swatchBookWrapperWidget =
new QWidget();
849 m_swatchBookWrapperWidget->setLayout(swatchBookOuterLayout);
851 m_wheelColorPicker =
new WheelColorPicker(m_rgbColorSpace);
852 m_hueFirstWrapperWidget =
new QWidget;
854 tempHueFirstLayout->
addWidget(m_wheelColorPicker);
855 m_hueFirstWrapperWidget->setLayout(tempHueFirstLayout);
857 m_lchLightnessSelector =
new GradientSlider(m_rgbColorSpace);
868 m_lchLightnessSelector->setColors(black, white);
869 m_chromaHueDiagram =
new ChromaHueDiagram(m_rgbColorSpace);
871 tempLightnesFirstLayout->
addWidget(m_lchLightnessSelector);
872 tempLightnesFirstLayout->
addWidget(m_chromaHueDiagram);
873 m_lightnessFirstWrapperWidget =
new QWidget();
874 m_lightnessFirstWrapperWidget->setLayout(tempLightnesFirstLayout);
876 initializeScreenColorPicker();
890 m_tabWidget->addTab(m_swatchBookWrapperWidget,
QString());
891 m_swatchBookTabShortcut =
new QShortcut(q_pointer);
892 connect(m_swatchBookTabShortcut,
896 m_tabWidget->setCurrentIndex(
897 m_tabWidget->indexOf(m_swatchBookWrapperWidget));
899 connect(m_swatchBookTabShortcut,
903 m_tabWidget->setCurrentIndex(
904 m_tabWidget->indexOf(m_swatchBookWrapperWidget));
907 m_tabWidget->addTab(m_hueFirstWrapperWidget,
QString());
908 m_hueFirstTabShortcut =
new QShortcut(q_pointer);
913 m_tabWidget->setCurrentIndex(
914 m_tabWidget->indexOf(m_hueFirstWrapperWidget));
920 m_tabWidget->setCurrentIndex(
921 m_tabWidget->indexOf(m_hueFirstWrapperWidget));
924 m_tabWidget->addTab(m_lightnessFirstWrapperWidget,
QString());
925 m_lightnessFirstTabShortcut =
new QShortcut(q_pointer);
926 connect(m_lightnessFirstTabShortcut,
930 m_tabWidget->setCurrentIndex(
931 m_tabWidget->indexOf(m_lightnessFirstWrapperWidget));
933 connect(m_lightnessFirstTabShortcut,
937 m_tabWidget->setCurrentIndex(
938 m_tabWidget->indexOf(m_lightnessFirstWrapperWidget));
941 m_tabTable.
insert(&m_swatchBookWrapperWidget,
942 QStringLiteral(
"swatch"));
943 m_tabTable.
insert(&m_hueFirstWrapperWidget,
944 QStringLiteral(
"hue-based"));
945 m_tabTable.
insert(&m_lightnessFirstWrapperWidget,
946 QStringLiteral(
"lightness-based"));
947 m_tabTable.
insert(&m_numericalWidget,
948 QStringLiteral(
"numerical"));
952 &ColorDialogPrivate::saveCurrentTab);
955 m_colorPatch =
new ColorPatch();
956 m_colorPatch->setMinimumSize(m_colorPatch->minimumSizeHint() * 1.5);
959 headerLayout->
addWidget(m_colorPatch, 1);
962 headerLayout->
addWidget(m_screenColorPickerButton,
970 m_numericalWidget = initializeNumericPage();
971 m_numericalTabShortcut =
new QShortcut(q_pointer);
972 connect(m_numericalTabShortcut,
976 m_tabWidget->setCurrentIndex(
977 m_tabWidget->indexOf(m_numericalWidget));
979 connect(m_numericalTabShortcut,
983 m_tabWidget->setCurrentIndex(
984 m_tabWidget->indexOf(m_numericalWidget));
989 m_selectorLayout->addWidget(m_tabWidget);
990 m_selectorLayout->addWidget(m_numericalWidget);
994 m_alphaGradientSlider =
new GradientSlider(m_rgbColorSpace,
995 Qt::Orientation::Horizontal);
996 m_alphaGradientSlider->setSingleStep(singleStepAlpha);
997 m_alphaGradientSlider->setPageStep(pageStepAlpha);
999 m_alphaSpinBox->setAlignment(Qt::AlignmentFlag::AlignRight);
1000 m_alphaSpinBox->setMinimum(0);
1001 m_alphaSpinBox->setMaximum(100);
1003 m_alphaSpinBox->setDecimals(decimals);
1004 m_alphaSpinBox->setSingleStep(singleStepAlpha * 100);
1007 m_alphaLabel =
new QLabel();
1008 m_alphaLabel->setBuddy(m_alphaSpinBox);
1010 m_alphaLayout->
addWidget(m_alphaGradientSlider);
1011 m_alphaLayout->
addWidget(m_alphaSpinBox);
1040 m_buttonBox->installEventFilter(&m_languageChangeEventFilter);
1041 m_buttonOK->installEventFilter(&m_languageChangeEventFilter);
1042 m_buttonCancel->installEventFilter(&m_languageChangeEventFilter);
1054 tempMainLayout->
addLayout(headerLayout);
1055 tempMainLayout->
addLayout(m_selectorLayout);
1056 tempMainLayout->
addLayout(m_alphaLayout);
1058 q_pointer->setLayout(tempMainLayout);
1064 &ColorDialogPrivate::readColorPatchValue
1066 connect(m_swatchBookBasicColors,
1067 &SwatchBook::currentColorChanged,
1069 &ColorDialogPrivate::readSwatchBookBasicColorsValue
1074 &ColorDialogPrivate::readRgbNumericValues
1079 &ColorDialogPrivate::readRgbHexValues
1084 &ColorDialogPrivate::updateRgbHexButBlockSignals
1089 &ColorDialogPrivate::readHslNumericValues
1094 &ColorDialogPrivate::readHwbNumericValues
1099 &ColorDialogPrivate::readHsvNumericValues
1104 &ColorDialogPrivate::readHlcNumericValues
1109 &ColorDialogPrivate::updateHlcButBlockSignals
1114 &ColorDialogPrivate::readOklchNumericValues
1119 &ColorDialogPrivate::updateOklchButBlockSignals
1121 connect(m_lchLightnessSelector,
1124 &ColorDialogPrivate::readLightnessValue
1129 &ColorDialogPrivate::readWheelColorPickerValues
1134 &ColorDialogPrivate::readChromaHueDiagramValue
1136 connect(m_alphaGradientSlider,
1139 &ColorDialogPrivate::updateColorPatch
1141 connect(m_alphaGradientSlider,
1144 [
this](
const qreal newFraction) {
1146 m_alphaSpinBox->setValue(newFraction * 100);
1151 [
this](
const double newValue) {
1154 m_alphaGradientSlider->setValue(newValue / 100);
1158 q_pointer->setOptions(QColorDialog::ColorDialogOption::DontUseNativeDialog);
1166 q_pointer->setWindowTitle(
tr(
"Select color"));
1181 q_pointer->setSizeGripEnabled(
true);
1186 m_ciehlcD50SpinBoxGamutAction =
new QAction(q_pointer);
1187 connect(m_ciehlcD50SpinBoxGamutAction,
1190 &ColorDialogPrivate::updateHlcButBlockSignals
1192 m_oklchSpinBoxGamutAction =
new QAction(q_pointer);
1193 connect(m_oklchSpinBoxGamutAction,
1196 &ColorDialogPrivate::updateOklchButBlockSignals
1201 m_ciehlcD50SpinBoxGamutAction->setVisible(
false);
1202 m_ciehlcD50SpinBox->addActionButton(
1203 m_ciehlcD50SpinBoxGamutAction,
1204 QLineEdit::ActionPosition::TrailingPosition);
1205 m_oklchSpinBoxGamutAction->setVisible(
false);
1206 m_oklchSpinBox->addActionButton(
1207 m_oklchSpinBoxGamutAction,
1208 QLineEdit::ActionPosition::TrailingPosition);
1215 std::optional<QStringList>());
1219#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
1220 connect(qGuiApp->styleHints(),
1223 &ColorDialogPrivate::reloadIcons);
1233 , d_pointer(new ColorDialogPrivate(this))
1251 , d_pointer(new ColorDialogPrivate(this))
1270 , d_pointer(new ColorDialogPrivate(this))
1272 d_pointer->initialize(colorSpace);
1290 , d_pointer(new ColorDialogPrivate(this))
1292 d_pointer->initialize(colorSpace);
1315ColorDialogPrivate::ColorDialogPrivate(
ColorDialog *backLink)
1316 : q_pointer(backLink)
1324 QColor temp = d_pointer->m_currentOpaqueColorRgb.rgbQColor;
1326 static_cast<QColorFloatType
>(
1327 d_pointer->m_alphaGradientSlider->value()));
1349 temp = color.
toRgb();
1354 if (
testOption(ColorDialog::ColorDialogOption::ShowAlphaChannel)) {
1355 d_pointer->m_alphaGradientSlider->setValue(
1356 static_cast<double>(temp.
alphaF()));
1358 d_pointer->m_alphaGradientSlider->setValue(1);
1362 const RgbColor myRgbColor = RgbColor::fromRgbQColor(temp);
1363 d_pointer->setCurrentOpaqueColor(myRgbColor,
nullptr);
1376void ColorDialog::open(
QObject *receiver,
const char *member)
1382 d_pointer->m_receiverToBeDisconnected = receiver;
1383 d_pointer->m_memberToBeDisconnected = member;
1392void ColorDialogPrivate::updateColorPatch()
1394 QColor tempRgbQColor = m_currentOpaqueColorRgb.rgbQColor;
1396 static_cast<QColorFloatType
>(m_alphaGradientSlider->value()));
1397 m_colorPatch->setColor(tempRgbQColor);
1403 const auto cielchD50 =
1405 const auto rgb1 = m_rgbColorSpace->fromCielchD50ToRgb1(cielchD50);
1406 const auto rgb255 = GenericColor(rgb1.first * 255,
1409 const auto rgbColor = RgbColor::fromRgb255(rgb255);
1410 setCurrentOpaqueColor(abs, rgbColor, ignoreWidget);
1414void ColorDialogPrivate::setCurrentOpaqueColor(
const PerceptualColor::RgbColor &rgb,
QWidget *
const ignoreWidget)
1416 const auto temp = rgb.rgb255;
1418 static_cast<QColorFloatType
>(temp.first / 255.),
1419 static_cast<QColorFloatType
>(temp.second / 255.),
1420 static_cast<QColorFloatType
>(temp.third / 255.));
1421 const auto cielchD50 = GenericColor(
1422 m_rgbColorSpace->toCielchD50Double(myQColor.
rgba64()));
1423 setCurrentOpaqueColor(
1447 const PerceptualColor::RgbColor &rgb,
1450 const bool isIdentical = (abs == m_currentOpaqueColorAbs) && (rgb == m_currentOpaqueColorRgb);
1451 if (m_isColorChangeInProgress || isIdentical) {
1458 m_isColorChangeInProgress =
true;
1462 QColor oldQColor = q_pointer->currentColor();
1465 m_currentOpaqueColorAbs = abs;
1466 m_currentOpaqueColorRgb = rgb;
1469 if (m_swatchBookBasicColors != ignoreWidget) {
1470 m_swatchBookBasicColors->setCurrentColor(m_currentOpaqueColorRgb.rgbQColor);
1474 if (m_rgbSpinBox != ignoreWidget) {
1475 m_rgbSpinBox->setSectionValues(
1476 m_currentOpaqueColorRgb.rgb255.toQList3());
1480 if (m_hslSpinBox != ignoreWidget) {
1481 m_hslSpinBox->setSectionValues(
1482 m_currentOpaqueColorRgb.hsl.toQList3());
1486 if (m_hwbSpinBox != ignoreWidget) {
1487 m_hwbSpinBox->setSectionValues(
1488 m_currentOpaqueColorRgb.hwb.toQList3());
1492 if (m_hsvSpinBox != ignoreWidget) {
1493 m_hsvSpinBox->setSectionValues(
1494 m_currentOpaqueColorRgb.hsv.toQList3());
1502 if (m_ciehlcD50SpinBox != ignoreWidget) {
1503 m_ciehlcD50SpinBox->setSectionValues(ciehlcD50);
1508 if (m_oklchSpinBox != ignoreWidget) {
1509 m_oklchSpinBox->setSectionValues(oklch.toQList3());
1513 if (m_rgbLineEdit != ignoreWidget) {
1514 updateRgbHexButBlockSignals();
1518 if (m_lchLightnessSelector != ignoreWidget) {
1519 m_lchLightnessSelector->setValue(
1520 cielchD50.first /
static_cast<qreal
>(100));
1524 if (m_chromaHueDiagram != ignoreWidget) {
1525 m_chromaHueDiagram->setCurrentColor(
1526 cielchD50.reinterpretAsLchToLchDouble());
1530 if (m_wheelColorPicker != ignoreWidget) {
1531 m_wheelColorPicker->setCurrentColor(
1532 cielchD50.reinterpretAsLchToLchDouble());
1536 if (m_alphaGradientSlider != ignoreWidget) {
1537 LchaDouble tempColor;
1538 tempColor.l = cielchD50.first;
1539 tempColor.c = cielchD50.second;
1540 tempColor.h = cielchD50.third;
1542 m_alphaGradientSlider->setFirstColor(tempColor);
1544 m_alphaGradientSlider->setSecondColor(tempColor);
1548 if (m_colorPatch != ignoreWidget) {
1553 if (q_pointer->currentColor() != oldQColor) {
1554 Q_EMIT q_pointer->currentColorChanged(q_pointer->currentColor());
1559 m_isColorChangeInProgress =
false;
1564void ColorDialogPrivate::readLightnessValue()
1566 if (m_isColorChangeInProgress) {
1571 cielchD50.first = m_lchLightnessSelector->value() * 100;
1572 cielchD50 = GenericColor(
1573 m_rgbColorSpace->reduceCielchD50ChromaToFitIntoGamut(
1574 cielchD50.reinterpretAsLchToLchDouble()));
1575 setCurrentOpaqueColor(
1577 m_lchLightnessSelector);
1582void ColorDialogPrivate::readHslNumericValues()
1584 if (m_isColorChangeInProgress) {
1588 const auto temp = RgbColor::fromHsl(
1589 GenericColor(m_hslSpinBox->sectionValues()));
1590 setCurrentOpaqueColor(temp, m_hslSpinBox);
1595void ColorDialogPrivate::readHwbNumericValues()
1597 if (m_isColorChangeInProgress) {
1601 const auto temp = RgbColor::fromHwb(
1602 GenericColor(m_hwbSpinBox->sectionValues()));
1603 setCurrentOpaqueColor(temp, m_hwbSpinBox);
1608void ColorDialogPrivate::readHsvNumericValues()
1610 if (m_isColorChangeInProgress) {
1614 const auto temp = RgbColor::fromHsv(
1615 GenericColor(m_hsvSpinBox->sectionValues()));
1616 setCurrentOpaqueColor(temp, m_hsvSpinBox);
1621void ColorDialogPrivate::readRgbNumericValues()
1623 if (m_isColorChangeInProgress) {
1627 const auto temp = RgbColor::fromRgb255(
1628 GenericColor(m_rgbSpinBox->sectionValues()));
1629 setCurrentOpaqueColor(temp, m_rgbSpinBox);
1634void ColorDialogPrivate::readColorPatchValue()
1636 if (m_isColorChangeInProgress) {
1640 const QColor temp = m_colorPatch->color();
1645 const auto myRgbColor = RgbColor::fromRgbQColor(temp);
1646 setCurrentOpaqueColor(myRgbColor, m_colorPatch);
1651void ColorDialogPrivate::readSwatchBookBasicColorsValue()
1653 if (m_isColorChangeInProgress) {
1657 const QColor temp = m_swatchBookBasicColors->currentColor();
1662 const auto myRgbColor = RgbColor::fromRgbQColor(temp);
1663 setCurrentOpaqueColor(myRgbColor, m_swatchBookBasicColors);
1668void ColorDialogPrivate::readWheelColorPickerValues()
1670 if (m_isColorChangeInProgress) {
1674 const auto cielchD50 = GenericColor(m_wheelColorPicker->currentColor());
1675 setCurrentOpaqueColor(
1677 m_wheelColorPicker);
1682void ColorDialogPrivate::readChromaHueDiagramValue()
1684 if (m_isColorChangeInProgress) {
1688 const auto cielchD50 = GenericColor(m_chromaHueDiagram->currentColor());
1689 setCurrentOpaqueColor(
1691 m_chromaHueDiagram);
1696void ColorDialogPrivate::readRgbHexValues()
1698 if (m_isColorChangeInProgress) {
1702 QString temp = m_rgbLineEdit->text();
1703 if (!temp.
startsWith(QStringLiteral(u
"#"))) {
1704 temp = QStringLiteral(u
"#") + temp;
1709 const auto myRgbColor = RgbColor::fromRgbQColor(rgb);
1710 setCurrentOpaqueColor(myRgbColor, m_rgbLineEdit);
1712 m_isDirtyRgbLineEdit =
true;
1720void ColorDialogPrivate::updateRgbHexButBlockSignals()
1728 const auto &rgbFloat = m_currentOpaqueColorRgb.rgb255;
1741 QStringLiteral(u
"#%1%2%3")
1742 .
arg(qBound(0, qRound(rgbFloat.first), 255),
1746 .
arg(qBound(0, qRound(rgbFloat.second), 255),
1750 .
arg(qBound(0, qRound(rgbFloat.third), 255),
1755 m_rgbLineEdit->setText(hexString);
1763void ColorDialogPrivate::updateHlcButBlockSignals()
1770 m_ciehlcD50SpinBox->setSectionValues(ciehlcD50List);
1771 m_ciehlcD50SpinBoxGamutAction->setVisible(
false);
1779void ColorDialogPrivate::updateOklchButBlockSignals()
1783 m_oklchSpinBox->setSectionValues(oklch.toQList3());
1784 m_oklchSpinBoxGamutAction->setVisible(
false);
1789void ColorDialogPrivate::readHlcNumericValues()
1791 if (m_isColorChangeInProgress) {
1795 QList<double> hlcValues = m_ciehlcD50SpinBox->sectionValues();
1797 lch.h = hlcValues.
at(0);
1798 lch.l = hlcValues.
at(1);
1799 lch.c = hlcValues.
at(2);
1800 if (m_rgbColorSpace->isCielchD50InGamut(lch)) {
1801 m_ciehlcD50SpinBoxGamutAction->setVisible(
false);
1803 m_ciehlcD50SpinBoxGamutAction->setVisible(
true);
1805 const auto myColor = GenericColor(
1806 m_rgbColorSpace->reduceCielchD50ChromaToFitIntoGamut(lch));
1807 setCurrentOpaqueColor(
1810 m_ciehlcD50SpinBox);
1815void ColorDialogPrivate::readOklchNumericValues()
1817 if (m_isColorChangeInProgress) {
1825 LchDouble originalOklch;
1826 originalOklch.l = m_oklchSpinBox->sectionValues().value(0);
1827 originalOklch.c = m_oklchSpinBox->sectionValues().value(1);
1828 originalOklch.h = m_oklchSpinBox->sectionValues().value(2);
1829 if (m_rgbColorSpace->isOklchInGamut(originalOklch)) {
1830 m_oklchSpinBoxGamutAction->setVisible(
false);
1832 m_oklchSpinBoxGamutAction->setVisible(
true);
1834 const auto inGamutOklch = GenericColor(
1835 m_rgbColorSpace->reduceOklchChromaToFitIntoGamut(originalOklch));
1836 const auto inGamutColor =
1838 setCurrentOpaqueColor(inGamutColor,
1847void ColorDialogPrivate::initializeScreenColorPicker()
1849 auto screenPicker =
new ScreenColorPicker(q_pointer);
1850 if (!screenPicker->isAvailable()) {
1854 screenPicker->
setParent(m_screenColorPickerButton);
1855 connect(m_screenColorPickerButton,
1859 [&, screenPicker]() {
1860 const auto myColor = q_pointer->currentColor();
1865 screenPicker->startPicking(
1866 fromFloatingToEightBit(myColor.redF()),
1867 fromFloatingToEightBit(myColor.greenF()),
1868 fromFloatingToEightBit(myColor.blueF()));
1871 &ScreenColorPicker::newColor,
1873 [
this](
const double red,
const double green,
const double blue) {
1874 const GenericColor rgb255
1875 {qBound<double>(0, red * 255, 255),
1876 qBound<double>(0, green * 255, 255),
1877 qBound<double>(0, blue * 255, 255)};
1878 setCurrentOpaqueColor(RgbColor::fromRgb255(rgb255),
nullptr);
1885QWidget *ColorDialogPrivate::initializeNumericPage()
1889 m_rgbSpinBox =
new MultiSpinBox();
1891 MultiSpinBoxSection mySection;
1892 mySection.setDecimals(decimals);
1893 mySection.setMinimum(0);
1894 mySection.setMaximum(255);
1896 mySection.setPrefix(
QString());
1897 mySection.setSuffix(m_multispinboxSectionSeparator);
1898 rgbSections.
append(mySection);
1900 mySection.setPrefix(m_multispinboxSectionSeparator);
1901 mySection.setSuffix(m_multispinboxSectionSeparator);
1902 rgbSections.
append(mySection);
1904 mySection.setPrefix(m_multispinboxSectionSeparator);
1905 mySection.setSuffix(
QString());
1906 rgbSections.
append(mySection);
1908 m_rgbSpinBox->setSectionConfigurations(rgbSections);
1914 m_rgbLineEdit->setMaxLength(7);
1916 QStringLiteral(u
"#?[0-9A-Fa-f]{0,6}"));
1918 tempRegularExpression,
1920 m_rgbLineEdit->setValidator(validator);
1925 m_hslSpinBox =
new MultiSpinBox();
1927 MultiSpinBoxSection mySection;
1928 mySection.setDecimals(decimals);
1930 mySection.setMinimum(0);
1931 mySection.setMaximum(360);
1932 mySection.setWrapping(
true);
1933 hslSections.
append(mySection);
1935 mySection.setMinimum(0);
1936 mySection.setMaximum(100);
1937 mySection.setWrapping(
false);
1938 hslSections.
append(mySection);
1940 mySection.setMinimum(0);
1941 mySection.setMaximum(100);
1942 mySection.setWrapping(
false);
1943 hslSections.
append(mySection);
1945 m_hslSpinBox->setSectionConfigurations(hslSections);
1950 m_hwbSpinBox =
new MultiSpinBox();
1952 MultiSpinBoxSection mySection;
1953 mySection.setDecimals(decimals);
1955 mySection.setMinimum(0);
1956 mySection.setMaximum(360);
1957 mySection.setWrapping(
true);
1958 hwbSections.
append(mySection);
1960 mySection.setMinimum(0);
1961 mySection.setMaximum(100);
1962 mySection.setWrapping(
false);
1963 hwbSections.
append(mySection);
1965 mySection.setMinimum(0);
1966 mySection.setMaximum(100);
1967 mySection.setWrapping(
false);
1968 hwbSections.
append(mySection);
1970 m_hwbSpinBox->setSectionConfigurations(hwbSections);
1975 m_hsvSpinBox =
new MultiSpinBox();
1977 MultiSpinBoxSection mySection;
1978 mySection.setDecimals(decimals);
1980 mySection.setMinimum(0);
1981 mySection.setMaximum(360);
1982 mySection.setWrapping(
true);
1983 hsvSections.
append(mySection);
1985 mySection.setMinimum(0);
1986 mySection.setMaximum(100);
1987 mySection.setWrapping(
false);
1988 hsvSections.
append(mySection);
1990 mySection.setMinimum(0);
1991 mySection.setMaximum(100);
1992 mySection.setWrapping(
false);
1993 hsvSections.
append(mySection);
1995 m_hsvSpinBox->setSectionConfigurations(hsvSections);
2001 m_rgbSpinBoxLabel =
new QLabel();
2002 m_rgbSpinBoxLabel->setBuddy(m_rgbSpinBox);
2003 tempRgbFormLayout->
addRow(m_rgbSpinBoxLabel, m_rgbSpinBox);
2004 m_rgbLineEditLabel =
new QLabel();
2005 m_rgbLineEditLabel->setBuddy(m_rgbLineEdit);
2006 tempRgbFormLayout->
addRow(m_rgbLineEditLabel, m_rgbLineEdit);
2007 m_hslSpinBoxLabel =
new QLabel();
2008 m_hslSpinBoxLabel->setBuddy(m_hslSpinBox);
2009 tempRgbFormLayout->
addRow(m_hslSpinBoxLabel, m_hslSpinBox);
2010 m_hwbSpinBoxLabel =
new QLabel();
2011 m_hwbSpinBoxLabel->setBuddy(m_hwbSpinBox);
2012 tempRgbFormLayout->
addRow(m_hwbSpinBoxLabel, m_hwbSpinBox);
2013 m_hsvSpinBoxLabel =
new QLabel();
2014 m_hsvSpinBoxLabel->setBuddy(m_hsvSpinBox);
2015 tempRgbFormLayout->
addRow(m_hsvSpinBoxLabel, m_hsvSpinBox);
2017 m_rgbGroupBox->setLayout(tempRgbFormLayout);
2024 const auto elidedProfileName = fontMetrics.elidedText(
2025 m_rgbColorSpace->profileName(),
2026 Qt::TextElideMode::ElideRight,
2029 m_rgbGroupBox->setTitle(elidedProfileName);
2035 m_ciehlcD50SpinBox =
new MultiSpinBox;
2036 MultiSpinBoxSection mySection;
2037 mySection.setDecimals(decimals);
2039 mySection.setMinimum(0);
2040 mySection.setMaximum(360);
2041 mySection.setWrapping(
true);
2042 ciehlcD50Sections.
append(mySection);
2044 mySection.setMinimum(0);
2045 mySection.setMaximum(100);
2046 mySection.setWrapping(
false);
2047 ciehlcD50Sections.
append(mySection);
2049 mySection.setMinimum(0);
2050 mySection.setMaximum(CielchD50Values::maximumChroma);
2051 mySection.setWrapping(
false);
2052 ciehlcD50Sections.
append(mySection);
2054 m_ciehlcD50SpinBox->setSectionConfigurations(ciehlcD50Sections);
2060 MultiSpinBoxSection mySection;
2061 m_oklchSpinBox =
new MultiSpinBox;
2063 mySection.setMinimum(0);
2064 mySection.setMaximum(1);
2065 mySection.setSingleStep(singleStepOklabc);
2066 mySection.setWrapping(
false);
2067 mySection.setDecimals(okdecimals);
2068 oklchSections.
append(mySection);
2070 mySection.setMinimum(0);
2071 mySection.setMaximum(OklchValues::maximumChroma);
2072 mySection.setSingleStep(singleStepOklabc);
2073 mySection.setWrapping(
false);
2074 mySection.setDecimals(okdecimals);
2075 oklchSections.
append(mySection);
2077 mySection.setMinimum(0);
2078 mySection.setMaximum(360);
2079 mySection.setSingleStep(1);
2080 mySection.setWrapping(
true);
2081 mySection.setDecimals(decimals);
2082 oklchSections.
append(mySection);
2084 m_oklchSpinBox->setSectionConfigurations(oklchSections);
2093 m_ciehlcD50SpinBoxLabel =
new QLabel();
2094 m_ciehlcD50SpinBoxLabel->setBuddy(m_ciehlcD50SpinBox);
2095 cielabFormLayout->
addRow(m_ciehlcD50SpinBoxLabel, m_ciehlcD50SpinBox);
2096 m_oklchSpinBoxLabel =
new QLabel();
2097 m_oklchSpinBoxLabel->setBuddy(m_oklchSpinBox);
2098 cielabFormLayout->
addRow(m_oklchSpinBoxLabel, m_oklchSpinBox);
2099 tempMainLayout->
addLayout(cielabFormLayout);
2100 tempMainLayout->
addWidget(m_rgbGroupBox);
2111 return d_pointer->m_options;
2122 temp.setFlag(option, on);
2132 if (newOptions == d_pointer->m_options) {
2137 d_pointer->m_options = newOptions;
2140 d_pointer->m_options.setFlag(
2141 QColorDialog::ColorDialogOption::DontUseNativeDialog,
2145 const bool alphaVisibility = d_pointer->m_options.testFlag(
2146 QColorDialog::ColorDialogOption::ShowAlphaChannel);
2147 d_pointer->m_alphaLabel->setVisible(alphaVisibility);
2148 d_pointer->m_alphaGradientSlider->setVisible(alphaVisibility);
2149 d_pointer->m_alphaSpinBox->setVisible(alphaVisibility);
2152 d_pointer->m_buttonBox->setVisible(!d_pointer->m_options.testFlag(
2153 QColorDialog::ColorDialogOption::NoButtons));
2168 return d_pointer->m_options.testFlag(option);
2240 return d_pointer->m_selectedColor;
2256 d_pointer->m_selectedColor =
QColor();
2257 d_pointer->applyLayoutDimensions();
2265 d_pointer->m_buttonOK->setDefault(
true);
2274 if (
result == QDialog::DialogCode::Accepted) {
2278 d_pointer->m_selectedColor =
QColor();
2281 if (d_pointer->m_receiverToBeDisconnected) {
2290 d_pointer->m_receiverToBeDisconnected,
2291 d_pointer->m_memberToBeDisconnected.
constData()
2293 d_pointer->m_receiverToBeDisconnected =
nullptr;
2301 return d_pointer->m_layoutDimensions;
2308 if (newLayoutDimensions == d_pointer->m_layoutDimensions) {
2311 d_pointer->m_layoutDimensions = newLayoutDimensions;
2312 d_pointer->applyLayoutDimensions();
2321void ColorDialogPrivate::applyLayoutDimensions()
2326 constexpr auto screenSizeDependent =
2328 int effectivelyAvailableScreenWidth;
2329 int widthThreeshold;
2330 switch (m_layoutDimensions) {
2332 m_layoutDimensionsEffective = collapsed;
2335 m_layoutDimensionsEffective = expanded;
2337 case screenSizeDependent:
2344 effectivelyAvailableScreenWidth = qRound(
2351 widthThreeshold = qMax(
2352 m_wheelColorPicker->sizeHint().width(),
2353 m_lightnessFirstWrapperWidget->sizeHint().width());
2355 widthThreeshold += m_numericalWidget->sizeHint().width();
2357 widthThreeshold = qRound(widthThreeshold * 1.2);
2360 if (effectivelyAvailableScreenWidth < widthThreeshold) {
2361 m_layoutDimensionsEffective = collapsed;
2363 m_layoutDimensionsEffective = expanded;
2372 if (m_layoutDimensionsEffective == collapsed) {
2373 if (m_selectorLayout->indexOf(m_numericalWidget) >= 0) {
2376 const bool oldUpdatesEnabled = m_tabWidget->updatesEnabled();
2377 m_tabWidget->setUpdatesEnabled(
false);
2381 m_tabWidget->addTab(m_numericalWidget,
QString());
2382 m_tabWidget->setUpdatesEnabled(oldUpdatesEnabled);
2388 q_pointer->adjustSize();
2391 if (m_selectorLayout->indexOf(m_numericalWidget) < 0) {
2394 m_selectorLayout->addWidget(m_numericalWidget);
2397 m_numericalWidget->show();
2399 q_pointer->adjustSize();
2413 const auto type =
event->type();
2422 d_pointer->retranslateUi();
2427 &eventForSwatchBook);
2437 &eventForButtonCancel);
2442 d_pointer->reloadIcons();
2460 if (!d_pointer->everShown) {
2462 const bool exp = d_pointer->m_layoutDimensionsEffective == expValue;
2463 const auto tabString = exp
2464 ? d_pointer->m_settings.tabExpanded.value()
2465 : d_pointer->m_settings.tab.value();
2466 const auto key = d_pointer->m_tabTable.
key(tabString,
nullptr);
2467 if (key !=
nullptr) {
2468 d_pointer->m_tabWidget->setCurrentWidget(*key);
2475 d_pointer->saveCurrentTab();
2476 d_pointer->everShown =
true;
2482void ColorDialogPrivate::saveCurrentTab()
2484 const auto currentIndex = m_tabWidget->currentIndex();
2485 QWidget const *
const widget = m_tabWidget->widget(currentIndex);
2486 const auto keyList = m_tabTable.
keys();
2487 auto it = std::find_if(
2490 [widget](
const auto &key) {
2491 return ((*key) == widget);
2494 if (it != keyList.end()) {
2495 const auto tabString = m_tabTable.
value(*it);
2497 if (m_layoutDimensionsEffective == expValue) {
2498 m_settings.tabExpanded.setValue(tabString);
2500 m_settings.tab.setValue(tabString);
void currentColorChanged(const PerceptualColor::LchDouble &newCurrentColor)
Notify signal for property currentColor.
A perceptually uniform color picker dialog.
void colorSelected(const QColor &color)
This signal is emitted just after the user has clicked OK to select a color to use.
static QColor getColor(const QColor &initial=Qt::white, QWidget *parent=nullptr, const QString &title=QString(), ColorDialogOptions options=ColorDialogOptions())
Pops up a modal color dialog, lets the user choose a color, and returns that color.
virtual void showEvent(QShowEvent *event) override
Handle show events.
virtual void setVisible(bool visible) override
Setter for property visible
Q_INVOKABLE ColorDialog(QWidget *parent=nullptr)
Constructor.
ColorDialogOptions options
Various options that affect the look and feel of the dialog.
Q_INVOKABLE bool testOption(PerceptualColor::ColorDialog::ColorDialogOption option) const
Getter for KConfig Entry Options.
Q_INVOKABLE void setOption(PerceptualColor::ColorDialog::ColorDialogOption option, bool on=true)
Setter for KConfig Entry Options.
QColor currentColor
Currently selected color in the dialog.
void setCurrentColor(const QColor &color)
Setter for currentColor property.
virtual void done(int result) override
Various updates when closing the dialog.
virtual ~ColorDialog() noexcept override
Destructor.
void optionsChanged(const PerceptualColor::ColorDialog::ColorDialogOptions newOptions)
Notify signal for property KConfig Entry Options.
void setOptions(PerceptualColor::ColorDialog::ColorDialogOptions newOptions)
Setter for KConfig Entry Options.
void setLayoutDimensions(const PerceptualColor::ColorDialog::DialogLayoutDimensions newLayoutDimensions)
Setter for property layoutDimensions.
DialogLayoutDimensions
Layout dimensions.
@ Expanded
Use the large, “expanded” layout of this dialog.
@ Collapsed
Use the small, “collapsed“ layout of this dialog.
@ ScreenSizeDependent
Decide automatically between collapsed and expanded layout: collapsed is used on small screens,...
virtual void changeEvent(QEvent *event) override
Handle state changes.
void layoutDimensionsChanged(const PerceptualColor::ColorDialog::DialogLayoutDimensions newLayoutDimensions)
Notify signal for property layoutDimensions.
Q_INVOKABLE QColor selectedColor() const
The color that was actually selected by the user.
DialogLayoutDimensions layoutDimensions
Layout dimensions.
QColorDialog::ColorDialogOptions ColorDialogOptions
Local alias for QColorDialog::ColorDialogOptions.
void colorChanged(const QColor &color)
Notify signal for property color.
void valueChanged(const qreal newValue)
Signal for value property.
void sectionValuesChanged(const QList< double > &newSectionValues)
Notify signal for property sectionValues.
static QSharedPointer< PerceptualColor::RgbColorSpace > createSrgb()
Create an sRGB color space object.
void currentColorChanged(const PerceptualColor::LchDouble &newCurrentColor)
Notify signal for property currentColor.
QString label(StandardShortcut id)
QString name(StandardShortcut id)
The namespace of this library.
ColorSchemeType
Represents the appearance of a theme.
Array2D< QColor > wcsBasicColors(const QSharedPointer< PerceptualColor::RgbColorSpace > &colorSpace)
Palette derived from the basic colors as by WCS (World color survey).
@ OklchD65
Oklch color space, which by definition always and exclusively uses a D65 illuminant.
@ CielchD50
Cielch color space using a D50 illuminant.
void triggered(bool checked)
void addLayout(QLayout *layout, int stretch)
void addStretch(int stretch)
const char * constData() const const
void setNamedColor(QLatin1StringView name)
float alphaF() const const
QColor fromRgbF(float r, float g, float b, float a)
bool isValid() const const
QRgba64 rgba64() const const
void setAlphaF(float alpha)
QColor toRgb() const const
typedef ColorDialogOptions
QCoreApplication * instance()
bool sendEvent(QObject *receiver, QEvent *event)
bool isNull() const const
virtual void setVisible(bool visible) override
virtual void showEvent(QShowEvent *event) override
void valueChanged(double d)
iterator insert(const Key &key, const T &value)
Key key(const T &value) const const
QList< Key > keys() const const
T value(const Key &key) const const
QKeySequence mnemonic(const QString &text)
void textChanged(const QString &text)
void append(QList< T > &&value)
const_reference at(qsizetype i) const const
qsizetype count() const const
bool isEmpty() const const
QString toString(QDate date, FormatType format) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
QObject * parent() const const
QString tr(const char *sourceText, const char *disambiguation, int n)
bool isNull() const const
void activatedAmbiguously()
QString arg(Args &&... args) const const
bool isEmpty() const const
void resize(qsizetype newSize, QChar fillChar)
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
QString toUpper() const const
QString join(QChar separator) const const
void colorSchemeChanged(Qt::ColorScheme colorScheme)
WindowContextHelpButtonHint
QString toString() const const