diff --git a/CMakeLists.txt b/CMakeLists.txt index f34aefce4..c8c6bf70d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,7 +72,6 @@ set(plasma_LIB_SRCS framesvg.cpp plasma.cpp popupapplet.cpp - framebackgroundprovider.cpp private/applethandle.cpp private/datacontainer_p.cpp private/desktoptoolbox.cpp @@ -224,7 +223,6 @@ set(plasma_LIB_INCLUDES servicejob.h svg.h theme.h - framebackgroundprovider.h tooltipcontent.h tooltipmanager.h tooltipmanager.h diff --git a/framebackgroundprovider.cpp b/framebackgroundprovider.cpp deleted file mode 100644 index ec9eaa166..000000000 --- a/framebackgroundprovider.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2009 David Nolden - * - * 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() { -} - -} \ No newline at end of file diff --git a/framesvg.cpp b/framesvg.cpp index cab91ffe2..f2a0f9262 100644 --- a/framesvg.cpp +++ b/framesvg.cpp @@ -32,7 +32,7 @@ #include #include -#include "framebackgroundprovider.h" +#include "private/framebackgroundprovider.h" namespace Plasma { @@ -388,12 +388,11 @@ void FrameSvg::paintFrame(QPainter *painter, const QPointF &pos) QString FrameSvgPrivate::cacheId(const FrameData* frame) const { Theme *theme = Theme::defaultTheme(); - FrameBackgroundProvider* backgroundProvider = theme->frameBackgroundProvider(q->imagePath()); - + StandardThemeBackgroundProvider backgroundProvider(theme, q->imagePath()); return QString::fromLatin1("%6_%5_%4_%3_%2_%1_"). 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) @@ -612,9 +611,10 @@ void FrameSvgPrivate::generateBackground(FrameData *frame) } if(!prefix.startsWith("mask-")) { - if(FrameBackgroundProvider* backgroundProvider = theme->frameBackgroundProvider(q->imagePath())) { + StandardThemeBackgroundProvider backgroundProvider(theme, q->imagePath()); + if(backgroundProvider) { p.setClipRegion(q->mask() ); - backgroundProvider->apply(p); + backgroundProvider.apply(p); } } diff --git a/framebackgroundprovider.h b/private/framebackgroundprovider.h similarity index 62% rename from framebackgroundprovider.h rename to private/framebackgroundprovider.h index 6d0b7d3e6..25133522c 100644 --- a/framebackgroundprovider.h +++ b/private/framebackgroundprovider.h @@ -20,27 +20,20 @@ #ifndef PLASMA_PANELBACKGROUNDPROVIDER_H #define PLASMA_PANELBACKGROUNDPROVIDER_H -#include -#include - -class QPainter; -class QRegion; - 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 -{ -public: - virtual ~FrameBackgroundProvider(); +class StandardThemeBackgroundProvider { + public: /** - * Returns an identity that can be used for caching the result of the background rendering. - * @return The identity string + * Constructs a background-provider for the given theme */ - virtual QString identity() = 0; - + StandardThemeBackgroundProvider(Theme* theme, QString imagePath); + /** * 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 @@ -48,9 +41,33 @@ public: * @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 */ - 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 PatternAlphaPair; //The alpha value is statically applied to the pattern + static QMap m_cachedPatterns; }; } -#endif // PLASMA_PANELBACKGROUNDPROVIDER_H +#endif diff --git a/theme.cpp b/theme.cpp index 10108bb5a..ad8def380 100644 --- a/theme.cpp +++ b/theme.cpp @@ -41,7 +41,7 @@ #include #include "private/packages_p.h" -#include "framebackgroundprovider.h" +#include "private/framebackgroundprovider.h" namespace Plasma { @@ -51,31 +51,7 @@ namespace Plasma static const int DEFAULT_WALLPAPER_WIDTH = 1920; static const int DEFAULT_WALLPAPER_HEIGHT = 1200; -class StandardThemeBackgroundProvider : public FrameBackgroundProvider { - 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 PatternAlphaPair; //The alpha value is statically applied to the pattern - QMap m_cachedPatterns; -}; - -static StandardThemeBackgroundProvider& standardThemeBackgroundProvider() { - static StandardThemeBackgroundProvider ret; - return ret; -} +QMap StandardThemeBackgroundProvider::m_cachedPatterns; class ThemePrivate { @@ -356,7 +332,7 @@ void ThemePrivate::settingsFileChanged(const QString &file) 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); 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("frameBackgroundColor", Qt::black, imagePath); + if(theme->d->hasOptionalConfig("frameBackgroundColor")) + m_color.setAlpha(theme->d->readOptionalConfig("frameBackgroundColorAlpha", 255, imagePath)); + else + m_color.setAlpha(0); + + m_pattern = theme->d->readOptionalConfig("frameBackgroundPattern", QString(), imagePath); + m_patternAlpha = theme->d->readOptionalConfig("frameBackgroundPatternAlpha", 255, imagePath); + m_offsetX = theme->d->readOptionalConfig("frameBackgroundPatternOffsetX", 0, imagePath); + m_offsetY = theme->d->readOptionalConfig("frameBackgroundPatternOffsetY", 0, imagePath); + int randomX = theme->d->readOptionalConfig("frameBackgroundPatternOffsetRandomX", 0, imagePath); + int randomY = theme->d->readOptionalConfig("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); //Apply color @@ -796,7 +813,7 @@ void StandardThemeBackgroundProvider::apply(QPainter& target, QPoint offset) { col.setAlpha(m_patternAlpha); brush.setColor(col); 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); }else{ 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); } - -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("frameBackgroundColor", Qt::black, imagePath); - if(d->hasOptionalConfig("frameBackgroundColor")) - provider.m_color.setAlpha(d->readOptionalConfig("frameBackgroundColorAlpha", 255, imagePath)); - else - provider.m_color.setAlpha(0); - - provider.m_pattern = d->readOptionalConfig("frameBackgroundPattern", QString(), imagePath); - provider.m_patternAlpha = d->readOptionalConfig("frameBackgroundPatternAlpha", 255, imagePath); - provider.m_offsetX = d->readOptionalConfig("frameBackgroundPatternOffsetX", 0, imagePath); - provider.m_offsetY = d->readOptionalConfig("frameBackgroundPatternOffsetY", 0, imagePath); - int randomX = d->readOptionalConfig("frameBackgroundPatternOffsetRandomX", 0, imagePath); - int randomY = d->readOptionalConfig("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 diff --git a/theme.h b/theme.h index ce5583c60..28880622f 100644 --- a/theme.h +++ b/theme.h @@ -31,7 +31,7 @@ namespace Plasma { -class FrameBackgroundProvider; +class StandardThemeBackgroundProvider; class ThemePrivate; /** @@ -265,18 +265,6 @@ class PLASMA_EXPORT Theme : public QObject */ 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: /** * Emitted when the user changes the theme. SVGs should be reloaded at @@ -294,6 +282,7 @@ class PLASMA_EXPORT Theme : public QObject private: friend class ThemeSingleton; friend class ThemePrivate; + friend class StandardThemeBackgroundProvider; ThemePrivate *const d; Q_PRIVATE_SLOT(d, void compositingChanged())