improved animated transition in title-outline mode, by using mixed color rather than painter opacity

svn path=/trunk/KDE/kdebase/workspace/; revision=1028173
icc-effect-5.14.5
Hugo Pereira Da Costa 2009-09-26 04:57:27 +00:00
parent 4e0f2a4d08
commit edf8167f3c
2 changed files with 43 additions and 14 deletions

View File

@ -37,7 +37,6 @@
#include <cmath> #include <cmath>
#include <kdeversion.h> #include <kdeversion.h>
#include <KGlobal>
#include <KLocale> #include <KLocale>
#include <KColorUtils> #include <KColorUtils>
#include <KDebug> #include <KDebug>
@ -444,7 +443,6 @@ namespace Oxygen
// save painter // save painter
painter->save(); painter->save();
if( timeLineIsRunning() ) painter->setOpacity( opacity() );
if( clipRect.isValid() ) painter->setClipRegion(clipRect,Qt::IntersectClip); if( clipRect.isValid() ) painter->setClipRegion(clipRect,Qt::IntersectClip);
QRect r = (isPreview()) ? OxygenClient::widget()->rect():window->rect(); QRect r = (isPreview()) ? OxygenClient::widget()->rect():window->rect();
@ -460,6 +458,8 @@ namespace Oxygen
if( tiles&TileSet::Top ) if( tiles&TileSet::Top )
{ {
int shadowSize = 5; int shadowSize = 5;
if( timeLineIsRunning() ) shadowSize*=opacity();
int height = HFRAMESIZE; int height = HFRAMESIZE;
QRect rect( r.topLeft()-position, QSize( r.width(), height ) ); QRect rect( r.topLeft()-position, QSize( r.width(), height ) );
helper().slab( palette.color( widget->backgroundRole() ), 0, shadowSize )->render( rect.adjusted(-shadowSize-1, 0, shadowSize+1, 2 ), painter, TileSet::Bottom ); helper().slab( palette.color( widget->backgroundRole() ), 0, shadowSize )->render( rect.adjusted(-shadowSize-1, 0, shadowSize+1, 2 ), painter, TileSet::Bottom );
@ -559,27 +559,24 @@ namespace Oxygen
void OxygenClient::renderTitleOutline( QPainter* painter, const QRect& rect, const QPalette& palette ) const void OxygenClient::renderTitleOutline( QPainter* painter, const QRect& rect, const QPalette& palette ) const
{ {
if( timeLineIsRunning() )
{
painter->save();
painter->setOpacity( opacity() );
}
// shadow // shadow
{ {
int shadowSize = 7; int shadowSize = 7;
if( timeLineIsRunning() ) shadowSize *= opacity();
int voffset = -shadowSize; int voffset = -shadowSize;
if( !isMaximized() ) voffset += HFRAMESIZE; if( !isMaximized() ) voffset += HFRAMESIZE;
helper().slab( palette.color( widget()->backgroundRole() ), 0, shadowSize )->render( rect.adjusted(0, voffset, 0, 0 ), painter, TileSet::Bottom|TileSet::Left|TileSet::Right ); helper().slab( palette.color( widget()->backgroundRole() ), 0, shadowSize )->render( rect.adjusted(0, voffset, 0, 0 ), painter, TileSet::Bottom|TileSet::Left|TileSet::Right );
} }
// center // center
{ {
int voffset = isMaximized() ? 0:HFRAMESIZE; int offset = 4;
renderWindowBackground(painter, rect.adjusted( 4, voffset, -4, -4 ), widget(), palette ); if( timeLineIsRunning() ) offset *= opacity();
}
if( timeLineIsRunning() ) painter->restore(); int voffset = isMaximized() ? 0:HFRAMESIZE;
renderWindowBackground(painter, rect.adjusted( offset, voffset, -offset, -offset ), widget(), palette );
}
} }
@ -624,13 +621,38 @@ namespace Oxygen
QPalette OxygenClient::backgroundPalette( const QWidget* widget, QPalette palette ) const QPalette OxygenClient::backgroundPalette( const QWidget* widget, QPalette palette ) const
{ {
if( configuration().drawTitleOutline() && isActive() ) if( configuration().drawTitleOutline() )
{ palette.setColor( widget->window()->backgroundRole(), options()->color( KDecorationDefines::ColorTitleBar, true ) ); } {
if( timeLineIsRunning() )
{
QColor inactiveColor( backgroundColor( widget, palette, false ) );
QColor activeColor( backgroundColor( widget, palette, true ) );
QColor mixed( KColorUtils::mix( inactiveColor, activeColor, opacity() ) );
palette.setColor( widget->window()->backgroundRole(), mixed );
} else if( isActive() ) {
palette.setColor( widget->window()->backgroundRole(), options()->color( KDecorationDefines::ColorTitleBar, true ) );
}
}
return palette; return palette;
} }
//_________________________________________________________
QColor OxygenClient::backgroundColor( const QWidget* widget, QPalette palette, bool active ) const
{
return ( configuration().drawTitleOutline() && active ) ?
options()->color( KDecorationDefines::ColorTitleBar, true ):
palette.color( widget->window()->backgroundRole() );
}
//________________________________________________________________ //________________________________________________________________
void OxygenClient::updateWindowShape() void OxygenClient::updateWindowShape()
{ {

View File

@ -119,6 +119,13 @@ namespace Oxygen
//! palette background //! palette background
QPalette backgroundPalette( const QWidget*, QPalette ) const; QPalette backgroundPalette( const QWidget*, QPalette ) const;
//! background
QColor backgroundColor( const QWidget* widget, QPalette palette ) const
{ return backgroundColor( widget, palette, isActive() ); }
//! background
QColor backgroundColor( const QWidget*, QPalette, bool ) const;
//! window background //! window background
virtual void renderWindowBackground( QPainter*, const QRect&, const QWidget*, const QPalette& ) const; virtual void renderWindowBackground( QPainter*, const QRect&, const QWidget*, const QPalette& ) const;