KDEUI
kurllabel.cpp
Go to the documentation of this file.
00001 // Copyright (C) 2000 Peter Putzer 00002 00003 // This library is free software; you can redistribute it and/or 00004 // modify it under the terms of the GNU Lesser General Public 00005 // License as published by the Free Software Foundation; either 00006 // version 2.1 of the License, or (at your option) any later version. 00007 00008 // This library is distributed in the hope that it will be useful, 00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 // Lesser General Public License for more details. 00012 00013 // You should have received a copy of the GNU Lesser General Public 00014 // License along with this library; if not, write to the Free Software 00015 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 00016 // 02110-1301 USA 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( KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::ActiveText).color() ), 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 ) { // update the tip as well 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"
KDE 4.6 API Reference