kaddressbook

colorlistbox.cpp

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 #include <qpainter.h>
00022 
00023 #include <kcolordialog.h>
00024 #include <kcolordrag.h>
00025 
00026 #include "colorlistbox.h"
00027 
00028 ColorListBox::ColorListBox( QWidget *parent, const char *name, WFlags f )
00029   :KListBox( parent, name, f ), mCurrentOnDragEnter(-1)
00030 {
00031   connect( this, SIGNAL(selected(int)), this, SLOT(newColor(int)) );
00032   setAcceptDrops( true);
00033 }
00034 
00035 
00036 void ColorListBox::setEnabled( bool state )
00037 {
00038   if( state == isEnabled() )
00039   {
00040     return;
00041   }
00042 
00043   QListBox::setEnabled( state );
00044   for( uint i=0; i<count(); i++ )
00045   {
00046     updateItem( i );
00047   }
00048 }
00049 
00050 
00051 void ColorListBox::setColor( uint index, const QColor &color )
00052 {
00053   if( index < count() )
00054   {
00055     ColorListItem *colorItem = (ColorListItem*)item(index);
00056     colorItem->setColor(color);
00057     updateItem( colorItem );
00058   }
00059 }
00060 
00061 
00062 QColor ColorListBox::color( uint index ) const
00063 {
00064   if( index < count() )
00065   {
00066     ColorListItem *colorItem = (ColorListItem*)item(index);
00067     return( colorItem->color() );
00068   }
00069   else
00070   {
00071     return( black );
00072   }
00073 }
00074 
00075 
00076 void ColorListBox::newColor( int index )
00077 {
00078   if( isEnabled() == false )
00079   {
00080     return;
00081   }
00082 
00083   if( (uint)index < count() )
00084   {
00085     QColor c = color( index );
00086     if( KColorDialog::getColor( c, this ) != QDialog::Rejected )
00087     {
00088       setColor( index, c );
00089     }
00090   }
00091 }
00092 
00093 
00094 void ColorListBox::dragEnterEvent( QDragEnterEvent *e )
00095 {
00096   if( KColorDrag::canDecode(e) && isEnabled() )
00097   {
00098     mCurrentOnDragEnter = currentItem();
00099     e->accept( true );
00100   }
00101   else
00102   {
00103     mCurrentOnDragEnter = -1;
00104     e->accept( false );
00105   }
00106 }
00107 
00108 
00109 void ColorListBox::dragLeaveEvent( QDragLeaveEvent * )
00110 {
00111   if( mCurrentOnDragEnter != -1 )
00112   {
00113     setCurrentItem( mCurrentOnDragEnter );
00114     mCurrentOnDragEnter = -1;
00115   }
00116 }
00117 
00118 
00119 void ColorListBox::dragMoveEvent( QDragMoveEvent *e )
00120 {
00121   if( KColorDrag::canDecode(e) && isEnabled() )
00122   {
00123     ColorListItem *item = (ColorListItem*)itemAt( e->pos() );
00124     if( item != 0 )
00125     {
00126       setCurrentItem ( item );
00127     }
00128   }
00129 }
00130 
00131 
00132 void ColorListBox::dropEvent( QDropEvent *e )
00133 {
00134   QColor color;
00135   if( KColorDrag::decode( e, color ) )
00136   {
00137     int index = currentItem();
00138     if( index != -1 )
00139     {
00140       ColorListItem *colorItem = (ColorListItem*)item(index);
00141       colorItem->setColor(color);
00142       triggerUpdate( false ); // Redraw item
00143     }
00144     mCurrentOnDragEnter = -1;
00145   }
00146 }
00147 
00148 
00149 
00150 ColorListItem::ColorListItem( const QString &text, const QColor &color )
00151   : QListBoxItem(), mColor( color ), mBoxWidth( 30 )
00152 {
00153   setText( text );
00154 }
00155 
00156 
00157 const QColor &ColorListItem::color( void )
00158 {
00159   return( mColor );
00160 }
00161 
00162 
00163 void ColorListItem::setColor( const QColor &color )
00164 {
00165   mColor = color;
00166 }
00167 
00168 
00169 void ColorListItem::paint( QPainter *p )
00170 {
00171   QFontMetrics fm = p->fontMetrics();
00172   int h = fm.height();
00173 
00174   p->drawText( mBoxWidth+3*2, fm.ascent() + fm.leading()/2, text() );
00175 
00176   p->setPen( Qt::black );
00177   p->drawRect( 3, 1, mBoxWidth, h-1 );
00178   p->fillRect( 4, 2, mBoxWidth-2, h-3, mColor );
00179 }
00180 
00181 
00182 int ColorListItem::height(const QListBox *lb ) const
00183 {
00184   return( lb->fontMetrics().lineSpacing()+1 );
00185 }
00186 
00187 
00188 int ColorListItem::width(const QListBox *lb ) const
00189 {
00190   return( mBoxWidth + lb->fontMetrics().width( text() ) + 6 );
00191 }
00192 
00193 #include "colorlistbox.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys