/* ColorPaletteDialog.cpp * * Copyright (C) 2014-2016 Jim Evins * * This file is part of gLabels-qt. * * gLabels-qt is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * gLabels-qt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gLabels-qt. If not, see . */ #include "ColorPaletteDialog.h" #include #include #include #include #include #include #include #include namespace glabels { // // Static data // ColorPaletteDialog::ColorTableEntry ColorPaletteDialog::mColorTable[] = { { "#ef2929", QT_TRANSLATE_NOOP("Color name", "Light Scarlet Red") }, { "#fcaf3e", QT_TRANSLATE_NOOP("Color name", "Light Orange") }, { "#fce94f", QT_TRANSLATE_NOOP("Color name", "Light Butter") }, { "#8ae234", QT_TRANSLATE_NOOP("Color name", "Light Chameleon") }, { "#729fcf", QT_TRANSLATE_NOOP("Color name", "Light Sky Blue") }, { "#ad7fa8", QT_TRANSLATE_NOOP("Color name", "Light Plum") }, { "#e9b96e", QT_TRANSLATE_NOOP("Color name", "Light Chocolate") }, { "#888a85", QT_TRANSLATE_NOOP("Color name", "Light Aluminum 1") }, { "#eeeeec", QT_TRANSLATE_NOOP("Color name", "Light Aluminum 2") }, { "#cc0000", QT_TRANSLATE_NOOP("Color name", "Scarlet Red") }, { "#f57900", QT_TRANSLATE_NOOP("Color name", "Orange") }, { "#edd400", QT_TRANSLATE_NOOP("Color name", "Butter") }, { "#73d216", QT_TRANSLATE_NOOP("Color name", "Chameleon") }, { "#3465a4", QT_TRANSLATE_NOOP("Color name", "Sky Blue") }, { "#75507b", QT_TRANSLATE_NOOP("Color name", "Plum") }, { "#c17d11", QT_TRANSLATE_NOOP("Color name", "Chocolate") }, { "#555753", QT_TRANSLATE_NOOP("Color name", "Aluminum 1") }, { "#d3d7cf", QT_TRANSLATE_NOOP("Color name", "Aluminum 2") }, { "#a40000", QT_TRANSLATE_NOOP("Color name", "Dark Scarlet Red") }, { "#ce5c00", QT_TRANSLATE_NOOP("Color name", "Dark Orange") }, { "#c4a000", QT_TRANSLATE_NOOP("Color name", "Dark Butter") }, { "#4e9a06", QT_TRANSLATE_NOOP("Color name", "Dark Chameleon") }, { "#204a87", QT_TRANSLATE_NOOP("Color name", "Dark Sky Blue") }, { "#5c3566", QT_TRANSLATE_NOOP("Color name", "Dark Plum") }, { "#8f5902", QT_TRANSLATE_NOOP("Color name", "Dark Chocolate") }, { "#2e3436", QT_TRANSLATE_NOOP("Color name", "Dark Aluminum 1") }, { "#babdb6", QT_TRANSLATE_NOOP("Color name", "Dark Aluminum 2") }, { "#000000", QT_TRANSLATE_NOOP("Color name", "Black") }, { "#2e3436", QT_TRANSLATE_NOOP("Color name", "Very Dark Gray") }, { "#555753", QT_TRANSLATE_NOOP("Color name", "Darker Gray") }, { "#888a85", QT_TRANSLATE_NOOP("Color name", "Dark Gray") }, { "#babdb6", QT_TRANSLATE_NOOP("Color name", "Medium Gray") }, { "#d3d7cf", QT_TRANSLATE_NOOP("Color name", "Light Gray") }, { "#eeeeec", QT_TRANSLATE_NOOP("Color name", "Lighter Gray") }, { "#f3f3f3", QT_TRANSLATE_NOOP("Color name", "Very Light Gray") }, { "#ffffff", QT_TRANSLATE_NOOP("Color name", "White") } }; ColorPaletteDialog::ColorPaletteDialog( const QString& defaultLabel, const QColor& defaultColor, const QColor& color, QWidget* parent ) : QDialog( parent ) { mColorHistory = ColorHistory::instance(); connect( mColorHistory, SIGNAL(changed()), this, SLOT(onColorHistoryChanged()) ); mDefaultColor = defaultColor; mColorNode = model::ColorNode( color ); setStyleSheet( ".glabels--ColorPaletteDialog {background: white; border: 1px solid black}" ); setWindowFlags( Qt::Popup | Qt::FramelessWindowHint ); auto* vLayout = new QVBoxLayout(); vLayout->setContentsMargins( 0, 0, 0, 0 ); vLayout->setSpacing( 0 ); // // Construct Standard Colors Grid // auto* standardColorsGroup = new QGroupBox( tr("Standard Colors") ); standardColorsGroup->setAlignment( Qt::AlignHCenter ); vLayout->addWidget( standardColorsGroup ); auto* mainPaletteLayout = new QGridLayout(); mainPaletteLayout->setSpacing( 0 ); for ( int iRow = 0; iRow < PALETTE_ROWS; iRow++ ) { for ( int iCol = 0; iCol < PALETTE_COLS; iCol++ ) { int i = iRow*PALETTE_COLS + iCol; ColorPaletteItem* item = new ColorPaletteItem( i, QColor( mColorTable[i].colorSpec ), tr(mColorTable[i].trname) ); connect( item, SIGNAL(activated(int)), this, SLOT(onPaletteItemActivated(int)) ); mainPaletteLayout->addWidget( item, iRow, iCol ); } } standardColorsGroup->setLayout( mainPaletteLayout ); // // Construct Recent Colors Grid // auto* recentColorsGroup = new QGroupBox( tr("Recent Colors") ); recentColorsGroup->setAlignment( Qt::AlignHCenter ); vLayout->addWidget( recentColorsGroup ); auto* customPaletteLayout = new QHBoxLayout(); customPaletteLayout->setSpacing( 0 ); for ( int iCol = 0; iCol < PALETTE_COLS; iCol++ ) { mHistoryItem[iCol] = new ColorPaletteItem( iCol, QColor(0,0,0,0), "" ); mHistoryItem[iCol]->setEnabled( false ); connect( mHistoryItem[iCol], SIGNAL(activated(int)), this, SLOT(onHistoryItemActivated(int)) ); customPaletteLayout->addWidget( mHistoryItem[iCol] ); } recentColorsGroup->setLayout( customPaletteLayout ); // // Construct Default (e.g. "No Fill") Button // auto* defaultColorButton = new QPushButton( defaultLabel ); defaultColorButton->setAutoDefault( false ); defaultColorButton->setDefault( false ); connect( defaultColorButton, SIGNAL(clicked()), this, SLOT(onDefaultButtonClicked()) ); vLayout->addWidget( defaultColorButton ); // // Construct Custom Color Button // auto* customColorButton = new QPushButton( tr("Custom color...") ); customColorButton->setAutoDefault( false ); customColorButton->setDefault( false ); connect( customColorButton, SIGNAL(clicked()), this, SLOT(onCustomColorButtonClicked()) ); vLayout->addWidget( customColorButton ); // // Construct "Use key" Button // mFieldButton = new FieldButton(); mFieldButton->setText( tr("Use key") ); mFieldButton->setAutoDefault( false ); mFieldButton->setDefault( false ); connect( mFieldButton, SIGNAL(keySelected(QString)), this, SLOT(onKeySelected(QString)) ); vLayout->addWidget( mFieldButton ); setLayout( vLayout ); loadCustomColorHistory(); } void ColorPaletteDialog::setColorNode( const model::ColorNode& colorNode ) { mColorNode = colorNode; } void ColorPaletteDialog::setKeys( const merge::Merge* merge, const model::Variables* variables ) { mFieldButton->setKeys( merge, variables ); } void ColorPaletteDialog::onPaletteItemActivated( int id ) { model::ColorNode newColorNode; newColorNode.setField( false ); newColorNode.setColor( QColor( mColorTable[id].colorSpec ) ); newColorNode.setKey( "" ); if ( newColorNode != mColorNode ) { mColorNode = newColorNode; mColorHistory->addColor( mColorNode.color() ); emit colorChanged( mColorNode, false ); accept(); } } void ColorPaletteDialog::onHistoryItemActivated( int id ) { mColorNode.setField( false ); mColorNode.setColor( mColorHistory->getColor(id) ); mColorNode.setKey( "" ); emit colorChanged( mColorNode, false ); accept(); } void ColorPaletteDialog::onDefaultButtonClicked() { mColorNode.setField( false ); mColorNode.setColor( mDefaultColor ); mColorNode.setKey( "" ); emit colorChanged( mColorNode, true ); accept(); } void ColorPaletteDialog::onCustomColorButtonClicked() { QColorDialog dlg( mColorNode.color(), this ); dlg.setWindowTitle( tr("Custom Color") ); if ( dlg.exec() ) { model::ColorNode newColorNode; newColorNode.setField( false ); newColorNode.setColor( dlg.currentColor() ); newColorNode.setKey( "" ); if ( newColorNode != mColorNode ) { mColorNode = newColorNode; mColorHistory->addColor( mColorNode.color() ); emit colorChanged( mColorNode, false ); accept(); } } } void ColorPaletteDialog::onColorHistoryChanged() { loadCustomColorHistory(); } void ColorPaletteDialog::loadCustomColorHistory() { QList colorList = mColorHistory->getColors(); int id = 0; foreach ( QColor color, colorList ) { mHistoryItem[id]->setColor( id, color, QString(tr("Custom color #%1").arg(id+1) ) ); mHistoryItem[id]->setEnabled( true ); id++; } while ( id < PALETTE_ROWS ) { mHistoryItem[id]->setEnabled( false ); id++; } } void ColorPaletteDialog::onKeySelected( QString key ) { mColorNode.setField( true ); mColorNode.setColor( QColor( 0xee, 0xee, 0xec ) ); mColorNode.setKey( key ); emit colorChanged( mColorNode, false ); accept(); } } // namespace glabels