From 552163320c5c04a1cabf834962fce5dfa0ccbfe4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 3 Apr 2020 01:16:08 +1100 Subject: [PATCH] colorpicker: implemented color management Also moves some items to ColorManager from Project for better accessibility and re-uses some widgets in ExportDialog for improved code. --- app/dialog/color/CMakeLists.txt | 2 + app/dialog/color/colordialog.cpp | 50 ++++++- app/dialog/color/colordialog.h | 10 +- app/dialog/color/colorpreviewbox.cpp | 22 ++- app/dialog/color/colorpreviewbox.h | 7 + app/dialog/color/colorspacechooser.cpp | 140 ++++++++++++++++++ app/dialog/color/colorspacechooser.h | 44 ++++++ app/dialog/color/colorvalueswidget.cpp | 16 ++ app/dialog/color/colorvalueswidget.h | 10 +- app/dialog/export/export.cpp | 7 +- app/dialog/export/exportvideotab.cpp | 72 +-------- app/dialog/export/exportvideotab.h | 15 +- app/project/project.cpp | 6 +- app/project/project.h | 1 - app/render/colormanager.cpp | 10 ++ app/render/colormanager.h | 7 + app/widget/colorbutton/colorbutton.cpp | 7 +- app/widget/colorbutton/colorbutton.h | 5 +- app/widget/colorwheel/colorgradientwidget.cpp | 15 +- app/widget/colorwheel/colorgradientwidget.h | 4 +- app/widget/colorwheel/colorswatchwidget.cpp | 40 ++++- app/widget/colorwheel/colorswatchwidget.h | 13 +- app/widget/colorwheel/colorwheelwidget.cpp | 10 +- app/widget/colorwheel/colorwheelwidget.h | 2 +- .../nodeparamviewwidgetbridge.cpp | 3 +- 25 files changed, 394 insertions(+), 124 deletions(-) create mode 100644 app/dialog/color/colorspacechooser.cpp create mode 100644 app/dialog/color/colorspacechooser.h diff --git a/app/dialog/color/CMakeLists.txt b/app/dialog/color/CMakeLists.txt index e921d67cf..661896880 100644 --- a/app/dialog/color/CMakeLists.txt +++ b/app/dialog/color/CMakeLists.txt @@ -20,6 +20,8 @@ set(OLIVE_SOURCES dialog/color/colordialog.cpp dialog/color/colorpreviewbox.h dialog/color/colorpreviewbox.cpp + dialog/color/colorspacechooser.h + dialog/color/colorspacechooser.cpp dialog/color/colorvalueswidget.h dialog/color/colorvalueswidget.cpp PARENT_SCOPE diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index 277272ee7..8ad333948 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -29,15 +29,25 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QWidget *pare hsv_value_gradient_->setFixedWidth(QFontMetricsWidth(fontMetrics(), QStringLiteral("HHH"))); wheel_layout->addWidget(hsv_value_gradient_); - ColorValuesWidget* cvw = new ColorValuesWidget(); - splitter->addWidget(cvw); + QWidget* value_area = new QWidget(); + QVBoxLayout* value_layout = new QVBoxLayout(value_area); + value_layout->setSpacing(0); + splitter->addWidget(value_area); + + color_values_widget_ = new ColorValuesWidget(); + value_layout->addWidget(color_values_widget_); + + ColorSpaceChooser* chooser = new ColorSpaceChooser(color_manager_); + value_layout->addWidget(chooser); splitter->setSizes({INT_MAX, 0}); - connect(color_wheel_, &ColorWheelWidget::SelectedColorChanged, cvw, &ColorValuesWidget::SetColor); + connect(color_wheel_, &ColorWheelWidget::SelectedColorChanged, color_values_widget_, &ColorValuesWidget::SetColor); connect(color_wheel_, &ColorWheelWidget::SelectedColorChanged, hsv_value_gradient_, &ColorGradientWidget::SetSelectedColor); - connect(hsv_value_gradient_, &ColorGradientWidget::SelectedColorChanged, cvw, &ColorValuesWidget::SetColor); + connect(hsv_value_gradient_, &ColorGradientWidget::SelectedColorChanged, color_values_widget_, &ColorValuesWidget::SetColor); connect(hsv_value_gradient_, &ColorGradientWidget::SelectedColorChanged, color_wheel_, &ColorWheelWidget::SetSelectedColor); + connect(color_values_widget_, &ColorValuesWidget::ColorChanged, hsv_value_gradient_, &ColorGradientWidget::SetSelectedColor); + connect(color_values_widget_, &ColorValuesWidget::ColorChanged, color_wheel_, &ColorWheelWidget::SetSelectedColor); connect(color_wheel_, &ColorWheelWidget::DiameterChanged, hsv_value_gradient_, &ColorGradientWidget::setFixedHeight); @@ -48,10 +58,36 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QWidget *pare color_wheel_->SetSelectedColor(start); hsv_value_gradient_->SetSelectedColor(start); - cvw->SetColor(start); + color_values_widget_->SetColor(start); + + connect(chooser, &ColorSpaceChooser::ColorSpaceChanged, this, &ColorDialog::ColorSpaceChanged); + ColorSpaceChanged(chooser->input(), chooser->display(), chooser->view(), chooser->look()); } -const Color &ColorDialog::GetSelectedColor() const +Color ColorDialog::GetSelectedColor() const { - return color_wheel_->GetSelectedColor(); + Color selected = color_wheel_->GetSelectedColor(); + + // Convert to linear and return a linear color + if (to_linear_processor_) { + return to_linear_processor_->ConvertColor(selected); + } + + // Fallback if no processor is available + return selected; +} + +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, OCIO::ROLE_SCENE_LINEAR); + + ColorProcessorPtr to_display = ColorProcessor::Create(color_manager_->GetConfig(), + OCIO::ROLE_SCENE_LINEAR, + display, + view, + look); + + color_wheel_->SetColorProcessor(to_linear_processor_, to_display); + hsv_value_gradient_->SetColorProcessor(to_linear_processor_, to_display); + color_values_widget_->preview_box()->SetColorProcessor(to_linear_processor_, to_display); } diff --git a/app/dialog/color/colordialog.h b/app/dialog/color/colordialog.h index 6669e8835..4a2cd56c6 100644 --- a/app/dialog/color/colordialog.h +++ b/app/dialog/color/colordialog.h @@ -3,6 +3,7 @@ #include +#include "colorspacechooser.h" #include "colorvalueswidget.h" #include "render/color.h" #include "render/colormanager.h" @@ -15,7 +16,7 @@ class ColorDialog : public QDialog public: ColorDialog(ColorManager* color_manager, Color start = Color(1.0f, 1.0f, 1.0f), QWidget* parent = nullptr); - const Color& GetSelectedColor() const; + Color GetSelectedColor() const; private: ColorManager* color_manager_; @@ -24,6 +25,13 @@ private: ColorGradientWidget* hsv_value_gradient_; + ColorValuesWidget* color_values_widget_; + + ColorProcessorPtr to_linear_processor_; + +private slots: + void ColorSpaceChanged(const QString& input, const QString& display, const QString& view, const QString& look); + }; #endif // COLORDIALOG_H diff --git a/app/dialog/color/colorpreviewbox.cpp b/app/dialog/color/colorpreviewbox.cpp index 4cd478c1b..68ac3727b 100644 --- a/app/dialog/color/colorpreviewbox.cpp +++ b/app/dialog/color/colorpreviewbox.cpp @@ -7,6 +7,14 @@ ColorPreviewBox::ColorPreviewBox(QWidget *parent) : { } +void ColorPreviewBox::SetColorProcessor(ColorProcessorPtr to_linear, ColorProcessorPtr to_display) +{ + to_linear_processor_ = to_linear; + to_display_processor_ = to_display; + + update(); +} + void ColorPreviewBox::SetColor(const Color &c) { color_ = c; @@ -17,14 +25,18 @@ void ColorPreviewBox::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); + QColor c; + + // Color management + if (to_linear_processor_ && to_display_processor_) { + c = to_display_processor_->ConvertColor(to_linear_processor_->ConvertColor(color_)).toQColor(); + } else { + c = color_.toQColor(); + } + QPainter p(this); p.setPen(Qt::black); - - QColor c; - c.setRedF(color_.red()); - c.setGreenF(color_.green()); - c.setBlueF(color_.blue()); p.setBrush(c); p.drawRect(rect()); diff --git a/app/dialog/color/colorpreviewbox.h b/app/dialog/color/colorpreviewbox.h index a6d6fb6a0..936675884 100644 --- a/app/dialog/color/colorpreviewbox.h +++ b/app/dialog/color/colorpreviewbox.h @@ -4,6 +4,7 @@ #include #include "render/color.h" +#include "render/colorprocessor.h" class ColorPreviewBox : public QWidget { @@ -11,6 +12,8 @@ class ColorPreviewBox : public QWidget public: ColorPreviewBox(QWidget* parent = nullptr); + void SetColorProcessor(ColorProcessorPtr to_linear, ColorProcessorPtr to_display); + public slots: void SetColor(const Color& c); @@ -20,6 +23,10 @@ protected: private: Color color_; + ColorProcessorPtr to_linear_processor_; + + ColorProcessorPtr to_display_processor_; + }; #endif // COLORPREVIEWBOX_H diff --git a/app/dialog/color/colorspacechooser.cpp b/app/dialog/color/colorspacechooser.cpp new file mode 100644 index 000000000..2834a2fa3 --- /dev/null +++ b/app/dialog/color/colorspacechooser.cpp @@ -0,0 +1,140 @@ +#include "colorspacechooser.h" + +#include +#include + +ColorSpaceChooser::ColorSpaceChooser(ColorManager* color_manager, bool enable_input_field, QWidget *parent): + QGroupBox(parent), + color_manager_(color_manager) +{ + QGridLayout* layout = new QGridLayout(this); + + setWindowTitle(tr("Color Management")); + + int row = 0; + + if (enable_input_field) { + layout->addWidget(new QLabel(tr("Input:")), row, 0); + + input_combobox_ = new QComboBox(); + layout->addWidget(input_combobox_, row, 1); + + QStringList input_spaces = color_manager->ListAvailableInputColorspaces(); + + foreach (const QString& s, input_spaces) { + input_combobox_->addItem(s); + } + + if (!color_manager_->GetDefaultInputColorSpace().isEmpty()) { + input_combobox_->setCurrentText(color_manager_->GetDefaultInputColorSpace()); + } + + connect(input_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged); + + row++; + } else { + input_combobox_ = nullptr; + } + + { + layout->addWidget(new QLabel(tr("Display:")), row, 0); + + display_combobox_ = new QComboBox(); + layout->addWidget(display_combobox_, row, 1); + + QStringList display_spaces = color_manager->ListAvailableDisplays(); + + foreach (const QString& s, display_spaces) { + display_combobox_->addItem(s); + } + + display_combobox_->setCurrentText(color_manager_->GetDefaultDisplay()); + + connect(display_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged); + connect(display_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::UpdateViews); + } + + row++; + + { + layout->addWidget(new QLabel(tr("View:")), row, 0); + + view_combobox_ = new QComboBox(); + layout->addWidget(view_combobox_, row, 1); + + UpdateViews(display_combobox_->currentText()); + + connect(view_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged); + } + + row++; + + { + layout->addWidget(new QLabel(tr("Look:")), row, 0); + + look_combobox_ = new QComboBox(); + layout->addWidget(look_combobox_, row, 1); + + QStringList looks = color_manager->ListAvailableLooks(); + + foreach (const QString& s, looks) { + look_combobox_->addItem(s); + } + + connect(look_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged); + } +} + +QString ColorSpaceChooser::input() const +{ + if (input_combobox_) { + return input_combobox_->currentText(); + } else { + return QString(); + } +} + +QString ColorSpaceChooser::display() const +{ + return display_combobox_->currentText(); +} + +QString ColorSpaceChooser::view() const +{ + return view_combobox_->currentText(); +} + +QString ColorSpaceChooser::look() const +{ + return look_combobox_->currentText(); +} + +void ColorSpaceChooser::UpdateViews(const QString& s) +{ + QString v = view_combobox_->currentText(); + + view_combobox_->clear(); + + QStringList views = color_manager_->ListAvailableViews(s); + + foreach (const QString& s, views) { + view_combobox_->addItem(s); + } + + if (views.contains(v)) { + // If we have the view we had before, set it again + view_combobox_->setCurrentText(v); + } else { + // Otherwise reset to default view for this display + view_combobox_->setCurrentText(color_manager_->GetDefaultView(s)); + } +} + +void ColorSpaceChooser::ComboBoxChanged() +{ + if (input_combobox_) { + emit ColorSpaceChanged(input(), display(), view(), look()); + } + + emit DisplayColorSpaceChanged(display(), view(), look()); +} diff --git a/app/dialog/color/colorspacechooser.h b/app/dialog/color/colorspacechooser.h new file mode 100644 index 000000000..4fd2944ed --- /dev/null +++ b/app/dialog/color/colorspacechooser.h @@ -0,0 +1,44 @@ +#ifndef COLORSPACECHOOSER_H +#define COLORSPACECHOOSER_H + +#include +#include + +#include "render/colormanager.h" + +class ColorSpaceChooser : public QGroupBox +{ + Q_OBJECT +public: + ColorSpaceChooser(ColorManager* color_manager, bool enable_input_field = true, QWidget* parent = nullptr); + + QString input() const; + QString display() const; + QString view() const; + QString look() const; + +signals: + void ColorSpaceChanged(const QString& input, const QString& display, const QString& view, const QString& look); + + void DisplayColorSpaceChanged(const QString& display, const QString& view, const QString& look); + +private slots: + void UpdateViews(const QString &s); + +private: + ColorManager* color_manager_; + + QComboBox* input_combobox_; + + QComboBox* display_combobox_; + + QComboBox* view_combobox_; + + QComboBox* look_combobox_; + +private slots: + void ComboBoxChanged(); + +}; + +#endif // COLORSPACECHOOSER_H diff --git a/app/dialog/color/colorvalueswidget.cpp b/app/dialog/color/colorvalueswidget.cpp index 7d5042d62..0b815b21d 100644 --- a/app/dialog/color/colorvalueswidget.cpp +++ b/app/dialog/color/colorvalueswidget.cpp @@ -44,6 +44,11 @@ Color ColorValuesWidget::GetColor() const blue_slider_->GetValue()); } +ColorPreviewBox *ColorValuesWidget::preview_box() const +{ + return preview_; +} + void ColorValuesWidget::SetColor(const Color &c) { red_slider_->SetValue(c.red()); @@ -58,5 +63,16 @@ FloatSlider *ColorValuesWidget::CreateColorSlider() fs->SetMinimum(0); fs->SetDragMultiplier(0.01); fs->SetMaximum(1); + fs->SetDecimalPlaces(3); + connect(fs, &FloatSlider::ValueChanged, this, &ColorValuesWidget::SliderChanged); return fs; } + +void ColorValuesWidget::SliderChanged() +{ + Color c(red_slider_->GetValue(), green_slider_->GetValue(), blue_slider_->GetValue()); + + preview_->SetColor(c); + + emit ColorChanged(c); +} diff --git a/app/dialog/color/colorvalueswidget.h b/app/dialog/color/colorvalueswidget.h index aa495f5da..2307bf469 100644 --- a/app/dialog/color/colorvalueswidget.h +++ b/app/dialog/color/colorvalueswidget.h @@ -15,11 +15,16 @@ public: Color GetColor() const; + ColorPreviewBox* preview_box() const; + public slots: void SetColor(const Color& c); +signals: + void ColorChanged(const Color& c); + private: - static FloatSlider* CreateColorSlider(); + FloatSlider* CreateColorSlider(); ColorPreviewBox* preview_; @@ -27,6 +32,9 @@ private: FloatSlider* green_slider_; FloatSlider* blue_slider_; +private slots: + void SliderChanged(); + }; #endif // COLORVALUESWIDGET_H diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 4e37338f0..2d7cd1f63 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -177,9 +177,10 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : connect(video_tab_->scaling_method_combobox(), SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateViewerDimensions())); connect(video_tab_->maintain_aspect_checkbox(), SIGNAL(toggled(bool)), this, SLOT(ResolutionChanged())); connect(video_tab_->codec_combobox(), SIGNAL(currentIndexChanged(int)), this, SLOT(VideoCodecChanged())); - connect(video_tab_, SIGNAL(DisplayChanged(const QString&)), preview_viewer_, SLOT(SetOCIODisplay(const QString&))); - connect(video_tab_, SIGNAL(ViewChanged(const QString&)), preview_viewer_, SLOT(SetOCIOView(const QString&))); - connect(video_tab_, SIGNAL(LookChanged(const QString&)), preview_viewer_, SLOT(SetOCIOLook(const QString&))); + connect(video_tab_, + &ExportVideoTab::DisplayColorSpaceChanged, + preview_viewer_, + static_cast(&ViewerWidget::SetOCIOParameters)); // Set viewer to view the node preview_viewer_->ConnectViewerNode(viewer_node_); diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 78b5421d0..7f6b773e1 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -60,17 +60,17 @@ void ExportVideoTab::set_frame_rate(const rational &frame_rate) QString ExportVideoTab::CurrentOCIODisplay() { - return display_combobox_->currentData().toString(); + return color_space_chooser_->display(); } QString ExportVideoTab::CurrentOCIOView() { - return views_combobox_->currentData().toString(); + return color_space_chooser_->view(); } QString ExportVideoTab::CurrentOCIOLook() { - return looks_combobox_->currentData().toString(); + return color_space_chooser_->look(); } CodecSection *ExportVideoTab::GetCodecSection() const @@ -153,47 +153,9 @@ QWidget* ExportVideoTab::SetupResolutionSection() QWidget* ExportVideoTab::SetupColorSection() { - int row = 0; - - QGroupBox* color_group = new QGroupBox(); - color_group->setTitle(tr("Color Management")); - - QGridLayout* color_layout = new QGridLayout(color_group); - - color_layout->addWidget(new QLabel(tr("Display:")), row, 0); - - QStringList displays = color_manager_->ListAvailableDisplays(); - display_combobox_ = new QComboBox(); - foreach (const QString& display, displays) { - display_combobox_->addItem(display, display); - } - connect(display_combobox_, SIGNAL(currentIndexChanged(int)), this, SLOT(ColorDisplayChanged())); - color_layout->addWidget(display_combobox_, row, 1); - - row++; - - views_combobox_ = new QComboBox(); - color_layout->addWidget(new QLabel(tr("View:")), row, 0); - color_layout->addWidget(views_combobox_, row, 1); - connect(views_combobox_, SIGNAL(currentIndexChanged(int)), this, SLOT(ColorViewChanged())); - - row++; - - QStringList looks = color_manager_->ListAvailableLooks(); - looks_combobox_ = new QComboBox(); - looks_combobox_->addItem(tr("(None)"), QString()); - foreach (const QString& look, looks) { - looks_combobox_->addItem(look, look); - } - connect(looks_combobox_, SIGNAL(currentIndexChanged(int)), this, SLOT(ColorLookChanged())); - color_layout->addWidget(new QLabel(tr("Look:")), row, 0); - color_layout->addWidget(looks_combobox_, row, 1); - - row++; - - ColorDisplayChanged(); - - return color_group; + color_space_chooser_ = new ColorSpaceChooser(color_manager_, false); + connect(color_space_chooser_, &ColorSpaceChooser::DisplayColorSpaceChanged, this, &ExportVideoTab::DisplayColorSpaceChanged); + return color_space_chooser_; } QWidget *ExportVideoTab::SetupCodecSection() @@ -224,28 +186,6 @@ QWidget *ExportVideoTab::SetupCodecSection() return codec_group; } -void ExportVideoTab::ColorDisplayChanged() -{ - views_combobox_->clear(); - - QStringList views = color_manager_->ListAvailableViews(display_combobox_->currentData().toString()); - foreach (const QString& view, views) { - views_combobox_->addItem(view, view); - } - - emit DisplayChanged(display_combobox_->currentData().toString()); -} - -void ExportVideoTab::ColorViewChanged() -{ - emit ViewChanged(views_combobox_->currentData().toString()); -} - -void ExportVideoTab::ColorLookChanged() -{ - emit LookChanged(looks_combobox_->currentData().toString()); -} - void ExportVideoTab::MaintainAspectRatioChanged(bool val) { scaling_method_combobox_->setEnabled(!val); diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index 96334d7df..4edc8a525 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -6,6 +6,7 @@ #include #include "common/rational.h" +#include "dialog/color/colorspacechooser.h" #include "dialog/export/codec/h264section.h" #include "dialog/export/codec/imagesection.h" #include "render/colormanager.h" @@ -43,9 +44,7 @@ public: H264Section* h264_section() const; signals: - void DisplayChanged(const QString& display); - void ViewChanged(const QString& view); - void LookChanged(const QString& look); + void DisplayColorSpaceChanged(const QString& display, const QString& view, const QString& look); private: QWidget* SetupResolutionSection(); @@ -61,22 +60,16 @@ private: ImageSection* image_section_; H264Section* h264_section_; + ColorSpaceChooser* color_space_chooser_; + IntegerSlider* width_slider_; IntegerSlider* height_slider_; - QComboBox* display_combobox_; - QComboBox* views_combobox_; - QComboBox* looks_combobox_; - QList frame_rates_; ColorManager* color_manager_; private slots: - void ColorDisplayChanged(); - void ColorViewChanged(); - void ColorLookChanged(); - void MaintainAspectRatioChanged(bool val); }; diff --git a/app/project/project.cpp b/app/project/project.cpp index 16466dbe5..add56c6f9 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -80,7 +80,7 @@ void Project::Save(QXmlStreamWriter *writer) const writer->writeTextElement("config", ocio_config_); - writer->writeTextElement("default", default_input_colorspace_); + writer->writeTextElement("default", default_input_colorspace()); writer->writeEndElement(); // colormanagement @@ -136,12 +136,12 @@ void Project::set_ocio_config(const QString &ocio_config) const QString &Project::default_input_colorspace() const { - return default_input_colorspace_; + return color_manager_.GetDefaultInputColorSpace(); } void Project::set_default_input_colorspace(const QString &colorspace) { - default_input_colorspace_ = colorspace; + color_manager_.SetDefaultInputColorSpace(colorspace); } ColorManager *Project::color_manager() diff --git a/app/project/project.h b/app/project/project.h index fd2473899..8b565469d 100644 --- a/app/project/project.h +++ b/app/project/project.h @@ -75,7 +75,6 @@ private: QString filename_; QString ocio_config_; - QString default_input_colorspace_; ColorManager color_manager_; diff --git a/app/render/colormanager.cpp b/app/render/colormanager.cpp index b9f66ba0d..98450a3eb 100644 --- a/app/render/colormanager.cpp +++ b/app/render/colormanager.cpp @@ -98,6 +98,16 @@ QStringList ColorManager::ListAvailableInputColorspaces() return ListAvailableInputColorspaces(config_); } +const QString &ColorManager::GetDefaultInputColorSpace() const +{ + return default_input_color_space_; +} + +void ColorManager::SetDefaultInputColorSpace(const QString &s) +{ + default_input_color_space_ = s; +} + QStringList ColorManager::ListAvailableInputColorspaces(OCIO::ConstConfigRcPtr config) { QStringList spaces; diff --git a/app/render/colormanager.h b/app/render/colormanager.h index 601c6f432..9e8fc5979 100644 --- a/app/render/colormanager.h +++ b/app/render/colormanager.h @@ -36,6 +36,10 @@ public: QStringList ListAvailableInputColorspaces(); + const QString& GetDefaultInputColorSpace() const; + + void SetDefaultInputColorSpace(const QString& s); + static QStringList ListAvailableInputColorspaces(OCIO::ConstConfigRcPtr config); enum OCIOMethod { @@ -63,6 +67,9 @@ private: template static void AssociateAlphaInternal(AlphaAction action, T* data, int pix_count); + + QString default_input_color_space_; + }; #endif // COLORSERVICE_H diff --git a/app/widget/colorbutton/colorbutton.cpp b/app/widget/colorbutton/colorbutton.cpp index a602b9d74..f0ffb3599 100644 --- a/app/widget/colorbutton/colorbutton.cpp +++ b/app/widget/colorbutton/colorbutton.cpp @@ -2,8 +2,9 @@ #include "dialog/color/colordialog.h" -ColorButton::ColorButton(QWidget *parent) : - QPushButton(parent) +ColorButton::ColorButton(ColorManager* color_manager, QWidget *parent) : + QPushButton(parent), + color_manager_(color_manager) { color_ = Color(1.0f, 1.0f, 1.0f); @@ -14,7 +15,7 @@ ColorButton::ColorButton(QWidget *parent) : void ColorButton::ShowColorDialog() { - ColorDialog cd(nullptr, color_, this); + ColorDialog cd(color_manager_, color_, this); if (cd.exec() == QDialog::Accepted) { color_ = cd.GetSelectedColor(); diff --git a/app/widget/colorbutton/colorbutton.h b/app/widget/colorbutton/colorbutton.h index 3d82d1099..4bd1f8239 100644 --- a/app/widget/colorbutton/colorbutton.h +++ b/app/widget/colorbutton/colorbutton.h @@ -4,12 +4,13 @@ #include #include "render/color.h" +#include "render/colormanager.h" class ColorButton : public QPushButton { Q_OBJECT public: - ColorButton(QWidget* parent = nullptr); + ColorButton(ColorManager* color_manager, QWidget* parent = nullptr); signals: void ColorChanged(); @@ -20,6 +21,8 @@ private slots: private: void UpdateColor(); + ColorManager* color_manager_; + Color color_; }; diff --git a/app/widget/colorwheel/colorgradientwidget.cpp b/app/widget/colorwheel/colorgradientwidget.cpp index 6199003f2..bf4d4641e 100644 --- a/app/widget/colorwheel/colorgradientwidget.cpp +++ b/app/widget/colorwheel/colorgradientwidget.cpp @@ -40,8 +40,7 @@ void ColorGradientWidget::paintEvent(QPaintEvent *e) } for (int i=0;ipos())); + SetSelectedColorInternal(GetColorFromScreenPos(e->pos()), false); emit SelectedColorChanged(GetSelectedColor()); } @@ -34,12 +44,12 @@ void ColorSwatchWidget::mouseMoveEvent(QMouseEvent *e) QWidget::mouseMoveEvent(e); if (e->buttons() & Qt::LeftButton) { - SetSelectedColor(GetColorFromScreenPos(e->pos())); + SetSelectedColorInternal(GetColorFromScreenPos(e->pos()), false); emit SelectedColorChanged(GetSelectedColor()); } } -void ColorSwatchWidget::SelectedColorChangedEvent(const Color &) +void ColorSwatchWidget::SelectedColorChangedEvent(const Color &, bool) { } @@ -53,3 +63,19 @@ Qt::GlobalColor ColorSwatchWidget::GetUISelectorColor() const return Qt::white; } } + +Color ColorSwatchWidget::GetManagedColor(const Color &input) const +{ + if (to_linear_processor_ && to_display_processor_) { + return to_display_processor_->ConvertColor(to_linear_processor_->ConvertColor(input)); + } + + return input; +} + +void ColorSwatchWidget::SetSelectedColorInternal(const Color &c, bool external) +{ + selected_color_ = c; + SelectedColorChangedEvent(c, external); + update(); +} diff --git a/app/widget/colorwheel/colorswatchwidget.h b/app/widget/colorwheel/colorswatchwidget.h index eff2ba8ec..357f5a9e1 100644 --- a/app/widget/colorwheel/colorswatchwidget.h +++ b/app/widget/colorwheel/colorswatchwidget.h @@ -5,6 +5,7 @@ #include "render/backend/opengl/openglshader.h" #include "render/color.h" +#include "render/colorprocessor.h" class ColorSwatchWidget : public QWidget { @@ -14,6 +15,8 @@ public: const Color& GetSelectedColor() const; + void SetColorProcessor(ColorProcessorPtr to_linear, ColorProcessorPtr to_display); + public slots: void SetSelectedColor(const Color& c); @@ -27,13 +30,21 @@ protected: virtual Color GetColorFromScreenPos(const QPoint& p) const = 0; - virtual void SelectedColorChangedEvent(const Color& c); + virtual void SelectedColorChangedEvent(const Color& c, bool external); Qt::GlobalColor GetUISelectorColor() const; + Color GetManagedColor(const Color& input) const; + private: + void SetSelectedColorInternal(const Color& c, bool external); + Color selected_color_; + ColorProcessorPtr to_linear_processor_; + + ColorProcessorPtr to_display_processor_; + }; #endif // COLORSWATCHWIDGET_H diff --git a/app/widget/colorwheel/colorwheelwidget.cpp b/app/widget/colorwheel/colorwheelwidget.cpp index fbd64831b..d26830e6e 100644 --- a/app/widget/colorwheel/colorwheelwidget.cpp +++ b/app/widget/colorwheel/colorwheelwidget.cpp @@ -49,7 +49,7 @@ void ColorWheelWidget::paintEvent(QPaintEvent *e) Triangle tri = GetTriangleFromCoords(center, j, i); if (tri.hypotenuse <= radius) { - QColor c = GetColorFromTriangle(tri).toQColor(); + QColor c = GetManagedColor(GetColorFromTriangle(tri)).toQColor(); // Very basic antialiasing around the edges of the wheel qreal alpha = qMin(1.0, radius - tri.hypotenuse); @@ -93,10 +93,12 @@ void ColorWheelWidget::paintEvent(QPaintEvent *e) p.drawEllipse(GetCoordsFromColor(GetSelectedColor()), selector_radius, selector_radius); } -void ColorWheelWidget::SelectedColorChangedEvent(const Color &c) +void ColorWheelWidget::SelectedColorChangedEvent(const Color &c, bool external) { - force_redraw_ = true; - val_ = c.value(); + if (external) { + force_redraw_ = true; + val_ = c.value(); + } } int ColorWheelWidget::GetDiameter() const diff --git a/app/widget/colorwheel/colorwheelwidget.h b/app/widget/colorwheel/colorwheelwidget.h index 5bb3b25d6..e8010c3e1 100644 --- a/app/widget/colorwheel/colorwheelwidget.h +++ b/app/widget/colorwheel/colorwheelwidget.h @@ -23,7 +23,7 @@ protected: virtual void paintEvent(QPaintEvent* e) override; - virtual void SelectedColorChangedEvent(const Color& c) override; + virtual void SelectedColorChangedEvent(const Color& c, bool external) override; private: int GetDiameter() const; diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index 79b152371..7f502ffa7 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -94,7 +94,8 @@ void NodeParamViewWidgetBridge::CreateWidgets() break; case NodeParam::kColor: { - ColorButton* color_button = new ColorButton(); + // NOTE: Very convoluted way to get back to the project's color manager + ColorButton* color_button = new ColorButton(static_cast(input_->parentNode()->parent())->project()->color_manager()); widgets_.append(color_button); connect(color_button, &ColorButton::ColorChanged, this, &NodeParamViewWidgetBridge::WidgetCallback); break;