• Skip to content
  • Skip to link menu
KDE 4.3 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KDEUI

ktabbar.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE libraries
00002     Copyright (C) 2003 Stephan Binner <binner@kde.org>
00003     Copyright (C) 2003 Zack Rusin <zack@kde.org>
00004     Copyright (C) 2009 Urs Wolfer <uwolfer @ kde.org>
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License as published by the Free Software Foundation; either
00009     version 2 of the License, or (at your option) any later version.
00010 
00011     This library is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014     Library General Public License for more details.
00015 
00016     You should have received a copy of the GNU Library General Public License
00017     along with this library; see the file COPYING.LIB.  If not, write to
00018     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019     Boston, MA 02110-1301, USA.
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))); // just for backward compatibilty, KDE5 remove
00078 
00079   //connect( this, SIGNAL( layoutChanged() ), SLOT( onLayoutChange() ) );
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 ); //deprecated
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     // compatibilty feature for old middle mouse tab moving
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     // compatibilty feature for old middle mouse tab moving
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   // deprecated
00188 }
00189 
00190 
00191 void KTabBar::enableCloseButton()
00192 {
00193   // deprecated
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       // compatibilty feature for old middle mouse tab moving
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     // The receivers of the testCanDecode() signal has to adjust
00253     // 'accept' accordingly.
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     // The receivers of the testCanDecode() signal has to adjust
00273     // 'accept' accordingly.
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   // deprecated
00351   setTabsClosable(button);
00352 }
00353 
00354 bool KTabBar::hoverCloseButton() const
00355 {
00356   // deprecated
00357   return tabsClosable();
00358 }
00359 
00360 void KTabBar::setHoverCloseButtonDelayed( bool delayed )
00361 {
00362   // deprecated
00363   Q_UNUSED( delayed );
00364 }
00365 
00366 bool KTabBar::hoverCloseButtonDelayed() const
00367 {
00368   // deprecated
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"

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.6.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal