void KTabBar::setTabColor( int id, const QColor& color ) { QTab *t = tab( id ); if ( t ) { mTabColors.insert( id, color ); repaint( t->rect(), false ); } }
void KTabBar::setTabEnabled( int id, bool enabled ) { QTab * t = tab( id ); if ( t ) { if ( t->isEnabled() != enabled ) { t->setEnabled( enabled ); QRect r( t->rect() ); if ( !enabled && id == currentTab() && count()>1 ) { int index = indexOf( id ); index += ( index+1 == count() ) ? -1 : 1; t = tabAt( index ); if ( t->isEnabled() ) { r = r.unite( t->rect() ); QPtrList<QTab> *tablist = tabList(); tablist->append( tablist->take( tablist->findRef( t ) ) ); emit selected( t->identifier() ); } } repaint( r ); } } }
void KTabBar::mouseMoveEvent( QMouseEvent *e ) { if ( e->state() == LeftButton ) { QTab *tab = selectTab( e->pos() ); if ( mDragSwitchTab && tab != mDragSwitchTab ) { mActivateDragSwitchTabTimer->stop(); mDragSwitchTab = 0; } int delay = KGlobalSettings::dndEventDelay(); QPoint newPos = e->pos(); if( newPos.x() > mDragStart.x()+delay || newPos.x() < mDragStart.x()-delay || newPos.y() > mDragStart.y()+delay || newPos.y() < mDragStart.y()-delay ) { if( tab!= 0L ) { emit( initiateDrag( indexOf( tab->identifier() ) ) ); return; } } } else if ( e->state() == MidButton ) { if (mReorderStartTab==-1) { int delay = KGlobalSettings::dndEventDelay(); QPoint newPos = e->pos(); if( newPos.x() > mDragStart.x()+delay || newPos.x() < mDragStart.x()-delay || newPos.y() > mDragStart.y()+delay || newPos.y() < mDragStart.y()-delay ) { QTab *tab = selectTab( e->pos() ); if( tab!= 0L && mTabReorderingEnabled ) { mReorderStartTab = indexOf( tab->identifier() ); grabMouse( sizeAllCursor ); return; } } } else { QTab *tab = selectTab( e->pos() ); if( tab!= 0L ) { int reorderStopTab = indexOf( tab->identifier() ); if ( mReorderStartTab!=reorderStopTab && mReorderPreviousTab!=reorderStopTab ) { emit( moveTab( mReorderStartTab, reorderStopTab ) ); mReorderPreviousTab=mReorderStartTab; mReorderStartTab=reorderStopTab; return; } } } } if ( mHoverCloseButtonEnabled && mReorderStartTab==-1) { QTab *t = selectTab( e->pos() ); //BEGIN Workaround //Qt3.2.0 (and 3.2.1) emit wrong local coordinates //for MouseMove events when the pointer leaves a widget. Discard those //to avoid enabling the wrong hover button #ifdef __GNUC__ #warning "Workaround for Qt 3.2.0, 3.2.1 bug" #endif if ( e->globalPos() != mapToGlobal( e->pos() ) ) return; //END Workaround if( t && t->iconSet() && t->isEnabled() ) { QPixmap pixmap = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ); QRect rect( 0, 0, pixmap.width() + 4, pixmap.height() +4); int xoff = 0, yoff = 0; // The additional offsets were found by try and error, TODO: find the rational behind them if ( t == tab( currentTab() ) ) { #if QT_VERSION >= 0x030200 xoff = style().pixelMetric( QStyle::PM_TabBarTabShiftHorizontal, this ) + 3; yoff = style().pixelMetric( QStyle::PM_TabBarTabShiftVertical, this ) - 4; #else xoff = 3; yoff = -4; #endif } else { xoff = 7; yoff = 0; } rect.moveLeft( t->rect().left() + 2 + xoff ); rect.moveTop( t->rect().center().y()-pixmap.height()/2 + yoff ); if ( rect.contains( e->pos() ) ) { if ( mHoverCloseButton ) { if ( mHoverCloseButtonTab == t ) return; mEnableCloseButtonTimer->stop(); delete mHoverCloseButton; } mHoverCloseButton = new QPushButton( this ); mHoverCloseButton->setIconSet( KGlobal::iconLoader()->loadIcon("fileclose", KIcon::Toolbar, KIcon::SizeSmall, KIcon::ActiveState) ); mHoverCloseButton->setGeometry( rect ); QToolTip::add(mHoverCloseButton,i18n("Close this tab")); mHoverCloseButton->setFlat(true); mHoverCloseButton->show(); if ( mHoverCloseButtonDelayed ) { mHoverCloseButton->setEnabled(false); mEnableCloseButtonTimer->start( QApplication::doubleClickInterval(), true ); } mHoverCloseButtonTab = t; connect( mHoverCloseButton, SIGNAL( clicked() ), SLOT( closeButtonClicked() ) ); return; } } if ( mHoverCloseButton ) { mEnableCloseButtonTimer->stop(); delete mHoverCloseButton; mHoverCloseButton = 0; } } QTabBar::mouseMoveEvent( e ); }