From 98e5b175e9c51dbfb7f666181805fb3e2b61be5b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 4 Apr 2020 04:22:55 +1100 Subject: [PATCH] colordialog: various improvements that should ultimately be near completion --- app/dialog/color/colordialog.cpp | 54 ++++++++++++++++++++++++++------ app/dialog/color/colordialog.h | 36 ++++++++++++++++++++- 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index 3fe1bd349..1591fd735 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -6,12 +6,16 @@ #include "common/qtutils.h" -ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QWidget *parent) : +ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QString input_cs, QWidget *parent) : QDialog(parent), color_manager_(color_manager) { setWindowTitle(tr("Select Color")); + if (input_cs.isEmpty()) { + input_cs = color_manager_->GetDefaultInputColorSpace(); + } + QVBoxLayout* layout = new QVBoxLayout(this); QSplitter* splitter = new QSplitter(Qt::Horizontal); @@ -37,8 +41,9 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QWidget *pare color_values_widget_ = new ColorValuesWidget(); value_layout->addWidget(color_values_widget_); - ColorSpaceChooser* chooser = new ColorSpaceChooser(color_manager_); - value_layout->addWidget(chooser); + chooser_ = new ColorSpaceChooser(color_manager_); + chooser_->set_input(input_cs); + value_layout->addWidget(chooser_); splitter->setSizes({INT_MAX, 0}); @@ -56,12 +61,23 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QWidget *pare connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); layout->addWidget(buttons); - color_wheel_->SetSelectedColor(start); - hsv_value_gradient_->SetSelectedColor(start); - color_values_widget_->SetColor(start); + { + // Convert reference color to the input space + ColorProcessorPtr linear_to_input = ColorProcessor::Create(color_manager_->GetConfig(), + color_manager_->GetReferenceColorSpace(), + input_cs); - connect(chooser, &ColorSpaceChooser::ColorSpaceChanged, this, &ColorDialog::ColorSpaceChanged); - ColorSpaceChanged(chooser->input(), chooser->display(), chooser->view(), chooser->look()); + Color managed_start = linear_to_input->ConvertColor(start); + + color_wheel_->SetSelectedColor(managed_start); + hsv_value_gradient_->SetSelectedColor(managed_start); + color_values_widget_->SetColor(managed_start); + } + + connect(chooser_, &ColorSpaceChooser::ColorSpaceChanged, this, &ColorDialog::ColorSpaceChanged); + ColorSpaceChanged(chooser_->input(), chooser_->display(), chooser_->view(), chooser_->look()); + + resize(sizeHint().height() * 2, sizeHint().height()); } Color ColorDialog::GetSelectedColor() const @@ -77,9 +93,29 @@ Color ColorDialog::GetSelectedColor() const return selected; } +QString ColorDialog::GetColorSpaceInput() const +{ + return chooser_->input(); +} + +QString ColorDialog::GetColorSpaceDisplay() const +{ + return chooser_->display(); +} + +QString ColorDialog::GetColorSpaceView() const +{ + return chooser_->view(); +} + +QString ColorDialog::GetColorSpaceLook() const +{ + return chooser_->look(); +} + void ColorDialog::ColorSpaceChanged(const QString &input, const QString &display, const QString &view, const QString &look) { - ColorProcessorPtr to_linear_processor_ = ColorProcessor::Create(color_manager_->GetConfig(), input, color_manager_->GetReferenceColorSpace()); + to_linear_processor_ = ColorProcessor::Create(color_manager_->GetConfig(), input, color_manager_->GetReferenceColorSpace()); ColorProcessorPtr to_display = ColorProcessor::Create(color_manager_->GetConfig(), color_manager_->GetReferenceColorSpace(), diff --git a/app/dialog/color/colordialog.h b/app/dialog/color/colordialog.h index 4a2cd56c6..eb7e23735 100644 --- a/app/dialog/color/colordialog.h +++ b/app/dialog/color/colordialog.h @@ -14,10 +14,42 @@ class ColorDialog : public QDialog { Q_OBJECT public: - ColorDialog(ColorManager* color_manager, Color start = Color(1.0f, 1.0f, 1.0f), QWidget* parent = nullptr); + /** + * @brief ColorDialog Constructor + * + * @param color_manager + * + * The ColorManager to use for color management. This must be valid. + * + * @param start + * + * The color to start with. This must be in the color_manager's reference space + * + * @param input_cs + * + * The input range that the user should see. The start color will be converted to this for UI object. + * + * @param parent + * + * QWidget parent. + */ + ColorDialog(ColorManager* color_manager, Color start = Color(1.0f, 1.0f, 1.0f), QString input_cs = QString(), QWidget* parent = nullptr); + /** + * @brief Retrieves the color selected by the user + * + * The color is always returned in the ColorManager's reference space (usually scene linear). + */ Color GetSelectedColor() const; + QString GetColorSpaceInput() const; + + QString GetColorSpaceDisplay() const; + + QString GetColorSpaceView() const; + + QString GetColorSpaceLook() const; + private: ColorManager* color_manager_; @@ -29,6 +61,8 @@ private: ColorProcessorPtr to_linear_processor_; + ColorSpaceChooser* chooser_; + private slots: void ColorSpaceChanged(const QString& input, const QString& display, const QString& view, const QString& look);