18 #include <QListWidget>
19 #include <QListWidgetItem>
20 #include <QVBoxLayout>
21 #include <QInputDialog>
22 #include <QColorDialog>
23 #include "ui_colorpalette.h"
25 #include "colordictionary.h"
26 #include "colourref.h"
30 #include "scribblearea.h"
31 #include "colormanager.h"
32 #include "colorpalettewidget.h"
36 ColorPaletteWidget::ColorPaletteWidget( QWidget* parent ) :
BaseDockWidget( parent )
38 setWindowTitle( tr(
"Color Palette",
"Window title of color palette." ) );
40 QWidget* pWidget =
new QWidget(
this );
41 ui =
new Ui::ColorPalette;
42 ui->setupUi( pWidget );
45 connect( ui->colorListWidget, &QListWidget::currentItemChanged,
46 this, &ColorPaletteWidget::colorListCurrentItemChanged );
48 connect( ui->colorListWidget, SIGNAL( itemClicked( QListWidgetItem* ) ),
49 this, SLOT( clickColorListItem( QListWidgetItem* ) ) );
51 connect( ui->colorListWidget, SIGNAL( itemDoubleClicked( QListWidgetItem* ) ),
this,
52 SLOT( changeColourName( QListWidgetItem* ) ) );
54 connect( ui->addColorButton, &QPushButton::clicked,
this, &ColorPaletteWidget::clickAddColorButton );
55 connect( ui->removeColorButton, &QPushButton::clicked,
this, &ColorPaletteWidget::clickRemoveColorButton );
56 connect( ui->palettePref, &QToolButton::clicked,
this, &ColorPaletteWidget::palettePreferences );
59 void ColorPaletteWidget::initUI()
65 iconSize = QSize(34,34);
66 ui->removeColorButton->hide();
71 void ColorPaletteWidget::updateUI()
77 void ColorPaletteWidget::setColor(QColor newColor)
79 int colorIndex = currentColourNumber();
80 updateItemColor(colorIndex, newColor);
82 emit colorChanged( newColor );
85 void ColorPaletteWidget::selectColorNumber(
int colorNumber)
87 ui->colorListWidget->setCurrentRow(colorNumber);
90 int ColorPaletteWidget::currentColourNumber()
92 if ( ui->colorListWidget->currentRow() < 0 )
94 ui->colorListWidget->setCurrentRow( 0 );
96 return ui->colorListWidget->currentRow();
99 void ColorPaletteWidget::refreshColorList()
102 if ( ui->colorListWidget->count() > 0)
104 ui->colorListWidget->clear();
107 QPixmap originalColourSwatch( iconSize );
108 QPainter swatchPainter( &originalColourSwatch );
109 swatchPainter.drawTiledPixmap( 0, 0, iconSize.width(), iconSize.height(), QPixmap(
":/background/checkerboard.png" ) );
111 QPixmap colourSwatch;
113 QListWidgetItem* colourItem;
115 for (
int i = 0; i < editor()->object()->getColourCount(); i++)
117 colourRef = editor()->object()->getColour(i);
119 colourItem =
new QListWidgetItem( ui->colorListWidget );
121 if ( ui->colorListWidget->viewMode() != QListView::IconMode){
122 colourItem->setText( colourRef.name );
124 colourSwatch = originalColourSwatch;
125 swatchPainter.begin( &colourSwatch );
126 swatchPainter.fillRect( 0, 0, iconSize.width(), iconSize.height(), colourRef.colour );
128 colourItem->setIcon( colourSwatch );
130 ui->colorListWidget->addItem( colourItem );
135 void ColorPaletteWidget::colorListCurrentItemChanged(QListWidgetItem* current, QListWidgetItem* previous)
141 emit colorNumberChanged( ui->colorListWidget->row(current) );
144 void ColorPaletteWidget::clickColorListItem(QListWidgetItem* currentItem)
146 int colorIndex = ui->colorListWidget->row( currentItem );
149 emit colorNumberChanged( colorIndex );
152 void ColorPaletteWidget::changeColourName( QListWidgetItem* item )
154 Q_ASSERT( item != NULL );
156 int colorNumber = ui->colorListWidget->row( item );
157 if (colorNumber > -1)
160 QString text = QInputDialog::getText(
this,
164 editor()->
object()->getColour(colorNumber).name,
166 if (ok && !text.isEmpty())
168 editor()->object()->renameColour(colorNumber, text);
174 void ColorPaletteWidget::palettePreferences()
176 layoutModes =
new QActionGroup(
this);
177 listMode =
new QAction (tr(
"List mode"),
this);
178 listMode->setStatusTip(tr(
"Show palette as a list"));
179 listMode->setCheckable(
true);
180 listMode->setChecked(
true);
181 layoutModes->addAction(listMode);
182 connect(listMode, &QAction::triggered,
this, &ColorPaletteWidget::setListMode);
184 gridMode =
new QAction (tr(
"Grid mode"),
this);
185 gridMode->setStatusTip(tr(
"Show palette as icons"));
186 gridMode->setCheckable(
true);
187 layoutModes->addAction(gridMode);
188 connect(gridMode, &QAction::triggered,
this, &ColorPaletteWidget::setGridMode);
191 iconSizes =
new QActionGroup (
this);
192 smallSwatch =
new QAction(tr(
"Small swatch"),
this);
193 smallSwatch->setStatusTip(tr(
"Sets swatch size to: 16x16px"));
194 smallSwatch->setCheckable(
true);
195 iconSizes->addAction(smallSwatch);
196 connect(smallSwatch, &QAction::triggered,
this, &ColorPaletteWidget::setSwatchSizeSmall);
198 mediumSwatch =
new QAction(tr(
"Medium swatch"),
this);
199 mediumSwatch->setStatusTip(tr(
"Sets swatch size to: 26x26px"));
200 mediumSwatch->setCheckable(
true);
201 iconSizes->addAction(mediumSwatch);
202 connect(mediumSwatch, &QAction::triggered,
this, &ColorPaletteWidget::setSwatchSizeMedium);
204 largeSwatch =
new QAction(tr(
"Large swatch"),
this);
205 largeSwatch->setCheckable(
true);
206 largeSwatch->setStatusTip(tr(
"Sets swatch size to: 36x36px"));
207 iconSizes->addAction(largeSwatch);
208 largeSwatch->setChecked(
true);
209 connect(largeSwatch, &QAction::triggered,
this, &ColorPaletteWidget::setSwatchSizeLarge);
211 ui->colorListWidget->setMinimumWidth(ui->colorListWidget->sizeHintForColumn(0));
214 separator =
new QAction(tr(
""),
this);
215 separator->setSeparator(
true);
218 ui->palettePref->addAction(listMode);
219 ui->palettePref->addAction(gridMode);
220 ui->palettePref->addAction(separator);
221 ui->palettePref->addAction(smallSwatch);
222 ui->palettePref->addAction(mediumSwatch);
223 ui->palettePref->addAction(largeSwatch);
226 void ColorPaletteWidget::setListMode()
228 ui->colorListWidget->setViewMode(QListView::ListMode);
229 ui->colorListWidget->setMovement(QListView::Static);
230 ui->colorListWidget->setGridSize(QSize(-1,-1));
234 void ColorPaletteWidget::setGridMode()
236 ui->colorListWidget->setViewMode(QListView::IconMode);
237 ui->colorListWidget->setMovement(QListView::Static);
238 ui->colorListWidget->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
239 ui->colorListWidget->setGridSize(iconSize);
243 void ColorPaletteWidget::resizeEvent(QResizeEvent *event)
246 for (
int i = 1; i < 75; i++) {
247 int size = (ui->colorListWidget->width()-18) / i;
248 if (size >= iconSize.width() && size <= iconSize.width() + 8){
252 QSize tempSize = QSize(stepper,iconSize.height());
254 ui->colorListWidget->setIconSize(QSize(tempSize.width(),iconSize.height()));
255 ui->colorListWidget->setGridSize(QSize(tempSize.width(),iconSize.height()));
256 iconSize.setWidth(iconSize.width());
259 QWidget::resizeEvent(event);
262 void ColorPaletteWidget::setSwatchSizeSmall()
264 if (iconSize.width() > 18) {
265 iconSize = QSize(14,14);
270 void ColorPaletteWidget::setSwatchSizeMedium()
272 if (iconSize.width() < 20 || iconSize.width() > 30) {
273 iconSize = QSize(26,26);
278 void ColorPaletteWidget::setSwatchSizeLarge()
280 if (iconSize.width() < 30) {
281 iconSize = QSize(34,34);
286 void ColorPaletteWidget::updateGridUI()
288 if (ui->colorListWidget->viewMode() == QListView::IconMode)
290 ui->colorListWidget->setGridSize(QSize(iconSize.width(),iconSize.height()));
294 ui->colorListWidget->setGridSize(QSize(-1,-1));
296 ui->colorListWidget->setIconSize(iconSize);
299 QString ColorPaletteWidget::getDefaultColorName(QColor c)
302 const int r = c.red(),
308 const qreal x = 0.412453*r + 0.357580*g + 0.180423*b,
309 y = 0.212671*r + 0.715160*g + 0.072169*b,
310 z = 0.019334*r + 0.119193*g + 0.950227*b;
315 auto f = [] (
const double a) {
return a > 0.008856 ? cbrt(a) : 7.787*a + 16/116; };
317 const qreal xn = 95.047,
320 const qreal l = y/yn > 0.008856 ? 116*cbrt( y/yn ) - 16 : 903.3*y/yn,
321 u = 500 * ( f( x/xn ) - f( y/yn ) ),
322 v = 200 * ( f( y/yn ) - f( z/zn ) );
326 if(u < 0.01 && u > -0.01 && v < 0.01 && v > -0.01) {
328 qreal minDist = pow(colorDict[dictSize-5][0] - l, 2) + pow(colorDict[dictSize-5][1] - u, 2) + pow(colorDict[dictSize-5][2] - v, 2);
330 for (
int i = dictSize-4; i < dictSize; i++)
332 curDist = pow(colorDict[i][0] - l, 2) + pow(colorDict[i][1] - u, 2) + pow(colorDict[i][2] - v, 2);
333 if ( curDist < minDist )
341 qreal minDist = pow(colorDict[0][0] - l, 2) + pow(colorDict[0][1] - u, 2) + pow(colorDict[0][2] - v, 2);
343 for (
int i = 1; i < dictSize; i++)
345 curDist = pow(colorDict[i][0] - l, 2) + pow(colorDict[i][1] - u, 2) + pow(colorDict[i][2] - v, 2);
346 if ( curDist < minDist )
353 return nameDict[minLoc];
356 void ColorPaletteWidget::clickAddColorButton()
358 QColor prevColor = Qt::white;
360 if ( currentColourNumber() > -1 )
362 prevColor = editor()->object()->getColour(currentColourNumber()).colour;
365 QColor newColour = QColorDialog::getColor( prevColor.rgba(),
this, QString(), QColorDialog::ShowAlphaChannel );
366 if ( !newColour.isValid() )
373 ref.name = getDefaultColorName(newColour);
375 editor()->object()->addColour(ref);
378 int colorIndex = editor()->object()->getColourCount() - 1;
380 editor()->color()->setColorNumber(colorIndex);
381 editor()->color()->setColor( ref.colour );
384 void ColorPaletteWidget::clickRemoveColorButton()
386 int colorNumber = ui->colorListWidget->currentRow();
387 editor()->object()->removeColour(colorNumber);
392 void ColorPaletteWidget::updateItemColor(
int itemIndex, QColor newColor )
394 QPixmap colourSwatch( iconSize );
395 QPainter swatchPainter( &colourSwatch );
396 swatchPainter.drawTiledPixmap( 0, 0, iconSize.width(), iconSize.height(), QPixmap(
":/background/checkerboard.png" ) );
397 swatchPainter.fillRect( 0, 0, iconSize.width(), iconSize.height(), newColor );
398 ui->colorListWidget->item( itemIndex )->setIcon( colourSwatch );
401 if (ui->colorListWidget->viewMode() == QListView::IconMode)