Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • app
  • src
colorpalettewidget.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17#include "colorpalettewidget.h"
18#include "ui_colorpalette.h"
19
20// Standard libraries
21#include <cmath>
22
23// Qt
24#include <QDebug>
25#include <QListWidgetItem>
26#include <QInputDialog>
27#include <QColorDialog>
28#include <QMessageBox>
29#include <QPushButton>
30#include <QSettings>
31#include <QMenu>
32#include <QtMath>
33#include <QScrollBar>
34#include <QAbstractItemModel>
35#include <QPainter>
36
37// Project
38#include "colorref.h"
39#include "object.h"
40#include "editor.h"
41#include "layerbitmap.h"
42#include "colormanager.h"
43
44
45ColorPaletteWidget::ColorPaletteWidget(QWidget* parent) :
46 BaseDockWidget(parent),
47 ui(new Ui::ColorPalette)
48{
49 ui->setupUi(this);
50}
51
52ColorPaletteWidget::~ColorPaletteWidget()
53{
54 delete ui;
55}
56
57void ColorPaletteWidget::initUI()
58{
59 QSettings settings(PENCIL2D, PENCIL2D);
60 int colorGridSize = settings.value("PreferredColorGridSize", 34).toInt();
61 mFitSwatches = settings.value("FitSwatchSize", false).toBool();
62 if (mFitSwatches)
63 {
64 fitSwatchSize();
65 }
66
67 mIconSize = QSize(colorGridSize, colorGridSize);
68
69 ui->colorListWidget->setContextMenuPolicy(Qt::CustomContextMenu);
70
71 QString sViewMode = settings.value("ColorPaletteViewMode", "ListMode").toString();
72 if (sViewMode == "ListMode")
73 setListMode();
74 else
75 setGridMode();
76
77 buttonStylesheet = "::menu-indicator{ image: none; }"
78 "QPushButton { border: 0px; }"
79 "QPushButton:pressed { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }"
80 "QPushButton:checked { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }";
81
82 ui->addColorButton->setStyleSheet(buttonStylesheet);
83 ui->removeColorButton->setStyleSheet(buttonStylesheet);
84 ui->colorDialogButton->setStyleSheet(buttonStylesheet);
85
86 palettePreferences();
87
88 connect(ui->colorListWidget, &QListWidget::itemClicked, this, &ColorPaletteWidget::clickColorListItem);
89 connect(ui->colorListWidget->model(), &QAbstractItemModel::rowsMoved, this, &ColorPaletteWidget::onRowsMoved);
90
91 connect(ui->colorListWidget, &QListWidget::itemDoubleClicked, this, &ColorPaletteWidget::changeColorName);
92 connect(ui->colorListWidget, &QListWidget::itemChanged, this, &ColorPaletteWidget::onItemChanged);
93
94 connect(ui->addColorButton, &QPushButton::clicked, this, &ColorPaletteWidget::clickAddColorButton);
95 connect(ui->colorDialogButton, &QPushButton::clicked, this, &ColorPaletteWidget::clickColorDialogButton);
96 connect(ui->removeColorButton, &QPushButton::clicked, this, &ColorPaletteWidget::clickRemoveColorButton);
97 connect(ui->colorListWidget, &QListWidget::customContextMenuRequested, this, &ColorPaletteWidget::showContextMenu);
98
99 connect(editor(), &Editor::objectLoaded, this, &ColorPaletteWidget::updateUI);
100}
101
102void ColorPaletteWidget::updateUI()
103{
104 mObject = mEditor->object();
105 refreshColorList();
106 updateGridUI();
107}
108
109void ColorPaletteWidget::setCore(Editor* editor)
110{
111 mEditor = editor;
112 mObject = mEditor->object();
113}
114
115void ColorPaletteWidget::showContextMenu(const QPoint& pos)
116{
117 QPoint globalPos = ui->colorListWidget->mapToGlobal(pos);
118
119 QMenu* menu = new QMenu;
120 connect(menu, &QMenu::triggered, menu, &QMenu::deleteLater);
121
122 menu->addAction(tr("Add"), this, &ColorPaletteWidget::addItem, 0);
123 menu->addAction(tr("Replace"), this, &ColorPaletteWidget::replaceItem, 0);
124 menu->addAction(tr("Remove"), this, &ColorPaletteWidget::removeItem, 0);
125
126 menu->exec(globalPos);
127}
128
129void ColorPaletteWidget::addItem()
130{
131 QSignalBlocker b(ui->colorListWidget);
132 QColor newColor = mEditor->color()->frontColor(false);
133
134 ColorRef ref(newColor);
135
136 const int colorIndex = ui->colorListWidget->count();
137 mObject->addColorAtIndex(colorIndex, ref);
138
139 refreshColorList();
140
141 if (mFitSwatches)
142 {
143 fitSwatchSize();
144 }
145
146 QListWidgetItem* item = ui->colorListWidget->item(colorIndex);
147 ui->colorListWidget->editItem(item);
148 ui->colorListWidget->scrollToItem(item);
149}
150
151void ColorPaletteWidget::replaceItem()
152{
153 QSignalBlocker b(ui->colorListWidget);
154 int index = ui->colorListWidget->currentRow();
155
156 QColor newColor = mEditor->color()->frontColor(false);
157
158 if (index < 0 ) { return; }
159
160 updateItemColor(index, newColor);
161 emit colorNumberChanged(index);
162 ui->colorListWidget->setCurrentRow(index);
163}
164
165void ColorPaletteWidget::removeItem()
166{
167 QSignalBlocker b(ui->colorListWidget);
168 clickRemoveColorButton();
169}
170
171void ColorPaletteWidget::selectColorNumber(int colorNumber) const
172{
173 ui->colorListWidget->setCurrentRow(colorNumber);
174}
175
176int ColorPaletteWidget::currentColorNumber()
177{
178 if (ui->colorListWidget->currentRow() < 0)
179 {
180 ui->colorListWidget->setCurrentRow(0);
181 }
182 return ui->colorListWidget->currentRow();
183}
184
185void ColorPaletteWidget::refreshColorList()
186{
187 QSignalBlocker b(ui->colorListWidget);
188 if (ui->colorListWidget->count() > 0)
189 {
190 ui->colorListWidget->clear();
191 }
192
193 int colorCount = editor()->object()->getColorCount();
194
195 for (int i = 0; i < colorCount; i++)
196 {
197 addSwatch(i);
198 }
199
200 selectColorNumber(editor()->color()->frontColorNumber());
201 updateGridUI();
202 update();
203}
204
205void ColorPaletteWidget::addSwatch(int colorIndex) const
206{
207 QPixmap originalColorSwatch(mIconSize);
208 QPainter painter(&originalColorSwatch);
209 painter.drawTiledPixmap(0, 0, mIconSize.width(), mIconSize.height(), QPixmap(":/background/checkerboard.png"));
210 painter.end();
211
212 QPen borderShadow(QColor(0, 0, 0, 200), 1, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin);
213 QVector<qreal> dashPattern{ 4, 4 };
214 borderShadow.setDashPattern(dashPattern);
215
216 QPen borderHighlight(borderShadow);
217 borderHighlight.setColor(QColor(255, 255, 255, 200));
218 borderHighlight.setDashOffset(4);
219
220 const ColorRef colorRef = mObject->getColor(colorIndex);
221 QListWidgetItem* colorItem = new QListWidgetItem(ui->colorListWidget);
222
223 if (ui->colorListWidget->viewMode() != QListView::IconMode)
224 {
225 colorItem->setText(colorRef.name);
226 }
227 else
228 {
229 colorItem->setToolTip(colorRef.name);
230 }
231
232 QPixmap colorSwatch = originalColorSwatch;
233 QPainter swatchPainter(&colorSwatch);
234 swatchPainter.fillRect(0, 0, mIconSize.width(), mIconSize.height(), colorRef.color);
235
236 QIcon swatchIcon;
237 swatchIcon.addPixmap(colorSwatch, QIcon::Normal);
238
239 // Draw selection border
240 if (ui->colorListWidget->viewMode() == QListView::IconMode)
241 {
242 swatchPainter.setPen(borderHighlight);
243 swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1);
244 swatchPainter.setPen(borderShadow);
245 swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1);
246 }
247 swatchIcon.addPixmap(colorSwatch, QIcon::Selected);
248
249 colorItem->setIcon(swatchIcon);
250 colorItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDragEnabled);
251
252 ui->colorListWidget->addItem(colorItem);
253}
254
255void ColorPaletteWidget::changeColorName(QListWidgetItem* item)
256{
257 Q_ASSERT(item != nullptr);
258
259 if (ui->colorListWidget->viewMode() == QListView::IconMode)
260 {
261 int colorNumber = ui->colorListWidget->row(item);
262 if (colorNumber > -1)
263 {
264 bool ok;
265 QString text = QInputDialog::getText(this,
266 tr("Color name"),
267 tr("Color name"),
268 QLineEdit::Normal,
269 mObject->getColor(colorNumber).name,
270 &ok);
271 if (ok && !text.isEmpty())
272 {
273 mObject->renameColor(colorNumber, text);
274 refreshColorList();
275 }
276 }
277 }
278}
279
280void ColorPaletteWidget::onItemChanged(QListWidgetItem* item)
281{
282 int index = ui->colorListWidget->row(item);
283 QString newColorName = item->text();
284 mObject->renameColor(index, newColorName);
285}
286
287void ColorPaletteWidget::onRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)
288{
289 Q_UNUSED(parent)
290 Q_UNUSED(destination)
291 Q_UNUSED(end)
292
293 int startIndex, endIndex;
294 if (start < row)
295 {
296 row -= 1; // TODO: Is this a bug?
297 if (start == row) { return; }
298
299 startIndex = start;
300 endIndex = row;
301
302 mObject->movePaletteColor(startIndex, endIndex);
303
304 mObject->addColor(mObject->getColor(startIndex));
305 mObject->moveVectorColor(startIndex, mObject->getColorCount() - 1);
306 for (int i = startIndex; i < endIndex; i++)
307 {
308 mObject->moveVectorColor(i + 1, i);
309 }
310 mObject->moveVectorColor(mObject->getColorCount() - 1, endIndex);
311 }
312 else
313 {
314 if (start == row) { return; }
315
316 startIndex = start;
317 endIndex = row;
318
319 mObject->movePaletteColor(startIndex, endIndex);
320
321 mObject->addColor(mObject->getColor(startIndex));
322 mObject->moveVectorColor(startIndex, mObject->getColorCount() - 1);
323 for (int i = startIndex; i > endIndex; i--)
324 {
325 mObject->moveVectorColor(i - 1, i);
326 }
327 mObject->moveVectorColor(mObject->getColorCount() - 1, endIndex);
328 }
329
330 mObject->removeColor(mObject->getColorCount() - 1);
331
332 refreshColorList();
333}
334
335void ColorPaletteWidget::clickColorListItem(QListWidgetItem* currentItem)
336{
337 auto modifiers = qApp->keyboardModifiers();
338
339 // to avoid conflicts with multiple selections
340 // ie. will be seen as selected twice and cause problems
341 if (modifiers & Qt::ShiftModifier || modifiers & Qt::ControlModifier) { return; }
342
343 int colorIndex = ui->colorListWidget->row(currentItem);
344
345 emit colorNumberChanged(colorIndex);
346}
347
348void ColorPaletteWidget::palettePreferences()
349{
350 ui->colorListWidget->setMinimumWidth(ui->colorListWidget->sizeHintForColumn(0));
351
352 // Let's pretend this button is a separator
353 mSeparator = new QAction("", this);
354 mSeparator->setSeparator(true);
355
356 buttonStylesheet = "::menu-indicator{ image: none; }"
357 "QToolButton { border: 0px; }"
358 "QToolButton:pressed { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }"
359 "QToolButton:checked { border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }";
360
361
362 // Add to UI
363 ui->palettePref->setIconSize(QSize(22,22));
364 ui->palettePref->setArrowType(Qt::ArrowType::NoArrow);
365 ui->palettePref->setStyleSheet(buttonStylesheet);
366 ui->palettePref->addAction(ui->listModeAction);
367 ui->palettePref->addAction(ui->gridModeAction);
368
369 ui->palettePref->addAction(mSeparator);
370 ui->palettePref->addAction(ui->smallSwatchAction);
371 ui->palettePref->addAction(ui->mediumSwatchAction);
372 ui->palettePref->addAction(ui->largeSwatchAction);
373 ui->palettePref->addAction(ui->fitSwatchAction);
374
375 if (mFitSwatches) ui->fitSwatchAction->setChecked(true);
376 else if (mIconSize.width() > MEDIUM_ICON_SIZE) ui->largeSwatchAction->setChecked(true);
377 else if (mIconSize.width() > MIN_ICON_SIZE) ui->mediumSwatchAction->setChecked(true);
378 else ui->smallSwatchAction->setChecked(true);
379
380 if (ui->colorListWidget->viewMode() == QListView::ListMode)
381 ui->listModeAction->setChecked(true);
382 else
383 ui->gridModeAction->setChecked(true);
384
385 connect(ui->listModeAction, &QAction::triggered, this, &ColorPaletteWidget::setListMode);
386 connect(ui->gridModeAction, &QAction::triggered, this, &ColorPaletteWidget::setGridMode);
387 connect(ui->fitSwatchAction, &QAction::triggered, this, &ColorPaletteWidget::fitSwatchSize);
388 connect(ui->smallSwatchAction, &QAction::triggered, this, &ColorPaletteWidget::setSwatchSizeSmall);
389 connect(ui->mediumSwatchAction, &QAction::triggered, this, &ColorPaletteWidget::setSwatchSizeMedium);
390 connect(ui->largeSwatchAction, &QAction::triggered, this, &ColorPaletteWidget::setSwatchSizeLarge);
391}
392
393void ColorPaletteWidget::setListMode()
394{
395 ui->colorListWidget->setViewMode(QListView::ListMode);
396 ui->colorListWidget->setDragDropMode(QAbstractItemView::InternalMove);
397 ui->colorListWidget->setGridSize(QSize(-1, -1));
398 if (mFitSwatches)
399 {
400 fitSwatchSize();
401 }
402 updateUI();
403
404 QSettings settings(PENCIL2D, PENCIL2D);
405 settings.setValue("ColorPaletteViewMode", "ListMode");
406}
407
408void ColorPaletteWidget::setGridMode()
409{
410 ui->colorListWidget->setViewMode(QListView::IconMode);
411 ui->colorListWidget->setMovement(QListView::Static); // TODO: update swatch index on move
412 ui->colorListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
413 ui->colorListWidget->setGridSize(QSize(mIconSize.width() + 1, mIconSize.height() + 1));
414 if (mFitSwatches)
415 {
416 fitSwatchSize();
417 }
418 updateUI();
419
420 QSettings settings(PENCIL2D, PENCIL2D);
421 settings.setValue("ColorPaletteViewMode", "GridMode");
422}
423
424void ColorPaletteWidget::setSwatchSizeSmall()
425{
426 if (mIconSize.width() > MIN_ICON_SIZE)
427 {
428 mIconSize = QSize(MIN_ICON_SIZE, MIN_ICON_SIZE);
429 updateUI();
430
431 mFitSwatches = false;
432 QSettings settings(PENCIL2D, PENCIL2D);
433 settings.setValue("PreferredColorGridSize", MIN_ICON_SIZE);
434 settings.setValue("FitSwatchSize", false);
435 }
436}
437
438void ColorPaletteWidget::setSwatchSizeMedium()
439{
440 if (mIconSize.width() != MEDIUM_ICON_SIZE)
441 {
442 mIconSize = QSize(MEDIUM_ICON_SIZE, MEDIUM_ICON_SIZE);
443 updateUI();
444
445 mFitSwatches = false;
446 QSettings settings(PENCIL2D, PENCIL2D);
447 settings.setValue("PreferredColorGridSize", MEDIUM_ICON_SIZE);
448 settings.setValue("FitSwatchSize", false);
449 }
450}
451
452void ColorPaletteWidget::setSwatchSizeLarge()
453{
454 if (mIconSize.width() < MAX_ICON_SIZE)
455 {
456 mIconSize = QSize(MAX_ICON_SIZE, MAX_ICON_SIZE);
457 updateUI();
458
459 mFitSwatches = false;
460 QSettings settings(PENCIL2D, PENCIL2D);
461 settings.setValue("PreferredColorGridSize", MAX_ICON_SIZE);
462 settings.setValue("FitSwatchSize", false);
463 }
464}
465
466void ColorPaletteWidget::adjustSwatches()
467{
468 if (mFitSwatches)
469 fitSwatchSize();
470}
471
472void ColorPaletteWidget::fitSwatchSize()
473{
474 int height = ui->colorListWidget->height();
475 int width = ui->colorListWidget->width();
476 int hScrollBar = ui->colorListWidget->horizontalScrollBar()->geometry().height() + 6;
477 int vScrollBar = ui->colorListWidget->verticalScrollBar()->geometry().width() * 2;
478 int colorCount = editor()->object()->getColorCount();
479 int size;
480
481 if (ui->colorListWidget->viewMode() == QListView::ListMode)
482 {
483 size = qFloor((height - hScrollBar - (4 * colorCount)) / colorCount);
484 if (size < MIN_ICON_SIZE) size = MIN_ICON_SIZE;
485 if (size > MAX_ICON_SIZE) size = MAX_ICON_SIZE;
486 }
487 else
488 {
489 bool proceed = true;
490 size = MIN_ICON_SIZE;
491 while (proceed)
492 {
493 int columns = (width - vScrollBar) / size;
494 int rows = static_cast<int>(qCeil(colorCount / columns));
495 if (height - hScrollBar > rows * (size + 6))
496 {
497 size++;
498 if (size == MAX_ICON_SIZE)
499 {
500 proceed = false;
501 }
502 }
503 else
504 {
505 proceed = false;
506 }
507 }
508 }
509 mIconSize = QSize(size, size);
510
511 updateUI();
512
513 mFitSwatches = true;
514 QSettings settings(PENCIL2D, PENCIL2D);
515 settings.setValue("PreferredColorGridSize", size);
516 settings.setValue("FitSwatchSize", true);
517}
518
519void ColorPaletteWidget::resizeEvent(QResizeEvent* event)
520{
521 updateUI();
522 if (mFitSwatches)
523 {
524 fitSwatchSize();
525 }
526 QWidget::resizeEvent(event);
527}
528
529void ColorPaletteWidget::updateGridUI()
530{
531 if (ui->colorListWidget->viewMode() == QListView::IconMode) {
532 // Find the value to divide with
533 for (int i = 1; i < 75; i++)
534 {
535 int size = (ui->colorListWidget->width() - 18) / i; // subtract scrollbar width
536 if (size >= mIconSize.width() && size <= mIconSize.width() + 8)
537 {
538 stepper = size;
539 }
540 }
541 QSize tempSize = QSize(stepper, mIconSize.height());
542
543 ui->colorListWidget->setIconSize(QSize(tempSize.width(), mIconSize.height()));
544 ui->colorListWidget->setGridSize(QSize(tempSize.width(), mIconSize.height() + 2));
545 mIconSize.setWidth(mIconSize.width());
546 }
547 else
548 {
549 ui->colorListWidget->setIconSize(mIconSize);
550 ui->colorListWidget->setGridSize(QSize(-1, -1));
551 }
552}
553
554void ColorPaletteWidget::clickColorDialogButton()
555{
556 mIsColorDialog = true;
557 clickAddColorButton();
558 mIsColorDialog = false;
559}
560
561void ColorPaletteWidget::clickAddColorButton()
562{
563 QColor prevColor = Qt::white;
564
565 QColor newColor;
566
567 if (mIsColorDialog)
568 newColor = QColorDialog::getColor(prevColor.rgba(), this, QString(), QColorDialog::ShowAlphaChannel);
569 else
570 newColor = mEditor->color()->frontColor(false);
571
572 if (!newColor.isValid())
573 {
574 return; // User canceled operation
575 }
576
577 int colorIndex = mObject->getColorCount();
578 ColorRef ref(newColor);
579
580 mObject->addColor(ref);
581 refreshColorList();
582
583 editor()->color()->setColorNumber(colorIndex);
584 editor()->color()->setIndexedColor(ref.color);
585 if (mFitSwatches)
586 {
587 fitSwatchSize();
588 }
589}
590
591void ColorPaletteWidget::clickRemoveColorButton()
592{
593 for (auto item : ui->colorListWidget->selectedItems())
594 {
595 int index = ui->colorListWidget->row(item);
596
597 // items are not deleted by qt, it has to be done manually
598 // delete should happen before removing the color from from palette
599 // as the palette will be one ahead and crash otherwise
600
601 if (mObject->getColorCount() == 1)
602 {
603 showPaletteReminder();
604 break;
605 }
606
607 bool colorRemoved = false;
608 if (mObject->isColorInUse(index))
609 {
610 bool accepted = false;
611 if (!mMultipleSelected)
612 accepted = showPaletteWarning();
613
614 if ((accepted || mMultipleSelected) && mObject->getColorCount() > 1)
615 {
616 delete item;
617 mObject->removeColor(index);
618 colorRemoved = true;
619 }
620 }
621 else if (mObject->getColorCount() > 1)
622 {
623 delete item;
624 mObject->removeColor(index);
625 colorRemoved = true;
626 }
627
628 if (colorRemoved) {
629 int newIndex = qBound(0, index-1, mObject->getColorCount() - 1);
630 emit colorNumberChanged(newIndex);
631 }
632 }
633 mMultipleSelected = false;
634 if (mFitSwatches)
635 {
636 fitSwatchSize();
637 }
638 mEditor->updateFrame();
639}
640
641bool ColorPaletteWidget::showPaletteWarning()
642{
643 QMessageBox msgBox;
644 msgBox.setText(tr("The color(s) you are about to delete are currently being used by one or multiple strokes."));
645 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
646 QPushButton* removeButton = msgBox.addButton(tr("Delete"), QMessageBox::AcceptRole);
647
648 msgBox.exec();
649 if (msgBox.clickedButton() == removeButton)
650 {
651 if (ui->colorListWidget->selectedItems().size() > 1)
652 {
653 mMultipleSelected = true;
654 }
655 return true;
656 }
657 return false;
658}
659
660void ColorPaletteWidget::showPaletteReminder()
661{
662 QMessageBox::warning(nullptr, tr("Palette Restriction"),
663 tr("The palette requires at least one swatch to remain functional"));
664}
665
666void ColorPaletteWidget::updateItemColor(int itemIndex, QColor newColor)
667{
668 QPixmap colorSwatch(mIconSize);
669 QPainter swatchPainter(&colorSwatch);
670 swatchPainter.drawTiledPixmap(0, 0, mIconSize.width(), mIconSize.height(), QPixmap(":/background/checkerboard.png"));
671 swatchPainter.fillRect(0, 0, mIconSize.width(), mIconSize.height(), newColor);
672
673 QPen borderShadow(QColor(0, 0, 0, 200), 1, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin);
674 QVector<qreal> dashPattern;
675 dashPattern << 4 << 4;
676 borderShadow.setDashPattern(dashPattern);
677 QPen borderHighlight(borderShadow);
678 borderHighlight.setColor(QColor(255, 255, 255, 200));
679 borderHighlight.setDashOffset(4);
680
681 QIcon swatchIcon;
682 swatchIcon.addPixmap(colorSwatch, QIcon::Normal);
683
684 if(ui->colorListWidget->viewMode() == QListView::IconMode)
685 {
686 // Draw selection border
687 swatchPainter.setPen(borderHighlight);
688 swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1);
689 swatchPainter.setPen(borderShadow);
690 swatchPainter.drawRect(0, 0, mIconSize.width() - 1, mIconSize.height() - 1);
691 }
692 swatchIcon.addPixmap(colorSwatch, QIcon::Selected);
693
694 ui->colorListWidget->item(itemIndex)->setIcon(swatchIcon);
695 editor()->object()->setColor(itemIndex, newColor);
696
697 // Make sure to update grid in grid mode
698 if (ui->colorListWidget->viewMode() == QListView::IconMode)
699 {
700 updateGridUI();
701 }
702}
BaseDockWidget
Definition: basedockwidget.h:27
ColorManager::setIndexedColor
void setIndexedColor(const QColor &newColor)
Set color for current index.
Definition: colormanager.cpp:87
ColorManager::frontColor
QColor frontColor(bool useIndexedColor=true)
frontColor
Definition: colormanager.cpp:61
ColorRef
Definition: colorref.h:26
Editor
Definition: editor.h:71
Editor::updateFrame
void updateFrame()
Will call update() and update the canvas Only call this directly If you need the cache to be intact a...
Definition: editor.cpp:850
QAbstractButton::clicked
void clicked(bool checked)
QAbstractItemModel::rowsMoved
void rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)
QAbstractItemView::InternalMove
InternalMove
QAction
QAction::setSeparator
void setSeparator(bool b)
QAction::triggered
void triggered(bool checked)
QColor
QColor::isValid
bool isValid() const const
QColor::rgba
QRgb rgba() const const
QColorDialog::ShowAlphaChannel
ShowAlphaChannel
QColorDialog::getColor
QColor getColor(const QColor &initial, QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
QDockWidget::event
virtual bool event(QEvent *event) override
QIcon
QIcon::Normal
Normal
QIcon::addPixmap
void addPixmap(const QPixmap &pixmap, QIcon::Mode mode, QIcon::State state)
QInputDialog::getText
QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode, const QString &text, bool *ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
QLineEdit::Normal
Normal
QListView::Static
Static
QListView::IconMode
IconMode
QListWidget::itemChanged
void itemChanged(QListWidgetItem *item)
QListWidget::itemClicked
void itemClicked(QListWidgetItem *item)
QListWidget::itemDoubleClicked
void itemDoubleClicked(QListWidgetItem *item)
QListWidgetItem
QListWidgetItem::setFlags
void setFlags(Qt::ItemFlags flags)
QListWidgetItem::setIcon
void setIcon(const QIcon &icon)
QListWidgetItem::setText
void setText(const QString &text)
QListWidgetItem::setToolTip
void setToolTip(const QString &toolTip)
QListWidgetItem::text
QString text() const const
QMenu
QMenu::addAction
QAction * addAction(const QString &text)
QMenu::exec
QAction * exec()
QMenu::triggered
void triggered(QAction *action)
QMessageBox
QMessageBox::RejectRole
RejectRole
QMessageBox::addButton
void addButton(QAbstractButton *button, QMessageBox::ButtonRole role)
QMessageBox::clickedButton
QAbstractButton * clickedButton() const const
QMessageBox::exec
virtual int exec() override
QMessageBox::setText
void setText(const QString &text)
QMessageBox::warning
QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QModelIndex
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::deleteLater
void deleteLater()
QObject::parent
QObject * parent() const const
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QPaintDevice::colorCount
int colorCount() const const
QPainter
QPen
QPixmap
QPoint
QPushButton
QResizeEvent
QSettings
QSignalBlocker
QSize
QSize::height
int height() const const
QSize::setWidth
void setWidth(int width)
QSize::width
int width() const const
QString
QString::isEmpty
bool isEmpty() const const
Qt::CustomContextMenu
CustomContextMenu
Qt::white
white
Qt::ItemIsSelectable
ItemIsSelectable
Qt::ShiftModifier
ShiftModifier
Qt::FlatCap
FlatCap
Qt::MiterJoin
MiterJoin
Qt::DotLine
DotLine
Qt::ScrollBarAlwaysOn
ScrollBarAlwaysOn
QVector
QWidget
QWidget::customContextMenuRequested
void customContextMenuRequested(const QPoint &pos)
QWidget::height
height
QWidget::pos
pos
QWidget::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
QWidget::setupUi
void setupUi(QWidget *widget)
QWidget::size
size
QWidget::update
void update()
QWidget::width
width
Generated on Thu May 8 2025 04:47:53 for Pencil2D by doxygen 1.9.6 based on revision 4513250b1d5b1a3676ec0e67b06b7a885ceaae39