Achieve the additional background painting without adding any public API
svn path=/trunk/KDE/kdelibs/; revision=962014
This commit is contained in:
parent
0b5c4e1947
commit
42172d0178
@ -72,7 +72,6 @@ set(plasma_LIB_SRCS
|
|||||||
framesvg.cpp
|
framesvg.cpp
|
||||||
plasma.cpp
|
plasma.cpp
|
||||||
popupapplet.cpp
|
popupapplet.cpp
|
||||||
framebackgroundprovider.cpp
|
|
||||||
private/applethandle.cpp
|
private/applethandle.cpp
|
||||||
private/datacontainer_p.cpp
|
private/datacontainer_p.cpp
|
||||||
private/desktoptoolbox.cpp
|
private/desktoptoolbox.cpp
|
||||||
@ -224,7 +223,6 @@ set(plasma_LIB_INCLUDES
|
|||||||
servicejob.h
|
servicejob.h
|
||||||
svg.h
|
svg.h
|
||||||
theme.h
|
theme.h
|
||||||
framebackgroundprovider.h
|
|
||||||
tooltipcontent.h
|
tooltipcontent.h
|
||||||
tooltipmanager.h
|
tooltipmanager.h
|
||||||
tooltipmanager.h
|
tooltipmanager.h
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2009 David Nolden <david.nolden.kdevelop@art-master.de>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Library General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this program; if not, write to the
|
|
||||||
* Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "framebackgroundprovider.h"
|
|
||||||
|
|
||||||
namespace Plasma {
|
|
||||||
|
|
||||||
FrameBackgroundProvider::~FrameBackgroundProvider() {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
12
framesvg.cpp
12
framesvg.cpp
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#include <plasma/theme.h>
|
#include <plasma/theme.h>
|
||||||
#include <plasma/applet.h>
|
#include <plasma/applet.h>
|
||||||
#include "framebackgroundprovider.h"
|
#include "private/framebackgroundprovider.h"
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
@ -388,12 +388,11 @@ void FrameSvg::paintFrame(QPainter *painter, const QPointF &pos)
|
|||||||
QString FrameSvgPrivate::cacheId(const FrameData* frame) const
|
QString FrameSvgPrivate::cacheId(const FrameData* frame) const
|
||||||
{
|
{
|
||||||
Theme *theme = Theme::defaultTheme();
|
Theme *theme = Theme::defaultTheme();
|
||||||
FrameBackgroundProvider* backgroundProvider = theme->frameBackgroundProvider(q->imagePath());
|
StandardThemeBackgroundProvider backgroundProvider(theme, q->imagePath());
|
||||||
|
|
||||||
|
|
||||||
return QString::fromLatin1("%6_%5_%4_%3_%2_%1_").
|
return QString::fromLatin1("%6_%5_%4_%3_%2_%1_").
|
||||||
arg(frame->enabledBorders).arg(frame->frameSize.width()).arg(frame->frameSize.height()).arg(prefix)
|
arg(frame->enabledBorders).arg(frame->frameSize.width()).arg(frame->frameSize.height()).arg(prefix)
|
||||||
.arg(q->imagePath()).arg(backgroundProvider ? backgroundProvider->identity() : QString());
|
.arg(q->imagePath()).arg(backgroundProvider.identity());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameSvgPrivate::generateBackground(FrameData *frame)
|
void FrameSvgPrivate::generateBackground(FrameData *frame)
|
||||||
@ -612,9 +611,10 @@ void FrameSvgPrivate::generateBackground(FrameData *frame)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!prefix.startsWith("mask-")) {
|
if(!prefix.startsWith("mask-")) {
|
||||||
if(FrameBackgroundProvider* backgroundProvider = theme->frameBackgroundProvider(q->imagePath())) {
|
StandardThemeBackgroundProvider backgroundProvider(theme, q->imagePath());
|
||||||
|
if(backgroundProvider) {
|
||||||
p.setClipRegion(q->mask() );
|
p.setClipRegion(q->mask() );
|
||||||
backgroundProvider->apply(p);
|
backgroundProvider.apply(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,27 +20,20 @@
|
|||||||
#ifndef PLASMA_PANELBACKGROUNDPROVIDER_H
|
#ifndef PLASMA_PANELBACKGROUNDPROVIDER_H
|
||||||
#define PLASMA_PANELBACKGROUNDPROVIDER_H
|
#define PLASMA_PANELBACKGROUNDPROVIDER_H
|
||||||
|
|
||||||
#include <plasma/plasma_export.h>
|
|
||||||
#include <QtCore/QPoint>
|
|
||||||
|
|
||||||
class QPainter;
|
|
||||||
class QRegion;
|
|
||||||
|
|
||||||
namespace Plasma {
|
namespace Plasma {
|
||||||
|
class Theme;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract class to provide additional panel backgrounds behind translucent panels.
|
* A class that paints an additional background behind specific elements of a theme.
|
||||||
|
* Construct it locally right before using it.
|
||||||
*/
|
*/
|
||||||
class PLASMA_EXPORT FrameBackgroundProvider
|
class StandardThemeBackgroundProvider {
|
||||||
{
|
public:
|
||||||
public:
|
|
||||||
virtual ~FrameBackgroundProvider();
|
|
||||||
/**
|
/**
|
||||||
* Returns an identity that can be used for caching the result of the background rendering.
|
* Constructs a background-provider for the given theme
|
||||||
* @return The identity string
|
|
||||||
*/
|
*/
|
||||||
virtual QString identity() = 0;
|
StandardThemeBackgroundProvider(Theme* theme, QString imagePath);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the background to the given target. The target must have correct alpha-values,
|
* Applies the background to the given target. The target must have correct alpha-values,
|
||||||
* so the background can be painted under it. Also the clip-region must be already set correctly
|
* so the background can be painted under it. Also the clip-region must be already set correctly
|
||||||
@ -48,9 +41,33 @@ public:
|
|||||||
* @param target The target where the background should be painted
|
* @param target The target where the background should be painted
|
||||||
* @param offset Additional offset for the rendering: The render-source is translated by this offset
|
* @param offset Additional offset for the rendering: The render-source is translated by this offset
|
||||||
*/
|
*/
|
||||||
virtual void apply(QPainter& target, QPoint offset = QPoint()) = 0;
|
void apply(QPainter& target) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an identity that can be used for caching the result of the background rendering.
|
||||||
|
* @return The identity string
|
||||||
|
*/
|
||||||
|
QString identity() const;
|
||||||
|
|
||||||
|
static void clearCache();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this background-provider will paint something
|
||||||
|
*/
|
||||||
|
operator bool() const;
|
||||||
|
private:
|
||||||
|
QColor m_color;
|
||||||
|
QString m_pattern;
|
||||||
|
int m_patternAlpha;
|
||||||
|
int m_offsetX;
|
||||||
|
int m_offsetY;
|
||||||
|
bool m_valid;
|
||||||
|
|
||||||
|
//Maps file-name to (image, alpha)
|
||||||
|
typedef QPair<QImage, int> PatternAlphaPair; //The alpha value is statically applied to the pattern
|
||||||
|
static QMap<QString, PatternAlphaPair > m_cachedPatterns;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // PLASMA_PANELBACKGROUNDPROVIDER_H
|
#endif
|
124
theme.cpp
124
theme.cpp
@ -41,7 +41,7 @@
|
|||||||
#include <kwindowsystem.h>
|
#include <kwindowsystem.h>
|
||||||
|
|
||||||
#include "private/packages_p.h"
|
#include "private/packages_p.h"
|
||||||
#include "framebackgroundprovider.h"
|
#include "private/framebackgroundprovider.h"
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
@ -51,31 +51,7 @@ namespace Plasma
|
|||||||
static const int DEFAULT_WALLPAPER_WIDTH = 1920;
|
static const int DEFAULT_WALLPAPER_WIDTH = 1920;
|
||||||
static const int DEFAULT_WALLPAPER_HEIGHT = 1200;
|
static const int DEFAULT_WALLPAPER_HEIGHT = 1200;
|
||||||
|
|
||||||
class StandardThemeBackgroundProvider : public FrameBackgroundProvider {
|
QMap<QString, StandardThemeBackgroundProvider::PatternAlphaPair> StandardThemeBackgroundProvider::m_cachedPatterns;
|
||||||
public:
|
|
||||||
StandardThemeBackgroundProvider();
|
|
||||||
virtual void apply(QPainter& target, QPoint offset);
|
|
||||||
virtual QString identity();
|
|
||||||
QColor m_color;
|
|
||||||
QString m_pattern;
|
|
||||||
int m_patternAlpha;
|
|
||||||
int m_offsetX;
|
|
||||||
int m_offsetY;
|
|
||||||
|
|
||||||
void clearCache() {
|
|
||||||
m_cachedPatterns.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
//Maps file-name to (image, alpha)
|
|
||||||
typedef QPair<QImage, uint> PatternAlphaPair; //The alpha value is statically applied to the pattern
|
|
||||||
QMap<QString, PatternAlphaPair > m_cachedPatterns;
|
|
||||||
};
|
|
||||||
|
|
||||||
static StandardThemeBackgroundProvider& standardThemeBackgroundProvider() {
|
|
||||||
static StandardThemeBackgroundProvider ret;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
class ThemePrivate
|
class ThemePrivate
|
||||||
{
|
{
|
||||||
@ -356,7 +332,7 @@ void ThemePrivate::settingsFileChanged(const QString &file)
|
|||||||
|
|
||||||
void Theme::settingsChanged()
|
void Theme::settingsChanged()
|
||||||
{
|
{
|
||||||
standardThemeBackgroundProvider().clearCache(); //So we don't waste memory with background images that are not used
|
StandardThemeBackgroundProvider::clearCache(); //So we don't waste memory with background images that are not used
|
||||||
|
|
||||||
QString newThemeName = d->config().readEntry("name", ThemePrivate::defaultTheme);
|
QString newThemeName = d->config().readEntry("name", ThemePrivate::defaultTheme);
|
||||||
if(newThemeName != d->themeName) {
|
if(newThemeName != d->themeName) {
|
||||||
@ -764,10 +740,51 @@ void Theme::setCacheLimit(int kbytes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StandardThemeBackgroundProvider::StandardThemeBackgroundProvider() : m_color(Qt::black), m_patternAlpha(0) {
|
|
||||||
|
void StandardThemeBackgroundProvider::clearCache()
|
||||||
|
{
|
||||||
|
m_cachedPatterns.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void StandardThemeBackgroundProvider::apply(QPainter& target, QPoint offset) {
|
StandardThemeBackgroundProvider::StandardThemeBackgroundProvider(Theme* theme, QString imagePath) : m_color(Qt::black), m_patternAlpha(0), m_valid(false)
|
||||||
|
{
|
||||||
|
if(theme->d->locolor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if((imagePath.startsWith("widgets/panel-") || imagePath.startsWith("dialogs/")) &&
|
||||||
|
(theme->d->hasOptionalConfig("frameBackgroundColor") || theme->d->hasOptionalConfig("frameBackgroundPattern")))
|
||||||
|
{
|
||||||
|
m_valid = true;
|
||||||
|
m_color = theme->d->readOptionalConfig<QColor>("frameBackgroundColor", Qt::black, imagePath);
|
||||||
|
if(theme->d->hasOptionalConfig("frameBackgroundColor"))
|
||||||
|
m_color.setAlpha(theme->d->readOptionalConfig<int>("frameBackgroundColorAlpha", 255, imagePath));
|
||||||
|
else
|
||||||
|
m_color.setAlpha(0);
|
||||||
|
|
||||||
|
m_pattern = theme->d->readOptionalConfig<QString>("frameBackgroundPattern", QString(), imagePath);
|
||||||
|
m_patternAlpha = theme->d->readOptionalConfig<int>("frameBackgroundPatternAlpha", 255, imagePath);
|
||||||
|
m_offsetX = theme->d->readOptionalConfig<int>("frameBackgroundPatternOffsetX", 0, imagePath);
|
||||||
|
m_offsetY = theme->d->readOptionalConfig<int>("frameBackgroundPatternOffsetY", 0, imagePath);
|
||||||
|
int randomX = theme->d->readOptionalConfig<int>("frameBackgroundPatternOffsetRandomX", 0, imagePath);
|
||||||
|
int randomY = theme->d->readOptionalConfig<int>("frameBackgroundPatternOffsetRandomY", 0, imagePath);
|
||||||
|
|
||||||
|
if(randomX || randomY) {
|
||||||
|
//Add "this" so the offsets are different after every startup, but stay same for the same image path
|
||||||
|
qsrand(qHash(imagePath) + ((size_t)this) + randomX + 11 * randomY);
|
||||||
|
if(randomX)
|
||||||
|
m_offsetX += qrand() % randomX;
|
||||||
|
if(randomY)
|
||||||
|
m_offsetY += qrand() % randomY;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StandardThemeBackgroundProvider::apply(QPainter& target) const
|
||||||
|
{
|
||||||
|
if(!m_valid)
|
||||||
|
return;
|
||||||
|
|
||||||
target.setCompositionMode(QPainter::CompositionMode_DestinationOver);
|
target.setCompositionMode(QPainter::CompositionMode_DestinationOver);
|
||||||
|
|
||||||
//Apply color
|
//Apply color
|
||||||
@ -796,7 +813,7 @@ void StandardThemeBackgroundProvider::apply(QPainter& target, QPoint offset) {
|
|||||||
col.setAlpha(m_patternAlpha);
|
col.setAlpha(m_patternAlpha);
|
||||||
brush.setColor(col);
|
brush.setColor(col);
|
||||||
brush.setTextureImage(cached.first);
|
brush.setTextureImage(cached.first);
|
||||||
target.setBrushOrigin(-(m_offsetX + offset.x()), -(m_offsetY + offset.y()));
|
target.setBrushOrigin(-m_offsetX, -m_offsetY);
|
||||||
target.fillRect(target.clipRegion().boundingRect(), brush);
|
target.fillRect(target.clipRegion().boundingRect(), brush);
|
||||||
}else{
|
}else{
|
||||||
kDebug() << "failed to load pattern" << m_pattern;
|
kDebug() << "failed to load pattern" << m_pattern;
|
||||||
@ -804,46 +821,17 @@ void StandardThemeBackgroundProvider::apply(QPainter& target, QPoint offset) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString StandardThemeBackgroundProvider::identity() {
|
StandardThemeBackgroundProvider::operator bool() const
|
||||||
|
{
|
||||||
|
return m_valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StandardThemeBackgroundProvider::identity() const
|
||||||
|
{
|
||||||
|
if(!m_valid)
|
||||||
|
return QString();
|
||||||
return QString("bgcolor_%1=").arg(m_color.alpha()) + m_color.name()+QString("_pattern_%1=").arg(m_patternAlpha)+m_pattern + QString("_offsets_%1_%2__").arg(m_offsetX).arg(m_offsetY);
|
return QString("bgcolor_%1=").arg(m_color.alpha()) + m_color.name()+QString("_pattern_%1=").arg(m_patternAlpha)+m_pattern + QString("_offsets_%1_%2__").arg(m_offsetX).arg(m_offsetY);
|
||||||
}
|
}
|
||||||
|
|
||||||
FrameBackgroundProvider* Theme::frameBackgroundProvider(QString imagePath) const {
|
|
||||||
if(d->locolor)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if((imagePath.startsWith("widgets/panel-") || imagePath.startsWith("dialogs/")) &&
|
|
||||||
(d->hasOptionalConfig("frameBackgroundColor") || d->hasOptionalConfig("frameBackgroundPattern")))
|
|
||||||
{
|
|
||||||
StandardThemeBackgroundProvider& provider(standardThemeBackgroundProvider());;
|
|
||||||
|
|
||||||
provider.m_color = d->readOptionalConfig<QColor>("frameBackgroundColor", Qt::black, imagePath);
|
|
||||||
if(d->hasOptionalConfig("frameBackgroundColor"))
|
|
||||||
provider.m_color.setAlpha(d->readOptionalConfig<int>("frameBackgroundColorAlpha", 255, imagePath));
|
|
||||||
else
|
|
||||||
provider.m_color.setAlpha(0);
|
|
||||||
|
|
||||||
provider.m_pattern = d->readOptionalConfig<QString>("frameBackgroundPattern", QString(), imagePath);
|
|
||||||
provider.m_patternAlpha = d->readOptionalConfig<int>("frameBackgroundPatternAlpha", 255, imagePath);
|
|
||||||
provider.m_offsetX = d->readOptionalConfig<int>("frameBackgroundPatternOffsetX", 0, imagePath);
|
|
||||||
provider.m_offsetY = d->readOptionalConfig<int>("frameBackgroundPatternOffsetY", 0, imagePath);
|
|
||||||
int randomX = d->readOptionalConfig<int>("frameBackgroundPatternOffsetRandomX", 0, imagePath);
|
|
||||||
int randomY = d->readOptionalConfig<int>("frameBackgroundPatternOffsetRandomY", 0, imagePath);
|
|
||||||
|
|
||||||
if(randomX || randomY) {
|
|
||||||
//Add "this" so the offsets are different after every startup, but stay same for the same image path
|
|
||||||
qsrand(qHash(imagePath) + ((size_t)this) + randomX + 11 * randomY);
|
|
||||||
if(randomX)
|
|
||||||
provider.m_offsetX += qrand() % randomX;
|
|
||||||
if(randomY)
|
|
||||||
provider.m_offsetY += qrand() % randomY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &provider;
|
|
||||||
}else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <theme.moc>
|
#include <theme.moc>
|
||||||
|
15
theme.h
15
theme.h
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
class FrameBackgroundProvider;
|
class StandardThemeBackgroundProvider;
|
||||||
class ThemePrivate;
|
class ThemePrivate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -265,18 +265,6 @@ class PLASMA_EXPORT Theme : public QObject
|
|||||||
*/
|
*/
|
||||||
void releaseRectsCache(const QString &image);
|
void releaseRectsCache(const QString &image);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a frame background provider, that allows intelligently filling the
|
|
||||||
* background of the frame represented by the given image.
|
|
||||||
*
|
|
||||||
* The ownership stays with the theme object, and the background provider
|
|
||||||
* is only for immediate usage.
|
|
||||||
*
|
|
||||||
* @param imagePath image path identifying the frame
|
|
||||||
* @return the backgrond-provider or zero, depending on the image, settings, and composition mode
|
|
||||||
*/
|
|
||||||
FrameBackgroundProvider* frameBackgroundProvider(QString imagePath) const;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
/**
|
/**
|
||||||
* Emitted when the user changes the theme. SVGs should be reloaded at
|
* Emitted when the user changes the theme. SVGs should be reloaded at
|
||||||
@ -294,6 +282,7 @@ class PLASMA_EXPORT Theme : public QObject
|
|||||||
private:
|
private:
|
||||||
friend class ThemeSingleton;
|
friend class ThemeSingleton;
|
||||||
friend class ThemePrivate;
|
friend class ThemePrivate;
|
||||||
|
friend class StandardThemeBackgroundProvider;
|
||||||
ThemePrivate *const d;
|
ThemePrivate *const d;
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d, void compositingChanged())
|
Q_PRIVATE_SLOT(d, void compositingChanged())
|
||||||
|
Loading…
Reference in New Issue
Block a user