Index: kdefx/kstyle.cpp =================================================================== --- kdefx/kstyle.cpp.orig +++ kdefx/kstyle.cpp @@ -154,6 +154,7 @@ struct KStylePrivate bool menuAltKeyNavigation : 1; bool menuDropShadow : 1; bool sloppySubMenus : 1; + bool semiTransparentRubberband : 1; int popupMenuDelay; float menuOpacity; @@ -187,6 +188,7 @@ KStyle::KStyle( KStyleFlags flags, KStyl d->menuAltKeyNavigation = settings.readBoolEntry("/KStyle/Settings/MenuAltKeyNavigation", true); d->scrollablePopupmenus = settings.readBoolEntry("/KStyle/Settings/ScrollablePopupMenus", false); d->menuDropShadow = settings.readBoolEntry("/KStyle/Settings/MenuDropShadow", false); + d->semiTransparentRubberband = settings.readBoolEntry("/KStyle/Settings/SemiTransparentRubberband", false); d->menuHandler = NULL; if (useMenuTransparency) { @@ -553,7 +555,57 @@ void KStyle::drawPrimitive( PrimitiveEle else // General handle, probably a kicker applet handle. drawKStylePrimitive( KPE_GeneralHandle, p, widget, r, cg, flags, opt ); - +#if QT_VERSION >= 0x030300 +#ifdef HAVE_XRENDER + } else if ( d->semiTransparentRubberband && pe == QStyle::PE_RubberBand ) { + QRect rect = r.normalize(); + QPoint point; + point = p->xForm( point ); + + static XRenderColor clr = { 0, 0, 0, 0 }; + static unsigned long fillColor = 0; + if ( fillColor != cg.highlight().rgb() ) { + fillColor = cg.highlight().rgb(); + + unsigned long color = fillColor << 8 | 0x40; + + int red = (color >> 24) & 0xff; + int green = (color >> 16) & 0xff; + int blue = (color >> 8) & 0xff; + int alpha = (color >> 0) & 0xff; + + red = red * alpha / 255; + green = green * alpha / 255; + blue = blue * alpha / 255; + + clr.red = (red << 8) + red; + clr.green = (green << 8) + green; + clr.blue = (blue << 8) + blue; + clr.alpha = (alpha << 8) + alpha; + } + + XRenderFillRectangle( + p->device()->x11Display(), + PictOpOver, + p->device()->x11RenderHandle(), + &clr, + rect.x() + point.x(), + rect.y() + point.y(), + rect.width(), + rect.height() ); + + p->save(); + p->setRasterOp( Qt::CopyROP ); + p->setPen( QPen( cg.highlight().dark( 160 ), 1 ) ); + p->setBrush( NoBrush ); + p->drawRect( + rect.x() + point.x(), + rect.y() + point.y(), + rect.width(), + rect.height() ); + p->restore(); +#endif +#endif } else QCommonStyle::drawPrimitive( pe, p, r, cg, flags, opt ); } Index: kdeui/kiconview.cpp =================================================================== --- kdeui/kiconview.cpp.orig +++ kdeui/kiconview.cpp @@ -548,7 +548,7 @@ void KIconViewItem::calcRect( const QStr r = m_wordWrap->boundingRect(); int realWidth = QMAX( QMIN( r.width() + 4, tw ), fm->width( "X" ) ); - itemTextRect.setWidth( realWidth ); + itemTextRect.setWidth( realWidth + 4 ); itemTextRect.setHeight( r.height() ); int w = 0; int h = 0; int y = 0; @@ -699,11 +699,13 @@ void KIconViewItem::paintPixmap( QPainte void KIconViewItem::paintText( QPainter *p, const QColorGroup &cg ) { - int textX = textRect( false ).x() + 2; + int textX = textRect( false ).x() + 4; int textY = textRect( false ).y(); if ( isSelected() ) { - p->fillRect( textRect( false ), cg.highlight() ); + p->setBrush(QBrush(cg.highlight())); + p->setPen(QPen(cg.highlight())); + p->drawRoundRect( textRect( false ) ,1000/textRect(false).width(),1000/textRect(false).height() ); p->setPen( QPen( cg.highlightedText() ) ); } else { if ( iconView()->itemTextBackground() != NoBrush ) Index: kdeui/kjanuswidget.cpp =================================================================== --- kdeui/kjanuswidget.cpp.orig +++ kdeui/kjanuswidget.cpp @@ -49,16 +49,19 @@ class KJanusWidget::IconListItem : publi { public: IconListItem( QListBox *listbox, const QPixmap &pixmap, - const QString &text ); + const QString &text ); virtual int height( const QListBox *lb ) const; virtual int width( const QListBox *lb ) const; int expandMinimumWidth( int width ); + void highlight( bool erase ); protected: const QPixmap &defaultPixmap(); void paint( QPainter *painter ); - + private: + void paintContents( QPainter *painter ); + QPixmap mPixmap; int mMinimumWidth; }; @@ -141,6 +144,8 @@ KJanusWidget::KJanusWidget( QWidget *par mIconList->verticalScrollBar()->installEventFilter( this ); connect( mIconList, SIGNAL(selectionChanged()), SLOT(slotShowPage())); + connect( mIconList, SIGNAL(onItem(QListBoxItem *)), SLOT(slotOnItem(QListBoxItem *))); + hbox->addSpacing( KDialog::marginHint() ); page = new QFrame( this ); hbox->addWidget( page, 10 ); @@ -259,7 +264,7 @@ void KJanusWidget::slotReopen( QListView } QFrame *KJanusWidget::addPage( const QString &itemName, const QString &header, - const QPixmap &pixmap ) + const QPixmap &pixmap ) { QStringList items; items << itemName; @@ -269,8 +274,8 @@ QFrame *KJanusWidget::addPage( const QSt QVBox *KJanusWidget::addVBoxPage( const QStringList &items, - const QString &header, - const QPixmap &pixmap ) + const QString &header, + const QPixmap &pixmap ) { if( !mValid ) { @@ -721,6 +726,12 @@ void KJanusWidget::slotItemClicked(QList it->setOpen(!it->isOpen()); } +// hack because qt does not support Q_OBJECT in nested classes +void KJanusWidget::slotOnItem(QListBoxItem *qitem) +{ + mIconList->slotOnItem( qitem ); +} + void KJanusWidget::setFocus() { if( !mValid ) { return; } @@ -929,11 +940,11 @@ bool KJanusWidget::eventFilter( QObject KJanusWidget::IconListBox::IconListBox( QWidget *parent, const char *name, WFlags f ) :KListBox( parent, name, f ), mShowAll(false), mHeightValid(false), - mWidthValid(false) + mWidthValid(false), + mOldItem(0) { } - void KJanusWidget::IconListBox::updateMinimumHeight() { if( mShowAll && !mHeightValid ) @@ -995,6 +1006,45 @@ void KJanusWidget::IconListBox::setShowA } +void KJanusWidget::IconListBox::leaveEvent( QEvent *ev ) +{ + KListBox::leaveEvent( ev ); + + if ( mOldItem && !mOldItem->isSelected() ) + { + ((KJanusWidget::IconListItem *) mOldItem)->highlight( true ); + mOldItem = 0; + } +} + +// hack because qt does not support Q_OBJECT in nested classes +void KJanusWidget::IconListBox::slotOnItem(QListBoxItem *qitem) +{ + KListBox::slotOnItem( qitem ); + + if ( qitem == mOldItem ) + { + return; + } + + if ( mOldItem && !mOldItem->isSelected() ) + { + ((KJanusWidget::IconListItem *) mOldItem)->highlight( true ); + } + + KJanusWidget::IconListItem *item = dynamic_cast< KJanusWidget::IconListItem * >( qitem ); + if ( item && !item->isSelected() ) + { + item->highlight( false ); + mOldItem = item; + } + else + { + mOldItem = 0; + } +} + + KJanusWidget::IconListItem::IconListItem( QListBox *listbox, const QPixmap &pixmap, const QString &text ) @@ -1006,6 +1056,7 @@ KJanusWidget::IconListItem::IconListItem mPixmap = defaultPixmap(); } setText( text ); + setCustomHighlighting( true ); mMinimumWidth = 0; } @@ -1017,6 +1068,36 @@ int KJanusWidget::IconListItem::expandMi } +void KJanusWidget::IconListItem::highlight( bool erase ) +{ + QRect r = listBox()->itemRect( this ); + r.addCoords( 1, 1, -1, -1 ); + + QPainter p( listBox()->viewport() ); + p.setClipRegion( r ); + + const QColorGroup &cg = listBox()->colorGroup(); + if ( erase ) + { + p.setPen( cg.base() ); + p.setBrush( cg.base() ); + p.drawRect( r ); + } + else + { + p.setBrush( cg.highlight().light( 120 ) ); + p.drawRect( r ); + + p.setPen( cg.highlight().dark( 140 ) ); + p.drawRect( r ); + } + + p.setPen( cg.foreground() ); + p.translate( r.x() - 1, r.y() - 1 ); + paintContents( &p ); +} + + const QPixmap &KJanusWidget::IconListItem::defaultPixmap() { static QPixmap *pix=0; @@ -1044,15 +1125,34 @@ const QPixmap &KJanusWidget::IconListIte void KJanusWidget::IconListItem::paint( QPainter *painter ) { + QRect itemPaintRegion( listBox()->itemRect( this ) ); + QRect r( 1, 1, itemPaintRegion.width() - 2, itemPaintRegion.height() - 2); + + if ( isSelected() ) + { + painter->eraseRect( r ); + + painter->save(); + painter->setPen( listBox()->colorGroup().highlight().dark( 160 ) ); + painter->drawRect( r ); + painter->restore(); + } + + paintContents( painter ); +} + + +void KJanusWidget::IconListItem::paintContents( QPainter *painter ) +{ QFontMetrics fm = painter->fontMetrics(); int ht = fm.boundingRect( 0, 0, 0, 0, Qt::AlignCenter, text() ).height(); int wp = mPixmap.width(); int hp = mPixmap.height(); + painter->drawPixmap( (mMinimumWidth - wp) / 2, 5, mPixmap ); - painter->drawPixmap( (mMinimumWidth-wp)/2, 5, mPixmap ); if( !text().isEmpty() ) { - painter->drawText( 0, hp+7, mMinimumWidth, ht, Qt::AlignCenter, text() ); + painter->drawText( 1, hp + 7, mMinimumWidth - 2, ht, Qt::AlignCenter, text() ); } } @@ -1082,6 +1182,7 @@ int KJanusWidget::IconListItem::width( c void KJanusWidget::virtual_hook( int, void* ) { /*BASE::virtual_hook( id, data );*/ } + // TODO: In TreeList, if the last child of a node is removed, and there is no corrsponding widget for that node, allow the caller to // delete the node. void KJanusWidget::removePage( QWidget *page ) @@ -1129,6 +1230,7 @@ void KJanusWidget::removePage( QWidget * } } + QString KJanusWidget::pageTitle(int index) const { if (!d || !d->mIntToTitle.contains(index)) @@ -1137,6 +1239,7 @@ QString KJanusWidget::pageTitle(int inde return d->mIntToTitle[index]; } + QWidget *KJanusWidget::pageWidget(int index) const { if (!d || !d->mIntToPage.contains(index)) Index: kdeui/kjanuswidget.h =================================================================== --- kdeui/kjanuswidget.h.orig +++ kdeui/kjanuswidget.h @@ -71,6 +71,8 @@ class KDEUI_EXPORT KJanusWidget : public private: class IconListBox : public KListBox { + friend class KJanusWidget; + public: IconListBox( QWidget *parent=0, const char *name=0, WFlags f=0 ); void updateMinimumHeight(); @@ -79,10 +81,15 @@ class KDEUI_EXPORT KJanusWidget : public void invalidateWidth(); void setShowAll( bool showAll ); + protected: + void slotOnItem( QListBoxItem *item ); + virtual void leaveEvent( QEvent * ); + private: bool mShowAll; bool mHeightValid; bool mWidthValid; + QListBoxItem *mOldItem; }; public: @@ -558,6 +565,8 @@ class KDEUI_EXPORT KJanusWidget : public private slots: bool slotShowPage(); void slotFontChanged(); + + void slotOnItem(QListBoxItem *item); void slotItemClicked(QListViewItem *it); void pageGone(QObject *obj); // signal from the added page's "destroyed" signal void slotReopen(QListViewItem *item);