On Thursday 16 July 2009, Marco Martin wrote:
> On Thursday 16 July 2009, Aaron J. Seigo wrote:
> > On Thursday 16 July 2009, Marco Martin wrote:
> > > but a sick idea come to my mind: what about encoding the pointer value
> > > (or another random number, whatever) into the key? :p
> > > a key will have the form
> > > 7635865:path_300_200_blahblah
> >
> > how will this work between sessions? (new pointer values)
> > between objects with the same svg at the same size? (should share the
> > same cache values)
>
> tomorrow I'll try another approach: putting the delayed save in just Svg
> and use that from FrameSvg, to avoid the code duplication there was before
here it is
since i really didn't want to add new protected members i did this dirty thing
with accessing svg private in framesvg..
it seems quite a big change to backport tough :)
and still, in the case of an applet with many subwidgets, independent timers
can do really a big signal storm, so i still kinda like more the pointer
approach :p
--
Marco Martin
Index: framesvg.cpp
===================================================================
--- framesvg.cpp (revision 995762)
+++ framesvg.cpp (working copy)
@@ -20,6 +20,7 @@
#include "framesvg.h"
#include "private/framesvg_p.h"
+#include "private/svg_p.h"
#include <QPainter>
#include <QSize>
@@ -621,13 +622,13 @@
//kDebug()<<"Saving to cache frame"<<id;
- Theme::defaultTheme()->insertIntoCache(id, frame->cachedBackground);
+ static_cast<Svg *>(q)->d->insertIntoCacheDelayed(id, prefixToSave, frame->cachedBackground);
//insert overlay
id = QString::fromLatin1("overlay_%7_%6_%5_%4_%3_%2_%1_").
arg(overlayPos.y()).arg(overlayPos.x()).arg(frame->enabledBorders).arg(size.width()).arg(size.height()).arg(prefixToSave).arg(q->imagePath());
- Theme::defaultTheme()->insertIntoCache(id, frame->cachedBackground);
+ static_cast<Svg *>(q)->d->insertIntoCacheDelayed(id, prefixToSave+"overlay", frame->cachedBackground);
}
void FrameSvgPrivate::updateSizes()
Index: svg.h
===================================================================
--- svg.h (revision 995762)
+++ svg.h (working copy)
@@ -62,6 +62,8 @@
Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath)
Q_PROPERTY(bool usingRenderingCache READ isUsingRenderingCache WRITE setUsingRenderingCache)
+ friend class FrameSvg;
+
public:
/**
* Constructs an SVG object that implicitly shares and caches rendering
Index: private/svg_p.h
===================================================================
--- private/svg_p.h (revision 0)
+++ private/svg_p.h (revision 0)
@@ -0,0 +1,449 @@
+/*
+ * Copyright 2006-2007 Aaron Seigo <[email protected]>
+ * Copyright 2008-2009 Marco Martin <[email protected]>
+ *
+ * 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.
+ */
+
+#ifndef SVG_P_H
+#define SVG_P_H
+
+
+#include <QDir>
+#include <QMatrix>
+#include <QPainter>
+#include <QSharedData>
+#include <QTimer>
+
+#include <kcolorscheme.h>
+#include <kconfiggroup.h>
+#include <kdebug.h>
+#include <kiconeffect.h>
+#include <kglobalsettings.h>
+#include <ksharedptr.h>
+#include <ksvgrenderer.h>
+
+#include "plasma/applet.h"
+#include "plasma/package.h"
+#include "plasma/theme.h"
+#include "plasma/svg.h"
+
+namespace Plasma
+{
+
+class SharedSvgRenderer : public KSvgRenderer, public QSharedData
+{
+ public:
+ typedef KSharedPtr<SharedSvgRenderer> Ptr;
+
+ SharedSvgRenderer(QObject *parent = 0)
+ : KSvgRenderer(parent)
+ {}
+
+ SharedSvgRenderer(const QString &filename, QObject *parent = 0)
+ : KSvgRenderer(filename, parent)
+ {}
+
+ SharedSvgRenderer(const QByteArray &contents, QObject *parent = 0)
+ : KSvgRenderer(contents, parent)
+ {}
+
+ ~SharedSvgRenderer()
+ {
+ //kDebug() << "leaving this world for a better one.";
+ }
+};
+
+class SvgPrivate
+{
+ public:
+ SvgPrivate(Svg *svg)
+ : q(svg),
+ theme(0),
+ renderer(0),
+ lastModified(0),
+ multipleImages(false),
+ themed(false),
+ applyColors(false),
+ cacheRendering(true)
+ {
+ saveTimer = new QTimer(q);
+ saveTimer->setSingleShot(true);
+ QObject::connect(saveTimer, SIGNAL(timeout()), q, SLOT(scheduledCacheUpdate()));
+ }
+
+ ~SvgPrivate()
+ {
+ eraseRenderer();
+ }
+
+ //This function is meant for the rects cache
+ QString cacheId(const QString &elementId)
+ {
+ if (size.isValid() && size != naturalSize) {
+ return QString("%3_%2_%1").arg(int(size.height()))
+ .arg(int(size.width()))
+ .arg(elementId);
+ } else {
+ return QString("%2_%1").arg("Natural")
+ .arg(elementId);
+ }
+ }
+
+ //This function is meant for the pixmap cache
+ QString cachePath(const QString &path, const QSize &size)
+ {
+ return QString("%3_%2_%1_").arg(int(size.height()))
+ .arg(int(size.width()))
+ .arg(path);
+ }
+
+ bool setImagePath(const QString &imagePath)
+ {
+ bool isThemed = !QDir::isAbsolutePath(imagePath);
+
+ // lets check to see if we're already set to this file
+ if (isThemed == themed &&
+ ((themed && themePath == imagePath) ||
+ (!themed && path == imagePath))) {
+ return false;
+ }
+
+ // if we don't have any path right now and are going to set one,
+ // then lets not schedule a repaint because we are just initializing!
+ bool updateNeeded = true; //!path.isEmpty() || !themePath.isEmpty();
+
+ if (themed) {
+ QObject::disconnect(actualTheme(), SIGNAL(themeChanged()),
+ q, SLOT(themeChanged()));
+ }
+
+ themed = isThemed;
+ path.clear();
+ themePath.clear();
+ localRectCache.clear();
+
+ if (themed) {
+ themePath = imagePath;
+ QObject::connect(actualTheme(), SIGNAL(themeChanged()), q, SLOT(themeChanged()));
+ } else if (QFile::exists(imagePath)) {
+ path = imagePath;
+ } else {
+ kDebug() << "file '" << path << "' does not exist!";
+ }
+
+ // check if svg wants colorscheme applied
+ QObject::disconnect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
+ q, SLOT(colorsChanged()));
+
+ checkApplyColorHint();
+ if (applyColors && !actualTheme()->colorScheme()) {
+ QObject::connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
+ q, SLOT(colorsChanged()));
+ }
+
+ // also images with absolute path needs to have a natural size initialized,
+ // even if looks a bit weird using Theme to store non-themed stuff
+ if (themed || QFile::exists(imagePath)) {
+ QRectF rect;
+ bool found = actualTheme()->findInRectsCache(path, "_Natural", rect);
+
+ if (!found) {
+ createRenderer();
+ naturalSize = renderer->defaultSize();
+ //kDebug() << "natural size for" << path << "from renderer is" << naturalSize;
+ actualTheme()->insertIntoRectsCache(path, "_Natural", QRectF(QPointF(0,0), naturalSize));
+ } else {
+ naturalSize = rect.size();
+ //kDebug() << "natural size for" << path << "from cache is" << naturalSize;
+ }
+ }
+
+ if (!themed) {
+ QFile f(imagePath);
+ QFileInfo info(f);
+ lastModified = info.lastModified().toTime_t();
+ }
+
+ return updateNeeded;
+ }
+
+ Theme *actualTheme()
+ {
+ if (!theme) {
+ theme = Plasma::Theme::defaultTheme();
+ }
+
+ return theme;
+ }
+
+ QPixmap findInCache(const QString &elementId, const QSizeF &s = QSizeF())
+ {
+ QSize size;
+ if (elementId.isEmpty() || (multipleImages && s.isValid())) {
+ size = s.toSize();
+ } else {
+ size = elementRect(elementId).size().toSize();
+ }
+
+ if (size.isEmpty()) {
+ return QPixmap();
+ }
+
+ QString id = cachePath(path, size);
+
+ if (!elementId.isEmpty()) {
+ id.append(elementId);
+ }
+
+ //kDebug() << "id is " << id;
+
+ QPixmap p;
+ if (cacheRendering) {
+ if (actualTheme()->findInCache(id, p, lastModified)) {
+ //kDebug() << "found cached version of " << id << p.size();
+ return p;
+ }
+ }
+
+ //kDebug() << "didn't find cached version of " << id << ", so re-rendering";
+
+ //kDebug() << "size for " << elementId << " is " << s;
+ // we have to re-render this puppy
+
+ p = QPixmap(size);
+
+ p.fill(Qt::transparent);
+ QPainter renderPainter(&p);
+
+ createRenderer();
+ if (elementId.isEmpty()) {
+ renderer->render(&renderPainter);
+ } else {
+ renderer->render(&renderPainter, elementId);
+ }
+
+ renderPainter.end();
+
+ // Apply current color scheme if the svg asks for it
+ if (applyColors) {
+ QImage itmp = p.toImage();
+ KIconEffect::colorize(itmp, actualTheme()->color(Theme::BackgroundColor), 1.0);
+ p = p.fromImage(itmp);
+ }
+
+ if (cacheRendering) {
+ insertIntoCacheDelayed(id, elementId, p);
+ }
+
+ return p;
+ }
+
+ void createRenderer()
+ {
+ if (renderer) {
+ return;
+ }
+
+ //kDebug() << kBacktrace();
+ if (themed && path.isEmpty()) {
+ Applet *applet = qobject_cast<Applet*>(q->parent());
+ if (applet && applet->package()) {
+ path = applet->package()->filePath("images", themePath + ".svg");
+
+ if (path.isEmpty()) {
+ path = applet->package()->filePath("images", themePath + ".svgz");
+ }
+ }
+
+ if (path.isEmpty()) {
+ path = actualTheme()->imagePath(themePath);
+ if (path.isEmpty()) {
+ kWarning() << "No image path found for" << themePath;
+ }
+ }
+ }
+
+ //kDebug() << "********************************";
+ //kDebug() << "FAIL! **************************";
+ //kDebug() << path << "**";
+
+ QHash<QString, SharedSvgRenderer::Ptr>::const_iterator it = s_renderers.constFind(path);
+
+ if (it != s_renderers.constEnd()) {
+ //kDebug() << "gots us an existing one!";
+ renderer = it.value();
+ } else {
+ if (path.isEmpty())
+ renderer = new SharedSvgRenderer();
+ else
+ renderer = new SharedSvgRenderer(path);
+ s_renderers[path] = renderer;
+ }
+
+ if (size == QSizeF()) {
+ size = renderer->defaultSize();
+ }
+ }
+
+ void eraseRenderer()
+ {
+ if (renderer && renderer.count() == 2) {
+ // this and the cache reference it
+ s_renderers.erase(s_renderers.find(path));
+
+ if (theme) {
+ theme->releaseRectsCache(path);
+ }
+ }
+
+ renderer = 0;
+ localRectCache.clear();
+ }
+
+ QRectF elementRect(const QString &elementId)
+ {
+ if (themed && path.isEmpty()) {
+ path = actualTheme()->imagePath(themePath);
+ }
+
+ QString id = cacheId(elementId);
+ if (localRectCache.contains(id)) {
+ return localRectCache.value(id);
+ }
+
+ QRectF rect;
+ bool found = actualTheme()->findInRectsCache(path, id, rect);
+
+ if (found) {
+ localRectCache.insert(id, rect);
+ return rect;
+ }
+
+ return findAndCacheElementRect(elementId);
+ }
+
+ QRectF findAndCacheElementRect(const QString &elementId)
+ {
+ createRenderer();
+ QRectF elementRect = renderer->elementExists(elementId) ?
+ renderer->boundsOnElement(elementId) : QRectF();
+ naturalSize = renderer->defaultSize();
+ //kDebug() << "natural size for" << path << "is" << naturalSize;
+ qreal dx = size.width() / naturalSize.width();
+ qreal dy = size.height() / naturalSize.height();
+
+ elementRect = QRectF(elementRect.x() * dx, elementRect.y() * dy,
+ elementRect.width() * dx, elementRect.height() * dy);
+
+ actualTheme()->insertIntoRectsCache(path, cacheId(elementId), elementRect);
+ return elementRect;
+ }
+
+ QMatrix matrixForElement(const QString &elementId)
+ {
+ createRenderer();
+ return renderer->matrixForElement(elementId);
+ }
+
+ void checkApplyColorHint()
+ {
+ applyColors = elementRect("hint-apply-color-scheme").isValid();
+ }
+
+ void themeChanged()
+ {
+ // check if new theme svg wants colorscheme applied
+ bool wasApplyColors = applyColors;
+ checkApplyColorHint();
+ if (applyColors && actualTheme()->colorScheme()) {
+ if (!wasApplyColors) {
+ QObject::connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
+ q, SLOT(colorsChanged()));
+ }
+ } else {
+ QObject::disconnect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
+ q, SLOT(colorsChanged()));
+ }
+
+ if (!themed) {
+ return;
+ }
+
+ QString currentPath = themePath;
+ themePath.clear();
+ eraseRenderer();
+ setImagePath(currentPath);
+
+ //kDebug() << themePath << ">>>>>>>>>>>>>>>>>> theme changed";
+ emit q->repaintNeeded();
+ }
+
+ void colorsChanged()
+ {
+ if (!applyColors) {
+ return;
+ }
+
+ eraseRenderer();
+ //kDebug() << "repaint needed from colorsChanged";
+ emit q->repaintNeeded();
+ }
+
+ void insertIntoCacheDelayed(const QString& key, const QString& id, const QPixmap& pix)
+ {
+ if (cacheRendering) {
+ pixmapsToCache.insert(id, QPair<QString, QPixmap>(key, pix));
+ saveTimer->start(600);
+ }
+ }
+
+ void scheduledCacheUpdate()
+ {
+ //kDebug()<< "Saving to cache:";
+ QHash<QString, QPair<QString, QPixmap> >::const_iterator it = pixmapsToCache.constBegin();
+
+ while (it != pixmapsToCache.constEnd()) {
+ //kDebug()<< "Saving item to cache: " << it.key();
+ actualTheme()->insertIntoCache(it.value().first, it.value().second);
+ ++it;
+ }
+
+ pixmapsToCache.clear();
+ }
+
+ static QHash<QString, SharedSvgRenderer::Ptr> s_renderers;
+
+ Svg *q;
+ QPointer<Theme> theme;
+ QHash<QString, QRectF> localRectCache;
+ SharedSvgRenderer::Ptr renderer;
+ QString themePath;
+ QString path;
+ QSizeF size;
+ QSizeF naturalSize;
+ QHash<QString, QPair<QString, QPixmap> > pixmapsToCache;
+ QTimer *saveTimer;
+ unsigned int lastModified;
+ bool multipleImages : 1;
+ bool themed : 1;
+ bool applyColors : 1;
+ bool cacheRendering : 1;
+};
+
+}
+
+#endif
Index: svg.cpp
===================================================================
--- svg.cpp (revision 995762)
+++ svg.cpp (working copy)
@@ -18,11 +18,13 @@
*/
#include "svg.h"
+#include "private/svg_p.h"
#include <QDir>
#include <QMatrix>
#include <QPainter>
#include <QSharedData>
+#include <QTimer>
#include <kcolorscheme.h>
#include <kconfiggroup.h>
@@ -39,379 +41,6 @@
namespace Plasma
{
-class SharedSvgRenderer : public KSvgRenderer, public QSharedData
-{
- public:
- typedef KSharedPtr<SharedSvgRenderer> Ptr;
-
- SharedSvgRenderer(QObject *parent = 0)
- : KSvgRenderer(parent)
- {}
-
- SharedSvgRenderer(const QString &filename, QObject *parent = 0)
- : KSvgRenderer(filename, parent)
- {}
-
- SharedSvgRenderer(const QByteArray &contents, QObject *parent = 0)
- : KSvgRenderer(contents, parent)
- {}
-
- ~SharedSvgRenderer()
- {
- //kDebug() << "leaving this world for a better one.";
- }
-};
-
-class SvgPrivate
-{
- public:
- SvgPrivate(Svg *svg)
- : q(svg),
- theme(0),
- renderer(0),
- lastModified(0),
- multipleImages(false),
- themed(false),
- applyColors(false),
- cacheRendering(true)
- {
- }
-
- ~SvgPrivate()
- {
- eraseRenderer();
- }
-
- //This function is meant for the rects cache
- QString cacheId(const QString &elementId)
- {
- if (size.isValid() && size != naturalSize) {
- return QString("%3_%2_%1").arg(int(size.height()))
- .arg(int(size.width()))
- .arg(elementId);
- } else {
- return QString("%2_%1").arg("Natural")
- .arg(elementId);
- }
- }
-
- //This function is meant for the pixmap cache
- QString cachePath(const QString &path, const QSize &size)
- {
- return QString("%3_%2_%1_").arg(int(size.height()))
- .arg(int(size.width()))
- .arg(path);
- }
-
- bool setImagePath(const QString &imagePath)
- {
- bool isThemed = !QDir::isAbsolutePath(imagePath);
-
- // lets check to see if we're already set to this file
- if (isThemed == themed &&
- ((themed && themePath == imagePath) ||
- (!themed && path == imagePath))) {
- return false;
- }
-
- // if we don't have any path right now and are going to set one,
- // then lets not schedule a repaint because we are just initializing!
- bool updateNeeded = true; //!path.isEmpty() || !themePath.isEmpty();
-
- if (themed) {
- QObject::disconnect(actualTheme(), SIGNAL(themeChanged()),
- q, SLOT(themeChanged()));
- }
-
- themed = isThemed;
- path.clear();
- themePath.clear();
- localRectCache.clear();
-
- if (themed) {
- themePath = imagePath;
- QObject::connect(actualTheme(), SIGNAL(themeChanged()), q, SLOT(themeChanged()));
- } else if (QFile::exists(imagePath)) {
- path = imagePath;
- } else {
- kDebug() << "file '" << path << "' does not exist!";
- }
-
- // check if svg wants colorscheme applied
- QObject::disconnect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
- q, SLOT(colorsChanged()));
-
- checkApplyColorHint();
- if (applyColors && !actualTheme()->colorScheme()) {
- QObject::connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
- q, SLOT(colorsChanged()));
- }
-
- // also images with absolute path needs to have a natural size initialized,
- // even if looks a bit weird using Theme to store non-themed stuff
- if (themed || QFile::exists(imagePath)) {
- QRectF rect;
- bool found = actualTheme()->findInRectsCache(path, "_Natural", rect);
-
- if (!found) {
- createRenderer();
- naturalSize = renderer->defaultSize();
- //kDebug() << "natural size for" << path << "from renderer is" << naturalSize;
- actualTheme()->insertIntoRectsCache(path, "_Natural", QRectF(QPointF(0,0), naturalSize));
- } else {
- naturalSize = rect.size();
- //kDebug() << "natural size for" << path << "from cache is" << naturalSize;
- }
- }
-
- if (!themed) {
- QFile f(imagePath);
- QFileInfo info(f);
- lastModified = info.lastModified().toTime_t();
- }
-
- return updateNeeded;
- }
-
- Theme *actualTheme()
- {
- if (!theme) {
- theme = Plasma::Theme::defaultTheme();
- }
-
- return theme;
- }
-
- QPixmap findInCache(const QString &elementId, const QSizeF &s = QSizeF())
- {
- QSize size;
- if (elementId.isEmpty() || (multipleImages && s.isValid())) {
- size = s.toSize();
- } else {
- size = elementRect(elementId).size().toSize();
- }
-
- if (size.isEmpty()) {
- return QPixmap();
- }
-
- QString id = cachePath(path, size);
-
- if (!elementId.isEmpty()) {
- id.append(elementId);
- }
-
- //kDebug() << "id is " << id;
-
- QPixmap p;
- if (cacheRendering) {
- if (actualTheme()->findInCache(id, p, lastModified)) {
- //kDebug() << "found cached version of " << id << p.size();
- return p;
- }
- }
-
- //kDebug() << "didn't find cached version of " << id << ", so re-rendering";
-
- //kDebug() << "size for " << elementId << " is " << s;
- // we have to re-render this puppy
-
- p = QPixmap(size);
-
- p.fill(Qt::transparent);
- QPainter renderPainter(&p);
-
- createRenderer();
- if (elementId.isEmpty()) {
- renderer->render(&renderPainter);
- } else {
- renderer->render(&renderPainter, elementId);
- }
-
- renderPainter.end();
-
- // Apply current color scheme if the svg asks for it
- if (applyColors) {
- QImage itmp = p.toImage();
- KIconEffect::colorize(itmp, actualTheme()->color(Theme::BackgroundColor), 1.0);
- p = p.fromImage(itmp);
- }
-
- if (cacheRendering) {
- actualTheme()->insertIntoCache(id, p);
- }
-
- return p;
- }
-
- void createRenderer()
- {
- if (renderer) {
- return;
- }
-
- //kDebug() << kBacktrace();
- if (themed && path.isEmpty()) {
- Applet *applet = qobject_cast<Applet*>(q->parent());
- if (applet && applet->package()) {
- path = applet->package()->filePath("images", themePath + ".svg");
-
- if (path.isEmpty()) {
- path = applet->package()->filePath("images", themePath + ".svgz");
- }
- }
-
- if (path.isEmpty()) {
- path = actualTheme()->imagePath(themePath);
- if (path.isEmpty()) {
- kWarning() << "No image path found for" << themePath;
- }
- }
- }
-
- //kDebug() << "********************************";
- //kDebug() << "FAIL! **************************";
- //kDebug() << path << "**";
-
- QHash<QString, SharedSvgRenderer::Ptr>::const_iterator it = s_renderers.constFind(path);
-
- if (it != s_renderers.constEnd()) {
- //kDebug() << "gots us an existing one!";
- renderer = it.value();
- } else {
- if (path.isEmpty())
- renderer = new SharedSvgRenderer();
- else
- renderer = new SharedSvgRenderer(path);
- s_renderers[path] = renderer;
- }
-
- if (size == QSizeF()) {
- size = renderer->defaultSize();
- }
- }
-
- void eraseRenderer()
- {
- if (renderer && renderer.count() == 2) {
- // this and the cache reference it
- s_renderers.erase(s_renderers.find(path));
-
- if (theme) {
- theme->releaseRectsCache(path);
- }
- }
-
- renderer = 0;
- localRectCache.clear();
- }
-
- QRectF elementRect(const QString &elementId)
- {
- if (themed && path.isEmpty()) {
- path = actualTheme()->imagePath(themePath);
- }
-
- QString id = cacheId(elementId);
- if (localRectCache.contains(id)) {
- return localRectCache.value(id);
- }
-
- QRectF rect;
- bool found = actualTheme()->findInRectsCache(path, id, rect);
-
- if (found) {
- localRectCache.insert(id, rect);
- return rect;
- }
-
- return findAndCacheElementRect(elementId);
- }
-
- QRectF findAndCacheElementRect(const QString &elementId)
- {
- createRenderer();
- QRectF elementRect = renderer->elementExists(elementId) ?
- renderer->boundsOnElement(elementId) : QRectF();
- naturalSize = renderer->defaultSize();
- //kDebug() << "natural size for" << path << "is" << naturalSize;
- qreal dx = size.width() / naturalSize.width();
- qreal dy = size.height() / naturalSize.height();
-
- elementRect = QRectF(elementRect.x() * dx, elementRect.y() * dy,
- elementRect.width() * dx, elementRect.height() * dy);
-
- actualTheme()->insertIntoRectsCache(path, cacheId(elementId), elementRect);
- return elementRect;
- }
-
- QMatrix matrixForElement(const QString &elementId)
- {
- createRenderer();
- return renderer->matrixForElement(elementId);
- }
-
- void checkApplyColorHint()
- {
- applyColors = elementRect("hint-apply-color-scheme").isValid();
- }
-
- void themeChanged()
- {
- // check if new theme svg wants colorscheme applied
- bool wasApplyColors = applyColors;
- checkApplyColorHint();
- if (applyColors && actualTheme()->colorScheme()) {
- if (!wasApplyColors) {
- QObject::connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
- q, SLOT(colorsChanged()));
- }
- } else {
- QObject::disconnect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()),
- q, SLOT(colorsChanged()));
- }
-
- if (!themed) {
- return;
- }
-
- QString currentPath = themePath;
- themePath.clear();
- eraseRenderer();
- setImagePath(currentPath);
-
- //kDebug() << themePath << ">>>>>>>>>>>>>>>>>> theme changed";
- emit q->repaintNeeded();
- }
-
- void colorsChanged()
- {
- if (!applyColors) {
- return;
- }
-
- eraseRenderer();
- //kDebug() << "repaint needed from colorsChanged";
- emit q->repaintNeeded();
- }
-
- static QHash<QString, SharedSvgRenderer::Ptr> s_renderers;
-
- Svg *q;
- QPointer<Theme> theme;
- QHash<QString, QRectF> localRectCache;
- SharedSvgRenderer::Ptr renderer;
- QString themePath;
- QString path;
- QSizeF size;
- QSizeF naturalSize;
- unsigned int lastModified;
- bool multipleImages : 1;
- bool themed : 1;
- bool applyColors : 1;
- bool cacheRendering : 1;
-};
-
QHash<QString, SharedSvgRenderer::Ptr> SvgPrivate::s_renderers;
Svg::Svg(QObject *parent)
_______________________________________________
Plasma-devel mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/plasma-devel