[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: [PATCH] KTabWidget / KTabBar changes for Qt 4.5
From: Urs Wolfer <uwolfer () kde ! org>
Date: 2009-02-21 11:58:19
Message-ID: 200902211258.19802.uwolfer () kde ! org
[Download RAW message or body]
[Attachment #2 (multipart/mixed)]
Please review the following patch.
Changes related to Qt 4.5 QTabWidget / QTabBar improvements:
* Deprecate:
* KTabBar/KTabWidget#isTabReorderingEnabled; use QTabBar#setMovable
* KTabBar/KTabWidget#setCloseButtonEnabled; use QTabBar#setTabsClosable
* KTabBar/KTabWidget#setTabCloseActivatePrevious; use
QTabBar#setSelectionBehaviorOnRemove
* signal KTabBar#moveTab; port to QTabBar#setMovable and connect to
QTabBar#tabMoved
* signal KTabBar#closeRequest; connect to QTabBar#tabCloseRequested
Remove all the close icon related code; call instead QTabBar code internally
already.
There are some known rendering issues with Qt 4.5 QTabBar which need to be
fixed in Oxygen style. See #184782.
Bye
urs
["ktabbar_ktabwidget_qt45.patch" (text/x-patch)]
Index: ktabbar.h
===================================================================
--- ktabbar.h (revision 929391)
+++ ktabbar.h (working copy)
@@ -1,6 +1,7 @@
/* This file is part of the KDE libraries
Copyright (C) 2003 Stephan Binner <binner@kde.org>
Copyright (C) 2003 Zack Rusin <zack@kde.org>
+ Copyright (C) 2009 Urs Wolfer <uwolfer @ kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -49,13 +50,17 @@
* Sets the tab reordering enabled or disabled. If enabled,
* the user can reorder the tabs by drag and drop the tab
* headers.
+ *
+ * @deprecated Use QTabBar::setMovable() instead.
*/
- void setTabReorderingEnabled( bool enable );
+ KDE_DEPRECATED void setTabReorderingEnabled( bool enable );
/**
* Returns whether tab reordering is enabled.
+ *
+ * @deprecated Use QTabBar::isMovable() instead.
*/
- bool isTabReorderingEnabled() const;
+ KDE_DEPRECATED bool isTabReorderingEnabled() const;
/**
* If enabled, a close button is shown above the tab icon.
@@ -63,11 +68,11 @@
* close button has been clicked. Note that the tab must have
* an icon to use this feature.
*
- * @deprecated Use KTabBar::setCloseButtonEnabled() instead.
+ * @deprecated Use QTabBar::setTabsClosable() instead.
*/
KDE_DEPRECATED void setHoverCloseButton( bool );
- /** @deprecated Use KTabBar::isCloseButtonEnabled() instead. */
+ /** @deprecated Use QTabBar::tabsClosable() instead. */
KDE_DEPRECATED bool hoverCloseButton() const;
/**
@@ -75,11 +80,11 @@
* minor delay has been passed. This prevents that user
* accidentally closes a tab.
*
- * @deprecated Use KTabBar::setCloseButtonEnabled() instead.
+ * @deprecated Use QTabBar::setTabsClosable() instead.
*/
KDE_DEPRECATED void setHoverCloseButtonDelayed( bool );
- /** @deprecated Use KTabBar::isCloseButtonEnabled() instead. */
+ /** @deprecated Use QTabBar::tabsClosable() instead. */
KDE_DEPRECATED bool hoverCloseButtonDelayed() const;
/**
@@ -88,28 +93,36 @@
* has been clicked.
*
* @since 4.1
+ *
+ * @deprecated Use QTabBar::setTabsClosable() instead.
*/
- void setCloseButtonEnabled( bool );
+ KDE_DEPRECATED void setCloseButtonEnabled( bool );
/**
* Returns true if the close button is shown on tabs.
*
* @since 4.1
+ *
+ * @deprecated Use QTabBar::tabsClosable() instead.
*/
- bool isCloseButtonEnabled() const;
+ KDE_DEPRECATED bool isCloseButtonEnabled() const;
/**
* Sets the 'activate previous tab on close' feature enabled
* or disabled. If enabled, as soon as you close a tab, the
* previously selected tab is activated again.
+ *
+ * @deprecated Use QTabBar::setSelectionBehaviorOnRemove() instead.
*/
- void setTabCloseActivatePrevious( bool );
+ KDE_DEPRECATED void setTabCloseActivatePrevious( bool );
/**
* Returns whether the 'activate previous tab on close' feature
* is enabled.
+ *
+ * @deprecated Use QTabBar::selectionBehaviorOnRemove() instead.
*/
- bool tabCloseActivatePrevious() const;
+ KDE_DEPRECATED bool tabCloseActivatePrevious() const;
/**
* Selects the tab which has a tab header at
@@ -135,8 +148,8 @@
void initiateDrag( int );
void testCanDecode( const QDragMoveEvent*, bool& );
void receivedDropEvent( int, QDropEvent* );
- void moveTab( int, int );
- void closeRequest( int );
+ QT_MOC_COMPAT void moveTab( int, int );
+ QT_MOC_COMPAT void closeRequest( int );
#ifndef QT_NO_WHEELEVENT
void wheelDelta( int );
#endif
Index: ktabwidget.cpp
===================================================================
--- ktabwidget.cpp (revision 929391)
+++ ktabwidget.cpp (working copy)
@@ -1,6 +1,7 @@
/* This file is part of the KDE libraries
Copyright (C) 2003 Stephan Binner <binner@kde.org>
Copyright (C) 2003 Zack Rusin <zack@kde.org>
+ Copyright (C) 2009 Urs Wolfer <uwolfer @ kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -192,7 +193,7 @@
connect(tabBar(), SIGNAL(testCanDecode(const QDragMoveEvent *, bool & )), \
SIGNAL(testCanDecode(const QDragMoveEvent *, bool & ))); connect(tabBar(), \
SIGNAL(receivedDropEvent( int, QDropEvent * )), SLOT(receivedDropEvent( int, \
QDropEvent * ))); connect(tabBar(), SIGNAL(moveTab( int, int )), SLOT(moveTab( int, \
int )));
- connect(tabBar(), SIGNAL(closeRequest( int )), SLOT(closeRequest( int )));
+ connect(tabBar(), SIGNAL(tabCloseRequested( int )), SLOT(closeRequest( int )));
connect(tabBar(), SIGNAL(currentChanged( int )), SLOT(currentChanged( int )));
#ifndef QT_NO_WHEELEVENT
connect(tabBar(), SIGNAL(wheelDelta( int )), SLOT(wheelDelta( int )));
@@ -545,7 +546,7 @@
void KTabWidget::setHoverCloseButton( bool button )
{
// deprecated
- setCloseButtonEnabled( button );
+ setTabsClosable( button );
}
bool KTabWidget::hoverCloseButton() const
@@ -563,17 +564,17 @@
bool KTabWidget::hoverCloseButtonDelayed() const
{
// deprecated
- return isCloseButtonEnabled();
+ return tabsClosable();
}
void KTabWidget::setCloseButtonEnabled( bool enable )
{
- static_cast<KTabBar*>( tabBar() )->setCloseButtonEnabled( enable );
+ static_cast<KTabBar*>( tabBar() )->setTabsClosable( enable );
}
bool KTabWidget::isCloseButtonEnabled() const
{
- return static_cast<KTabBar*>( tabBar() )->isCloseButtonEnabled();
+ return static_cast<KTabBar*>( tabBar() )->tabsClosable();
}
void KTabWidget::setAutomaticResizeTabs( bool enabled )
Index: ktabbar.cpp
===================================================================
--- ktabbar.cpp (revision 929391)
+++ ktabbar.cpp (working copy)
@@ -1,6 +1,7 @@
/* This file is part of the KDE libraries
Copyright (C) 2003 Stephan Binner <binner@kde.org>
Copyright (C) 2003 Zack Rusin <zack@kde.org>
+ Copyright (C) 2009 Urs Wolfer <uwolfer @ kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -44,14 +45,9 @@
: mReorderStartTab( -1 ),
mReorderPreviousTab( -1 ),
mDragSwitchTab( -1 ),
- mHoveredCloseIconIndex( -1 ),
mActivateDragSwitchTabTimer( 0 ),
- mHoveredCloseIcon( 0 ),
- mInactiveCloseIcon( 0 ),
- mActiveCloseIcon( 0 ),
mTabReorderingEnabled( false ),
- mTabCloseActivatePrevious( false ),
- mTabCloseButtonClicked( false )
+ mTabCloseActivatePrevious( false )
{
}
@@ -59,16 +55,10 @@
int mReorderStartTab;
int mReorderPreviousTab;
int mDragSwitchTab;
- int mHoveredCloseIconIndex;
- //QTab *mDragSwitchTab;
QTimer *mActivateDragSwitchTabTimer;
- QPixmap *mHoveredCloseIcon;
- QPixmap *mInactiveCloseIcon;
- QPixmap *mActiveCloseIcon;
bool mTabReorderingEnabled : 1;
bool mTabCloseActivatePrevious : 1;
- bool mTabCloseButtonClicked : 1;
};
@@ -82,21 +72,13 @@
d->mActivateDragSwitchTabTimer = new QTimer( this );
d->mActivateDragSwitchTabTimer->setSingleShot( true );
connect( d->mActivateDragSwitchTabTimer, SIGNAL( timeout() ), SLOT( \
activateDragSwitchTab() ) ); + connect( this, SIGNAL(tabCloseRequested(int)), this, \
SIGNAL(closeRequest(int))); // just for backward compatibilty, KDE5 remove
//connect( this, SIGNAL( layoutChanged() ), SLOT( onLayoutChange() ) );
}
KTabBar::~KTabBar()
{
- delete d->mHoveredCloseIcon;
- d->mHoveredCloseIcon = 0;
-
- delete d->mInactiveCloseIcon;
- d->mInactiveCloseIcon = 0;
-
- delete d->mActiveCloseIcon;
- d->mActiveCloseIcon = 0;
-
delete d;
}
@@ -113,21 +95,14 @@
emit mouseDoubleClick( tab ); //deprecated
emit tabDoubleClicked( tab );
}
+
+ QTabBar::mouseDoubleClickEvent( event );
}
void KTabBar::mousePressEvent( QMouseEvent *event )
{
if ( event->button() == Qt::LeftButton ) {
d->mDragStart = event->pos();
- if ( isCloseButtonEnabled() ) {
- const QPoint pos = event->pos();
- const int tabIndex = tabAt( pos );
- if (closeButtonRect( tabIndex ).contains( pos )) {
- // the close button is clicked - prevent that the tab gets activated
- d->mTabCloseButtonClicked = true;
- return;
- }
- }
} else if( event->button() == Qt::RightButton ) {
int tab = selectTab( event->pos() );
if ( tab != -1 ) {
@@ -143,26 +118,6 @@
void KTabBar::mouseMoveEvent( QMouseEvent *event )
{
- if ( isCloseButtonEnabled() ) {
- if ( d->mHoveredCloseIconIndex >= 0) {
- // reset previously hovered close button
- update( closeButtonRect( d->mHoveredCloseIconIndex ));
- d->mHoveredCloseIconIndex = -1;
- }
-
- const QPoint pos = event->pos();
- const int tabCount = count();
- for ( int i = 0; i < tabCount; ++i ) {
- const QRect rect = closeButtonRect( i );
- if (rect.contains( pos )) {
- // update currently hovered close button
- d->mHoveredCloseIconIndex = i;
- update( rect );
- break;
- }
- }
- }
-
if ( event->buttons() == Qt::LeftButton ) {
int tab = selectTab( event->pos() );
if ( d->mDragSwitchTab && tab != d->mDragSwitchTab ) {
@@ -238,16 +193,6 @@
{
switch ( event->button() ) {
case Qt::LeftButton:
- if ( isCloseButtonEnabled() ) {
- update(closeButtonRect( d->mHoveredCloseIconIndex ));
-
- const QPoint pos = event->pos();
- const int tabIndex = tabAt( pos );
- if (d->mTabCloseButtonClicked && closeButtonRect( tabIndex ).contains( pos )) \
{
- d->mHoveredCloseIconIndex = -1;
- emit closeRequest( tabIndex );
- }
- }
break;
case Qt::MidButton:
@@ -269,7 +214,6 @@
break;
}
- d->mTabCloseButtonClicked = false;
QTabBar::mouseReleaseEvent( event );
}
@@ -329,38 +273,16 @@
void KTabBar::paintEvent( QPaintEvent *event )
{
QTabBar::paintEvent( event );
-
- if ( isCloseButtonEnabled() ) {
- QPainter painter( this );
- const int tabCount = count();
- for ( int i = 0; i < tabCount; ++i ) {
- QPixmap icon;
- if ( i == d->mHoveredCloseIconIndex)
- icon = *d->mActiveCloseIcon;
- else if ( i == currentIndex() )
- icon = *d->mHoveredCloseIcon;
- else
- icon = *d->mInactiveCloseIcon;
-
- painter.drawPixmap( closeButtonPos( i ), icon );
- }
- }
}
void KTabBar::leaveEvent( QEvent *event )
{
QTabBar::leaveEvent( event );
- if ( d->mHoveredCloseIconIndex >= 0 ) {
- update( closeButtonRect( d->mHoveredCloseIconIndex ));
- d->mHoveredCloseIconIndex = -1;
- }
}
QSize KTabBar::tabSizeHint( int index ) const
{
QSize size = QTabBar::tabSizeHint( index );
- if ( isCloseButtonEnabled() )
- size.rwidth() += KIconLoader::SizeSmall * 3 / 2;
return size;
}
@@ -399,13 +321,13 @@
void KTabBar::setHoverCloseButton( bool button )
{
// deprecated
- setCloseButtonEnabled( button );
+ setTabsClosable(button);
}
bool KTabBar::hoverCloseButton() const
{
// deprecated
- return isCloseButtonEnabled();
+ return tabsClosable();
}
void KTabBar::setHoverCloseButtonDelayed( bool delayed )
@@ -422,40 +344,12 @@
void KTabBar::setCloseButtonEnabled( bool enable )
{
- if ( enable == isCloseButtonEnabled() )
- return;
-
- d->mHoveredCloseIconIndex = -1;
- if ( enable ) {
- Q_ASSERT( d->mHoveredCloseIcon == 0 );
- Q_ASSERT( d->mInactiveCloseIcon == 0 );
- Q_ASSERT( d->mActiveCloseIcon == 0 );
-
- const QPixmap icon = KIconLoader::global()->loadIcon( "dialog-close", \
KIconLoader::Small );
-
- d->mHoveredCloseIcon = new QPixmap( icon );
- KIconEffect::semiTransparent( *d->mHoveredCloseIcon );
-
- KIconEffect iconEffect;
- d->mInactiveCloseIcon = new QPixmap( iconEffect.apply( icon, KIconLoader::Small, \
KIconLoader::DisabledState ));
-
- KIconEffect::semiTransparent( *d->mInactiveCloseIcon );
- d->mActiveCloseIcon = new QPixmap( icon );
- } else {
- delete d->mHoveredCloseIcon;
- d->mHoveredCloseIcon = 0;
-
- delete d->mInactiveCloseIcon;
- d->mInactiveCloseIcon = 0;
-
- delete d->mActiveCloseIcon;
- d->mActiveCloseIcon = 0;
- }
+ QTabBar::setTabsClosable(enable);
}
bool KTabBar::isCloseButtonEnabled() const
{
- return d->mHoveredCloseIcon != 0;
+ return QTabBar::tabsClosable();
}
void KTabBar::tabLayoutChange()
@@ -476,41 +370,14 @@
QPoint KTabBar::closeButtonPos( int tabIndex ) const
{
- QPoint buttonPos;
- if ( tabIndex < 0 ) {
- return buttonPos;
- }
-
- int availableHeight = height();
- if ( tabIndex == currentIndex() ) {
- QStyleOption option;
- option.initFrom(this);
- availableHeight -= style()->pixelMetric( QStyle::PM_TabBarTabShiftVertical, \
&option, this );
- }
-
- const QRect tabBounds = tabRect( tabIndex );
- const int xInc = (height() - KIconLoader::SizeSmall) / 2;
-
- if ( layoutDirection() == Qt::RightToLeft ) {
- buttonPos = tabBounds.topLeft();
- buttonPos.rx() += xInc;
- } else {
- buttonPos = tabBounds.topRight();
- buttonPos.rx() -= KIconLoader::SizeSmall + xInc;
- }
- buttonPos.ry() += (availableHeight - KIconLoader::SizeSmall) / 2;
-
- return buttonPos;
+ Q_UNUSED(tabIndex);
+ return QPoint();
}
QRect KTabBar::closeButtonRect( int tabIndex ) const
{
- QRect rect;
- if ( tabIndex >= 0 ) {
- rect.setTopLeft(closeButtonPos( tabIndex ));
- rect.setSize(QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall));
- }
- return rect;
+ Q_UNUSED(tabIndex);
+ return QRect();
}
#include "ktabbar.moc"
Index: ktabwidget.h
===================================================================
--- ktabwidget.h (revision 929391)
+++ ktabwidget.h (working copy)
@@ -1,6 +1,7 @@
/* This file is part of the KDE libraries
Copyright (C) 2003 Stephan Binner <binner@kde.org>
Copyright (C) 2003 Zack Rusin <zack@kde.org>
+ Copyright (C) 2009 Urs Wolfer <uwolfer @ kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -78,6 +79,8 @@
/**
* Returns true if tab ordering with the middle mouse button
* has been enabled.
+ *
+ * @deprecated Use QTabWidget::isMovable() instead.
*/
bool isTabReorderingEnabled() const;
@@ -85,7 +88,7 @@
* Returns true if the close button is shown on tabs
* when mouse is hovering over them.
*
- * @deprecated Use KTabWidget::isCloseButtonEnabled() instead.
+ * @deprecated Use QTabWidget::tabsClosable() instead.
*/
KDE_DEPRECATED bool hoverCloseButton() const;
@@ -93,7 +96,7 @@
* Returns true if the close button is shown on tabs
* after a delay.
*
- * @deprecated Use KTabWidget::isCloseButtonEnabled() instead.
+ * @deprecated Use QTabWidget::setTabsClosable() instead.
*/
KDE_DEPRECATED bool hoverCloseButtonDelayed() const;
@@ -101,14 +104,18 @@
* Returns true if the close button is shown on tabs.
*
* @since 4.1
+ *
+ * @deprecated Use QTabWidget::tabsClosable() instead.
*/
- bool isCloseButtonEnabled() const;
+ KDE_DEPRECATED bool isCloseButtonEnabled() const;
/**
* Returns true if closing the current tab activates the previous
* actice tab instead of the one to the right.
+ *
+ * @deprecated Use QTabBar::selectionBehaviorOnRemove() instead.
*/
- bool tabCloseActivatePrevious() const;
+ KDE_DEPRECATED bool tabCloseActivatePrevious() const;
/**
* Returns true if calling setTitle() will resize tabs
@@ -197,15 +204,17 @@
*
* You can connect to signal movedTab(int, int) which will notify
* you from which index to which index a tab has been moved.
+ *
+ * @deprecated Use QTabWidget::setMovable() instead.
*/
- void setTabReorderingEnabled( bool enable );
+ QT_MOC_COMPAT void setTabReorderingEnabled( bool enable );
/**
* If \a enable is true, a close button will be shown on mouse hover
* over tab icons which will emit signal closeRequest( QWidget * )
* when pressed.
*
- * @deprecated Use KTabWidget::setCloseButtonEnabled() instead.
+ * @deprecated Use QTabWidget::setTabsClosable() instead.
*/
QT_MOC_COMPAT void setHoverCloseButton( bool enable );
@@ -213,7 +222,7 @@
* If \a delayed is true, a close button will be shown on mouse hover
* over tab icons after mouse double click delay else immediately.
*
- * @deprecated Use KTabWidget::setCloseButtonEnabled() instead.
+ * @deprecated Use QTabWidget::setTabsClosable() instead.
*/
QT_MOC_COMPAT void setHoverCloseButtonDelayed( bool delayed );
@@ -223,14 +232,18 @@
* has been clicked.
*
* @since 4.1
+ *
+ * @deprecated Use QTabWidget::setTabsClosable() instead.
*/
- void setCloseButtonEnabled( bool );
+ QT_MOC_COMPAT void setCloseButtonEnabled( bool );
/**
* If \a previous is true, closing the current tab activates the
* previous active tab instead of the one to the right.
+ *
+ * @deprecated Use QTabWidget::setSelectionBehaviorOnRemove() instead.
*/
- void setTabCloseActivatePrevious( bool previous );
+ QT_MOC_COMPAT void setTabCloseActivatePrevious( bool previous );
/**
* If \a enable is true, tabs will be resized to the width of the tab bar.
["signature.asc" (application/pgp-signature)]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic