From 2943203c125e2ae883c22ee70316381b54b392aa Mon Sep 17 00:00:00 2001 From: CandyFace Date: Thu, 10 May 2018 20:26:07 +0200 Subject: [PATCH 1/4] Add colorsliders, UI and more... Added colorslider widgets + HSV, RGB colorsliders with extendability + Color wheel and color sliders are now separated + Improved performance of painting color square. + Remember color values from last session + Can modify existing swatches on bitmap (forced behaviour for now) + Ability to add colors to palette using the color wheel, and via the dialog through a new button. + Added colorpalette preference icon --- app/app.pro | 6 +- app/data/app.qrc | 3 + app/data/icons/new/checkerboard_smaller | Bin 0 -> 829 bytes app/data/icons/new/svg/color-dialog.svg | 38 +++ app/data/icons/new/svg/more_options.svg | 21 ++ app/src/colorbox.cpp | 38 +-- app/src/colorbox.h | 5 +- app/src/colorinspector.cpp | 208 +++++++++--- app/src/colorinspector.h | 20 +- app/src/colorpalettewidget.cpp | 54 +++- app/src/colorpalettewidget.h | 5 + app/src/colorslider.cpp | 401 ++++++++++++++++++++++++ app/src/colorslider.h | 92 ++++++ app/src/colorwheel.cpp | 78 +++-- app/src/mainwindow2.cpp | 33 +- app/src/mainwindow2.h | 7 +- app/ui/colorinspector.ui | 312 ++++++++++++++++-- app/ui/colorpalette.ui | 87 ++++- core_lib/src/managers/colormanager.cpp | 12 +- 19 files changed, 1269 insertions(+), 151 deletions(-) create mode 100644 app/data/icons/new/checkerboard_smaller create mode 100644 app/data/icons/new/svg/color-dialog.svg create mode 100644 app/data/icons/new/svg/more_options.svg create mode 100644 app/src/colorslider.cpp create mode 100644 app/src/colorslider.h diff --git a/app/app.pro b/app/app.pro index 20927b2689..c726f20ebb 100644 --- a/app/app.pro +++ b/app/app.pro @@ -58,7 +58,8 @@ HEADERS += \ src/exportimagedialog.h \ src/importimageseqdialog.h \ src/spinslider.h \ - src/doubleprogressdialog.h + src/doubleprogressdialog.h \ + src/colorslider.h SOURCES += \ src/main.cpp \ @@ -85,7 +86,8 @@ SOURCES += \ src/exportimagedialog.cpp \ src/importimageseqdialog.cpp \ src/spinslider.cpp \ - src/doubleprogressdialog.cpp + src/doubleprogressdialog.cpp \ + src/colorslider.cpp FORMS += \ ui/mainwindow2.ui \ diff --git a/app/data/app.qrc b/app/data/app.qrc index 7a68a10d1f..2ac121f465 100644 --- a/app/data/app.qrc +++ b/app/data/app.qrc @@ -50,6 +50,7 @@ icons/new/svg/selection.svg icons/new/svg/smudge_detailed.svg icons/new/svg/trash_detailed.svg + icons/new/checkerboard_smaller icons/onion-blue.png @@ -62,5 +63,7 @@ icons/mirrorV.png icons/dialog-error.svg pencil2d_quick_guide.pdf + icons/new/svg/color-dialog.svg + icons/new/svg/more_options.svg diff --git a/app/data/icons/new/checkerboard_smaller b/app/data/icons/new/checkerboard_smaller new file mode 100644 index 0000000000000000000000000000000000000000..71a0822a54c6ea829efdec055a03917f2f11f779 GIT binary patch literal 829 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9Sn@V3f`bi71Ki^|4CM&(%vz$xlkv ztH>-n*TA>HIW;5GqpB!1xXLdi zxhgx^GDXSWj?1RP3TQxXYDuC(MQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}6yY17;GAES zs$i;Ts%M~N$E9FXl#*r@k>g7FXt#Bv$C=6)S^`fSBQuTAW;zSx}OhpQivaGchT@w8U0PNgrg1KGYVVbM@iw z1#;j%PR#>)vk2%PDX-P9fWg$5>FgX(9OUk#;OXjYW@u?KCdRZLOo@l}qav{%eYAex{(& zr64tHR(F(E-1F1~mwBgmJ}=(?ecs`{&zn?d1%ImAEB>iC46L})LcDU+#ew}h; z%L`3O%TsCp|9=bh=l`X3RhDsst;8{JeUrQc&vzy6c`tqJIb+28hid}P#@}jQ7=H2k z>ZtR27U2({>{+F{?Li5z)%z#q`}m)ShiAWpgv3ANdpnDtn{RSTO-<#|E|}@0>dwTVZ^k=E T_5QKxpj7Ya>gTe~DWM4f%6CF% literal 0 HcmV?d00001 diff --git a/app/data/icons/new/svg/color-dialog.svg b/app/data/icons/new/svg/color-dialog.svg new file mode 100644 index 0000000000..4a79d4bc75 --- /dev/null +++ b/app/data/icons/new/svg/color-dialog.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/data/icons/new/svg/more_options.svg b/app/data/icons/new/svg/more_options.svg new file mode 100644 index 0000000000..07f79b30fd --- /dev/null +++ b/app/data/icons/new/svg/more_options.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/colorbox.cpp b/app/src/colorbox.cpp index 3ea82ae6b8..16c9b3b20e 100644 --- a/app/src/colorbox.cpp +++ b/app/src/colorbox.cpp @@ -18,18 +18,18 @@ GNU General Public License for more details. #include "colorwheel.h" #include "colorinspector.h" #include "colorbox.h" +#include "qsettings.h" +#include "pencildef.h" ColorBox::ColorBox( QWidget* parent ) : BaseDockWidget( parent ) { - setWindowTitle(tr("Color Wheel", "Color Wheel's window title")); + setWindowTitle(tr("Color Box", "Color Box window title")); mColorWheel = new ColorWheel(this); - mColorInspector = new ColorInspector(this); QVBoxLayout* layout = new QVBoxLayout(); layout->setContentsMargins(5, 5, 5, 5); layout->addWidget(mColorWheel); - layout->addWidget(mColorInspector); layout->setStretch(0, 1); layout->setStretch(1, 0); QWidget* mainWidget = new QWidget; @@ -37,13 +37,8 @@ ColorBox::ColorBox( QWidget* parent ) : BaseDockWidget( parent ) setWidget(mainWidget); connect(mColorWheel, &ColorWheel::colorChanged, this, &ColorBox::onWheelMove); - connect(mColorInspector, &ColorInspector::colorChanged, this, &ColorBox::onSpinboxChange); connect(mColorWheel, &ColorWheel::colorSelected, this, &ColorBox::onWheelRelease); - - QColor defaultColor; - defaultColor.setHsv(0, 0, 0); - mColorWheel->setColor(defaultColor); - mColorInspector->setColor(defaultColor); +// connect(this, &ColorBox::colorChanged, mColorWheel, &ColorWheel::setColor); } ColorBox::~ColorBox() @@ -52,6 +47,11 @@ ColorBox::~ColorBox() void ColorBox::initUI() { + QSettings settings(PENCIL2D, PENCIL2D); + + QColor savedColor; + savedColor.setRgba(settings.value("colorOfSliders").toUInt()); + setColor(savedColor); } void ColorBox::updateUI() @@ -65,34 +65,18 @@ QColor ColorBox::color() void ColorBox::setColor(const QColor& newColor) { - if ( newColor.toHsv() != mColorWheel->color() ) + if ( newColor != mColorWheel->color() ) { mColorWheel->setColor(newColor); - mColorInspector->setColor(newColor); - - emit colorChanged(newColor); - } -} - -void ColorBox::onSpinboxChange(const QColor& color) -{ - if ( mColorWheel->color() != color.toHsv() ) - { - mColorWheel->setColor(color); - emit colorChanged(color); } } void ColorBox::onWheelMove(const QColor& color) { - if ( mColorInspector->color() != color ) - { - mColorInspector->setColor(color); - } + emit colorChanged(color); } void ColorBox::onWheelRelease(const QColor& color) { - mColorInspector->setColor(color); emit colorChanged(color); } diff --git a/app/src/colorbox.h b/app/src/colorbox.h index 23d8b604b4..3bcc2f8900 100644 --- a/app/src/colorbox.h +++ b/app/src/colorbox.h @@ -19,8 +19,6 @@ GNU General Public License for more details. #include "basedockwidget.h" class ColorWheel; -class ColorInspector; - class ColorBox : public BaseDockWidget { @@ -40,12 +38,11 @@ class ColorBox : public BaseDockWidget void colorChanged(const QColor&); private: - void onSpinboxChange(const QColor&); void onWheelMove(const QColor&); void onWheelRelease(const QColor&); ColorWheel* mColorWheel = nullptr; - ColorInspector* mColorInspector = nullptr; +// ColorInspector* mColorInspector = nullptr; }; #endif // COLORBOX_H diff --git a/app/src/colorinspector.cpp b/app/src/colorinspector.cpp index 385eb5555a..752f96c510 100644 --- a/app/src/colorinspector.cpp +++ b/app/src/colorinspector.cpp @@ -16,20 +16,53 @@ GNU General Public License for more details. #include "colorinspector.h" #include "ui_colorinspector.h" +#include +#include #include +#include + +#include "colorslider.h" +#include "pencildef.h" ColorInspector::ColorInspector(QWidget *parent) : - QWidget(parent), - ui(new Ui::ColorInspector) + BaseDockWidget(parent) { - ui->setupUi(this); + + QWidget* innerWidget = new QWidget; + setWindowTitle(tr("Color Inspector", "Window title of color inspector")); + + ui = new Ui::ColorInspector; + ui->setupUi(innerWidget); + setWidget(innerWidget); + + QButtonGroup* colorModeChangeGroup = new QButtonGroup(); + + colorModeChangeGroup->addButton(ui->hsvButton); + colorModeChangeGroup->addButton(ui->rgbButton); + colorModeChangeGroup->setExclusive(true); + + QSettings settings(PENCIL2D, PENCIL2D); + isRgbColors = settings.value("isRgb").toBool(); + + if (isRgbColors) { + ui->rgbButton->setChecked(true); + } else { + ui->hsvButton->setChecked(true); + } + onModeChanged(); auto spinBoxChanged = static_cast(&QSpinBox::valueChanged); connect(ui->RedspinBox, spinBoxChanged, this, &ColorInspector::onColorChanged); connect(ui->GreenspinBox, spinBoxChanged, this, &ColorInspector::onColorChanged); connect(ui->BluespinBox, spinBoxChanged, this, &ColorInspector::onColorChanged); connect(ui->AlphaspinBox, spinBoxChanged, this, &ColorInspector::onColorChanged); - connect(ui->rgb, &QRadioButton::toggled, this, &ColorInspector::onModeChanged); + connect(ui->rgbButton, &QPushButton::clicked, this, &ColorInspector::onModeChanged); + connect(ui->hsvButton, &QPushButton::clicked, this, &ColorInspector::onModeChanged); + + connect(ui->red_slider, &ColorSlider::valueChanged, this, &ColorInspector::onSliderChanged); + connect(ui->green_slider, &ColorSlider::valueChanged, this, &ColorInspector::onSliderChanged); + connect(ui->blue_slider, &ColorSlider::valueChanged, this, &ColorInspector::onSliderChanged); + connect(ui->alpha_slider, &ColorSlider::valueChanged, this, &ColorInspector::onSliderChanged); } ColorInspector::~ColorInspector() @@ -37,16 +70,65 @@ ColorInspector::~ColorInspector() delete ui; } +void ColorInspector::initUI() +{ + if (isRgbColors) { + ui->red_slider->init(ColorSlider::ColorType::RED, QColor(255,255,255,255), 0.0, 255.0); + ui->green_slider->init(ColorSlider::ColorType::GREEN, QColor(255,255,255,255), 0.0, 255.0); + ui->blue_slider->init(ColorSlider::ColorType::BLUE, QColor(255,255,255,255), 0.0, 255.0); + ui->alpha_slider->init(ColorSlider::ColorType::ALPHA, QColor(0,255,255,255), 0.0, 255.0); + } else { + ui->red_slider->init(ColorSlider::ColorType::HUE, QColor(359,255,255,255), 0.0, 359.0); + ui->green_slider->init(ColorSlider::ColorType::SAT, QColor(255,255,255,255), 0.0, 255.0); + ui->blue_slider->init(ColorSlider::ColorType::VAL, QColor(255,255,255,255), 0.0, 255.0); + ui->alpha_slider->init(ColorSlider::ColorType::ALPHA, QColor(0,255,255,255), 0.0, 255.0); + } + + QSettings settings(PENCIL2D, PENCIL2D); + + QColor savedColor; + savedColor.setRgba(settings.value("colorOfSliders").toUInt()); + setColor(savedColor); +} + +void ColorInspector::updateUI() +{ +} + +void ColorInspector::onSliderChanged(QColor color) +{ + + if (isRgbColors) { + ui->red_slider->setRgb(color); + ui->green_slider->setRgb(color); + ui->blue_slider->setRgb(color); + ui->alpha_slider->setRgb(color); + } else { + ui->red_slider->setHsv(color); + ui->green_slider->setHsv(color); + ui->blue_slider->setHsv(color); + ui->alpha_slider->setHsv(color); + } + + emit colorChanged(color); +} + void ColorInspector::setColor(const QColor &newColor) { - if (newColor == m_color) + if (newColor == mCurrentColor) { return; } noColorUpdate = true; + qDebug() << "set color"; if(isRgbColors) { + ui->red_slider->setRgb(newColor); + ui->green_slider->setRgb(newColor); + ui->blue_slider->setRgb(newColor); + ui->alpha_slider->setRgb(newColor); + ui->RedspinBox->setValue(newColor.red()); ui->GreenspinBox->setValue(newColor.green()); ui->BluespinBox->setValue(newColor.blue()); @@ -54,42 +136,73 @@ void ColorInspector::setColor(const QColor &newColor) } else { + ui->red_slider->setHsv(newColor); + ui->green_slider->setHsv(newColor); + ui->blue_slider->setHsv(newColor); + ui->alpha_slider->setHsv(newColor); + ui->RedspinBox->setValue(newColor.hsvHue()); ui->GreenspinBox->setValue(qRound(newColor.hsvSaturation() / 2.55)); ui->BluespinBox->setValue(qRound(newColor.value() / 2.55)); ui->AlphaspinBox->setValue(qRound(newColor.alpha() / 2.55)); } - m_color = newColor; + + mCurrentColor = newColor; QPalette p1 = ui->colorWrapper->palette(), p2 = ui->color->palette(); p1.setBrush(QPalette::Background, QBrush(QImage(":/background/checkerboard.png"))); - p2.setColor(QPalette::Background, m_color); + p2.setColor(QPalette::Background, mCurrentColor); ui->colorWrapper->setPalette(p1); ui->color->setPalette(p2); noColorUpdate = false; + update(); } QColor ColorInspector::color() { - return m_color; + return mCurrentColor; +} + +void ColorInspector::paintEvent(QPaintEvent*) +{ + + // HACK: possible bug in 5.9 + // title style is not set when window is not docked + // this enforces the style again. This is what QDockWidget + // should be doing behind the scene + QStyleOptionDockWidget opt; + initStyleOption(&opt); + + QStylePainter p(this); + p.drawControl(QStyle::CE_DockWidgetTitle, opt); +} + +void ColorInspector::mouseReleaseEvent(QMouseEvent*) +{ + + QSettings settings(PENCIL2D, PENCIL2D); + settings.setValue("colorOfSliders", mCurrentColor.rgba()); + } void ColorInspector::onModeChanged() { - bool newValue = ui->rgb->isChecked(); - if (isRgbColors == newValue) - { - return; - } + + // assume hsv if not checked + bool newValue = ui->rgbButton->isChecked(); + + QSettings settings(PENCIL2D, PENCIL2D); + settings.setValue("isRgb", newValue); + isRgbColors = newValue; noColorUpdate = true; if (isRgbColors) { - ui->red->setText(tr("Red")); - ui->green->setText(tr("Green")); - ui->blue->setText(tr("Blue")); - ui->alpha->setText(tr("Alpha")); + ui->red->setText("R"); + ui->green->setText("G"); + ui->blue->setText("B"); + ui->alpha->setText("A"); ui->RedspinBox->setRange(0,255); ui->RedspinBox->setSuffix(""); @@ -99,18 +212,39 @@ void ColorInspector::onModeChanged() ui->BluespinBox->setSuffix(""); ui->AlphaspinBox->setRange(0,255); ui->AlphaspinBox->setSuffix(""); - m_color = m_color.toRgb(); - ui->RedspinBox->setValue(m_color.red()); - ui->GreenspinBox->setValue(m_color.green()); - ui->BluespinBox->setValue(m_color.blue()); - ui->AlphaspinBox->setValue(m_color.alpha()); + mCurrentColor = mCurrentColor.toRgb(); + + ui->red_slider->setMax(255); + ui->red_slider->setColorType(ColorSlider::ColorType::RED); + ui->red_slider->setColorSpecType(ColorSlider::ColorSpecType::RGB); + ui->green_slider->setColorSpecType(ColorSlider::ColorSpecType::RGB); + ui->green_slider->setColorType(ColorSlider::ColorType::GREEN); + ui->blue_slider->setColorSpecType(ColorSlider::ColorSpecType::RGB); + ui->blue_slider->setColorType(ColorSlider::ColorType::BLUE); + ui->alpha_slider->setColorSpecType(ColorSlider::ColorSpecType::RGB); + ui->alpha_slider->setColorType(ColorSlider::ColorType::ALPHA); + + ui->RedspinBox->setValue(mCurrentColor.red()); + ui->GreenspinBox->setValue(mCurrentColor.green()); + ui->BluespinBox->setValue(mCurrentColor.blue()); + ui->AlphaspinBox->setValue(mCurrentColor.alpha()); } else { - ui->red->setText(tr("Hue")); - ui->green->setText(tr("Saturation")); - ui->blue->setText(tr("Value")); - ui->alpha->setText(tr("Alpha")); + ui->red->setText("H"); + ui->green->setText("S"); + ui->blue->setText("V"); + ui->alpha->setText("A"); + + ui->red_slider->setMax(359); + ui->red_slider->setColorType(ColorSlider::ColorType::HUE); + ui->red_slider->setColorSpecType(ColorSlider::ColorSpecType::HSV); + ui->green_slider->setColorType(ColorSlider::ColorType::SAT); + ui->green_slider->setColorSpecType(ColorSlider::ColorSpecType::HSV); + ui->blue_slider->setColorType(ColorSlider::ColorType::VAL); + ui->blue_slider->setColorSpecType(ColorSlider::ColorSpecType::HSV); + ui->alpha_slider->setColorType(ColorSlider::ColorType::ALPHA); + ui->alpha_slider->setColorSpecType(ColorSlider::ColorSpecType::HSV); ui->RedspinBox->setRange(0,359); ui->RedspinBox->setSuffix("°"); @@ -121,12 +255,14 @@ void ColorInspector::onModeChanged() ui->AlphaspinBox->setRange(0,100); ui->AlphaspinBox->setSuffix("%"); - m_color = m_color.toHsv(); - ui->RedspinBox->setValue(m_color.hue()); - ui->GreenspinBox->setValue(m_color.saturation()); - ui->BluespinBox->setValue(m_color.value()); - ui->AlphaspinBox->setValue(m_color.alpha()); + qreal bound = 100.0/255.0; // from 255 to 100 + mCurrentColor = mCurrentColor.toHsv(); + ui->RedspinBox->setValue(mCurrentColor.hsvHue()); + ui->GreenspinBox->setValue(qRound(mCurrentColor.hsvSaturation()*bound)); + ui->BluespinBox->setValue(qRound(mCurrentColor.value()*bound)); + ui->AlphaspinBox->setValue(qRound(mCurrentColor.alpha()*bound)); } + noColorUpdate = false; emit modeChange(isRgbColors); } @@ -137,18 +273,18 @@ void ColorInspector::onColorChanged() QColor c; if (isRgbColors) { - c = QColor::fromRgb( + c.setRgb( ui->RedspinBox->value(), ui->GreenspinBox->value(), ui->BluespinBox->value(), ui->AlphaspinBox->value()); } else { - c = QColor::fromHsv( + c.setHsv( ui->RedspinBox->value(), - ui->GreenspinBox->value() * 2.555, - ui->BluespinBox->value() * 2.555, - ui->AlphaspinBox->value() * 2.555); + ui->GreenspinBox->value()* 2.55, + ui->BluespinBox->value()* 2.55, + ui->AlphaspinBox->value()* 2.55); } emit colorChanged(c); diff --git a/app/src/colorinspector.h b/app/src/colorinspector.h index 137f88f6e0..2f9898abaf 100644 --- a/app/src/colorinspector.h +++ b/app/src/colorinspector.h @@ -16,20 +16,32 @@ GNU General Public License for more details. #ifndef COLORSPINBOXGROUP_H #define COLORSPINBOXGROUP_H -#include +#include +#include "basedockwidget.h" namespace Ui { class ColorInspector; } -class ColorInspector : public QWidget +class ColorInspector : public BaseDockWidget { Q_OBJECT + + friend class ColorSliders; public: + explicit ColorInspector(QWidget *parent = 0); ~ColorInspector(); QColor color(); + + void initUI() override; + void updateUI() override; + + +protected: + void paintEvent(QPaintEvent *) override; + void mouseReleaseEvent(QMouseEvent *) override; signals: void colorChanged(const QColor& c); void modeChange(const bool& isRgb); @@ -40,12 +52,14 @@ public slots: private slots: void onModeChanged(); void onColorChanged(); + void onSliderChanged(QColor color); private: + Ui::ColorInspector* ui = nullptr; bool isRgbColors = true; bool noColorUpdate = false; - QColor m_color; + QColor mCurrentColor; }; #endif // COLORSPINBOXGROUP_H diff --git a/app/src/colorpalettewidget.cpp b/app/src/colorpalettewidget.cpp index 301d2e2a91..39e18e3137 100644 --- a/app/src/colorpalettewidget.cpp +++ b/app/src/colorpalettewidget.cpp @@ -22,6 +22,7 @@ GNU General Public License for more details. #include #include #include "ui_colorpalette.h" +#include "qtoolbar.h" #include "colordictionary.h" #include "colourref.h" @@ -62,6 +63,25 @@ void ColorPaletteWidget::initUI() else setGridMode(); + QColor savedColor; + savedColor.setRgba(settings.value("colorOfSliders").toUInt()); + + buttonStylesheet = "::menu-indicator{ image: none; }" + "QPushButton { border: 0px; }" + "QPushButton:pressed { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }" + "QPushButton:checked { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }"; + + + // color number need to be set to add new color to palette + // in cases where the last color was saved + // otherwise first color will be black. + editor()->color()->setColorNumber(0); + editor()->color()->setColor(savedColor); + + ui->addColorButton->setStyleSheet(buttonStylesheet); + ui->removeColorButton->setStyleSheet(buttonStylesheet); + ui->colorDialogButton->setStyleSheet(buttonStylesheet); + palettePreferences(); connect(ui->colorListWidget, &QListWidget::currentItemChanged, this, &ColorPaletteWidget::colorListCurrentItemChanged); @@ -70,6 +90,7 @@ void ColorPaletteWidget::initUI() connect(ui->colorListWidget, &QListWidget::currentTextChanged, this, &ColorPaletteWidget::onActiveColorNameChange); connect(ui->addColorButton, &QPushButton::clicked, this, &ColorPaletteWidget::clickAddColorButton); + connect(ui->colorDialogButton, &QPushButton::clicked, this, &ColorPaletteWidget::clickColorDialogButton); connect(ui->removeColorButton, &QPushButton::clicked, this, &ColorPaletteWidget::clickRemoveColorButton); } @@ -91,6 +112,7 @@ void ColorPaletteWidget::setColor(QColor newColor, int colorIndex) } } + void ColorPaletteWidget::selectColorNumber(int colorNumber) { ui->colorListWidget->setCurrentRow(colorNumber); @@ -202,7 +224,17 @@ void ColorPaletteWidget::palettePreferences() mSeparator = new QAction("", this); mSeparator->setSeparator(true); + buttonStylesheet = "::menu-indicator{ image: none; }" + "QToolButton { border: 0px; }" + "QToolButton:pressed { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }" + "QToolButton:checked { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }"; + + // Add to UI + ui->palettePref->setIcon(QIcon(":/app/icons/new/svg/more_options.svg")); + ui->palettePref->setIconSize(QSize(15,15)); + ui->palettePref->setArrowType(Qt::ArrowType::NoArrow); + ui->palettePref->setStyleSheet(buttonStylesheet); ui->palettePref->addAction(ui->listModeAction); ui->palettePref->addAction(ui->gridModeAction); ui->palettePref->addAction(mSeparator); @@ -379,16 +411,32 @@ QString ColorPaletteWidget::getDefaultColorName(QColor c) return nameDict[minLoc]; } +void ColorPaletteWidget::clickColorDialogButton() +{ + mIsColorDialog = true; + clickAddColorButton(); + mIsColorDialog = false; +} + void ColorPaletteWidget::clickAddColorButton() { QColor prevColor = Qt::white; - if (currentColourNumber() > -1) + if (editor()->object()->getLayer(editor()->currentLayerIndex())->type() == Layer::VECTOR) { - prevColor = editor()->object()->getColour(currentColourNumber()).colour; + if (currentColourNumber() > -1) + { + prevColor = editor()->object()->getColour(currentColourNumber()).colour; + } + } + + QColor newColour; + if (mIsColorDialog) { + newColour = QColorDialog::getColor(prevColor.rgba(), this, QString(), QColorDialog::ShowAlphaChannel); + } else { + newColour = editor()->color()->frontColor(); } - QColor newColour = QColorDialog::getColor(prevColor.rgba(), this, QString(), QColorDialog::ShowAlphaChannel); if (!newColour.isValid()) { // User canceled operation diff --git a/app/src/colorpalettewidget.h b/app/src/colorpalettewidget.h index 7386c5b290..19eb828d8a 100644 --- a/app/src/colorpalettewidget.h +++ b/app/src/colorpalettewidget.h @@ -66,6 +66,7 @@ private slots: void changeColourName(QListWidgetItem*); void onActiveColorNameChange(QString name); void clickAddColorButton(); + void clickColorDialogButton(); void clickRemoveColorButton(); void palettePreferences(); void setListMode(); @@ -94,6 +95,10 @@ private slots: QMenu* mToolMenu = nullptr; int stepper = 0; + QString buttonStylesheet; + + bool mIsColorDialog = false; + }; #endif diff --git a/app/src/colorslider.cpp b/app/src/colorslider.cpp new file mode 100644 index 0000000000..8d8134ea15 --- /dev/null +++ b/app/src/colorslider.cpp @@ -0,0 +1,401 @@ +#include "colorslider.h" + +#include +#include +#include +#include +#include +#include +#include + + +ColorSlider::ColorSlider(QWidget* parent) : QWidget(parent) +{ + +} + +ColorSlider::~ColorSlider() +{ + +} + +void ColorSlider::init(ColorType type, QColor color, qreal min, float max) +{ + init(type, color, min, max, QSize(this->size())); +} + +void ColorSlider::init(ColorType type, QColor color, qreal min, float max, QSize size) +{ + + mMin = min; + mMax = max; + mColor = color; + mColorType = type; + + drawColorBox(color, size); +} + +void ColorSlider::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + + drawColorBox(mColor, mSize); + + painter.drawPixmap(0, 0, mBoxPixmapSource); + drawPicker(mColor); + painter.end(); + +} + + +void ColorSlider::resizeEvent(QResizeEvent *event) +{ + mSize = event->size(); + drawColorBox(mColor, event->size()); +} + +QLinearGradient ColorSlider::setColorSpec(QColor color) +{ + + if (mSpecType == ColorSpecType::HSV) + { + return hsvGradient(color); + } + else if (mSpecType == ColorSpecType::RGB) + { + return rgbGradient(color); + } +} + +QLinearGradient ColorSlider::rgbGradient(QColor color) +{ + int val = 0; + if (mColorType == ColorType::RED) + { + + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromRgb(val, + 255, + 255, + color.alpha())); + } + } + else if (mColorType == ColorType::GREEN) + { + + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromRgb(color.red(), + val, + color.blue(), + color.alpha())); + } + } + else if (mColorType == ColorType::BLUE) + { + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromRgb(color.red(), + color.green(), + val, + color.alpha())); + } + } + else if (mColorType == ColorType::ALPHA) + { + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromRgb(0, + 0, + 0, + val)); + } + } + return mGradient; +} + +QLinearGradient ColorSlider::hsvGradient(QColor color) +{ + int val = 0; + if (mColorType == ColorType::HUE) { + + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromHsv(val, + 255, + 255, + color.alpha())); + } + } + else if (mColorType == ColorType::SAT) + { + + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromHsv(color.hsvHue(), + val, + color.value(), + color.alpha())); + } + } + else if (mColorType == ColorType::VAL) + { + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromHsv(color.hsvHue(), + color.hsvSaturation(), + val, + color.alpha())); + } + } + else if (mColorType == ColorType::ALPHA) + { + for (; val < mMax; val += 1) + { + mGradient.setColorAt(val / mMax, QColor::fromHsv(0, + 0, + 0, + val)); + } + } + return mGradient; +} + +void ColorSlider::drawColorBox(QColor color, QSize size) +{ + QStyleOption option; + option.initFrom(this); + + QBrush backgroundBrush = option.palette.window(); + + mBoxPixmapSource = QPixmap(size); + + QPainter painter(&mBoxPixmapSource); + painter.setRenderHint(QPainter::Antialiasing); + + painter.fillRect(mBoxPixmapSource.rect(), backgroundBrush); + + mGradient = QLinearGradient(0,0,mBoxPixmapSource.width(),0); + mGradient = setColorSpec(color); + + painter.end(); + + // draw checkerboard background + painter.begin(&mBoxPixmapSource); + QBrush brush2(QBrush(QPixmap("://icons/new/checkerboard_smaller"))); + + painter.setBrush(brush2); + QPen pen2; + pen2.setWidthF(0); + pen2.setColor(Qt::gray); + pen2.setCosmetic(false); + painter.setPen(pen2); + painter.drawRoundedRect(0, + 0, + mBoxPixmapSource.width(), + mBoxPixmapSource.height(), + 4, + mBoxPixmapSource.width(), + Qt::SizeMode::AbsoluteSize); + + painter.end(); + + painter.begin(&mBoxPixmapSource); + painter.setRenderHint(QPainter::Antialiasing); + + QBrush brush(mGradient); + QPen pen; + pen.setWidthF(0); + pen.setColor(Qt::gray); + pen.setCosmetic(false); + painter.setPen(pen); + + + painter.setBrush(brush); + + painter.drawRoundedRect(0, + 0, + mBoxPixmapSource.width(), + mBoxPixmapSource.height(), + 4, + mBoxPixmapSource.width(), + Qt::SizeMode::AbsoluteSize); + painter.end(); +} + +void ColorSlider::mouseMoveEvent(QMouseEvent* event) +{ + colorPicked(event->pos()); +} + +void ColorSlider::mousePressEvent(QMouseEvent *event) +{ + colorPicked(event->pos()); + +} + +void ColorSlider::drawPicker(QColor color) +{ + QPainter painter(this); + qreal val = 0; + QSize mPickerSize = QSize(10, this->height()-1); + + QPen pen; + pen.setWidth(0); + pen.setColor(QColor(0,0,0,255)); + + if (mSpecType == ColorSpecType::HSV) { + if (mColorType == ColorType::HUE) + { + val = color.hsvHueF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + else if (mColorType == ColorType::SAT) + { + if ( (color.hsvSaturation() > 127 || color.value() < 127) && color.alpha() > 127) + { + pen.setColor(Qt::white); + } + val = color.hsvSaturationF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + else if (mColorType == ColorType::VAL) + { + if ( color.value() < 127 && color.alpha() > 127) + { + pen.setColor(Qt::white); + } + val = color.valueF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + } else if (mSpecType == ColorSpecType::RGB) { + if (mColorType == ColorType::RED) + { + val = color.redF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + else if (mColorType == ColorType::GREEN) + { + if ( color.alpha() > 127) + { + pen.setColor(Qt::white); + } + val = color.greenF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + else if (mColorType == ColorType::BLUE) + { + if (color.alpha() > 127) + { + pen.setColor(Qt::white); + } + val = color.blueF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + } + if (mColorType == ColorType::ALPHA) + { + if ( color.alpha() > 127) + { + pen.setColor(Qt::white); + } + val = color.alphaF() * (mBoxPixmapSource.width()-mPickerSize.width()); + } + + + painter.setPen(pen); + painter.drawRect(val, 0, mPickerSize.width(), mPickerSize.height()); + painter.end(); +} + +void ColorSlider::colorPicked(QPoint point) +{ + QColor colorPicked = mColor; + int colorMax = mMax; + int colorVal = 0; + + colorVal = point.x()*colorMax/mBoxPixmapSource.width(); + + colorVal = (colorVal > colorMax) ? colorMax : colorVal; + colorVal = (colorVal < 0) ? 0 : colorVal; + + if (mSpecType == ColorSpecType::HSV) { + switch(mColorType) + { + case ColorType::HUE: + { + colorPicked = QColor::fromHsv(colorVal, + mColor.hsvSaturation(), + mColor.value(), + mColor.alpha()); + + break; + } + case ColorType::SAT: + { + colorPicked = QColor::fromHsv(mColor.hsvHue(), + colorVal, + mColor.value(), + mColor.alpha()); + break; + } + case ColorType::VAL: + { + colorPicked = QColor::fromHsv(mColor.hsvHue(), + mColor.hsvSaturation(), + colorVal, + mColor.alpha()); + break; + } + case ColorType::ALPHA: + { + + colorPicked = QColor::fromHsv(mColor.hsvHue(), + mColor.hsvSaturation(), + mColor.value(), + colorVal); + break; + } + default: + break; + } + } else if (mSpecType == ColorSpecType::RGB) + { + switch(mColorType) + { + case ColorType::RED: + { + colorPicked = QColor::fromRgb(colorVal, + mColor.green(), + mColor.blue(), + mColor.alpha()); + + break; + } + case ColorType::GREEN: + { + colorPicked = QColor::fromRgb(mColor.red(), + colorVal, + mColor.blue(), + mColor.alpha()); + break; + } + case ColorType::BLUE: + { + colorPicked = QColor::fromRgb(mColor.red(), + mColor.green(), + colorVal, + mColor.alpha()); + break; + } + case ColorType::ALPHA: + { + + colorPicked = QColor::fromRgb(mColor.red(), + mColor.green(), + mColor.blue(), + colorVal); + break; + } + default: + break; + } + } + mColor = colorPicked; + emit valueChanged(mColor); +} diff --git a/app/src/colorslider.h b/app/src/colorslider.h new file mode 100644 index 0000000000..310d83f7e8 --- /dev/null +++ b/app/src/colorslider.h @@ -0,0 +1,92 @@ +#ifndef COLORSLIDER_H +#define COLORSLIDER_H + +#include + + +class ColorSlider : public QWidget +{ + Q_OBJECT +public: + + enum ColorType { + HUE, + SAT, + VAL, + RED, + GREEN, + BLUE, + ALPHA + }; + enum ColorSpecType { + RGB, + HSV, + HSL, + CMYK + }; + + explicit ColorSlider(QWidget* parent); + ~ColorSlider(); + + void init(ColorType type, QColor color, qreal min, float max); + void init(ColorType type, QColor color, qreal min, float max, QSize size); + + QLinearGradient setColorSpec(QColor color); + + QColor color() { return mColor; } + + void setHsv(QColor hsv) { mColor.setHsv(hsv.hsvHue(), + hsv.hsvSaturation(), + hsv.value(), + hsv.alpha()); + } + + void setRgb(QColor rgb) { mColor.setRgb(rgb.red(), + rgb.green(), + rgb.blue(), + rgb.alpha()); + } + + void setColorSpecType(ColorSpecType newType) { this->mSpecType = newType; } + void setColorType(ColorType newType) { this->mColorType = newType; } + + void setMin(float min) { mMin = min; } + void setMax(float max) { mMax = max; } + +protected: + void paintEvent(QPaintEvent* event) override; + void resizeEvent(QResizeEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void mousePressEvent(QMouseEvent* event) override; + +//public slots: + +signals: + void valueChanged(QColor color); +// void valueChanged(QColor color); + +private: + + void drawColorBox(QColor color, QSize size); + void drawPicker(QColor color); + QLinearGradient hsvGradient(QColor color); + QLinearGradient rgbGradient(QColor color); + + void colorPicked(QPoint point); + + QPixmap mBoxPixmapTarget; + QPixmap mBoxPixmapSource; + + QColor mColor; + float mMin = 0.0; + float mMax = 0.0; + + ColorType mColorType; + ColorSpecType mSpecType; + + QSize mSize = QSize(0,0); + + QLinearGradient mGradient; +}; + +#endif // COLORSLIDER_H diff --git a/app/src/colorwheel.cpp b/app/src/colorwheel.cpp index 3139391b16..8ef1ccb815 100644 --- a/app/src/colorwheel.cpp +++ b/app/src/colorwheel.cpp @@ -14,18 +14,23 @@ GNU General Public License for more details. */ -#include +#include #include #include #include +#include #include +#include #include #include +#include "qsettings.h" +#include "pencildef.h" #include "colorwheel.h" ColorWheel::ColorWheel(QWidget* parent) : QWidget(parent) { + setWindowTitle(tr("Color Wheel", "Color Wheel's window title")); mCurrentColor = mCurrentColor.toHsv(); setMinimumHeight(100); } @@ -65,8 +70,10 @@ void ColorWheel::setColor(const QColor& color) changeRgbColors(color); else if (color.spec() == QColor::Spec::Hsv) changeHsvColors(color); - else + else { + qDebug() << color.spec(); Q_ASSERT(false); + } drawSquareImage(color.hue()); @@ -225,6 +232,8 @@ void ColorWheel::mouseMoveEvent(QMouseEvent* event) void ColorWheel::mouseReleaseEvent(QMouseEvent *) { + QSettings settings(PENCIL2D, PENCIL2D); + settings.setValue("colorOfSliders", mCurrentColor.rgba()); mIsInWheel = false; mIsInSquare = false; emit colorSelected(mCurrentColor); @@ -236,18 +245,24 @@ void ColorWheel::resizeEvent(QResizeEvent* event) mWheelPixmap.fill(palette().background().color()); drawWheelImage(event->size()); drawSquareImage(mCurrentColor.hue()); + update(); } void ColorWheel::paintEvent(QPaintEvent*) { - QPainter painter(this); + + QPainter painter; + + painter.begin(this); QStyleOption opt; opt.initFrom(this); + composeWheel(mWheelPixmap); painter.translate(width() / 2, height() / 2); painter.translate(-mWheelPixmap.width() / 2, -mWheelPixmap.height() / 2); painter.drawPixmap(0, 0, mWheelPixmap); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); } @@ -312,17 +327,23 @@ void ColorWheel::drawSquareImage(const int &hue) qreal m1 = (width() / 2) - (ir / qSqrt(2)); qreal m2 = (height() / 2) - (ir / qSqrt(2)); - QImage square(255, 255, QImage::Format_ARGB32_Premultiplied); + QImage square(255, 255, QImage::Format_ARGB32); - for (int i = 0; i < 255; ++i) - { - for (int j = 0; j < 255; ++j) - { - QColor color = QColor::fromHsv(hue, i, 255 - j); - QRgb rgb = qRgb(color.red(), color.green(), color.blue()); - square.setPixel(i, j, rgb); - } - } + QLinearGradient colorGradient = QLinearGradient(0, 0, square.width(), 0); + colorGradient.setColorAt(0, QColor(255,255,255)); + colorGradient.setColorAt(1, QColor::fromHsv(color().hsvHue(), color().hsvSaturation(), color().value())); + + QLinearGradient blackGradient = QLinearGradient(0, 0, 0, square.height()); + blackGradient.setColorAt(0, QColor(0,0,0,0)); + blackGradient.setColorAt(1, QColor(0,0,0,255)); + + QBrush colorGradiantBrush = QBrush(colorGradient); + QBrush blackGradiantBrush = QBrush(blackGradient); + + QPainter painter(&square); + + painter.fillRect(square.rect(), colorGradiantBrush); + painter.fillRect(square.rect(), blackGradiantBrush); qreal SquareWidth = 2 * ir / qSqrt(2.1); mSquareImage = square.scaled(SquareWidth, SquareWidth); @@ -358,25 +379,28 @@ void ColorWheel::drawPicker(const QColor& color) { QPainter painter(&mWheelPixmap); painter.setRenderHint(QPainter::Antialiasing); + int ellipseSize = 7; - QPoint squareTopLeft = mSquareRegion.boundingRect().topLeft(); + QPoint squareTopLeft = mSquareRegion.boundingRect().topLeft()-QPoint(1,1); - painter.translate(squareTopLeft.x(), squareTopLeft.y()); + QSize squareSize = mSquareRegion.boundingRect().size()*1.01; - QSize squareSize = mSquareRegion.boundingRect().size(); - - qreal S = color.saturationF() * squareSize.width(); - qreal V = squareSize.height() - (color.valueF() * squareSize.height()); + qreal S = color.hsvSaturationF() * (squareSize.width()); + qreal V = (squareSize.height() - (color.valueF() * (squareSize.height()))); QPen pen; - pen.setWidth(3); - if (color.saturation() > 30 || color.value() < 50) + pen.setWidth(1); + if (color.hsvSaturation() > 30 || color.value() < 50) { pen.setColor(Qt::white); } painter.setPen(pen); - painter.drawEllipse(S - 2, V - 2, 10, 10); + QTransform transform; + transform.translate(-ellipseSize/2,-ellipseSize/2); + transform.translate(squareTopLeft.x()+2,squareTopLeft.y()+2); + painter.setTransform(transform); + painter.drawEllipse(S, V, ellipseSize, ellipseSize); } void ColorWheel::composeWheel(QPixmap& pixmap) @@ -387,7 +411,7 @@ void ColorWheel::composeWheel(QPixmap& pixmap) composePainter.translate(-mSquareImage.width() / 2, -mSquareImage.height() / 2); //move to center of image composePainter.drawImage(0, 0, mSquareImage); composePainter.end(); - drawHueIndicator(mCurrentColor.hue()); + drawHueIndicator(mCurrentColor.hsvHue()); drawPicker(mCurrentColor); } @@ -449,7 +473,7 @@ void ColorWheel::hueChanged(const int &hue) { return; } - int s = mCurrentColor.saturation(); + int s = mCurrentColor.hsvSaturation(); int v = mCurrentColor.value(); int a = mCurrentColor.alpha(); @@ -468,7 +492,7 @@ void ColorWheel::hueChanged(const int &hue) void ColorWheel::saturationChanged(const int &sat) { - int hue = mCurrentColor.hue(); + int hue = mCurrentColor.hsvHue(); int value = mCurrentColor.value(); int alpha = mCurrentColor.alpha(); @@ -480,8 +504,8 @@ void ColorWheel::saturationChanged(const int &sat) void ColorWheel::valueChanged(const int &value) { - int hue = mCurrentColor.hue(); - int sat = mCurrentColor.saturation(); + int hue = mCurrentColor.hsvHue(); + int sat = mCurrentColor.hsvSaturation(); int alpha = mCurrentColor.alpha(); mCurrentColor.setHsv(hue, sat, value, alpha); diff --git a/app/src/mainwindow2.cpp b/app/src/mainwindow2.cpp index 364e6b36be..b7047b0446 100644 --- a/app/src/mainwindow2.cpp +++ b/app/src/mainwindow2.cpp @@ -54,6 +54,7 @@ GNU General Public License for more details. // app headers #include "scribblearea.h" #include "colorbox.h" +#include "colorinspector.h" #include "colorpalettewidget.h" #include "displayoptionwidget.h" #include "tooloptionwidget.h" @@ -141,9 +142,13 @@ void MainWindow2::createDockWidgets() mTimeLine = new TimeLine(this); mTimeLine->setObjectName("TimeLine"); - mColorWheel = new ColorBox(this); - mColorWheel->setToolTip(tr("color palette:
use (C)
toggle at cursor")); - mColorWheel->setObjectName("ColorWheel"); + mColorBox = new ColorBox(this); + mColorBox->setToolTip(tr("color palette:
use (C)
toggle at cursor")); + mColorBox->setObjectName("ColorWheel"); + + mColorInspector = new ColorInspector(this); + mColorInspector->setToolTip(tr("Color inspector")); + mColorInspector->setObjectName("Color Inspector"); mColorPalette = new ColorPaletteWidget(this); mColorPalette->setObjectName("ColorPalette"); @@ -165,12 +170,14 @@ void MainWindow2::createDockWidgets() mDockWidgets << mTimeLine - << mColorWheel + << mColorBox + << mColorInspector << mColorPalette << mDisplayOptionWidget << mToolOptions << mToolBox; +// mColorInspector->setFloating(true); mStartIcon = QIcon(":icons/controls/play.png"); mStopIcon = QIcon(":icons/controls/stop.png"); @@ -186,12 +193,13 @@ void MainWindow2::createDockWidgets() qDebug() << "Init Dock widget: " << pWidget->objectName(); } - addDockWidget(Qt::RightDockWidgetArea, mColorWheel); + addDockWidget(Qt::RightDockWidgetArea, mColorBox); addDockWidget(Qt::RightDockWidgetArea, mColorPalette); addDockWidget(Qt::RightDockWidgetArea, mDisplayOptionWidget); addDockWidget(Qt::LeftDockWidgetArea, mToolBox); addDockWidget(Qt::LeftDockWidgetArea, mToolOptions); addDockWidget(Qt::BottomDockWidgetArea, mTimeLine); +// addDockWidget(Qt::LeftDockWidgetArea, mColorInspector); setDockNestingEnabled(true); //addDockWidget( Qt::BottomDockWidgetArea, mTimeline2); @@ -205,7 +213,8 @@ void MainWindow2::createDockWidgets() makeConnections(mEditor); makeConnections(mEditor, mTimeLine); - makeConnections(mEditor, mColorWheel); + makeConnections(mEditor, mColorBox); + makeConnections(mEditor, mColorInspector); makeConnections(mEditor, mColorPalette); makeConnections(mEditor, mToolOptions); @@ -324,7 +333,7 @@ void MainWindow2::createMenus() { mToolBox->toggleViewAction(), mToolOptions->toggleViewAction(), - mColorWheel->toggleViewAction(), + mColorBox->toggleViewAction(), mColorPalette->toggleViewAction(), mTimeLine->toggleViewAction(), mDisplayOptionWidget->toggleViewAction() @@ -791,7 +800,7 @@ void MainWindow2::lockWidgets(bool shouldLock) { QDockWidget::DockWidgetFeature feat = shouldLock ? QDockWidget::DockWidgetClosable : QDockWidget::AllDockWidgetFeatures; - mColorWheel->setFeatures(feat); + mColorBox->setFeatures(feat); mColorPalette->setFeatures(feat); mDisplayOptionWidget->setFeatures(feat); mToolOptions->setFeatures(feat); @@ -958,7 +967,7 @@ void MainWindow2::setupKeyboardShortcuts() mToolBox->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TOOLBOX)); mToolOptions->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TOOL_OPTIONS)); - mColorWheel->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_COLOR_WHEEL)); + mColorBox->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_COLOR_WHEEL)); mColorPalette->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_COLOR_LIBRARY)); mTimeLine->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_TIMELINE)); mDisplayOptionWidget->toggleViewAction()->setShortcut(cmdKeySeq(CMD_TOGGLE_DISPLAY_OPTIONS)); @@ -1044,6 +1053,12 @@ void MainWindow2::makeConnections(Editor* editor, ColorBox* colorBox) connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor); } +void MainWindow2::makeConnections(Editor* editor, ColorInspector* colorInspector) +{ + connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setColor); + connect(editor->color(), &ColorManager::colorChanged, colorInspector, &ColorInspector::setColor); +} + void MainWindow2::makeConnections(Editor* editor, ScribbleArea* scribbleArea) { connect(editor->tools(), &ToolManager::toolChanged, scribbleArea, &ScribbleArea::setCurrentTool); diff --git a/app/src/mainwindow2.h b/app/src/mainwindow2.h index 6933c0efce..cba5e3f260 100644 --- a/app/src/mainwindow2.h +++ b/app/src/mainwindow2.h @@ -36,6 +36,7 @@ class ToolBoxWidget; class PreferencesDialog; class PreviewWidget; class ColorBox; +class ColorInspector; class RecentFileMenu; class Timeline2; class ActionCommands; @@ -117,7 +118,8 @@ private slots: void changePlayState(bool isPlaying); void makeConnections(Editor*); - void makeConnections(Editor*, ColorBox*); + void makeConnections(Editor*, ColorBox* colorBox); + void makeConnections(Editor*, ColorInspector*); void makeConnections(Editor*, ScribbleArea*); void makeConnections(Editor*, ColorPaletteWidget*); void makeConnections(Editor*, TimeLine*); @@ -127,7 +129,7 @@ private slots: void bindActionWithSetting(QAction*, SETTING); // UI: Dock widgets - ColorBox* mColorWheel = nullptr; + ColorBox* mColorBox = nullptr; ColorPaletteWidget* mColorPalette = nullptr; DisplayOptionWidget* mDisplayOptionWidget = nullptr; ToolOptionWidget* mToolOptions = nullptr; @@ -137,6 +139,7 @@ private slots: PreferencesDialog* mPrefDialog = nullptr; //PreviewWidget* mPreview = nullptr; TimeLine* mTimeLine = nullptr; // be public temporary + ColorInspector* mColorInspector = nullptr; // backup BackupElement* mBackupAtSave = nullptr; diff --git a/app/ui/colorinspector.ui b/app/ui/colorinspector.ui index 9045819667..1ca70e96a2 100644 --- a/app/ui/colorinspector.ui +++ b/app/ui/colorinspector.ui @@ -7,8 +7,8 @@ 0 0 - 114 - 152 + 301 + 162 @@ -22,7 +22,7 @@ 2 - 2 + 5 2 @@ -38,53 +38,170 @@ 2 + + 0 + - + + + + 0 + 0 + + + + + 40 + 0 + + + + + 40 + 20 + + HSV + + + 16 + 16 + + + + true + - + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + + 40 + 0 + + + + + 40 + 20 + + RGB - + true + + false + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + - 2 + 0 + + + 0 + 0 + + - Red + R + + + 2 - - - - 255 + + + + A + + + 2 - Green + G + + + 2 - + + + + + 60 + 16777215 + + + + 255 + + + + + + + 60 + 16777215 + + 255 @@ -93,31 +210,172 @@ - Blue + B + + + 2 - - + + + + + 60 + 16777215 + + 255 - - - - Alpha + + + + + 16777215 + 10 + + + + 5 + + + 5 + + + 5 + + + 5 + + + 5 + + - + + + + 60 + 16777215 + + 255 + + + + + 16777215 + 10 + + + + + 5 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + 16777215 + 10 + + + + + 5 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + 0 + 0 + + + + + 0 + 10 + + + + + 16777215 + 10 + + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + @@ -162,9 +420,15 @@ + + + ColorSlider + QWidget +
colorslider.h
+ 1 +
+
- hsv - rgb RedspinBox GreenspinBox BluespinBox diff --git a/app/ui/colorpalette.ui b/app/ui/colorpalette.ui index 4614f1d973..8c0cf48809 100644 --- a/app/ui/colorpalette.ui +++ b/app/ui/colorpalette.ui @@ -2,18 +2,18 @@ ColorPalette + + + 0 + 0 + 268 + 241 + + Color Palette - - - 0 - 0 - 246 - 337 - - 1 @@ -87,6 +87,69 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 20 + 20 + + + + + 20 + 20 + + + + Native color dialog window + + + + + + + :/app/icons/new/svg/color-dialog.svg:/app/icons/new/svg/color-dialog.svg + + + + 16 + 16 + + + + true + + + @@ -115,12 +178,16 @@ -1 - ... + + + + + :/app/icons/new/svg/more_options.svg:/app/icons/new/svg/more_options.svg 15 - 10 + 15 diff --git a/core_lib/src/managers/colormanager.cpp b/core_lib/src/managers/colormanager.cpp index 126f54bd87..2eb5220917 100644 --- a/core_lib/src/managers/colormanager.cpp +++ b/core_lib/src/managers/colormanager.cpp @@ -59,6 +59,7 @@ void ColorManager::workingLayerChanged(Layer* layer) QColor ColorManager::frontColor() { + if (mIsWorkingOnVectorLayer) return object()->getColour(mCurrentColorIndex).colour; else @@ -72,6 +73,7 @@ void ColorManager::setColorNumber(int n) mCurrentColorIndex = n; QColor currentColor = object()->getColour(mCurrentColorIndex).colour; + emit colorNumberChanged(mCurrentColorIndex); emit colorChanged(currentColor, mCurrentColorIndex); } @@ -81,11 +83,13 @@ void ColorManager::setColor(const QColor& newColor) if (mCurrentFrontColor != newColor) { mCurrentFrontColor = newColor; - - if ( mIsWorkingOnVectorLayer ) - object()->setColour(mCurrentColorIndex, newColor); - emit colorChanged(newColor, (mIsWorkingOnVectorLayer) ? mCurrentColorIndex : -1); + emit colorChanged(mCurrentFrontColor, mCurrentColorIndex); + + if (mIsWorkingOnVectorLayer) + { + object()->setColour(mCurrentColorIndex, newColor); + } } } From 1415a016812540e880a4538eca87c26b0d5a6c7a Mon Sep 17 00:00:00 2001 From: CandyFace Date: Wed, 16 May 2018 19:27:42 +0200 Subject: [PATCH 2/4] Use loadcolor instead of qsettings --- app/src/colorbox.cpp | 22 +++++++++++++++------- app/src/colorbox.h | 3 +++ app/src/colorwheel.cpp | 3 --- app/src/mainwindow2.cpp | 1 + core_lib/src/managers/colormanager.cpp | 3 +++ core_lib/src/managers/colormanager.h | 1 + 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/src/colorbox.cpp b/app/src/colorbox.cpp index 16c9b3b20e..d0fab3e93f 100644 --- a/app/src/colorbox.cpp +++ b/app/src/colorbox.cpp @@ -18,7 +18,6 @@ GNU General Public License for more details. #include "colorwheel.h" #include "colorinspector.h" #include "colorbox.h" -#include "qsettings.h" #include "pencildef.h" ColorBox::ColorBox( QWidget* parent ) : BaseDockWidget( parent ) @@ -38,7 +37,6 @@ ColorBox::ColorBox( QWidget* parent ) : BaseDockWidget( parent ) connect(mColorWheel, &ColorWheel::colorChanged, this, &ColorBox::onWheelMove); connect(mColorWheel, &ColorWheel::colorSelected, this, &ColorBox::onWheelRelease); -// connect(this, &ColorBox::colorChanged, mColorWheel, &ColorWheel::setColor); } ColorBox::~ColorBox() @@ -47,15 +45,11 @@ ColorBox::~ColorBox() void ColorBox::initUI() { - QSettings settings(PENCIL2D, PENCIL2D); - - QColor savedColor; - savedColor.setRgba(settings.value("colorOfSliders").toUInt()); - setColor(savedColor); } void ColorBox::updateUI() { + mColorLoaded = true; } QColor ColorBox::color() @@ -63,8 +57,22 @@ QColor ColorBox::color() return mColorWheel->color(); } +/** + * @brief ColorBox::loadColor + * + * This value is only to be used once + * for further color modifications, use setColor + */ +void ColorBox::loadColor(const QColor& color) +{ + mColorLoaded = false; + mColorWheel->setColor(color); +} + void ColorBox::setColor(const QColor& newColor) { + if (!mColorLoaded) { return; } + if ( newColor != mColorWheel->color() ) { mColorWheel->setColor(newColor); diff --git a/app/src/colorbox.h b/app/src/colorbox.h index 3bcc2f8900..0dca261bea 100644 --- a/app/src/colorbox.h +++ b/app/src/colorbox.h @@ -33,6 +33,7 @@ class ColorBox : public BaseDockWidget QColor color(); void setColor(const QColor&); + void loadColor(const QColor&); Q_SIGNALS: void colorChanged(const QColor&); @@ -42,6 +43,8 @@ class ColorBox : public BaseDockWidget void onWheelRelease(const QColor&); ColorWheel* mColorWheel = nullptr; + + bool mColorLoaded = false; // ColorInspector* mColorInspector = nullptr; }; diff --git a/app/src/colorwheel.cpp b/app/src/colorwheel.cpp index 8ef1ccb815..787a0218cc 100644 --- a/app/src/colorwheel.cpp +++ b/app/src/colorwheel.cpp @@ -23,7 +23,6 @@ GNU General Public License for more details. #include #include #include -#include "qsettings.h" #include "pencildef.h" #include "colorwheel.h" @@ -232,8 +231,6 @@ void ColorWheel::mouseMoveEvent(QMouseEvent* event) void ColorWheel::mouseReleaseEvent(QMouseEvent *) { - QSettings settings(PENCIL2D, PENCIL2D); - settings.setValue("colorOfSliders", mCurrentColor.rgba()); mIsInWheel = false; mIsInSquare = false; emit colorSelected(mCurrentColor); diff --git a/app/src/mainwindow2.cpp b/app/src/mainwindow2.cpp index 34d5f21b25..dde469362d 100644 --- a/app/src/mainwindow2.cpp +++ b/app/src/mainwindow2.cpp @@ -1052,6 +1052,7 @@ void MainWindow2::makeConnections(Editor* editor, ColorBox* colorBox) { connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setColor); connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor); + connect(editor->color(), &ColorManager::colorLoaded, colorBox, &ColorBox::loadColor); } void MainWindow2::makeConnections(Editor* editor, ColorInspector* colorInspector) diff --git a/core_lib/src/managers/colormanager.cpp b/core_lib/src/managers/colormanager.cpp index 2eb5220917..7a8464736d 100644 --- a/core_lib/src/managers/colormanager.cpp +++ b/core_lib/src/managers/colormanager.cpp @@ -38,6 +38,9 @@ Status ColorManager::load(Object* o) { mCurrentColorIndex = 0; mCurrentFrontColor = o->data()->getCurrentColor(); + + emit colorLoaded(mCurrentFrontColor); + return Status::OK; } diff --git a/core_lib/src/managers/colormanager.h b/core_lib/src/managers/colormanager.h index 6a7942e232..e60ea25156 100644 --- a/core_lib/src/managers/colormanager.h +++ b/core_lib/src/managers/colormanager.h @@ -43,6 +43,7 @@ class ColorManager : public BaseManager Q_SIGNALS: void colorChanged(QColor, int); // new color and color index void colorNumberChanged(int); + void colorLoaded(QColor); private: QColor mCurrentFrontColor{ 33, 33, 33 }; From c9423c532a7612e9e73c62cc7b8bb1866b7871d2 Mon Sep 17 00:00:00 2001 From: Matt Chang Date: Thu, 17 May 2018 10:57:58 +1000 Subject: [PATCH 3/4] Compare the new color and current color under the same color spec --- app/src/colorinspector.cpp | 6 ++++-- app/src/colorinspector.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/colorinspector.cpp b/app/src/colorinspector.cpp index 752f96c510..38213b7f67 100644 --- a/app/src/colorinspector.cpp +++ b/app/src/colorinspector.cpp @@ -113,8 +113,11 @@ void ColorInspector::onSliderChanged(QColor color) emit colorChanged(color); } -void ColorInspector::setColor(const QColor &newColor) +void ColorInspector::setColor(QColor newColor) { + // compare under the same color spec + newColor = (isRgbColors) ? newColor.toRgb() : newColor.toHsv(); + if (newColor == mCurrentColor) { return; @@ -187,7 +190,6 @@ void ColorInspector::mouseReleaseEvent(QMouseEvent*) void ColorInspector::onModeChanged() { - // assume hsv if not checked bool newValue = ui->rgbButton->isChecked(); diff --git a/app/src/colorinspector.h b/app/src/colorinspector.h index 2f9898abaf..5b81109e43 100644 --- a/app/src/colorinspector.h +++ b/app/src/colorinspector.h @@ -47,7 +47,7 @@ class ColorInspector : public BaseDockWidget void modeChange(const bool& isRgb); public slots: - void setColor(const QColor &c); + void setColor(QColor newColor); private slots: void onModeChanged(); From ed25cfbc8d19966cd0a3f48fae83b40aa43c20a5 Mon Sep 17 00:00:00 2001 From: Matt Chang Date: Thu, 17 May 2018 12:17:16 +1000 Subject: [PATCH 4/4] Block signals when updating UI components to avoid unwanted signal emitting - ex. Spinboxes may emit valueChanged when setting a new range, end up sending a invalid color value --- app/src/colorinspector.cpp | 46 +++++++++++++++++++++++++++++++------- app/src/colorinspector.h | 1 - 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/src/colorinspector.cpp b/app/src/colorinspector.cpp index 38213b7f67..e6266f4811 100644 --- a/app/src/colorinspector.cpp +++ b/app/src/colorinspector.cpp @@ -24,6 +24,7 @@ GNU General Public License for more details. #include "colorslider.h" #include "pencildef.h" + ColorInspector::ColorInspector(QWidget *parent) : BaseDockWidget(parent) { @@ -97,7 +98,6 @@ void ColorInspector::updateUI() void ColorInspector::onSliderChanged(QColor color) { - if (isRgbColors) { ui->red_slider->setRgb(color); ui->green_slider->setRgb(color); @@ -122,16 +122,25 @@ void ColorInspector::setColor(QColor newColor) { return; } - noColorUpdate = true; qDebug() << "set color"; if(isRgbColors) { + QSignalBlocker b1(ui->red_slider); + QSignalBlocker b2(ui->green_slider); + QSignalBlocker b3(ui->blue_slider); + QSignalBlocker b4(ui->alpha_slider); + ui->red_slider->setRgb(newColor); ui->green_slider->setRgb(newColor); ui->blue_slider->setRgb(newColor); ui->alpha_slider->setRgb(newColor); + QSignalBlocker b5(ui->RedspinBox); + QSignalBlocker b6(ui->GreenspinBox); + QSignalBlocker b7(ui->BluespinBox); + QSignalBlocker b8(ui->AlphaspinBox); + ui->RedspinBox->setValue(newColor.red()); ui->GreenspinBox->setValue(newColor.green()); ui->BluespinBox->setValue(newColor.blue()); @@ -139,11 +148,21 @@ void ColorInspector::setColor(QColor newColor) } else { + QSignalBlocker b1(ui->red_slider); + QSignalBlocker b2(ui->green_slider); + QSignalBlocker b3(ui->blue_slider); + QSignalBlocker b4(ui->alpha_slider); + ui->red_slider->setHsv(newColor); ui->green_slider->setHsv(newColor); ui->blue_slider->setHsv(newColor); ui->alpha_slider->setHsv(newColor); + QSignalBlocker b5(ui->RedspinBox); + QSignalBlocker b6(ui->GreenspinBox); + QSignalBlocker b7(ui->BluespinBox); + QSignalBlocker b8(ui->AlphaspinBox); + ui->RedspinBox->setValue(newColor.hsvHue()); ui->GreenspinBox->setValue(qRound(newColor.hsvSaturation() / 2.55)); ui->BluespinBox->setValue(qRound(newColor.value() / 2.55)); @@ -157,7 +176,7 @@ void ColorInspector::setColor(QColor newColor) p2.setColor(QPalette::Background, mCurrentColor); ui->colorWrapper->setPalette(p1); ui->color->setPalette(p2); - noColorUpdate = false; + update(); } @@ -197,10 +216,16 @@ void ColorInspector::onModeChanged() settings.setValue("isRgb", newValue); isRgbColors = newValue; - noColorUpdate = true; if (isRgbColors) { + // Spinboxes may emit unwanted valueChanged signals when setting ranges + // so block them all first + QSignalBlocker b1(ui->RedspinBox); + QSignalBlocker b2(ui->GreenspinBox); + QSignalBlocker b3(ui->BluespinBox); + QSignalBlocker b4(ui->AlphaspinBox); + ui->red->setText("R"); ui->green->setText("G"); ui->blue->setText("B"); @@ -214,6 +239,7 @@ void ColorInspector::onModeChanged() ui->BluespinBox->setSuffix(""); ui->AlphaspinBox->setRange(0,255); ui->AlphaspinBox->setSuffix(""); + mCurrentColor = mCurrentColor.toRgb(); ui->red_slider->setMax(255); @@ -233,6 +259,11 @@ void ColorInspector::onModeChanged() } else { + QSignalBlocker b1(ui->RedspinBox); + QSignalBlocker b2(ui->GreenspinBox); + QSignalBlocker b3(ui->BluespinBox); + QSignalBlocker b4(ui->AlphaspinBox); + ui->red->setText("H"); ui->green->setText("S"); ui->blue->setText("V"); @@ -257,22 +288,21 @@ void ColorInspector::onModeChanged() ui->AlphaspinBox->setRange(0,100); ui->AlphaspinBox->setSuffix("%"); - qreal bound = 100.0/255.0; // from 255 to 100 mCurrentColor = mCurrentColor.toHsv(); + + const qreal bound = 100.0 / 255.0; // from 255 to 100 + ui->RedspinBox->setValue(mCurrentColor.hsvHue()); ui->GreenspinBox->setValue(qRound(mCurrentColor.hsvSaturation()*bound)); ui->BluespinBox->setValue(qRound(mCurrentColor.value()*bound)); ui->AlphaspinBox->setValue(qRound(mCurrentColor.alpha()*bound)); } - noColorUpdate = false; emit modeChange(isRgbColors); } void ColorInspector::onColorChanged() { - if(noColorUpdate) return; - QColor c; if (isRgbColors) { c.setRgb( diff --git a/app/src/colorinspector.h b/app/src/colorinspector.h index 5b81109e43..735f2580c4 100644 --- a/app/src/colorinspector.h +++ b/app/src/colorinspector.h @@ -58,7 +58,6 @@ private slots: Ui::ColorInspector* ui = nullptr; bool isRgbColors = true; - bool noColorUpdate = false; QColor mCurrentColor; };