KDEUI
ktabbar.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
00019
00020
00021
00022 #include "ktabbar.h"
00023 #include "ktabwidget.h"
00024
00025 #include <QtCore/QTimer>
00026 #include <QtGui/QApplication>
00027 #include <QtGui/QCursor>
00028 #include <QtGui/QMouseEvent>
00029 #include <QtGui/QPainter>
00030 #include <QtGui/QPushButton>
00031 #include <QtGui/QStyle>
00032 #include <QtGui/QStyleOption>
00033
00034 #include <kglobalsettings.h>
00035 #include <kicon.h>
00036 #include <kiconeffect.h>
00037 #include <kiconloader.h>
00038 #include <klocale.h>
00039 #include <kstyle.h>
00040
00041 class KTabBar::Private
00042 {
00043 public:
00044 Private()
00045 : mReorderStartTab( -1 ),
00046 mReorderPreviousTab( -1 ),
00047 mDragSwitchTab( -1 ),
00048 mActivateDragSwitchTabTimer( 0 ),
00049 mTabReorderingEnabled( false ),
00050 mTabCloseActivatePrevious( false ),
00051 mMiddleMouseTabMoveInProgress( false)
00052 {
00053 }
00054
00055 QPoint mDragStart;
00056 int mReorderStartTab;
00057 int mReorderPreviousTab;
00058 int mDragSwitchTab;
00059 QTimer *mActivateDragSwitchTabTimer;
00060
00061 bool mTabReorderingEnabled : 1;
00062 bool mTabCloseActivatePrevious : 1;
00063 bool mMiddleMouseTabMoveInProgress : 1;
00064
00065 };
00066
00067 KTabBar::KTabBar( QWidget *parent )
00068 : QTabBar( parent ),
00069 d( new Private )
00070 {
00071 setAcceptDrops( true );
00072 setMouseTracking( true );
00073
00074 d->mActivateDragSwitchTabTimer = new QTimer( this );
00075 d->mActivateDragSwitchTabTimer->setSingleShot( true );
00076 connect( d->mActivateDragSwitchTabTimer, SIGNAL( timeout() ), SLOT( activateDragSwitchTab() ) );
00077 connect( this, SIGNAL(tabCloseRequested(int)), this, SIGNAL(closeRequest(int)));
00078
00079
00080 }
00081
00082 KTabBar::~KTabBar()
00083 {
00084 delete d;
00085 }
00086
00087 void KTabBar::mouseDoubleClickEvent( QMouseEvent *event )
00088 {
00089 if ( event->button() != Qt::LeftButton )
00090 return;
00091
00092 int tab = selectTab( event->pos() );
00093
00094 if(tab == -1) {
00095 emit newTabRequest();
00096 } else {
00097 emit mouseDoubleClick( tab );
00098 emit tabDoubleClicked( tab );
00099 }
00100
00101 QTabBar::mouseDoubleClickEvent( event );
00102 }
00103
00104 void KTabBar::mousePressEvent( QMouseEvent *event )
00105 {
00106 if ( event->button() == Qt::LeftButton ) {
00107 d->mDragStart = event->pos();
00108 } else if( event->button() == Qt::RightButton ) {
00109 int tab = selectTab( event->pos() );
00110 if ( tab != -1 ) {
00111 emit contextMenu( tab, mapToGlobal( event->pos() ) );
00112 } else {
00113 emit emptyAreaContextMenu( mapToGlobal( event->pos() ) );
00114 }
00115 return;
00116 } else if (QTabBar::isMovable() && event->button() == Qt::MidButton) {
00117
00118 event->accept();
00119 QMouseEvent fakedMouseEvent(event->type(), event->pos(), Qt::LeftButton, Qt::LeftButton, event->modifiers());
00120 QCoreApplication::sendEvent(this, &fakedMouseEvent);
00121 }
00122
00123 QTabBar::mousePressEvent( event );
00124 }
00125
00126 void KTabBar::mouseMoveEvent( QMouseEvent *event )
00127 {
00128 if ( event->buttons() == Qt::LeftButton && !isMovable() ) {
00129 int tab = selectTab( event->pos() );
00130 if ( d->mDragSwitchTab && tab != d->mDragSwitchTab ) {
00131 d->mActivateDragSwitchTabTimer->stop();
00132 d->mDragSwitchTab = 0;
00133 }
00134
00135 int delay = KGlobalSettings::dndEventDelay();
00136 QPoint newPos = event->pos();
00137 if ( newPos.x() > d->mDragStart.x() + delay || newPos.x() < d->mDragStart.x() - delay ||
00138 newPos.y() > d->mDragStart.y() + delay || newPos.y() < d->mDragStart.y() - delay ) {
00139 if ( tab != -1 ) {
00140 emit initiateDrag( tab );
00141 return;
00142 }
00143 }
00144 } else if ( event->buttons() == Qt::MidButton && !isMovable() ) {
00145 if ( d->mReorderStartTab == -1 ) {
00146 int delay = KGlobalSettings::dndEventDelay();
00147 QPoint newPos = event->pos();
00148
00149 if ( newPos.x() > d->mDragStart.x() + delay || newPos.x() < d->mDragStart.x() - delay ||
00150 newPos.y() > d->mDragStart.y() + delay || newPos.y() < d->mDragStart.y() - delay ) {
00151 int tab = selectTab( event->pos() );
00152 if ( tab != -1 && d->mTabReorderingEnabled ) {
00153 d->mReorderStartTab = tab;
00154 grabMouse( Qt::SizeAllCursor );
00155 return;
00156 }
00157 }
00158 } else {
00159 int tab = selectTab( event->pos() );
00160 if ( tab != -1 ) {
00161 int reorderStopTab = tab;
00162 if ( d->mReorderStartTab != reorderStopTab && d->mReorderPreviousTab != reorderStopTab ) {
00163 emit moveTab( d->mReorderStartTab, reorderStopTab );
00164
00165 d->mReorderPreviousTab = d->mReorderStartTab;
00166 d->mReorderStartTab = reorderStopTab;
00167
00168 return;
00169 }
00170 }
00171 }
00172 } else if ( event->button() == Qt::NoButton && event->buttons() == Qt::MidButton && isMovable() ) {
00173
00174 d->mMiddleMouseTabMoveInProgress = true;
00175 event->accept();
00176 QMouseEvent fakedMouseEvent(event->type(), event->pos(), event->button(), Qt::LeftButton, event->modifiers());
00177 QCoreApplication::sendEvent(this, &fakedMouseEvent);
00178 return;
00179 }
00180
00181 QTabBar::mouseMoveEvent( event );
00182 }
00183
00184
00185 void KTabBar::closeButtonClicked()
00186 {
00187
00188 }
00189
00190
00191 void KTabBar::enableCloseButton()
00192 {
00193
00194 }
00195
00196
00197 void KTabBar::activateDragSwitchTab()
00198 {
00199 int tab = selectTab( mapFromGlobal( QCursor::pos() ) );
00200 if ( tab != -1 && d->mDragSwitchTab == tab )
00201 setCurrentIndex( d->mDragSwitchTab );
00202
00203 d->mDragSwitchTab = 0;
00204 }
00205
00206 void KTabBar::mouseReleaseEvent( QMouseEvent *event )
00207 {
00208 switch ( event->button() ) {
00209 case Qt::LeftButton:
00210 break;
00211
00212 case Qt::MidButton:
00213 if (d->mMiddleMouseTabMoveInProgress && QTabBar::isMovable()) {
00214
00215 d->mMiddleMouseTabMoveInProgress = false;
00216 event->accept();
00217 QMouseEvent fakedMouseEvent(event->type(), event->pos(), Qt::LeftButton, Qt::LeftButton, event->modifiers());
00218 QCoreApplication::sendEvent(this, &fakedMouseEvent);
00219 return;
00220 }
00221 if ( d->mReorderStartTab == -1 ) {
00222 int tab = selectTab( event->pos() );
00223 if ( tab != -1 ) {
00224 event->accept();
00225 if (QTabBar::isMovable()) {
00226 QMouseEvent fakedMouseEvent(event->type(), event->pos(), Qt::LeftButton, Qt::LeftButton, event->modifiers());
00227 QCoreApplication::sendEvent(this, &fakedMouseEvent);
00228 }
00229 emit mouseMiddleClick( tab );
00230 return;
00231 }
00232 } else {
00233 releaseMouse();
00234 setCursor( Qt::ArrowCursor );
00235 d->mReorderStartTab = -1;
00236 d->mReorderPreviousTab = -1;
00237 }
00238 break;
00239
00240 default:
00241 break;
00242 }
00243
00244 QTabBar::mouseReleaseEvent( event );
00245 }
00246
00247 void KTabBar::dragEnterEvent( QDragEnterEvent *event )
00248 {
00249 int tab = selectTab( event->pos() );
00250 if ( tab != -1 ) {
00251 bool accept = false;
00252
00253
00254 emit testCanDecode( event, accept );
00255 if ( accept && tab != currentIndex() ) {
00256 d->mDragSwitchTab = tab;
00257 d->mActivateDragSwitchTabTimer->start( QApplication::doubleClickInterval() * 2 );
00258 }
00259
00260 event->setAccepted( accept );
00261 return;
00262 }
00263
00264 QTabBar::dragEnterEvent( event );
00265 }
00266
00267 void KTabBar::dragMoveEvent( QDragMoveEvent *event )
00268 {
00269 int tab = selectTab( event->pos() );
00270 if ( tab != -1 ) {
00271 bool accept = false;
00272
00273
00274 emit testCanDecode( event, accept );
00275 if ( accept && tab != currentIndex() ) {
00276 d->mDragSwitchTab = tab;
00277 d->mActivateDragSwitchTabTimer->start( QApplication::doubleClickInterval() * 2 );
00278 }
00279
00280 event->setAccepted( accept );
00281 return;
00282 }
00283
00284 QTabBar::dragMoveEvent( event );
00285 }
00286
00287 void KTabBar::dropEvent( QDropEvent *event )
00288 {
00289 int tab = selectTab( event->pos() );
00290 if ( tab != -1 ) {
00291 d->mActivateDragSwitchTabTimer->stop();
00292 d->mDragSwitchTab = 0;
00293 emit receivedDropEvent( tab , event );
00294 return;
00295 }
00296
00297 QTabBar::dropEvent( event );
00298 }
00299
00300 void KTabBar::paintEvent( QPaintEvent *event )
00301 {
00302 QTabBar::paintEvent( event );
00303 }
00304
00305 void KTabBar::leaveEvent( QEvent *event )
00306 {
00307 QTabBar::leaveEvent( event );
00308 }
00309
00310 QSize KTabBar::tabSizeHint( int index ) const
00311 {
00312 QSize size = QTabBar::tabSizeHint( index );
00313
00314 return size;
00315 }
00316
00317 #ifndef QT_NO_WHEELEVENT
00318 void KTabBar::wheelEvent( QWheelEvent *event )
00319 {
00320 if ( event->orientation() == Qt::Horizontal )
00321 return;
00322
00323 emit( wheelDelta( event->delta() ) );
00324 }
00325 #endif
00326
00327 bool KTabBar::isTabReorderingEnabled() const
00328 {
00329 return d->mTabReorderingEnabled;
00330 }
00331
00332 void KTabBar::setTabReorderingEnabled( bool on )
00333 {
00334 d->mTabReorderingEnabled = on;
00335 }
00336
00337 bool KTabBar::tabCloseActivatePrevious() const
00338 {
00339 return d->mTabCloseActivatePrevious;
00340 }
00341
00342 void KTabBar::setTabCloseActivatePrevious( bool on )
00343 {
00344 d->mTabCloseActivatePrevious = on;
00345 }
00346
00347
00348 void KTabBar::setHoverCloseButton( bool button )
00349 {
00350
00351 setTabsClosable(button);
00352 }
00353
00354 bool KTabBar::hoverCloseButton() const
00355 {
00356
00357 return tabsClosable();
00358 }
00359
00360 void KTabBar::setHoverCloseButtonDelayed( bool delayed )
00361 {
00362
00363 Q_UNUSED( delayed );
00364 }
00365
00366 bool KTabBar::hoverCloseButtonDelayed() const
00367 {
00368
00369 return false;
00370 }
00371
00372 void KTabBar::setCloseButtonEnabled( bool enable )
00373 {
00374 QTabBar::setTabsClosable(enable);
00375 }
00376
00377 bool KTabBar::isCloseButtonEnabled() const
00378 {
00379 return QTabBar::tabsClosable();
00380 }
00381
00382 void KTabBar::tabLayoutChange()
00383 {
00384 d->mActivateDragSwitchTabTimer->stop();
00385 d->mDragSwitchTab = 0;
00386 }
00387
00388 int KTabBar::selectTab( const QPoint &pos ) const
00389 {
00390 const int tabCount = count();
00391 for ( int i = 0; i < tabCount; ++i )
00392 if ( tabRect( i ).contains( pos ) )
00393 return i;
00394
00395 return -1;
00396 }
00397
00398 QPoint KTabBar::closeButtonPos( int tabIndex ) const
00399 {
00400 Q_UNUSED(tabIndex);
00401 return QPoint();
00402 }
00403
00404 QRect KTabBar::closeButtonRect( int tabIndex ) const
00405 {
00406 Q_UNUSED(tabIndex);
00407 return QRect();
00408 }
00409
00410 #include "ktabbar.moc"