diff --git a/glabels/CMakeLists.txt b/glabels/CMakeLists.txt index 84efee2..97b691c 100644 --- a/glabels/CMakeLists.txt +++ b/glabels/CMakeLists.txt @@ -14,6 +14,7 @@ set (glabels_sources ColorNode.cpp ColorPaletteDialog.cpp ColorPaletteItem.cpp + ColorPaletteButtonItem.cpp ColorSwatch.cpp Cursors.cpp FieldButton.cpp @@ -49,6 +50,7 @@ set (glabels_qobject_headers ColorHistory.h ColorPaletteDialog.h ColorPaletteItem.h + ColorPaletteButtonItem.h FieldButton.h FieldMenu.h FieldMenuItem.h diff --git a/glabels/ColorButton.cpp b/glabels/ColorButton.cpp index 670442f..b1e210a 100644 --- a/glabels/ColorButton.cpp +++ b/glabels/ColorButton.cpp @@ -53,7 +53,7 @@ namespace glabels mDialog->setModal( true ); connect( this, SIGNAL(pressed()), this, SLOT(onButtonPressed()) ); - connect( mDialog, SIGNAL(changed(colorNode,bool)), this, SLOT(onColorPaletteDialogChanged(colorNode,bool)) ); + connect( mDialog, SIGNAL(colorChanged(colorNode,bool)), this, SLOT(onColorPaletteDialogChanged(colorNode,bool)) ); } @@ -123,7 +123,6 @@ namespace glabels void ColorButton::onButtonPressed() { - setDown( true ); // TODO: move dialog -- see menu_position_function is VALA version mDialog->show(); } @@ -131,8 +130,6 @@ namespace glabels void ColorButton::onPaletteDialogChanged( ColorNode colorNode, bool isDefault ) { - setDown( false ); - mColorNode = colorNode; mIsDefault = isDefault; diff --git a/glabels/ColorHistory.cpp b/glabels/ColorHistory.cpp index d8470e7..2c3d40d 100644 --- a/glabels/ColorHistory.cpp +++ b/glabels/ColorHistory.cpp @@ -50,7 +50,7 @@ namespace glabels QColor newColors[MAX_COLORS]; int n; - readColorArray( oldColors, n ); + readColorArray( oldColors, &n ); int i; newColors[0] = color; @@ -69,6 +69,8 @@ namespace glabels QColor colors[MAX_COLORS]; int n; + readColorArray( colors, &n ); + if ( (n > 0) && (i < n) ) { return colors[i]; @@ -80,15 +82,15 @@ namespace glabels } - void ColorHistory::readColorArray( QColor array[MAX_COLORS], int& n ) + void ColorHistory::readColorArray( QColor array[MAX_COLORS], int* n ) { QSettings settings; settings.beginGroup( "ColorHistory" ); settings.beginReadArray( "history" ); - n = settings.value( "history/size", 0 ).toInt(); - for ( int i = 0; i < n; i++ ) + *n = settings.value( "history/size", 0 ).toInt(); + for ( int i = 0; i < *n; i++ ) { settings.setArrayIndex(i); array[i] = settings.value( "color" ).value(); diff --git a/glabels/ColorHistory.h b/glabels/ColorHistory.h index 3d11642..0239dda 100644 --- a/glabels/ColorHistory.h +++ b/glabels/ColorHistory.h @@ -67,7 +67,7 @@ namespace glabels // Private Methods ///////////////////////////////// private: - void readColorArray( QColor array[MAX_COLORS], int& n ); + void readColorArray( QColor array[MAX_COLORS], int* n ); void writeColorArray( const QColor array[MAX_COLORS], int n ); diff --git a/glabels/ColorPaletteButtonItem.cpp b/glabels/ColorPaletteButtonItem.cpp new file mode 100644 index 0000000..cc1730a --- /dev/null +++ b/glabels/ColorPaletteButtonItem.cpp @@ -0,0 +1,130 @@ +/* ColorPaletteButtonItem.cpp + * + * Copyright (C) 2014 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 "ColorPaletteButtonItem.h" + + +#include + + +// +// Private Configuration Data +// +namespace +{ + const int border = 4; + const int hBox = 25; + const QColor hoverOutlineColor( 89, 130, 182 ); + const QColor hoverGradientColor0( 164, 195, 232 ); + const QColor hoverGradientColor1( 147, 181, 224 ); + const int outlineWidthPixels = 1; + const QColor textColor( 0, 0, 0 ); + const QColor hoverTextColor( 255, 255, 255 ); +} + + +namespace glabels +{ + + /// + /// Constructor From Data + /// + ColorPaletteButtonItem::ColorPaletteButtonItem( const QString& text, QWidget* parent ) + : QWidget(parent), mText(text), mHover(false) + { + setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); + setMinimumSize( hBox+2*border+1, hBox+2*border+1 ); + } + + + /// + /// Paint Event + /// + void ColorPaletteButtonItem::paintEvent( QPaintEvent* event ) + { + QPainter painter(this); + + // + // Draw background + // + if ( mHover ) + { + QLinearGradient gradient( 0, 0, 0, height() ); + gradient.setColorAt( 0, hoverGradientColor0 ); + gradient.setColorAt( 1, hoverGradientColor1 ); + painter.setBrush( QBrush( gradient ) ); + + QPen pen( hoverOutlineColor ); + pen.setWidth( outlineWidthPixels ); + painter.setPen( pen ); + + painter.drawRect( 0, 0, width()-1, height()-1 ); + } + + // + // Draw text + // + painter.setBrush( QBrush( Qt::NoBrush ) ); + + if ( mHover ) + { + painter.setPen( QPen( hoverTextColor ) ); + } + else + { + painter.setPen( QPen( textColor ) ); + } + + QRect textRect( border, border, width()-2*border, hBox ); + + painter.drawText( textRect, Qt::AlignLeft|Qt::AlignVCenter, mText ); + } + + + /// + /// Enter Event + /// + void ColorPaletteButtonItem::enterEvent( QEvent* event ) + { + mHover = true; + update(); + } + + + /// + /// Leave Event + /// + void ColorPaletteButtonItem::leaveEvent( QEvent* event ) + { + mHover = false; + update(); + } + + + /// + /// Mouse Press Event + /// + void ColorPaletteButtonItem::mousePressEvent( QMouseEvent* event ) + { + emit activated(); + } + +} + diff --git a/glabels/ColorPaletteButtonItem.h b/glabels/ColorPaletteButtonItem.h new file mode 100644 index 0000000..57769e6 --- /dev/null +++ b/glabels/ColorPaletteButtonItem.h @@ -0,0 +1,74 @@ +/* ColorPaletteButtonItem.h + * + * Copyright (C) 2014 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 . + */ + +#ifndef glabels_ColorPaletteButtonItem_h +#define glabels_ColorPaletteButtonItem_h + +#include +#include + + +namespace glabels +{ + + /// + /// Color Palette Item + /// + class ColorPaletteButtonItem : public QWidget + { + Q_OBJECT + + ///////////////////////////////// + // Life Cycle + ///////////////////////////////// + public: + ColorPaletteButtonItem( const QString& text, QWidget* parent = 0 ); + + + ///////////////////////////////// + // Signals + ///////////////////////////////// + signals: + void activated(); + + + ///////////////////////////////// + // Event handlers + ///////////////////////////////// + protected: + void paintEvent( QPaintEvent* event ); + void enterEvent( QEvent* event ); + void leaveEvent( QEvent* event ); + void mousePressEvent( QMouseEvent* event ); + + + ///////////////////////////////// + // Private Data + ///////////////////////////////// + private: + QString mText; + + bool mHover; + }; + + +} + +#endif // glabels_ColorPaletteButtonItem_h diff --git a/glabels/ColorPaletteDialog.cpp b/glabels/ColorPaletteDialog.cpp index 0a61bd4..28f7ec5 100644 --- a/glabels/ColorPaletteDialog.cpp +++ b/glabels/ColorPaletteDialog.cpp @@ -20,8 +20,15 @@ #include "ColorPaletteDialog.h" +#include "ColorPaletteItem.h" +#include "ColorPaletteButtonItem.h" + +#include +#include #include #include +#include +#include namespace glabels @@ -80,14 +87,20 @@ namespace glabels mColorHistory = ColorHistory::instance(); connect( mColorHistory, SIGNAL(changed()), this, SLOT(onColorHistoryChanged()) ); - QGridLayout* layout = new QGridLayout(); - int iAbsRow = 0; - - QPushButton* defaultButton = new QPushButton( defaultLabel ); - layout->addWidget( defaultButton, iAbsRow, 0, 1, PALETTE_COLS ); - iAbsRow++; + QVBoxLayout* vLayout = new QVBoxLayout(); + vLayout->setContentsMargins( 0, 0, 0, 0 ); + vLayout->setSpacing( 0 ); + ColorPaletteButtonItem* defaultButton = new ColorPaletteButtonItem( defaultLabel ); + vLayout->addWidget( defaultButton ); + + QFrame* hline1 = new QFrame; + hline1->setFrameStyle( QFrame::HLine | QFrame::Plain ); + hline1->setLineWidth( 1 ); + vLayout->addWidget( hline1 ); + QGridLayout* mainPaletteLayout = new QGridLayout(); + mainPaletteLayout->setSpacing( 0 ); for ( int iRow = 0; iRow < PALETTE_ROWS; iRow++ ) { for ( int iCol = 0; iCol < PALETTE_COLS; iCol++ ) @@ -99,33 +112,46 @@ namespace glabels mColorTable[i].name ); connect( item, SIGNAL(activated(int)), this, SLOT(onPaletteItemActivated(int)) ); - layout->addWidget( item, iAbsRow, iCol ); + mainPaletteLayout->addWidget( item, iRow, iCol ); } - iAbsRow++; } + vLayout->addLayout( mainPaletteLayout ); + QFrame* hline2 = new QFrame; + hline2->setFrameStyle( QFrame::HLine | QFrame::Plain ); + hline2->setLineWidth( 1 ); + vLayout->addWidget( hline2 ); + QHBoxLayout* 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] = new ColorPaletteItem( iCol, QColor(0,0,0,0), "" ); mHistoryItem[iCol]->setEnabled( false ); connect( mHistoryItem[iCol], SIGNAL(activated(int)), this, SLOT(onHistoryItemActivated(int)) ); - layout->addWidget( mHistoryItem[iCol], iAbsRow, iCol ); + customPaletteLayout->addWidget( mHistoryItem[iCol] ); } - iAbsRow++; + vLayout->addLayout( customPaletteLayout ); - QPushButton* customColorButton = new QPushButton( tr("Custom color") ); - layout->addWidget( customColorButton, iAbsRow, 0, 1, PALETTE_COLS ); - iAbsRow++; + QFrame* hline3 = new QFrame; + hline3->setFrameStyle( QFrame::HLine | QFrame::Plain ); + hline3->setLineWidth( 1 ); + vLayout->addWidget( hline3 ); - QPushButton* mergeFieldButton = new QPushButton( "TODO: Field Button" ); - layout->addWidget( mergeFieldButton, iAbsRow, 0, 1, PALETTE_COLS ); + ColorPaletteButtonItem* customColorButton = new ColorPaletteButtonItem( tr("Custom color") ); + vLayout->addWidget( customColorButton ); - setLayout( layout ); + QFrame* hline4 = new QFrame; + hline4->setFrameStyle( QFrame::HLine | QFrame::Plain ); + hline4->setLineWidth( 1 ); + vLayout->addWidget( hline4 ); + + ColorPaletteButtonItem* mergeFieldButton = new ColorPaletteButtonItem( "TODO: Field Button" ); + vLayout->addWidget( mergeFieldButton ); + + setLayout( vLayout ); loadCustomColorHistory(); } @@ -143,12 +169,13 @@ namespace glabels } - void ColorPaletteDialog::onDefaultButtonClicked() + void ColorPaletteDialog::onDefaultItemActivated() { mColorNode.setFieldFlag( false ); mColorNode.setColor( mDefaultColor ); mColorNode.setKey( "" ); + setVisible( false ); emit colorChanged( mColorNode, true ); } @@ -159,6 +186,7 @@ namespace glabels mColorNode.setColor( QColor( mColorTable[id].colorSpec ) ); mColorNode.setKey( "" ); + setVisible( false ); emit colorChanged( mColorNode, false ); } @@ -169,12 +197,14 @@ namespace glabels mColorNode.setColor( mColorHistory->getColor( id ) ); mColorNode.setKey( "" ); + setVisible( false ); emit colorChanged( mColorNode, false ); } - void ColorPaletteDialog::onCustomColorButtonClicked() + void ColorPaletteDialog::onCustomColorItemActivated() { + setVisible( false ); // TODO } @@ -187,7 +217,7 @@ namespace glabels void ColorPaletteDialog::loadCustomColorHistory() { - for ( int i; i < PALETTE_COLS; i++ ) + for ( int i = 0; i < PALETTE_COLS; i++ ) { QColor color = mColorHistory->getColor( i ); diff --git a/glabels/ColorPaletteDialog.h b/glabels/ColorPaletteDialog.h index 05f02f2..d63879c 100644 --- a/glabels/ColorPaletteDialog.h +++ b/glabels/ColorPaletteDialog.h @@ -69,10 +69,10 @@ namespace glabels // Slots ///////////////////////////////// private slots: - void onDefaultButtonClicked(); + void onDefaultItemActivated(); void onPaletteItemActivated( int id ); void onHistoryItemActivated( int id ); - void onCustomColorButtonClicked(); + void onCustomColorItemActivated(); void onColorHistoryChanged(); diff --git a/glabels/ColorPaletteItem.cpp b/glabels/ColorPaletteItem.cpp index d97ae94..22dc32e 100644 --- a/glabels/ColorPaletteItem.cpp +++ b/glabels/ColorPaletteItem.cpp @@ -32,8 +32,14 @@ namespace const int border = 4; const int wSwatch = 25; const int hSwatch = 25; - const QColor hoverColor( 170, 200, 255 ); + + const QColor hoverBgOutlineColor( 89, 130, 182 ); + const QColor hoverBgGradientColor0( 164, 195, 232 ); + const QColor hoverBgGradientColor1( 147, 181, 224 ); + const int hoverBgOutlineWidthPixels = 1; + const QColor outlineColor( 0, 0, 0 ); + const QColor hoverOutlineColor( 255, 255, 255 ); const QColor emptyOutlineColor( 192, 192, 192 ); const int outlineWidthPixels = 1; } @@ -80,18 +86,44 @@ namespace glabels { QPainter painter(this); - if ( mHover && mColor.alpha() ) + // + // Draw background + // + if ( isEnabled() && mHover ) { - painter.setBrush( QBrush( hoverColor ) ); - painter.setPen( Qt::NoPen ); - painter.drawRect( rect() ); + QLinearGradient gradient( 0, 0, 0, height() ); + gradient.setColorAt( 0, hoverBgGradientColor0 ); + gradient.setColorAt( 1, hoverBgGradientColor1 ); + painter.setBrush( QBrush( gradient ) ); + + QPen pen( hoverBgOutlineColor ); + pen.setWidth( hoverBgOutlineWidthPixels ); + painter.setPen( pen ); + + painter.drawRect( 0, 0, width()-1, height()-1 ); } - if ( mColor.alpha() ) + // + // Draw swatch + // + painter.setBrush( QBrush( Qt::NoBrush ) ); + + if ( isEnabled() ) { - QPen pen( outlineColor ); - pen.setWidth( outlineWidthPixels ); - painter.setPen( pen ); + if ( mHover ) + { + QPen pen( hoverOutlineColor ); + pen.setWidth( outlineWidthPixels ); + painter.setPen( pen ); + } + else + { + QPen pen( outlineColor ); + pen.setWidth( outlineWidthPixels ); + painter.setPen( pen ); + } + + } else {