diff --git a/clients/oxygen/oxygenbutton.cpp b/clients/oxygen/oxygenbutton.cpp index 6e0921538f..ed31f290b4 100644 --- a/clients/oxygen/oxygenbutton.cpp +++ b/clients/oxygen/oxygenbutton.cpp @@ -109,116 +109,6 @@ namespace Oxygen void Button::reset( unsigned long ) { _glowAnimation->setDuration( _client.configuration().buttonAnimationsDuration() ); } - - //___________________________________________________ - void Button::enterEvent( QEvent *event ) - { - - KCommonDecorationButton::enterEvent( event ); - if( _status != Oxygen::Pressed ) _status = Oxygen::Hovered; - if( buttonAnimationsEnabled() ) - { - - _glowAnimation->setDirection( Animation::Forward ); - if( !isAnimated() ) _glowAnimation->start(); - - } else update(); - - } - - //___________________________________________________ - void Button::leaveEvent( QEvent *event ) - { - - KCommonDecorationButton::leaveEvent( event ); - - if( _status == Oxygen::Hovered && buttonAnimationsEnabled() ) - { - _glowAnimation->setDirection( Animation::Backward ); - if( !isAnimated() ) _glowAnimation->start(); - } - - _status = Oxygen::Normal; - update(); - - } - - //___________________________________________________ - void Button::mousePressEvent( QMouseEvent *event ) - { - - if( _type == ButtonMax || event->button() == Qt::LeftButton ) - { - _status = Oxygen::Pressed; - update(); - } - - KCommonDecorationButton::mousePressEvent( event ); - } - - //___________________________________________________ - void Button::mouseReleaseEvent( QMouseEvent* event ) - { - - _status = ( rect().contains( event->pos() ) ) ? Oxygen::Hovered:Oxygen::Normal; - update(); - - KCommonDecorationButton::mouseReleaseEvent( event ); - } - - //___________________________________________________ - void Button::resizeEvent( QResizeEvent *event ) - { - - // resize backing store pixmap - if( !_client.compositingActive() ) - { _pixmap = QPixmap( event->size() ); } - - // base class implementation - KCommonDecorationButton::resizeEvent( event ); - - } - - //___________________________________________________ - void Button::paintEvent(QPaintEvent *event) - { - - if( _client.hideTitleBar() ) return; - - if( _client.compositingActive() ) - { - QPainter painter( this ); - painter.setRenderHints(QPainter::Antialiasing); - painter.setClipRegion( event->region() ); - paint( painter ); - - } else { - - { - - // create painter - QPainter painter( &_pixmap ); - painter.setRenderHints(QPainter::Antialiasing); - painter.setClipRect( this->rect().intersected( event->rect() ) ); - - // render parent background - painter.translate( -geometry().topLeft() ); - _client.paintBackground( painter ); - - // render buttons - painter.translate( geometry().topLeft() ); - paint( painter ); - - } - - QPainter painter(this); - painter.setClipRegion( event->region() ); - painter.drawPixmap( QPoint(), _pixmap ); - - } - - } - //___________________________________________________ void Button::paint( QPainter& painter ) { @@ -245,29 +135,30 @@ namespace Oxygen buttonDetailColor( _client.backgroundPalette( this, palette ) ): buttonDetailColor( palette ); - // glow color - QColor glow = isCloseButton() ? - _helper.viewNegativeTextBrush().brush(palette).color(): - _helper.viewHoverBrush().brush(palette).color(); - - // shadow color - QColor shadow = _helper.calcShadowColor( base ); - // decide decoration color - if( isAnimated() ) color = KColorUtils::mix( color, glow, glowIntensity() ); - else if( _status == Oxygen::Hovered ) color = glow; + QColor glow; + if( isAnimated() || _status == Oxygen::Hovered ) + { + glow = isCloseButton() ? + _helper.viewNegativeTextBrush().brush(palette).color(): + _helper.viewHoverBrush().brush(palette).color(); + + if( isAnimated() ) + { + + color = KColorUtils::mix( color, glow, glowIntensity() ); + glow = _helper.alphaColor( glow, glowIntensity() ); + + } else if( _status == Oxygen::Hovered ) color = glow; + + } if( hasDecoration() ) { - - // decide shadow color - if( isAnimated() ) shadow = KColorUtils::mix( shadow, glow, glowIntensity() ); - else if( _status == Oxygen::Hovered ) shadow = glow; - shadow = _helper.calcDarkColor( shadow ); - + // scale qreal scale( (21.0*_client.configuration().buttonSize())/22.0 ); - // decide on pressed state + // pressed state const bool pressed( (_status == Oxygen::Pressed) || ( _type == ButtonSticky && _client.isOnAllDesktops() ) || @@ -275,7 +166,7 @@ namespace Oxygen ( _type == ButtonBelow && _client.keepBelow() ) ); // draw button shape - painter.drawPixmap(0, 0, _helper.windecoButton( base, shadow, pressed, scale ) ); + painter.drawPixmap(0, 0, _helper.windecoButton( base, glow, pressed, scale ) ); } @@ -308,6 +199,117 @@ namespace Oxygen } + //___________________________________________________ + void Button::mousePressEvent( QMouseEvent *event ) + { + + if( _type == ButtonMax || event->button() == Qt::LeftButton ) + { + _status = Oxygen::Pressed; + parentUpdate(); + } + + KCommonDecorationButton::mousePressEvent( event ); + } + + //___________________________________________________ + void Button::mouseReleaseEvent( QMouseEvent* event ) + { + + _status = ( rect().contains( event->pos() ) ) ? Oxygen::Hovered:Oxygen::Normal; + parentUpdate(); + + KCommonDecorationButton::mouseReleaseEvent( event ); + } + + //___________________________________________________ + void Button::enterEvent( QEvent *event ) + { + + KCommonDecorationButton::enterEvent( event ); + if( _status != Oxygen::Pressed ) _status = Oxygen::Hovered; + if( buttonAnimationsEnabled() ) + { + + _glowAnimation->setDirection( Animation::Forward ); + if( !isAnimated() ) _glowAnimation->start(); + + } else parentUpdate(); + + } + + //___________________________________________________ + void Button::leaveEvent( QEvent *event ) + { + + KCommonDecorationButton::leaveEvent( event ); + + if( _status == Oxygen::Hovered && buttonAnimationsEnabled() ) + { + _glowAnimation->setDirection( Animation::Backward ); + if( !isAnimated() ) _glowAnimation->start(); + } + + _status = Oxygen::Normal; + parentUpdate(); + + } + + //___________________________________________________ + void Button::resizeEvent( QResizeEvent *event ) + { + + // resize backing store pixmap + if( !_client.compositingActive() ) + { _pixmap = QPixmap( event->size() ); } + + // base class implementation + KCommonDecorationButton::resizeEvent( event ); + + } + + //___________________________________________________ + void Button::paintEvent(QPaintEvent *event) + { + + if( _client.hideTitleBar() ) return; + if( !_client.compositingActive() ) + { + + { + + // create painter + QPainter painter( &_pixmap ); + painter.setRenderHints(QPainter::Antialiasing); + painter.setClipRect( this->rect().intersected( event->rect() ) ); + + // render parent background + painter.translate( -geometry().topLeft() ); + _client.paintBackground( painter ); + + // render buttons + painter.translate( geometry().topLeft() ); + paint( painter ); + + } + + QPainter painter(this); + painter.setClipRegion( event->region() ); + painter.drawPixmap( QPoint(), _pixmap ); + + } + + } + + //___________________________________________________ + void Button::parentUpdate( void ) + { + + if( _client.compositingActive() && parentWidget() ) parentWidget()->update( geometry().adjusted( -1, -1, 1, 1 ) ); + else this->update(); + + } + //___________________________________________________ void Button::drawIcon( QPainter* painter ) { diff --git a/clients/oxygen/oxygenbutton.h b/clients/oxygen/oxygenbutton.h index 3268795a90..06ad3218ab 100644 --- a/clients/oxygen/oxygenbutton.h +++ b/clients/oxygen/oxygenbutton.h @@ -82,7 +82,7 @@ namespace Oxygen { if( _glowIntensity == value ) return; _glowIntensity = value; - update(); + parentUpdate(); } qreal glowIntensity( void ) const @@ -90,6 +90,9 @@ namespace Oxygen //@} + //! render buttn to provided painter + void paint(QPainter& ); + protected: //! press event @@ -110,8 +113,8 @@ namespace Oxygen //! paint void paintEvent( QPaintEvent* ); - //! render buttn to provided painter - void paint(QPainter& ); + // parent update + void parentUpdate( void ); //! draw icon void drawIcon( QPainter* ); diff --git a/clients/oxygen/oxygenclient.cpp b/clients/oxygen/oxygenclient.cpp index c3e826e676..b9248211d9 100644 --- a/clients/oxygen/oxygenclient.cpp +++ b/clients/oxygen/oxygenclient.cpp @@ -1394,6 +1394,24 @@ namespace Oxygen painter.setClipRegion( event->region() ); paint( painter ); + // update buttons + if( compositingActive() ) + { + QList<Button*> buttons( widget()->findChildren<Button*>() ); + foreach( Button* button, buttons ) + { + if( event->rect().intersects( button->geometry() ) ) + { + painter.save(); + painter.setViewport( button->geometry() ); + painter.setWindow( button->rect() ); + button->paint( painter ); + painter.restore(); + } + } + } + + } else { { diff --git a/clients/oxygen/oxygendecohelper.cpp b/clients/oxygen/oxygendecohelper.cpp index 732425ca92..f8cea7a5bf 100644 --- a/clients/oxygen/oxygendecohelper.cpp +++ b/clients/oxygen/oxygendecohelper.cpp @@ -66,18 +66,28 @@ namespace Oxygen QPainter p( pixmap ); p.setRenderHints(QPainter::Antialiasing); p.setPen(Qt::NoPen); - p.setWindow( 0, 0, 18, 18 ); + p.setWindow( 0, 0, 21, 21 ); + + // button shadow + if( color.isValid() ) + { + p.save(); + p.translate( 0, -1.4 ); + drawShadow( p, calcShadowColor( color ), 21 ); + p.restore(); + } // button glow if( glow.isValid() ) { p.save(); - p.translate( 0, -1.2 ); - drawShadow( p, glow, 18 ); + p.translate( 0, -1.4 ); + drawOuterGlow( p, glow, 21 ); p.restore(); } // button slab + p.setWindow( 0, 0, 18, 18 ); if( color.isValid() ) { p.translate( 0, (0.5-0.668) );