kmail

colorlistbox.cpp

Go to the documentation of this file.
00001 /*
00002  *   kmail: KDE mail client
00003  *   This file: Copyright (C) 2000 Espen Sand, espen@kde.org
00004  *
00005  *   This program is free software; you can redistribute it and/or modify
00006  *   it under the terms of the GNU General Public License as published by
00007  *   the Free Software Foundation; either version 2 of the License, or
00008  *   (at your option) any later version.
00009  *
00010  *   This program is distributed in the hope that it will be useful,
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *   GNU General Public License for more details.
00014  *
00015  *   You should have received a copy of the GNU General Public License
00016  *   along with this program; if not, write to the Free Software
00017  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00018  *
00019  */
00020 
00021 #ifdef HAVE_CONFIG_H
00022 #include <config.h>
00023 #endif
00024 
00025 #include <qpainter.h>
00026 
00027 #include <kcolordialog.h>
00028 #include <kcolordrag.h>
00029 
00030 #include "colorlistbox.h"
00031 
00032 ColorListBox::ColorListBox( QWidget *parent, const char *name, WFlags f )
00033   :KListBox( parent, name, f ), mCurrentOnDragEnter(-1)
00034 {
00035   connect( this, SIGNAL(selected(int)), this, SLOT(newColor(int)) );
00036   setAcceptDrops( true);
00037 }
00038 
00039 
00040 void ColorListBox::setEnabled( bool state )
00041 {
00042   if( state == isEnabled() )
00043   {
00044     return;
00045   }
00046 
00047   QListBox::setEnabled( state );
00048   for( uint i=0; i<count(); i++ )
00049   {
00050     updateItem( i );
00051   }
00052 }
00053 
00054 
00055 void ColorListBox::setColor( uint index, const QColor &color )
00056 {
00057   if( index < count() )
00058   {
00059     ColorListItem *colorItem = (ColorListItem*)item(index);
00060     colorItem->setColor(color);
00061     updateItem( colorItem );
00062     emit changed();
00063   }
00064 }
00065 
00066 
00067 QColor ColorListBox::color( uint index ) const
00068 {
00069   if( index < count() )
00070   {
00071     ColorListItem *colorItem = (ColorListItem*)item(index);
00072     return( colorItem->color() );
00073   }
00074   else
00075   {
00076     return( black );
00077   }
00078 }
00079 
00080 
00081 void ColorListBox::newColor( int index )
00082 {
00083   if( isEnabled() == false )
00084   {
00085     return;
00086   }
00087 
00088   if( (uint)index < count() )
00089   {
00090     QColor c = color( index );
00091     if( KColorDialog::getColor( c, this ) != QDialog::Rejected )
00092     {
00093       setColor( index, c );
00094     }
00095   }
00096 }
00097 
00098 
00099 void ColorListBox::dragEnterEvent( QDragEnterEvent *e )
00100 {
00101   if( KColorDrag::canDecode(e) && isEnabled() )
00102   {
00103     mCurrentOnDragEnter = currentItem();
00104     e->accept( true );
00105   }
00106   else
00107   {
00108     mCurrentOnDragEnter = -1;
00109     e->accept( false );
00110   }
00111 }
00112 
00113 
00114 void ColorListBox::dragLeaveEvent( QDragLeaveEvent * )
00115 {
00116   if( mCurrentOnDragEnter != -1 )
00117   {
00118     setCurrentItem( mCurrentOnDragEnter );
00119     mCurrentOnDragEnter = -1;
00120   }
00121 }
00122 
00123 
00124 void ColorListBox::dragMoveEvent( QDragMoveEvent *e )
00125 {
00126   if( KColorDrag::canDecode(e) && isEnabled() )
00127   {
00128     ColorListItem *item = (ColorListItem*)itemAt( e->pos() );
00129     if( item != 0 )
00130     {
00131       setCurrentItem ( item );
00132     }
00133   }
00134 }
00135 
00136 
00137 void ColorListBox::dropEvent( QDropEvent *e )
00138 {
00139   QColor color;
00140   if( KColorDrag::decode( e, color ) )
00141   {
00142     int index = currentItem();
00143     if( index != -1 )
00144     {
00145       ColorListItem *colorItem = (ColorListItem*)item(index);
00146       colorItem->setColor(color);
00147       triggerUpdate( false ); // Redraw item
00148     }
00149     mCurrentOnDragEnter = -1;
00150   }
00151 }
00152 
00153 
00154 
00155 ColorListItem::ColorListItem( const QString &text, const QColor &color )
00156   : QListBoxItem(), mColor( color ), mBoxWidth( 30 )
00157 {
00158   setText( text );
00159 }
00160 
00161 
00162 const QColor &ColorListItem::color( void )
00163 {
00164   return( mColor );
00165 }
00166 
00167 
00168 void ColorListItem::setColor( const QColor &color )
00169 {
00170   mColor = color;
00171 }
00172 
00173 
00174 void ColorListItem::paint( QPainter *p )
00175 {
00176   QFontMetrics fm = p->fontMetrics();
00177   int h = fm.height();
00178 
00179   p->drawText( mBoxWidth+3*2, fm.ascent() + fm.leading()/2, text() );
00180 
00181   p->setPen( Qt::black );
00182   p->drawRect( 3, 1, mBoxWidth, h-1 );
00183   p->fillRect( 4, 2, mBoxWidth-2, h-3, mColor );
00184 }
00185 
00186 
00187 int ColorListItem::height(const QListBox *lb ) const
00188 {
00189   return( lb->fontMetrics().lineSpacing()+1 );
00190 }
00191 
00192 
00193 int ColorListItem::width(const QListBox *lb ) const
00194 {
00195   return( mBoxWidth + lb->fontMetrics().width( text() ) + 6 );
00196 }
00197 
00198 #include "colorlistbox.moc"