You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktechlab/src/gui/colorcombo.cpp

195 lines
4.8 KiB

/***************************************************************************
* Copyright (C) 2005 by David Saxton *
* david@bluehaze.org *
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "colorcombo.h"
#include <kcolordialog.h>
#include <klocale.h>
#include <qpainter.h>
bool ColorCombo::createdPalettes = false;
QColor * ColorCombo::palette[ NumberOfSchemes ];
int ColorCombo::paletteSize[ NumberOfSchemes ];
ColorCombo::ColorCombo( ColorScheme colorScheme, QWidget *parent, const char *name )
: QComboBox( parent, name )
{
m_colorScheme = colorScheme;
customColor.setRgb( 255, 255, 255 );
internalColor.setRgb( 255, 255, 255 );
createPalettes();
addColors();
connect( this, SIGNAL( activated(int) ), SLOT( slotActivated(int) ) );
connect( this, SIGNAL( highlighted(int) ), SLOT( slotHighlighted(int) ) );
}
ColorCombo::~ColorCombo()
{
}
void ColorCombo::createPalettes()
{
if ( createdPalettes )
return;
createdPalettes = true;
paletteSize[ QtStandard ] = 17;
palette[ QtStandard ] = new QColor[ paletteSize[ QtStandard ] ];
int i = 0;
palette[ QtStandard ][i++] = Qt::red;
palette[ QtStandard ][i++] = Qt::green;
palette[ QtStandard ][i++] = Qt::blue;
palette[ QtStandard ][i++] = Qt::cyan;
palette[ QtStandard ][i++] = Qt::magenta;
palette[ QtStandard ][i++] = Qt::yellow;
palette[ QtStandard ][i++] = Qt::darkRed;
palette[ QtStandard ][i++] = Qt::darkGreen;
palette[ QtStandard ][i++] = Qt::darkBlue;
palette[ QtStandard ][i++] = Qt::darkCyan;
palette[ QtStandard ][i++] = Qt::darkMagenta;
palette[ QtStandard ][i++] = Qt::darkYellow;
palette[ QtStandard ][i++] = Qt::white;
palette[ QtStandard ][i++] = Qt::lightGray;
palette[ QtStandard ][i++] = Qt::gray;
palette[ QtStandard ][i++] = Qt::darkGray;
palette[ QtStandard ][i++] = Qt::black;
paletteSize[ LED ] = 6;
palette[ LED ] = new QColor[ paletteSize[ LED ] ];
i = 0;
palette[ LED ][i++] = "#f62a2a";
palette[ LED ][i++] = "#ff7733";
palette[ LED ][i++] = "#ffbb33";
palette[ LED ][i++] = "#eeee22";
palette[ LED ][i++] = "#4cc308";
palette[ LED ][i++] = "#22aaee";
}
void ColorCombo::setColor( const QColor &col )
{
internalColor = col;
addColors();
}
void ColorCombo::resizeEvent( QResizeEvent *re )
{
QComboBox::resizeEvent( re );
addColors();
}
void ColorCombo::slotActivated( int index )
{
if ( index == 0 )
{
if ( KColorDialog::getColor( customColor, this ) == QDialog::Accepted )
{
QPainter painter;
QPen pen;
QRect rect( 0, 0, width(), QFontMetrics(painter.font()).height()+4);
QPixmap pixmap( rect.width(), rect.height() );
if ( qGray( customColor.rgb() ) < 128 )
pen.setColor( white );
else
pen.setColor( black );
painter.begin( &pixmap );
QBrush brush( customColor );
painter.fillRect( rect, brush );
painter.setPen( pen );
painter.drawText( 2, QFontMetrics(painter.font()).ascent()+2, i18n("Custom...") );
painter.end();
changeItem( pixmap, 0 );
pixmap.detach();
}
internalColor = customColor;
}
else
internalColor = palette[ m_colorScheme ][ index - 1 ];
emit activated( internalColor );
}
void ColorCombo::slotHighlighted( int index )
{
if ( index == 0 )
internalColor = customColor;
else
internalColor = palette[ m_colorScheme ][ index - 1 ];
emit highlighted( internalColor );
}
void ColorCombo::addColors()
{
QPainter painter;
QPen pen;
QRect rect( 0, 0, width(), QFontMetrics(painter.font()).height()+4 );
QPixmap pixmap( rect.width(), rect.height() );
int i;
clear();
createPalettes();
for ( i = 0; i < paletteSize[ m_colorScheme ]; i++ )
if ( palette[ m_colorScheme ][i] == internalColor ) break;
if ( i == paletteSize[ m_colorScheme ] )
customColor = internalColor;
if ( qGray( customColor.rgb() ) < 128 )
pen.setColor( white );
else
pen.setColor( black );
painter.begin( &pixmap );
QBrush brush( customColor );
painter.fillRect( rect, brush );
painter.setPen( pen );
painter.drawText( 2, QFontMetrics(painter.font()).ascent()+2, i18n("Custom...") );
painter.end();
insertItem( pixmap );
pixmap.detach();
for ( i = 0; i < paletteSize[ m_colorScheme ]; i++ )
{
painter.begin( &pixmap );
QBrush brush( palette[ m_colorScheme ][i] );
painter.fillRect( rect, brush );
painter.end();
insertItem( pixmap );
pixmap.detach();
if ( palette[ m_colorScheme ][i] == internalColor )
setCurrentItem( i + 1 );
}
}
#include "colorcombo.moc"