00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <QImage>
00026 #include <QPixmap>
00027 #include <QPainter>
00028 #include <QColor>
00029 #include <QRectF>
00030
00031
00032 #include <kdebug.h>
00033 #include <kstandarddirs.h>
00034
00035
00036 #include "thememanager.h"
00037
00038
00039 ThemeManager::ThemeManager(QString themefile, QObject* parent, int initialSize)
00040 : QObject(parent)
00041 {
00042 mScale = initialSize;
00043 updateTheme(themefile);
00044 }
00045
00046
00047
00048 void ThemeManager::registerTheme(Themable* ob)
00049 {
00050 mObjects[ob] = 1;
00051 }
00052
00053
00054
00055 void ThemeManager::unregisterTheme(Themable* ob)
00056 {
00057 mObjects.remove(ob);
00058 }
00059
00060
00061
00062 void ThemeManager::updateTheme(Themable* ob)
00063 {
00064 ob->changeTheme();
00065 }
00066
00067
00068
00069
00070 void ThemeManager::updateTheme(QString themefile)
00071 {
00072
00073 mPixmapCache.clear();
00074
00075
00076 QString rcfile = KStandardDirs::locate("data", themefile);
00077 kDebug() << "ThemeManager LOAD with theme "<<rcfile << endl;
00078
00079
00080 mConfig = new KConfig(rcfile, KConfig::NoGlobals);
00081 QString svgfile = config("general").readEntry("svgfile");
00082 svgfile = KStandardDirs::locate("data", svgfile);
00083 kDebug() << "Reading SVG master file = " << svgfile << endl;
00084
00085
00086 mRenderer = new QSvgRenderer(this);
00087 bool result = mRenderer->load(svgfile);
00088 if (!result)
00089 {
00090 kFatal() << "Cannot open file " << svgfile << endl;
00091 }
00092 kDebug() << "Renderer " << mRenderer<<" = " << result << endl;
00093
00094
00095 QHashIterator<Themable*, int> it(mObjects);
00096 while (it.hasNext())
00097 {
00098 it.next();
00099 Themable* ob = it.key();
00100 ob->changeTheme();
00101 }
00102 }
00103
00104
00105
00106 void ThemeManager::rescale(int scale)
00107 {
00108 if (scale==mScale) return;
00109 mScale = scale;
00110 kDebug() << "Rescale to " << scale<<endl;
00111
00112 QHashIterator<Themable*, int> it(mObjects);
00113 while (it.hasNext())
00114 {
00115 it.next();
00116 Themable* ob = it.key();
00117 ob->changeTheme();
00118 }
00119 }
00120
00121
00122
00123 double ThemeManager::getScale()
00124 {
00125 return (double)mScale;
00126 }
00127
00128
00129
00130 KConfigGroup ThemeManager::config(QString id)
00131 {
00132 KConfigGroup grp = mConfig->group(id);
00133 return grp;
00134 }
00135
00136
00137
00138 const QPixmap ThemeManager::getPixmap(QString svgid, QSize size)
00139 {
00140 if (size.width() < 1 || size.height() < 1)
00141 kFatal() << "ThemeManager::getPixmap Cannot create svgid ID " << svgid << " with zero size " << size << endl;
00142
00143 QPixmap pixmap;
00144
00145
00146 if (mPixmapCache.contains(svgid))
00147 {
00148 pixmap = mPixmapCache[svgid];
00149 if (pixmap.size() == size)
00150 {
00151 return pixmap;
00152 }
00153 }
00154
00155
00156 QImage image(size, QImage::Format_ARGB32_Premultiplied);
00157 image.fill(0);
00158 QPainter p(&image);
00159 mRenderer->render(&p, svgid);
00160 pixmap = QPixmap::fromImage(image);
00161 if (pixmap.isNull())
00162 kFatal() << "ThemeManager::getPixmap Cannot load svgid ID " << svgid << endl;
00163
00164
00165 mPixmapCache[svgid] = pixmap;
00166
00167 return pixmap;
00168 }
00169
00170
00171
00172 const QPixmap ThemeManager::getPixmap(QString svgid, double width)
00173 {
00174 QRectF rect = mRenderer->boundsOnElement(svgid);
00175 double factor = width/rect.width();
00176 QSize size = QSize(int(width), int(rect.height()*factor));
00177 return getPixmap(svgid, size);
00178 }
00179
00180
00181
00182
00183 const QPixmap ThemeManager::getPixmap(QString svgid, QString svgref, double refwidth)
00184 {
00185 QRectF refrect = mRenderer->boundsOnElement(svgref);
00186 QRectF rect = mRenderer->boundsOnElement(svgid);
00187 double factor = refwidth/refrect.width();
00188 QSize size = QSize(int(rect.width()*factor), int(rect.height()*factor));
00189 return getPixmap(svgid, size);
00190 }
00191
00192
00193
00194
00195
00196 Themable::Themable()
00197 {
00198 mScale = 1.0;
00199 mThemeManager = 0;
00200 }
00201
00202
00203
00204
00205 Themable::Themable(QString id, ThemeManager* thememanager)
00206 {
00207 mScale = 1.0;
00208 mId = id;
00209 mThemeManager = thememanager;
00210 if (!thememanager) return;
00211 thememanager->registerTheme(this);
00212 }
00213
00214
00215
00216 Themable::~Themable()
00217 {
00218 if (mThemeManager) mThemeManager->unregisterTheme(this);
00219 }
00220
00221
00222