KDEUI
kurllabel.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "kurllabel.h"
00019
00020 #include <QtCore/QTimer>
00021 #include <QtGui/QApplication>
00022 #include <QtGui/QMouseEvent>
00023
00024 #include <kcursor.h>
00025 #include <kcolorscheme.h>
00026
00027 class KUrlLabel::Private
00028 {
00029 public:
00030 Private( const QString& _url, KUrlLabel* _parent )
00031 : parent( _parent ),
00032 url( _url ),
00033 tipText( url ),
00034 linkColor( KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::LinkText).color() ),
00035 highlightedLinkColor( Qt::red ),
00036 cursor( 0 ),
00037 textUnderlined( true ),
00038 realUnderlined( true ),
00039 useTips( false ),
00040 useCursor( false ),
00041 glowEnabled( true ),
00042 floatEnabled( false ),
00043 timer( new QTimer( parent ) )
00044 {
00045 connect( timer, SIGNAL( timeout() ), parent, SLOT( updateColor() ) );
00046 }
00047
00048 ~Private ()
00049 {
00050 }
00051
00052 void updateColor()
00053 {
00054 timer->stop();
00055
00056 if ( !(glowEnabled || floatEnabled) || !parent->rect().contains( parent->mapFromGlobal( QCursor::pos() ) ) )
00057 setLinkColor( linkColor );
00058 }
00059
00060 void setLinkColor( const QColor& color )
00061 {
00062 QPalette palette = parent->palette();
00063 palette.setColor( QPalette::WindowText, color );
00064 parent->setPalette( palette );
00065
00066 parent->update();
00067 }
00068
00069
00070 KUrlLabel *parent;
00071
00072 QString url;
00073 QString tipText;
00074 QColor linkColor;
00075 QColor highlightedLinkColor;
00076 QCursor* cursor;
00077 bool textUnderlined : 1;
00078 bool realUnderlined : 1;
00079 bool useTips : 1;
00080 bool useCursor : 1;
00081 bool glowEnabled : 1;
00082 bool floatEnabled : 1;
00083 QPixmap alternatePixmap;
00084 QPixmap realPixmap;
00085 QTimer* timer;
00086 };
00087
00088 KUrlLabel::KUrlLabel( const QString& url, const QString& text, QWidget* parent )
00089 : QLabel( !text.isNull() ? text : url, parent ),
00090 d( new Private( url, this ) )
00091 {
00092 setFont( font() );
00093 setCursor( QCursor( Qt::PointingHandCursor ) );
00094 d->setLinkColor( d->linkColor );
00095 }
00096
00097 KUrlLabel::KUrlLabel( QWidget* parent )
00098 : QLabel( parent ),
00099 d( new Private( QString(), this ) )
00100 {
00101 setFont( font() );
00102 setCursor( QCursor( Qt::PointingHandCursor ) );
00103 d->setLinkColor( d->linkColor );
00104 }
00105
00106 KUrlLabel::~KUrlLabel()
00107 {
00108 delete d;
00109 }
00110
00111 void KUrlLabel::mouseReleaseEvent( QMouseEvent* event )
00112 {
00113 QLabel::mouseReleaseEvent( event );
00114
00115 d->setLinkColor( d->highlightedLinkColor );
00116 d->timer->start( 300 );
00117
00118 switch ( event->button() ) {
00119 case Qt::LeftButton:
00120 emit leftClickedUrl();
00121 emit leftClickedUrl( d->url );
00122 break;
00123
00124 case Qt::MidButton:
00125 emit middleClickedUrl();
00126 emit middleClickedUrl( d->url );
00127 break;
00128
00129 case Qt::RightButton:
00130 emit rightClickedUrl();
00131 emit rightClickedUrl( d->url );
00132 break;
00133
00134 default:
00135 break;
00136 }
00137 }
00138
00139 void KUrlLabel::setFont( const QFont& font )
00140 {
00141 QFont newFont = font;
00142 newFont.setUnderline( d->textUnderlined );
00143
00144 QLabel::setFont( newFont );
00145 }
00146
00147 void KUrlLabel::setUnderline( bool on )
00148 {
00149 d->textUnderlined = on;
00150
00151 setFont( font() );
00152 }
00153
00154 void KUrlLabel::setUrl( const QString& url )
00155 {
00156 if ( d->tipText == d->url ) {
00157 d->tipText = url;
00158 setUseTips( d->useTips );
00159 }
00160
00161 d->url = url;
00162 }
00163
00164 QString KUrlLabel::url() const
00165 {
00166 return d->url;
00167 }
00168
00169 void KUrlLabel::setUseCursor( bool on, QCursor* cursor )
00170 {
00171 d->useCursor = on;
00172 d->cursor = cursor;
00173
00174 if ( on ) {
00175 if ( cursor ) {
00176 setCursor( *cursor );
00177 } else {
00178 setCursor( QCursor( Qt::PointingHandCursor ) );
00179 }
00180 } else
00181 unsetCursor();
00182 }
00183
00184 bool KUrlLabel::useCursor() const
00185 {
00186 return d->useCursor;
00187 }
00188
00189 void KUrlLabel::setUseTips( bool on )
00190 {
00191 d->useTips = on;
00192
00193 if ( on )
00194 setToolTip( d->tipText );
00195 else
00196 setToolTip( QString() );
00197 }
00198
00199 void KUrlLabel::setTipText( const QString& tipText )
00200 {
00201 d->tipText = tipText;
00202
00203 setUseTips( d->useTips );
00204 }
00205
00206 bool KUrlLabel::useTips() const
00207 {
00208 return d->useTips;
00209 }
00210
00211 QString KUrlLabel::tipText() const
00212 {
00213 return d->tipText;
00214 }
00215
00216 void KUrlLabel::setHighlightedColor( const QColor& color )
00217 {
00218 d->linkColor = color;
00219
00220 if ( !d->timer->isActive() )
00221 d->setLinkColor( color );
00222 }
00223
00224 void KUrlLabel::setHighlightedColor( const QString& color )
00225 {
00226 setHighlightedColor( QColor( color ) );
00227 }
00228
00229 void KUrlLabel::setSelectedColor( const QColor& color )
00230 {
00231 d->highlightedLinkColor = color;
00232
00233 if ( d->timer->isActive() )
00234 d->setLinkColor( color );
00235 }
00236
00237 void KUrlLabel::setSelectedColor( const QString& color )
00238 {
00239 setSelectedColor( QColor( color ) );
00240 }
00241
00242 void KUrlLabel::setGlowEnabled( bool glowEnabled )
00243 {
00244 d->glowEnabled = glowEnabled;
00245 }
00246
00247 void KUrlLabel::setFloatEnabled( bool floatEnabled )
00248 {
00249 d->floatEnabled = floatEnabled;
00250 }
00251
00252 bool KUrlLabel::isGlowEnabled() const
00253 {
00254 return d->glowEnabled;
00255 }
00256
00257 bool KUrlLabel::isFloatEnabled() const
00258 {
00259 return d->floatEnabled;
00260 }
00261
00262 void KUrlLabel::setAlternatePixmap( const QPixmap& pixmap )
00263 {
00264 d->alternatePixmap = pixmap;
00265 }
00266
00267 const QPixmap* KUrlLabel::alternatePixmap() const
00268 {
00269 return &d->alternatePixmap;
00270 }
00271
00272 void KUrlLabel::enterEvent( QEvent* event )
00273 {
00274 QLabel::enterEvent( event );
00275
00276 if ( !d->alternatePixmap.isNull() && pixmap() ) {
00277 d->realPixmap = *pixmap();
00278 setPixmap( d->alternatePixmap );
00279 }
00280
00281 if ( d->glowEnabled || d->floatEnabled ) {
00282 d->timer->stop();
00283
00284 d->setLinkColor( d->highlightedLinkColor );
00285
00286 d->realUnderlined = d->textUnderlined;
00287
00288 if ( d->floatEnabled )
00289 setUnderline( true );
00290 }
00291
00292 emit enteredUrl();
00293 emit enteredUrl( d->url );
00294 }
00295
00296 void KUrlLabel::leaveEvent( QEvent* event )
00297 {
00298 QLabel::leaveEvent( event );
00299
00300 if ( !d->alternatePixmap.isNull() && pixmap() )
00301 setPixmap( d->realPixmap );
00302
00303 if ( (d->glowEnabled || d->floatEnabled) && !d->timer->isActive() )
00304 d->setLinkColor( d->linkColor );
00305
00306 setUnderline( d->realUnderlined );
00307
00308 emit leftUrl();
00309 emit leftUrl( d->url );
00310 }
00311
00312 bool KUrlLabel::event( QEvent *event )
00313 {
00314 if ( event->type() == QEvent::PaletteChange ) {
00318 QPalette palette = parentWidget() ? parentWidget()->palette() : qApp->palette();
00319
00320 palette.setBrush( QPalette::Base, palette.brush( QPalette::Normal, QPalette::Background ) );
00321 palette.setColor( QPalette::Foreground, this->palette().color( QPalette::Active, QPalette::Foreground ) );
00322 setPalette( palette );
00323
00324 d->linkColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::LinkText).color();
00325 d->updateColor();
00326
00327 return true;
00328 } else
00329 return QLabel::event( event );
00330 }
00331
00332 #include "kurllabel.moc"