17 #include "colorpalettewidget.h"
18 #include "ui_colorpalette.h"
25 #include <QListWidget>
26 #include <QListWidgetItem>
27 #include <QInputDialog>
28 #include <QColorDialog>
29 #include <QMessageBox>
30 #include <QPushButton>
35 #include <QAbstractItemModel>
42 #include "layerbitmap.h"
43 #include "colormanager.h"
46 ColorPaletteWidget::ColorPaletteWidget(
QWidget* parent) :
48 ui(new Ui::ColorPalette)
53 ColorPaletteWidget::~ColorPaletteWidget()
58 void ColorPaletteWidget::initUI()
61 int colorGridSize = settings.value(
"PreferredColorGridSize", 34).toInt();
62 mFitSwatches = settings.value(
"FitSwatchSize",
false).toBool();
68 mIconSize =
QSize(colorGridSize, colorGridSize);
72 QString sViewMode = settings.value(
"ColorPaletteViewMode",
"ListMode").toString();
73 if (sViewMode ==
"ListMode")
78 buttonStylesheet =
"::menu-indicator{ image: none; }"
79 "QPushButton { border: 0px; }"
80 "QPushButton:pressed { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }"
81 "QPushButton:checked { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }";
83 ui->addColorButton->setStyleSheet(buttonStylesheet);
84 ui->removeColorButton->setStyleSheet(buttonStylesheet);
85 ui->colorDialogButton->setStyleSheet(buttonStylesheet);
100 connect(editor(), &Editor::objectLoaded,
this, &ColorPaletteWidget::updateUI);
103 void ColorPaletteWidget::updateUI()
105 mObject = mEditor->object();
110 void ColorPaletteWidget::setCore(
Editor* editor)
113 mObject = mEditor->object();
116 void ColorPaletteWidget::showContextMenu(
const QPoint& pos)
118 QPoint globalPos = ui->colorListWidget->mapToGlobal(pos);
123 menu->
addAction(
tr(
"Add"),
this, &ColorPaletteWidget::addItem, 0);
124 menu->
addAction(
tr(
"Replace"),
this, &ColorPaletteWidget::replaceItem, 0);
125 menu->
addAction(
tr(
"Remove"),
this, &ColorPaletteWidget::removeItem, 0);
127 menu->
exec(globalPos);
130 void ColorPaletteWidget::addItem()
133 QColor newColor = mEditor->color()->frontColor();
136 int colorIndex = ui->colorListWidget->count();
140 mObject->addColorAtIndex(colorIndex, ref);
150 ui->colorListWidget->editItem(item);
151 ui->colorListWidget->scrollToItem(item);
154 void ColorPaletteWidget::replaceItem()
157 int index = ui->colorListWidget->currentRow();
159 QColor newColor = mEditor->color()->frontColor();
163 updateItemColor(index, newColor);
164 emit colorChanged(newColor);
165 ui->colorListWidget->setCurrentRow(index);
169 void ColorPaletteWidget::removeItem()
172 clickRemoveColorButton();
175 void ColorPaletteWidget::setColor(
QColor newColor,
int colorIndex)
178 ui->colorListWidget->setCurrentRow(colorIndex);
182 emit colorChanged(newColor);
186 void ColorPaletteWidget::selectColorNumber(
int colorNumber)
188 ui->colorListWidget->setCurrentRow(colorNumber);
191 int ColorPaletteWidget::currentColorNumber()
193 if (ui->colorListWidget->currentRow() < 0)
195 ui->colorListWidget->setCurrentRow(0);
197 return ui->colorListWidget->currentRow();
200 void ColorPaletteWidget::refreshColorList()
203 if (ui->colorListWidget->count() > 0)
205 ui->colorListWidget->clear();
208 QPixmap originalColorSwatch(mIconSize);
209 QPainter painter(&originalColorSwatch);
210 painter.drawTiledPixmap(0, 0, mIconSize.
width(), mIconSize.
height(),
QPixmap(
":/background/checkerboard.png"));
215 borderShadow.setDashPattern(dashPattern);
217 QPen borderHighlight(borderShadow);
218 borderHighlight.setColor(
QColor(255, 255, 255, 200));
219 borderHighlight.setDashOffset(4);
221 const int colorCount = mObject->getColorCount();
225 const ColorRef colorRef = mObject->getColor(i);
230 colorItem->
setText(colorRef.name);
236 QPixmap colorSwatch = originalColorSwatch;
237 QPainter swatchPainter(&colorSwatch);
238 swatchPainter.fillRect(0, 0, mIconSize.
width(), mIconSize.
height(), colorRef.color);
246 swatchPainter.setPen(borderHighlight);
247 swatchPainter.drawRect(0, 0, mIconSize.
width() - 1, mIconSize.
height() - 1);
248 swatchPainter.setPen(borderShadow);
249 swatchPainter.drawRect(0, 0, mIconSize.
width() - 1, mIconSize.
height() - 1);
253 colorItem->
setIcon(swatchIcon);
256 ui->colorListWidget->addItem(colorItem);
264 Q_ASSERT(item != NULL);
268 int colorNumber = ui->colorListWidget->row(item);
269 if (colorNumber > -1)
276 mObject->getColor(colorNumber).name,
280 mObject->renameColor(colorNumber, text);
289 int index = ui->colorListWidget->row(item);
291 mObject->renameColor(index, newColorName);
294 void ColorPaletteWidget::onRowsMoved(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row)
297 Q_UNUSED(destination)
300 int startIndex, endIndex;
304 if (start == row) {
return; }
309 mObject->movePaletteColor(startIndex, endIndex);
311 mObject->addColor(mObject->getColor(startIndex));
312 mObject->moveVectorColor(startIndex, mObject->getColorCount() - 1);
313 for (
int i = startIndex; i < endIndex; i++)
315 mObject->moveVectorColor(i + 1, i);
317 mObject->moveVectorColor(mObject->getColorCount() - 1, endIndex);
321 if (start == row) {
return; }
326 mObject->movePaletteColor(startIndex, endIndex);
328 mObject->addColor(mObject->getColor(startIndex));
329 mObject->moveVectorColor(startIndex, mObject->getColorCount() - 1);
330 for (
int i = startIndex; i > endIndex; i--)
332 mObject->moveVectorColor(i - 1, i);
334 mObject->moveVectorColor(mObject->getColorCount() - 1, endIndex);
337 mObject->removeColor(mObject->getColorCount() - 1);
342 void ColorPaletteWidget::clickColorListItem(
QListWidgetItem* currentItem)
344 auto modifiers = qApp->keyboardModifiers();
350 int colorIndex = ui->colorListWidget->row(currentItem);
352 emit colorNumberChanged(colorIndex);
355 void ColorPaletteWidget::palettePreferences()
357 ui->colorListWidget->setMinimumWidth(ui->colorListWidget->sizeHintForColumn(0));
360 mSeparator =
new QAction(
"",
this);
363 buttonStylesheet =
"::menu-indicator{ image: none; }"
364 "QToolButton { border: 0px; }"
365 "QToolButton:pressed { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }"
366 "QToolButton:checked { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }";
370 ui->palettePref->setIcon(
QIcon(
":/app/icons/new/svg/more_options.svg"));
371 ui->palettePref->setIconSize(
QSize(15,15));
372 ui->palettePref->setArrowType(Qt::ArrowType::NoArrow);
373 ui->palettePref->setStyleSheet(buttonStylesheet);
374 ui->palettePref->addAction(ui->listModeAction);
375 ui->palettePref->addAction(ui->gridModeAction);
377 ui->palettePref->addAction(mSeparator);
378 ui->palettePref->addAction(ui->smallSwatchAction);
379 ui->palettePref->addAction(ui->mediumSwatchAction);
380 ui->palettePref->addAction(ui->largeSwatchAction);
381 ui->palettePref->addAction(ui->fitSwatchAction);
383 if (mFitSwatches) ui->fitSwatchAction->setChecked(
true);
384 else if (mIconSize.
width() > MEDIUM_ICON_SIZE) ui->largeSwatchAction->setChecked(
true);
385 else if (mIconSize.
width() > MIN_ICON_SIZE) ui->mediumSwatchAction->setChecked(
true);
386 else ui->smallSwatchAction->setChecked(
true);
389 ui->listModeAction->setChecked(
true);
391 ui->gridModeAction->setChecked(
true);
401 void ColorPaletteWidget::setListMode()
405 ui->colorListWidget->setGridSize(
QSize(-1, -1));
413 settings.setValue(
"ColorPaletteViewMode",
"ListMode");
416 void ColorPaletteWidget::setGridMode()
421 ui->colorListWidget->setGridSize(
QSize(mIconSize.
width() + 1, mIconSize.
height() + 1));
429 settings.setValue(
"ColorPaletteViewMode",
"GridMode");
432 void ColorPaletteWidget::setSwatchSizeSmall()
434 if (mIconSize.
width() > MIN_ICON_SIZE)
436 mIconSize =
QSize(MIN_ICON_SIZE, MIN_ICON_SIZE);
439 mFitSwatches =
false;
441 settings.setValue(
"PreferredColorGridSize", MIN_ICON_SIZE);
442 settings.setValue(
"FitSwatchSize",
false);
446 void ColorPaletteWidget::setSwatchSizeMedium()
448 if (mIconSize.
width() != MEDIUM_ICON_SIZE)
450 mIconSize =
QSize(MEDIUM_ICON_SIZE, MEDIUM_ICON_SIZE);
453 mFitSwatches =
false;
455 settings.setValue(
"PreferredColorGridSize", MEDIUM_ICON_SIZE);
456 settings.setValue(
"FitSwatchSize",
false);
460 void ColorPaletteWidget::setSwatchSizeLarge()
462 if (mIconSize.
width() < MAX_ICON_SIZE)
464 mIconSize =
QSize(MAX_ICON_SIZE, MAX_ICON_SIZE);
467 mFitSwatches =
false;
469 settings.setValue(
"PreferredColorGridSize", MAX_ICON_SIZE);
470 settings.setValue(
"FitSwatchSize",
false);
474 void ColorPaletteWidget::adjustSwatches()
480 void ColorPaletteWidget::fitSwatchSize()
482 int height = ui->colorListWidget->height();
483 int width = ui->colorListWidget->width();
484 int hScrollBar = ui->colorListWidget->horizontalScrollBar()->geometry().height() + 6;
485 int vScrollBar = ui->colorListWidget->verticalScrollBar()->geometry().width() * 2;
486 int colorCount = editor()->object()->getColorCount();
491 size = qFloor((height - hScrollBar - (4 * colorCount)) / colorCount);
492 if (size < MIN_ICON_SIZE) size = MIN_ICON_SIZE;
493 if (size > MAX_ICON_SIZE) size = MAX_ICON_SIZE;
498 size = MIN_ICON_SIZE;
501 int columns = (width - vScrollBar) / size;
502 int rows =
static_cast<int>(qCeil(colorCount / columns));
503 if (height - hScrollBar > rows * (size + 6))
506 if (size == MAX_ICON_SIZE)
517 mIconSize =
QSize(size, size);
523 settings.setValue(
"PreferredColorGridSize", size);
524 settings.setValue(
"FitSwatchSize",
true);
527 void ColorPaletteWidget::resizeEvent(
QResizeEvent* event)
537 void ColorPaletteWidget::updateGridUI()
541 for (
int i = 1; i < 75; i++)
543 int size = (ui->colorListWidget->width() - 18) / i;
544 if (size >= mIconSize.
width() && size <= mIconSize.
width() + 8)
551 ui->colorListWidget->setIconSize(
QSize(tempSize.
width(), mIconSize.
height()));
552 ui->colorListWidget->setGridSize(
QSize(tempSize.
width(), mIconSize.
height() + 2));
557 ui->colorListWidget->setIconSize(mIconSize);
558 ui->colorListWidget->setGridSize(
QSize(-1, -1));
562 void ColorPaletteWidget::clickColorDialogButton()
564 mIsColorDialog =
true;
565 clickAddColorButton();
566 mIsColorDialog =
false;
569 void ColorPaletteWidget::clickAddColorButton()
578 newColor = mEditor->color()->frontColor();
580 if (!newColor.isValid())
585 int colorIndex = mObject->getColorCount();
588 mObject->addColor(ref);
591 editor()->color()->setColorNumber(colorIndex);
592 editor()->color()->setColor(ref.color);
599 void ColorPaletteWidget::clickRemoveColorButton()
601 for (
auto item : ui->colorListWidget->selectedItems())
603 int index = ui->colorListWidget->row(item);
608 if (mObject->isColorInUse(index))
610 bool accepted =
false;
611 if (!mMultipleSelected)
612 accepted = showPaletteWarning();
614 if ((accepted || mMultipleSelected) && mObject->getColorCount() > 1)
617 mObject->removeColor(index);
620 else if (mObject->getColorCount() > 1)
623 mObject->removeColor(index);
625 else if (mObject->getColorCount() == 1)
627 showPaletteReminder();
629 mEditor->updateCurrentFrame();
631 mMultipleSelected =
false;
638 bool ColorPaletteWidget::showPaletteWarning()
641 msgBox.
setText(
tr(
"The color(s) you are about to delete are currently being used by one or multiple strokes."));
648 if (ui->colorListWidget->selectedItems().size() > 1)
650 mMultipleSelected =
true;
657 void ColorPaletteWidget::showPaletteReminder()
660 tr(
"The palette requires at least one swatch to remain functional"));
663 void ColorPaletteWidget::updateItemColor(
int itemIndex,
QColor newColor)
665 QPixmap colorSwatch(mIconSize);
666 QPainter swatchPainter(&colorSwatch);
667 swatchPainter.drawTiledPixmap(0, 0, mIconSize.
width(), mIconSize.
height(),
QPixmap(
":/background/checkerboard.png"));
668 swatchPainter.fillRect(0, 0, mIconSize.
width(), mIconSize.
height(), newColor);
672 dashPattern << 4 << 4;
673 borderShadow.setDashPattern(dashPattern);
674 QPen borderHighlight(borderShadow);
675 borderHighlight.setColor(
QColor(255, 255, 255, 200));
676 borderHighlight.setDashOffset(4);
684 swatchPainter.setPen(borderHighlight);
685 swatchPainter.drawRect(0, 0, mIconSize.
width() - 1, mIconSize.
height() - 1);
686 swatchPainter.setPen(borderShadow);
687 swatchPainter.drawRect(0, 0, mIconSize.
width() - 1, mIconSize.
height() - 1);
691 ui->colorListWidget->item(itemIndex)->setIcon(swatchIcon);
int colorCount() const const
void triggered(bool checked)
void setSeparator(bool b)
QString tr(const char *sourceText, const char *disambiguation, int n)
void rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)
bool isEmpty() const const
void setText(const QString &text)
void addPixmap(const QPixmap &pixmap, QIcon::Mode mode, QIcon::State state)
QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode, const QString &text, bool *ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
virtual int exec() override
QColor getColor(const QColor &initial, QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString text() const const
void setText(const QString &text)