You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/opensuse/tdelibs/rubberband-selection.diff

381 lines
11 KiB

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);