rendered paste bodyIndex: ktabbar.h
===================================================================
--- ktabbar.h (revision 740173)
+++ ktabbar.h (working copy)
@@ -57,7 +57,18 @@
*/
bool isTabReorderingEnabled() const;
- // KDE4 porting: disabled
+ // NoCloseButton -> nothing is shown
+ // StaticCloseButton -> always show a close button (no other icon allowed)
+ // HoverCloseButton -> show close button on mouse over, otherwise use icon
+ enum CloseButton { NoCloseButton=0, StaticCloseButton=1, HoverCloseButton=2};
+ // Q_DECLARE_FLAGS( CloseButtons, CloseButton ) not sure what this could be
+
+
+ void setCloseButton( int );
+ int closeButton() const;
+
+
+ //KDE4 porting: disabled
void setHoverCloseButton( bool );
bool hoverCloseButton() const;
@@ -84,11 +95,17 @@
*
* @param position the coordinates of the tab
*/
+ /** @deprecated use tabAt( const QPoint & ) instead. */
int selectTab( const QPoint &position ) const;
+
+
+ void setTabIcon(int index, const QIcon & icon);
Q_SIGNALS:
/** Emitted when the user right-clicks a tab. */
void contextMenu( int, const QPoint& );
+ /** Emitted when close button is clicked */
+ void closeButtonClicked(int index );
/** Emitted when the user right-clicks the empty area on the tab bar. */
void emptyAreaContextMenu( const QPoint& );
/** @deprecated use tabDoubleClicked(int) and newTabRequest() instead. */
@@ -120,16 +137,20 @@
virtual void dragEnterEvent( QDragEnterEvent *event );
virtual void dragMoveEvent( QDragMoveEvent *event );
virtual void dropEvent( QDropEvent *event );
+ virtual void paintEvent ( QPaintEvent * event );
protected Q_SLOTS:
- //virtual void closeButtonClicked();
- //virtual void enableCloseButton();
+ virtual void p_closeButtonClicked();
virtual void activateDragSwitchTab();
protected:
+ QRect findIconGeometry(const int index);
virtual void tabLayoutChange();
-
+ virtual void tabInserted(int index);
+ void drawCloseButton();
+ void setCloseIcon( int index);
private:
+
class Private;
Private* const d;
};
Index: ktabwidget.cpp
===================================================================
--- ktabwidget.cpp (revision 740173)
+++ ktabwidget.cpp (working copy)
@@ -496,6 +496,13 @@
}
}
+void KTabWidget::setCloseButton( int setting )
+{
+ static_cast<KTabBar*>( tabBar() )->setCloseButton( setting );
+ connect(tabBar(), SIGNAL(closeButtonClicked ( int )), this, SLOT(closeRequest(int ) ));
+}
+
+
void KTabWidget::setHoverCloseButton( bool button )
{
static_cast<KTabBar*>( tabBar() )->setHoverCloseButton( button );
Index: ktabbar.cpp
===================================================================
--- ktabbar.cpp (revision 740173)
+++ ktabbar.cpp (working copy)
@@ -27,24 +27,32 @@
#include <QtGui/QMouseEvent>
#include <QtGui/QPushButton>
#include <QtGui/QStyle>
+#include <QtCore/QRect>
+#include <QStyle>
+#include <QIcon>
#include <kglobalsettings.h>
#include <kiconloader.h>
#include <klocale.h>
+#include <kicon.h>
+
class KTabBar::Private
{
public:
Private()
: mReorderStartTab( -1 ),
mReorderPreviousTab( -1 ),
- // mHoverCloseButtonTab( 0 ),
+
mDragSwitchTab( -1 ),
- // mHoverCloseButton( 0 ),
- // mHoverCloseButtonEnabled( false ),
+
+ //mHoverCloseButtonEnabled( false ),
// mHoverCloseButtonDelayed( true ),
mTabReorderingEnabled( false ),
- mTabCloseActivatePrevious( false )
+ mTabCloseActivatePrevious( false ),
+ mCloseButtonSetting(KTabBar::NoCloseButton),
+ mCloseButtonInTab( -1 ),
+ mCloseButton( 0 )
{
}
@@ -53,7 +61,7 @@
int mReorderPreviousTab;
int mDragSwitchTab;
//QTab *mHoverCloseButtonTab, *mDragSwitchTab;
- //QPushButton *mHoverCloseButton;
+
//QTimer mEnableCloseButtonTimer;
QTimer *mActivateDragSwitchTabTimer;
@@ -61,7 +69,19 @@
//bool mHoverCloseButtonDelayed;
bool mTabReorderingEnabled : 1;
bool mTabCloseActivatePrevious : 1;
+
+ //what sort of close button (static, hover, delay)
+ int mCloseButtonSetting;
+ //in what tab is the close button shown currently?
+ int mCloseButtonInTab;
+
+ //the closebutton
+ QPushButton *mCloseButton;
+ //temporary storage for the icons "real" tab.
+ QIcon mCloseButtonTmpIcon;
+
+
};
KTabBar::KTabBar( QWidget *parent )
@@ -86,12 +106,20 @@
delete d;
}
+
+void KTabBar::paintEvent ( QPaintEvent * event )
+{
+ drawCloseButton();
+ QTabBar::paintEvent(event);
+}
+
+
void KTabBar::mouseDoubleClickEvent( QMouseEvent *event )
{
if ( event->button() != Qt::LeftButton )
return;
- int tab = selectTab( event->pos() );
+ int tab = tabAt( event->pos() );
if(tab == -1) {
emit newTabRequest();
@@ -107,7 +135,7 @@
//d->mEnableCloseButtonTimer->stop();
d->mDragStart = event->pos();
} else if( event->button() == Qt::RightButton ) {
- int tab = selectTab( event->pos() );
+ int tab = tabAt( event->pos() );
if ( tab != -1 ) {
emit contextMenu( tab, mapToGlobal( event->pos() ) );
} else {
@@ -121,8 +149,8 @@
void KTabBar::mouseMoveEvent( QMouseEvent *event )
{
+ int tab = tabAt( event->pos() );
if ( event->buttons() == Qt::LeftButton ) {
- int tab = selectTab( event->pos() );
if ( d->mDragSwitchTab && tab != d->mDragSwitchTab ) {
d->mActivateDragSwitchTabTimer->stop();
d->mDragSwitchTab = 0;
@@ -144,7 +172,6 @@
if ( newPos.x() > d->mDragStart.x() + delay || newPos.x() < d->mDragStart.x() - delay ||
newPos.y() > d->mDragStart.y() + delay || newPos.y() < d->mDragStart.y() - delay ) {
- int tab = selectTab( event->pos() );
if ( tab != -1 && d->mTabReorderingEnabled ) {
d->mReorderStartTab = tab;
grabMouse( Qt::SizeAllCursor );
@@ -152,7 +179,6 @@
}
}
} else {
- int tab = selectTab( event->pos() );
if ( tab != -1 ) {
int reorderStopTab = tab;
if ( d->mReorderStartTab != reorderStopTab && d->mReorderPreviousTab != reorderStopTab ) {
@@ -166,71 +192,92 @@
}
}
}
+ if(d->mCloseButtonSetting != KTabBar::NoCloseButton){
+
+ switch(d->mCloseButtonSetting){
+ case KTabBar::StaticCloseButton:
+ d->mCloseButtonInTab = tab;
+ break;
+ case KTabBar::HoverCloseButton:
+ setCloseIcon(tab);
+ break;
+ }
+
+ }
+
- /*if ( d->mHoverCloseButtonEnabled && d->mReorderStartTab == -1 ) {
- QTab *t = selectTab( event->pos() );
- if ( t && t->iconSet() && t->isEnabled() ) {
- QPixmap pixmap = t->iconSet()->pixmap( QIcon::Small, QIcon::Normal );
- QRect rect( 0, 0, pixmap.width() + 4, pixmap.height() +4);
+ QTabBar::mouseMoveEvent( event );
+}
- int xoff = 0, yoff = 0;
- // The additional offsets were found by try and error, TODO: find the rational behind them
- if ( t == tab( currentTab() ) ) {
- xoff = style().pixelMetric( QStyle::PM_TabBarTabShiftHorizontal, this ) + 3;
- yoff = style().pixelMetric( QStyle::PM_TabBarTabShiftVertical, this ) - 4;
- } else {
- xoff = 7;
- yoff = 0;
- }
+void KTabBar::setCloseIcon(int index)
+{
- rect.moveLeft( t->rect().left() + 2 + xoff );
- rect.moveTop( t->rect().center().y() - pixmap.height() / 2 + yoff );
- if ( rect.contains( event->pos() ) ) {
- if ( d->mHoverCloseButton ) {
- if ( d->mHoverCloseButtonTab == t )
- return;
- d->mEnableCloseButtonTimer->stop();
- d->mHoverCloseButton->deleteLater();
- d->mHoverCloseButton = 0;
- }
+ if(d->mCloseButtonInTab != -1)
+ setTabIcon(d->mCloseButtonInTab, d->mCloseButtonTmpIcon);
- d->mHoverCloseButton = new QPushButton( this );
- d->mHoverCloseButton->setIcon( KGlobal::iconLoader()->loadIconSet( "window-close", KIconLoader::Toolbar, KIconLoader::SizeSmall ) );
- d->mHoverCloseButton->setGeometry( rect );
- d->mHoverCloseButton->setToolTip( i18n( "Close this tab" ) );
- d->mHoverCloseButton->setFlat( true );
- d->mHoverCloseButton->show();
- if ( d->mHoverCloseButtonDelayed ) {
- d->mHoverCloseButton->setEnabled( false );
- d->mEnableCloseButtonTimer->start( QApplication::doubleClickInterval(), true );
- }
+ d->mCloseButtonInTab = index;
+ if(index == -1)
+ return;
- d->mHoverCloseButtonTab = t;
- connect( d->mHoverCloseButton, SIGNAL( clicked() ), SLOT( closeButtonClicked() ) );
- return;
- }
- }
+ d->mCloseButtonTmpIcon = tabIcon(index);
+ setTabIcon(index, KIcon( "window-close" ));
- if ( d->mHoverCloseButton ) {
- d->mEnableCloseButtonTimer->stop();
- d->mHoverCloseButton->deleteLater();
- d->mHoverCloseButton = 0;
- }
- }*/
+}
- QTabBar::mouseMoveEvent( event );
+void KTabBar::drawCloseButton()
+{
+
+ if(d->mCloseButtonSetting == KTabBar::NoCloseButton )
+ return;
+
+ //if the close button isn't set yet, set it up
+ if(d->mCloseButton == 0){
+ d->mCloseButton = new QPushButton( this );
+ d->mCloseButton->setIcon( KIcon( "window-close" ) );
+ d->mCloseButton->setToolTip( i18n( "Close this tab" ) );
+ d->mCloseButton->setFlat( true );
+ connect( d->mCloseButton, SIGNAL( clicked() ), SLOT( p_closeButtonClicked( ) ) );
+ }
+
+
+ //mouse is about to leave the tabbar. remove the button
+ if(d->mCloseButtonInTab == -1){
+ d->mCloseButton->hide();
+ return;
+ }
+
+ //move the button
+ d->mCloseButton->setGeometry( findIconGeometry( d->mCloseButtonInTab ) );
+
+ d->mCloseButton->show();
+
}
-/*
-void KTabBar::enableCloseButton()
+
+
+QRect KTabBar::findIconGeometry(const int index)
{
- d->mHoverCloseButton->setEnabled( true );
+
+ QRect rect;
+ rect = QRect(tabRect(index).topLeft(), iconSize() );
+ //found via trial and error... there's gotta be a system behind it: --> insert here ;)
+ rect.moveLeft(rect.left() + 14);
+ rect.moveBottom(rect.bottom() + 8);
+
+ return rect;
}
-*/
+void KTabBar::p_closeButtonClicked()
+{
+ emit closeButtonClicked(d->mCloseButtonInTab );
+ d->mCloseButtonInTab = -1;
+ d->mCloseButton->hide();
+}
+
+
void KTabBar::activateDragSwitchTab()
{
- int tab = selectTab( mapFromGlobal( QCursor::pos() ) );
+ int tab = tabAt( mapFromGlobal( QCursor::pos() ) );
if ( tab != -1 && d->mDragSwitchTab == tab )
setCurrentIndex( d->mDragSwitchTab );
@@ -241,7 +288,7 @@
{
if ( event->button() == Qt::MidButton ) {
if ( d->mReorderStartTab == -1 ) {
- int tab = selectTab( event->pos() );
+ int tab = tabAt( event->pos() );
if ( tab != -1 ) {
emit mouseMiddleClick( tab );
return;
@@ -265,7 +312,7 @@
void KTabBar::dragMoveEvent( QDragMoveEvent *event )
{
- int tab = selectTab( event->pos() );
+ int tab = tabAt( event->pos() );
if ( tab != -1 ) {
bool accept = false;
// The receivers of the testCanDecode() signal has to adjust
@@ -286,7 +333,7 @@
void KTabBar::dropEvent( QDropEvent *event )
{
- int tab = selectTab( event->pos() );
+ int tab = tabAt( event->pos() );
if ( tab != -1 ) {
d->mActivateDragSwitchTabTimer->stop();
d->mDragSwitchTab = 0;
@@ -327,33 +374,72 @@
d->mTabCloseActivatePrevious = on;
}
-/*
-void KTabBar::closeButtonClicked()
+
+void KTabBar::setHoverCloseButton( bool button )
{
- emit closeRequest( indexOf( d->mHoverCloseButtonTab->identifier() ) );
+ if(button == true)
+ setCloseButton( KTabBar::HoverCloseButton );
+ else
+ setCloseButton( KTabBar::NoCloseButton );
+ return;
}
-*/
-void KTabBar::setHoverCloseButton( bool /*button*/ )
+
+void KTabBar::setCloseButton( int setting )
{
- // KDE4 porting: disabled
- return;
+ d->mCloseButtonSetting = setting;
-/*
- d->mHoverCloseButtonEnabled = button;
- if ( !button )
- tabLayoutChange();
-*/
+ if(setting != KTabBar::NoCloseButton){
+ int i;
+ for(i=0;i<this->count();i++)
+ tabInserted(i);
+ }
+
}
-bool KTabBar::hoverCloseButton() const
+int KTabBar::closeButton() const
{
- // KDE4 porting: disabled
- return false;
+ return d->mCloseButtonSetting;
+}
- //return d->mHoverCloseButtonEnabled;
+void KTabBar::setTabIcon(int index, const QIcon & icon)
+{
+ //if the static close button is set, disable icons
+ if(d->mCloseButtonSetting == KTabBar::StaticCloseButton)
+ return;
+
+ if(d->mCloseButtonSetting == KTabBar::HoverCloseButton && icon.isNull()){
+ QTabBar::setTabIcon(index, KIcon( "window-close" ));
+ return;
+ }
+
+ QTabBar::setTabIcon(index, icon);
}
+void KTabBar::tabInserted(int index)
+{
+
+ switch(d->mCloseButtonSetting){
+ case KTabBar::StaticCloseButton :
+ QTabBar::setTabIcon(index, KIcon( "window-close" ));
+ break;
+ case KTabBar::HoverCloseButton:
+ if(tabIcon(index).isNull())
+ QTabBar::setTabIcon(index, KIcon( "window-close" ));
+ break;
+ }
+}
+
+
+
+bool KTabBar::hoverCloseButton() const
+{
+ if(d->mCloseButtonSetting == KTabBar::HoverCloseButton)
+ return true;
+ else
+ return false;
+}
+
void KTabBar::setHoverCloseButtonDelayed( bool /*delayed*/ )
{
// KDE4 porting: disabled
@@ -372,21 +458,11 @@
void KTabBar::tabLayoutChange()
{
- //d->mEnableCloseButtonTimer->stop();
- //delete d->mHoverCloseButton;
- //d->mHoverCloseButton = 0;
- //d->mHoverCloseButtonTab = 0;
d->mActivateDragSwitchTabTimer->stop();
d->mDragSwitchTab = 0;
+
}
-int KTabBar::selectTab( const QPoint &pos ) const
-{
- for ( int i = 0; i < count(); ++i )
- if ( tabRect( i ).contains( pos ) )
- return i;
- return -1;
-}
#include "ktabbar.moc"
Index: ktabwidget.h
===================================================================
--- ktabwidget.h (revision 740173)
+++ ktabwidget.h (working copy)
@@ -187,7 +187,11 @@
* you from which index to which index a tab has been moved.
*/
void setTabReorderingEnabled( bool enable );
+
+ void setCloseButton( int setting );
+
+
/**
* If \a enable is true, a close button will be shown on mouse hover
* over tab icons which will emit signal closeRequest( QWidget * )