- Simplified titleBar title color handling, moved to oxygenHelper, and cached.

- added some missing consts in Client.

svn path=/trunk/KDE/kdebase/workspace/; revision=1169247
This commit is contained in:
Hugo Pereira Da Costa 2010-08-28 19:58:22 +00:00
parent 4c6f8d9c28
commit 2947ec516b
6 changed files with 114 additions and 98 deletions

View file

@ -81,7 +81,7 @@ namespace Oxygen
{}
//_______________________________________________
QColor Button::buttonDetailColor(const QPalette &palette)
QColor Button::buttonDetailColor(const QPalette &palette) const
{
if( client_.glowIsAnimated() && !forceInactive_ && !client_.isForcedActive()) return KColorUtils::mix(
buttonDetailColor( palette, false ),
@ -90,24 +90,6 @@ namespace Oxygen
else return buttonDetailColor( palette, isActive() || client_.isForcedActive() );
}
//_______________________________________________
QColor Button::buttonDetailColor(const QPalette &palette, bool active)
{
if( active ) return palette.color(QPalette::Active, QPalette::WindowText);
else {
// todo: re-implement caching
QColor ab = palette.color(QPalette::Active, QPalette::Window);
QColor af = palette.color(QPalette::Active, QPalette::WindowText);
QColor nb = palette.color(QPalette::Inactive, QPalette::Window);
QColor nf = palette.color(QPalette::Inactive, QPalette::WindowText);
return reduceContrast(nb, nf, qMax(qreal(2.5), KColorUtils::contrastRatio(ab, KColorUtils::mix(ab, af, 0.4))));
}
}
//___________________________________________________
bool Button::isActive( void ) const
{ return (!forceInactive_) && client_.isActive(); }

View file

@ -118,10 +118,15 @@ namespace Oxygen
void drawIcon(QPainter*);
//! color
QColor buttonDetailColor(const QPalette& );
QColor buttonDetailColor(const QPalette& ) const;
//! color
QColor buttonDetailColor(const QPalette&, bool active );
QColor buttonDetailColor(const QPalette& palette, bool active ) const
{
return active ?
palette.color(QPalette::Active, QPalette::WindowText):
helper_.inactiveTitleBarTextColor( palette );
}
//! true if animation is in progress
bool isAnimated( void ) const

View file

@ -47,31 +47,6 @@
namespace Oxygen
{
//_________________________________________________________
QColor reduceContrast(const QColor &c0, const QColor &c1, double t)
{
double s = KColorUtils::contrastRatio(c0, c1);
if (s < t)
return c1;
double l = 0.0, h = 1.0;
double x = s, a;
QColor r = c1;
for (int maxiter = 16; maxiter; --maxiter)
{
a = 0.5 * (l + h);
r = KColorUtils::mix(c0, c1, a);
x = KColorUtils::contrastRatio(c0, r);
if (fabs(x - t) < 0.01) break;
if (x > t) h = a;
else l = a;
}
return r;
}
//___________________________________________
Client::Client(KDecorationBridge *b, Factory *f):
KCommonDecorationUnstable(b, f),
@ -399,9 +374,8 @@ namespace Oxygen
//_________________________________________________________
QRect Client::defaultTitleRect( bool active ) const
{
QRect titleRect( this->titleRect() );
titleRect.adjust( 0, -layoutMetric( LM_TitleEdgeTop ), 0, 0 );
QRect titleRect( this->titleRect().adjusted( 0, -layoutMetric( LM_TitleEdgeTop ), 0, 0 ) );
if( active && configuration().drawTitleOutline() && isActive() )
{
@ -425,7 +399,7 @@ namespace Oxygen
{
// get title bounding rect
QRect boundingRect = QFontMetrics( font ).boundingRect( rect, configuration().titleAlignment() | Qt::AlignVCenter, caption );
QRect boundingRect( QFontMetrics( font ).boundingRect( rect, configuration().titleAlignment() | Qt::AlignVCenter, caption ) );
// adjust to make sure bounding rect
// 1/ has same vertical alignment as original titleRect
@ -535,7 +509,7 @@ namespace Oxygen
}
//_________________________________________________________
QColor Client::titlebarTextColor(const QPalette &palette)
QColor Client::titlebarTextColor(const QPalette &palette) const
{
if( glowIsAnimated() ) return KColorUtils::mix(
titlebarTextColor( palette, false ),
@ -544,27 +518,6 @@ namespace Oxygen
else return titlebarTextColor( palette, isActive() );
}
//_________________________________________________________
QColor Client::titlebarTextColor(const QPalette &palette, bool active)
{
if( active ){
return palette.color(QPalette::Active, QPalette::WindowText);
} else {
// todo: reimplement cache
const QColor ab = palette.color(QPalette::Active, QPalette::Window);
const QColor af = palette.color(QPalette::Active, QPalette::WindowText);
const QColor nb = palette.color(QPalette::Inactive, QPalette::Window);
const QColor nf = palette.color(QPalette::Inactive, QPalette::WindowText);
return reduceContrast(nb, nf, qMax(qreal(2.5), KColorUtils::contrastRatio(ab, KColorUtils::mix(ab, af, 0.4))));
}
}
//_________________________________________________________
void Client::renderWindowBackground( QPainter* painter, const QRect& rect, const QWidget* widget, const QPalette& palette ) const
{
@ -572,7 +525,7 @@ namespace Oxygen
if( configuration().blendColor() == Configuration::NoBlending )
{
painter->fillRect( rect, palette.color( widget->window()->backgroundRole() ) );
painter->fillRect( rect, palette.color( QPalette::Window ) );
} else {
@ -778,9 +731,7 @@ namespace Oxygen
// center (for active windows only)
{
painter->save();
const int offset = 1;
const int voffset = 1;
QRect adjustedRect( rect.adjusted( offset, voffset, -offset, 1 ) );
QRect adjustedRect( rect.adjusted( 1, 1, -1, 1 ) );
// prepare painter mask
QRegion mask( adjustedRect.adjusted( 1, 0, -1, 0 ) );
@ -793,9 +744,9 @@ namespace Oxygen
}
// shadow
const int shadowSize = 7;
const int offset = -3;
const int voffset = 5-shadowSize;
const int shadowSize( 7 );
const int offset( -3 );
const int voffset( 5-shadowSize );
const QRect adjustedRect( rect.adjusted(offset, voffset, -offset, shadowSize) );
helper().slab( palette.color( widget()->backgroundRole() ), 0, shadowSize )->render( adjustedRect, painter, TileSet::Tiles(TileSet::Top|TileSet::Left|TileSet::Right) );
@ -1203,13 +1154,13 @@ namespace Oxygen
const QColor inactiveColor( backgroundColor( widget, palette, false ) );
const QColor activeColor( backgroundColor( widget, palette, true ) );
const QColor mixed( KColorUtils::mix( inactiveColor, activeColor, glowIntensity() ) );
palette.setColor( widget->window()->backgroundRole(), mixed );
palette.setColor( QPalette::Window, mixed );
palette.setColor( QPalette::Button, mixed );
} else if( isActive() || isForcedActive() ) {
const QColor color = options()->color( KDecorationDefines::ColorTitleBar, true );
palette.setColor( widget->window()->backgroundRole(), color );
palette.setColor( QPalette::Window, color );
palette.setColor( QPalette::Button, color );
}
@ -1221,12 +1172,12 @@ namespace Oxygen
}
//_________________________________________________________
QColor Client::backgroundColor( const QWidget* widget, QPalette palette, bool active ) const
QColor Client::backgroundColor( const QWidget*, QPalette palette, bool active ) const
{
return ( configuration().drawTitleOutline() && active ) ?
options()->color( KDecorationDefines::ColorTitleBar, true ):
palette.color( widget->window()->backgroundRole() );
palette.color( QPalette::Window );
}

View file

@ -344,10 +344,15 @@ namespace Oxygen
QRegion calcMask( void ) const;
//! text color
QColor titlebarTextColor(const QPalette&);
QColor titlebarTextColor(const QPalette&) const;
//! text color
QColor titlebarTextColor(const QPalette&, bool active);
QColor titlebarTextColor(const QPalette& palette, bool active) const
{
return active ?
palette.color(QPalette::Active, QPalette::WindowText):
helper().inactiveTitleBarTextColor( palette );
}
//! text color
QColor titlebarContrastColor(const QPalette& palette ) const
@ -436,17 +441,6 @@ namespace Oxygen
};
//!@name utility functions
//@{
// dot
void renderDot(QPainter*, const QPointF&, qreal );
// contrast
QColor reduceContrast(const QColor&, const QColor&, double t);
//@}
} // namespace Oxygen
#endif // EXAMPLECLIENT_H

View file

@ -21,13 +21,27 @@
#include "oxygendecohelper.h"
#include <QtGui/QPainter>
#include <KColorUtils>
#include <cmath>
namespace Oxygen
{
//______________________________________________________________________________
DecoHelper::DecoHelper(const QByteArray &componentName):
Helper(componentName)
{}
{}
//______________________________________________________________________________
void DecoHelper::invalidateCaches( void )
{
// base class call
Helper::invalidateCaches();
// local caches
m_titleBarTextColorCache.clear();
}
//______________________________________________________________________________
QPixmap DecoHelper::windecoButton(const QColor &color, bool pressed, int size)
@ -158,4 +172,52 @@ namespace Oxygen
return mask;
}
//______________________________________________________________________________
const QColor& DecoHelper::inactiveTitleBarTextColor( const QPalette& palette )
{
const quint32 key( palette.color(QPalette::Active, QPalette::Window).rgba() );
QColor* out( m_titleBarTextColorCache.object( key ) );
if( !out )
{
// todo: reimplement cache
const QColor ab = palette.color(QPalette::Active, QPalette::Window);
const QColor af = palette.color(QPalette::Active, QPalette::WindowText);
const QColor nb = palette.color(QPalette::Inactive, QPalette::Window);
const QColor nf = palette.color(QPalette::Inactive, QPalette::WindowText);
out = new QColor( reduceContrast(nb, nf, qMax(qreal(2.5), KColorUtils::contrastRatio(ab, KColorUtils::mix(ab, af, 0.4)))) );
m_titleBarTextColorCache.insert( key, out );
}
return *out;
}
//_________________________________________________________
QColor DecoHelper::reduceContrast(const QColor &c0, const QColor &c1, double t) const
{
const double s( KColorUtils::contrastRatio(c0, c1) );
if (s < t) return c1;
double l(0);
double h(1.0);
double x(s);
double a;
QColor r( c1 );
for (int maxiter = 16; maxiter; --maxiter)
{
a = 0.5 * (l + h);
r = KColorUtils::mix(c0, c1, a);
x = KColorUtils::contrastRatio(c0, r);
if (fabs(x - t) < 0.01) break;
if (x > t) h = a;
else l = a;
}
return r;
}
}

View file

@ -32,8 +32,15 @@ namespace Oxygen
public:
explicit DecoHelper(const QByteArray &componentName);
virtual ~DecoHelper() {}
//! constructor
DecoHelper(const QByteArray &componentName);
//! destructor
virtual ~DecoHelper()
{}
//! reset all caches
virtual void invalidateCaches();
//!@name decoration specific helper functions
//!
@ -42,8 +49,23 @@ namespace Oxygen
virtual QPixmap windecoButtonGlow(const QColor &color, int size = 21);
//@}
//
virtual QRegion decoRoundedMask( const QRect&, int left = 1, int right = 1, int top = 1, int bottom = 1 ) const;
//! title bar text color
const QColor& inactiveTitleBarTextColor( const QPalette& );
protected:
//! reduce contrast between two colors
QColor reduceContrast(const QColor&, const QColor&, double) const;
private:
//! titleBar text color cache
ColorCache m_titleBarTextColorCache;
};
}