diff --git a/app/src/colorpalettewidget.cpp b/app/src/colorpalettewidget.cpp index 8d17eb6959..7f86fcd602 100644 --- a/app/src/colorpalettewidget.cpp +++ b/app/src/colorpalettewidget.cpp @@ -129,13 +129,11 @@ void ColorPaletteWidget::showContextMenu(const QPoint& pos) void ColorPaletteWidget::addItem() { QSignalBlocker b(ui->colorListWidget); - QColor newColor = mEditor->color()->frontColor(); - - // add at bottom - int colorIndex = ui->colorListWidget->count(); + QColor newColor = mEditor->color()->frontColor(false); ColorRef ref(newColor); + const int colorIndex = ui->colorListWidget->count(); mObject->addColorAtIndex(colorIndex, ref); refreshColorList(); @@ -155,14 +153,13 @@ void ColorPaletteWidget::replaceItem() QSignalBlocker b(ui->colorListWidget); int index = ui->colorListWidget->currentRow(); - QColor newColor = mEditor->color()->frontColor(); + QColor newColor = mEditor->color()->frontColor(false); - if (index >= 0) - { - updateItemColor(index, newColor); - emit colorChanged(newColor); - ui->colorListWidget->setCurrentRow(index); - } + if (index < 0 ) { return; } + + updateItemColor(index, newColor); + emit colorNumberChanged(index); + ui->colorListWidget->setCurrentRow(index); } void ColorPaletteWidget::removeItem() @@ -171,18 +168,7 @@ void ColorPaletteWidget::removeItem() clickRemoveColorButton(); } -void ColorPaletteWidget::setColor(QColor newColor, int colorIndex) -{ - QSignalBlocker b(ui->colorListWidget); - ui->colorListWidget->setCurrentRow(colorIndex); - - if (colorIndex >= 0) - { - emit colorChanged(newColor); - } -} - -void ColorPaletteWidget::selectColorNumber(int colorNumber) +void ColorPaletteWidget::selectColorNumber(int colorNumber) const { ui->colorListWidget->setCurrentRow(colorNumber); } @@ -204,6 +190,20 @@ void ColorPaletteWidget::refreshColorList() ui->colorListWidget->clear(); } + int colorCount = editor()->object()->getColorCount(); + + for (int i = 0; i < colorCount; i++) + { + addSwatch(i); + } + + selectColorNumber(editor()->color()->frontColorNumber()); + updateGridUI(); + update(); +} + +void ColorPaletteWidget::addSwatch(int colorIndex) const +{ QPixmap originalColorSwatch(mIconSize); QPainter painter(&originalColorSwatch); painter.drawTiledPixmap(0, 0, mIconSize.width(), mIconSize.height(), QPixmap(":/background/checkerboard.png")); @@ -217,45 +217,39 @@ void ColorPaletteWidget::refreshColorList() borderHighlight.setColor(QColor(255, 255, 255, 200)); borderHighlight.setDashOffset(4); - const int colorCount = mObject->getColorCount(); + const ColorRef colorRef = mObject->getColor(colorIndex); + QListWidgetItem* colorItem = new QListWidgetItem(ui->colorListWidget); - for (int i = 0; i < colorCount; i++) + if (ui->colorListWidget->viewMode() != QListView::IconMode) { - const ColorRef colorRef = mObject->getColor(i); - QListWidgetItem* colorItem = new QListWidgetItem(ui->colorListWidget); + colorItem->setText(colorRef.name); + } + else + { + colorItem->setToolTip(colorRef.name); + } - if (ui->colorListWidget->viewMode() != QListView::IconMode) - { - colorItem->setText(colorRef.name); - } - else - { - colorItem->setToolTip(colorRef.name); - } - QPixmap colorSwatch = originalColorSwatch; - QPainter swatchPainter(&colorSwatch); - swatchPainter.fillRect(0, 0, mIconSize.width(), mIconSize.height(), colorRef.color); + QPixmap colorSwatch = originalColorSwatch; + QPainter swatchPainter(&colorSwatch); + swatchPainter.fillRect(0, 0, mIconSize.width(), mIconSize.height(), colorRef.color); - QIcon swatchIcon; - swatchIcon.addPixmap(colorSwatch, QIcon::Normal); + QIcon swatchIcon; + swatchIcon.addPixmap(colorSwatch, QIcon::Normal); - // Draw selection border - if (ui->colorListWidget->viewMode() == QListView::IconMode) - { - swatchPainter.setPen(borderHighlight); - swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1); - swatchPainter.setPen(borderShadow); - swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1); - } - swatchIcon.addPixmap(colorSwatch, QIcon::Selected); + // Draw selection border + if (ui->colorListWidget->viewMode() == QListView::IconMode) + { + swatchPainter.setPen(borderHighlight); + swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1); + swatchPainter.setPen(borderShadow); + swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1); + } + swatchIcon.addPixmap(colorSwatch, QIcon::Selected); - colorItem->setIcon(swatchIcon); - colorItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDragEnabled); + colorItem->setIcon(swatchIcon); + colorItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDragEnabled); - ui->colorListWidget->addItem(colorItem); - } - updateGridUI(); - update(); + ui->colorListWidget->addItem(colorItem); } void ColorPaletteWidget::changeColorName(QListWidgetItem* item) @@ -574,7 +568,7 @@ void ColorPaletteWidget::clickAddColorButton() if (mIsColorDialog) newColor = QColorDialog::getColor(prevColor.rgba(), this, QString(), QColorDialog::ShowAlphaChannel); else - newColor = mEditor->color()->frontColor(); + newColor = mEditor->color()->frontColor(false); if (!newColor.isValid()) { @@ -588,7 +582,7 @@ void ColorPaletteWidget::clickAddColorButton() refreshColorList(); editor()->color()->setColorNumber(colorIndex); - editor()->color()->setColor(ref.color); + editor()->color()->setIndexedColor(ref.color); if (mFitSwatches) { fitSwatchSize(); @@ -604,6 +598,14 @@ void ColorPaletteWidget::clickRemoveColorButton() // items are not deleted by qt, it has to be done manually // delete should happen before removing the color from from palette // as the palette will be one ahead and crash otherwise + + if (mObject->getColorCount() == 1) + { + showPaletteReminder(); + break; + } + + bool colorRemoved = false; if (mObject->isColorInUse(index)) { bool accepted = false; @@ -614,24 +616,27 @@ void ColorPaletteWidget::clickRemoveColorButton() { delete item; mObject->removeColor(index); + colorRemoved = true; } } else if (mObject->getColorCount() > 1) { delete item; mObject->removeColor(index); + colorRemoved = true; } - else if (mObject->getColorCount() == 1) - { - showPaletteReminder(); + + if (colorRemoved) { + int newIndex = qBound(0, index-1, mObject->getColorCount() - 1); + emit colorNumberChanged(newIndex); } - mEditor->updateCurrentFrame(); } mMultipleSelected = false; if (mFitSwatches) { fitSwatchSize(); } + mEditor->updateCurrentFrame(); } bool ColorPaletteWidget::showPaletteWarning() @@ -688,6 +693,7 @@ void ColorPaletteWidget::updateItemColor(int itemIndex, QColor newColor) swatchIcon.addPixmap(colorSwatch, QIcon::Selected); ui->colorListWidget->item(itemIndex)->setIcon(swatchIcon); + editor()->object()->setColor(itemIndex, newColor); // Make sure to update grid in grid mode if (ui->colorListWidget->viewMode() == QListView::IconMode) diff --git a/app/src/colorpalettewidget.h b/app/src/colorpalettewidget.h index 106891af95..7d1be3c150 100644 --- a/app/src/colorpalettewidget.h +++ b/app/src/colorpalettewidget.h @@ -50,8 +50,7 @@ class ColorPaletteWidget : public BaseDockWidget int currentColorNumber(); - void selectColorNumber(int); - void setColor(QColor, int); + void selectColorNumber(int) const; void refreshColorList(); void adjustSwatches(); @@ -59,7 +58,6 @@ class ColorPaletteWidget : public BaseDockWidget void showContextMenu(const QPoint&); signals: - void colorChanged(QColor); void colorNumberChanged(int); protected: @@ -90,6 +88,7 @@ private slots: private: void updateItemColor(int, QColor); void updateGridUI(); + void addSwatch(int colorIndex) const; Ui::ColorPalette* ui = nullptr; QActionGroup* mLayoutModeActionGroup = nullptr; diff --git a/app/src/mainwindow2.cpp b/app/src/mainwindow2.cpp index 1966d80441..b87bfb8504 100644 --- a/app/src/mainwindow2.cpp +++ b/app/src/mainwindow2.cpp @@ -1405,13 +1405,13 @@ void MainWindow2::makeConnections(Editor* editor) void MainWindow2::makeConnections(Editor* editor, ColorBox* colorBox) { - connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setColor); + connect(colorBox, &ColorBox::colorChanged, editor->color(), &ColorManager::setFrontColor); connect(editor->color(), &ColorManager::colorChanged, colorBox, &ColorBox::setColor); } void MainWindow2::makeConnections(Editor* editor, ColorInspector* colorInspector) { - connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setColor); + connect(colorInspector, &ColorInspector::colorChanged, editor->color(), &ColorManager::setFrontColor); connect(editor->color(), &ColorManager::colorChanged, colorInspector, &ColorInspector::setColor); } @@ -1489,12 +1489,8 @@ void MainWindow2::makeConnections(Editor* pEditor, ColorPaletteWidget* pColorPal ColorManager* pColorManager = pEditor->color(); ScribbleArea* pScribbleArea = pEditor->getScribbleArea(); - connect(pColorPalette, &ColorPaletteWidget::colorChanged, pColorManager, &ColorManager::setColor); connect(pColorPalette, &ColorPaletteWidget::colorNumberChanged, pColorManager, &ColorManager::setColorNumber); - - connect(pColorPalette, &ColorPaletteWidget::colorChanged, pScribbleArea, &ScribbleArea::paletteColorChanged); - - connect(pColorManager, &ColorManager::colorChanged, pColorPalette, &ColorPaletteWidget::setColor); + connect(pColorManager, &ColorManager::colorNumberChanged, pScribbleArea, &ScribbleArea::paletteColorChanged); connect(pColorManager, &ColorManager::colorNumberChanged, pColorPalette, &ColorPaletteWidget::selectColorNumber); } diff --git a/core_lib/src/graphics/vector/vectorimage.cpp b/core_lib/src/graphics/vector/vectorimage.cpp index 940c90e8bc..3735d39db5 100644 --- a/core_lib/src/graphics/vector/vectorimage.cpp +++ b/core_lib/src/graphics/vector/vectorimage.cpp @@ -1150,11 +1150,17 @@ void VectorImage::removeColor(int index) { for (int i = 0; i < mArea.size(); i++) { - if (mArea[i].getColorNumber() > index) mArea[i].decreaseColorNumber(); + int colorNumber = mArea[i].getColorNumber(); + if (colorNumber >= index && colorNumber > 0) { + mArea[i].decreaseColorNumber(); + } } for (int i = 0; i < mCurves.size(); i++) { - if (mCurves[i].getColorNumber() > index) mCurves[i].decreaseColorNumber(); + int colorNumber = mCurves[i].getColorNumber(); + if (colorNumber >= index && colorNumber > 0) { + mCurves[i].decreaseColorNumber(); + } } } diff --git a/core_lib/src/managers/colormanager.cpp b/core_lib/src/managers/colormanager.cpp index a4ab06d203..66ff1b83a3 100644 --- a/core_lib/src/managers/colormanager.cpp +++ b/core_lib/src/managers/colormanager.cpp @@ -58,10 +58,9 @@ void ColorManager::workingLayerChanged(Layer* layer) } } -QColor ColorManager::frontColor() +QColor ColorManager::frontColor(bool useIndexedColor) { - - if (mIsWorkingOnVectorLayer) + if (mIsWorkingOnVectorLayer && useIndexedColor) return object()->getColor(mCurrentColorIndex).color; else return mCurrentFrontColor; @@ -76,25 +75,22 @@ void ColorManager::setColorNumber(int n) QColor currentColor = object()->getColor(mCurrentColorIndex).color; emit colorNumberChanged(mCurrentColorIndex); - emit colorChanged(currentColor, mCurrentColorIndex); + setFrontColor(currentColor); } -void ColorManager::setColor(const QColor& newColor) +void ColorManager::setFrontColor(const QColor& newFrontColor) { - if (mCurrentFrontColor != newColor) - { - mCurrentFrontColor = newColor; - - emit colorChanged(mCurrentFrontColor, mCurrentColorIndex); + mCurrentFrontColor = newFrontColor; + emit colorChanged(newFrontColor, mCurrentColorIndex); +} - if (mIsWorkingOnVectorLayer) - { - object()->setColor(mCurrentColorIndex, newColor); - } - } +void ColorManager::setIndexedColor(const QColor& newColor) +{ + object()->setColor(mCurrentColorIndex, newColor); + emit colorChanged(newColor, mCurrentColorIndex); } -int ColorManager::frontColorNumber() +int ColorManager::frontColorNumber() const { return mCurrentColorIndex; } diff --git a/core_lib/src/managers/colormanager.h b/core_lib/src/managers/colormanager.h index 2e950c94f9..ca1fe2bb77 100644 --- a/core_lib/src/managers/colormanager.h +++ b/core_lib/src/managers/colormanager.h @@ -35,10 +35,17 @@ class ColorManager : public BaseManager Status save(Object*) override; void workingLayerChanged(Layer*) override; - QColor frontColor(); - int frontColorNumber(); - void setColor(const QColor& color); + /** frontColor + * @param useIndexedColor default true, will only affect vector layer + * @return Latest stored color for bitmap or indexed color for vector, unless useIndexedColor is false + */ + QColor frontColor(bool useIndexedColor = true); + void setFrontColor(const QColor& newFrontColor); + + /** Set color for current index */ + void setIndexedColor(const QColor& newColor); void setColorNumber(int n); + int frontColorNumber() const; signals: void colorChanged(QColor, int); // new color and color index diff --git a/core_lib/src/tool/eyedroppertool.cpp b/core_lib/src/tool/eyedroppertool.cpp index 2ffa083511..0007c1d867 100644 --- a/core_lib/src/tool/eyedroppertool.cpp +++ b/core_lib/src/tool/eyedroppertool.cpp @@ -131,7 +131,7 @@ void EyedropperTool::updateFrontColor() QColor pickedColor = getBitmapColor(static_cast(layer)); if (pickedColor.isValid()) { - mEditor->color()->setColor(pickedColor); + mEditor->color()->setFrontColor(pickedColor); } } else if (layer->type() == Layer::VECTOR) diff --git a/tests/src/test_colormanager.cpp b/tests/src/test_colormanager.cpp index 0fdc824569..c451d29c84 100644 --- a/tests/src/test_colormanager.cpp +++ b/tests/src/test_colormanager.cpp @@ -40,6 +40,7 @@ TEST_CASE("ColorManager Initial Test") TEST_CASE("ColorManager set color tests") { Object* object = new Object; + Editor* editor = new Editor; editor->setObject(object); ColorManager* cm = new ColorManager(editor); @@ -61,14 +62,15 @@ TEST_CASE("ColorManager set color tests") SECTION("setColor non vector layer") { cm->workingLayerChanged(layerObj->getLayer(2)); - cm->setColor(QColor(255,0,0)); + cm->setFrontColor(QColor(255,0,0)); REQUIRE(cm->frontColor() == QColor(255,0,0)); } SECTION("setColor vector layer") { + object->addColorAtIndex(0, QColor(255,255,255)); cm->workingLayerChanged(layerObj->getLayer(1)); - cm->setColor(QColor(255,255,255)); + cm->setIndexedColor(QColor(255,255,255)); REQUIRE(cm->frontColor() == QColor(255,255,255)); } @@ -93,7 +95,7 @@ TEST_CASE("Save and Load") SECTION("load") { - cm2->setColor(QColor(0,0,0)); + cm2->setFrontColor(QColor(0,0,0)); REQUIRE(cm2->frontColor() == QColor(0,0,0)); REQUIRE(cm2->load(objToLoad) == Status::OK); REQUIRE(cm2->frontColor() == QColor(255,255,0)); @@ -101,7 +103,7 @@ TEST_CASE("Save and Load") SECTION("save") { - cm2->setColor(QColor(0,255,0)); + cm2->setFrontColor(QColor(0,255,0)); REQUIRE(cm2->frontColor() == QColor(0,255,0)); REQUIRE(objToSave->data()->getCurrentColor() == QColor(45,45,255)); REQUIRE(cm2->save(objToSave) == Status::OK); diff --git a/tests/src/test_vectorimage.cpp b/tests/src/test_vectorimage.cpp new file mode 100644 index 0000000000..3dd55dea77 --- /dev/null +++ b/tests/src/test_vectorimage.cpp @@ -0,0 +1,27 @@ +#include "vectorimage.h" +#include "catch.hpp" + +TEST_CASE("VectorImage removeColor") +{ + auto vImage = VectorImage(); + auto bezier = BezierCurve({ QPoint(50,50), QPoint(100,100)}); + SECTION("Ensure that number is changed") + { + bezier.setColorNumber(3); + vImage.addCurve(bezier, 1.0); + + vImage.removeColor(3); + + REQUIRE(vImage.curve(0).getColorNumber() == 2); + } + + SECTION("Can't get below zero") + { + bezier.setColorNumber(0); + vImage.addCurve(bezier, 1.0); + + vImage.removeColor(0); + + REQUIRE(vImage.curve(0).getColorNumber() == 0); + } +} diff --git a/tests/tests.pro b/tests/tests.pro index 99340028c4..753c753948 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -44,6 +44,7 @@ SOURCES += \ src/test_filemanager.cpp \ src/test_bitmapimage.cpp \ src/test_bitmapbucket.cpp \ + src/test_vectorimage.cpp \ src/test_viewmanager.cpp # --- core_lib ---