• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

parley

  • sources
  • kde-4.12
  • kdeedu
  • parley
  • src
  • practice
themedbackgroundrenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  Copyright 2010 Daniel Laidig <laidig@kde.org>
3  ***************************************************************************/
4 
5 /***************************************************************************
6  * *
7  * This program is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  ***************************************************************************/
13 
14 #include "themedbackgroundrenderer.h"
15 
16 #include "settings/kgametheme/kgametheme.h"
17 #include <kdebug.h>
18 #include <kstandarddirs.h>
19 #include <unistd.h>
20 
21 #include <QtConcurrentRun>
22 #include <QPainter>
23 #include <QMargins>
24 #include <QPalette>
25 #include <QApplication>
26 
27 using namespace Practice;
28 
29 ThemedBackgroundRenderer::ThemedBackgroundRenderer(QObject* parent, const QString& cacheFilename)
30  : QObject(parent), m_haveCache(true), m_queuedRequest(false), m_isFastScaledRender(true)
31 {
32  m_theme = new KGameTheme();
33  m_cache.setSaveFilename(KStandardDirs::locateLocal("appdata", cacheFilename));
34  m_timer.setSingleShot(true);
35  m_timer.setInterval(1000);
36  connect(&m_timer, SIGNAL(timeout()), this, SLOT(updateBackgroundTimeout()));
37  connect(&m_watcher, SIGNAL(finished()), this, SLOT(renderingFinished()));
38 }
39 
40 ThemedBackgroundRenderer::~ThemedBackgroundRenderer()
41 {
42  if (m_future.isRunning()) {
43  kDebug() << "Waiting for rendering to finish";
44  m_future.waitForFinished();
45  }
46  m_cache.saveCache();
47  delete m_theme;
48 }
49 
50 void ThemedBackgroundRenderer::setTheme(const QString &theme)
51 {
52  if(!m_theme->load(theme)) {
53  kDebug() << "could not load theme" << theme;
54  }
55  m_renderer.load(m_theme->graphics());
56  m_cache.setFilenames(QStringList(m_theme->graphics()) << m_theme->path());
57  m_haveCache = !m_cache.isEmpty();
58  m_lastScaledRenderRects.clear();
59  m_lastFullRenderRects.clear();
60  m_rectMappings.clear();
61 }
62 
63 void ThemedBackgroundRenderer::clearRects()
64 {
65  m_rects.clear();
66  m_rectMappings.clear();
67 }
68 
69 void ThemedBackgroundRenderer::addRect(const QString& name, const QRect& rect)
70 {
71  m_rects.append(qMakePair<QString, QRect>(name, rect));
72  if (!m_rectMappings.contains(name)) {
73  QString mapped = m_theme->property("X-Parley-"+name);
74  m_rectMappings[name] = mapped.isEmpty() ? name : mapped;
75  }
76 }
77 
78 QPixmap ThemedBackgroundRenderer::getScaledBackground()
79 {
80  if (m_rects.isEmpty() || m_rects[0].second.isEmpty()) {
81  return QPixmap();
82  }
83  if (m_future.isRunning() || m_future.resultCount()) {
84  return QPixmap();
85  }
86  if (m_cache.isEmpty()) {
87  m_timer.start(0);
88  return QPixmap();
89  }
90  if (m_lastScaledRenderRects == m_rects) {
91  // we already renderered an image with that exact sizing, no need to waste resources on it again
92  return QPixmap();
93  }
94 
95  QFutureWatcher<QImage> watcher;
96  m_future = QtConcurrent::run(this, &ThemedBackgroundRenderer::renderBackground, true);
97  watcher.setFuture(m_future);
98  watcher.waitForFinished();
99 
100  QPixmap result = QPixmap::fromImage(m_future.result());
101  m_future = QFuture<QImage>();
102  m_lastScaledRenderRects = m_rects;
103  return result;
104 }
105 
106 QColor ThemedBackgroundRenderer::fontColor(const QString& context, const QColor& fallback)
107 {
108  QString text = m_theme->property("X-Parley-Font-Color-"+context).toLower();
109  if (text.length() == 6 && text.contains(QRegExp("[0-9a-f]{6}"))) {
110  return QColor(text.mid(0,2).toInt(0,16),
111  text.mid(2,2).toInt(0,16),
112  text.mid(4,2).toInt(0,16));
113 
114  }
115 
116  return fallback;
117 }
118 
119 void ThemedBackgroundRenderer::updateBackground()
120 {
121  if (m_rects.isEmpty() || m_rects[0].second.isEmpty()) {
122  return;
123  }
124  m_timer.start();
125 
126 }
127 
128 void ThemedBackgroundRenderer::updateBackgroundTimeout()
129 {
130  bool fastScale = false;
131  if (m_future.isRunning()) {
132  m_timer.start(); // restart the timer again
133  return;
134  }
135  if (m_lastFullRenderRects == m_rects && m_lastScaledRenderRects == m_rects) {
136  // we already renderered an image with that exact sizing, no need to waste resources on it again
137  return;
138  }
139  m_future = QtConcurrent::run(this, &ThemedBackgroundRenderer::renderBackground, fastScale);
140  m_watcher.setFuture(m_future);
141  m_lastFullRenderRects = m_rects;
142 }
143 
144 void ThemedBackgroundRenderer::renderingFinished()
145 {
146  if(!m_future.resultCount()) {
147  //kDebug() << "there is no image!";
148  return;
149  }
150  emit backgroundChanged(QPixmap::fromImage(m_future.result()));
151  m_future = QFuture<QImage>();
152 }
153 
154 QSizeF ThemedBackgroundRenderer::getSizeForId(const QString& id)
155 {
156  if (!m_renderer.elementExists(id))
157  return QSizeF();
158  return m_renderer.boundsOnElement(id).size();
159 }
160 
161 QRectF ThemedBackgroundRenderer::getRectForId(const QString& id)
162 {
163  if (!m_renderer.elementExists(id))
164  return QRectF();
165  return m_renderer.boundsOnElement(id);
166 }
167 
168 QPixmap ThemedBackgroundRenderer::getPixmapForId(const QString& id, QSize size)
169 {
170  if (!m_renderer.elementExists(id))
171  return QPixmap();
172  QRectF itemRect = m_renderer.boundsOnElement(id);
173  if (itemRect.isNull())
174  return QPixmap();
175  if (size.isEmpty())
176  size = itemRect.size().toSize();
177 
178  if (m_cache.imageSize(id) != size) {
179  QImage image(size, QImage::Format_ARGB32_Premultiplied);
180  image.fill(QColor(Qt::transparent).rgba());
181  QPainter p(&image);
182  m_renderer.render(&p, id, QRectF(QPointF(0,0), size));
183  m_cache.updateImage(id, image);
184  return QPixmap::fromImage(image);
185  } else {
186  return QPixmap::fromImage(m_cache.getImage(id));
187  }
188 }
189 
190 QMargins ThemedBackgroundRenderer::contentMargins()
191 {
192  QString rect;
193  if (!m_rects.empty()) {
194  rect = m_rects.at(0).first;
195  }
196  if (m_rectMappings.contains(rect)) {
197  rect = m_rectMappings.value(rect);
198  }
199  QMargins margins;
200  if (m_renderer.elementExists(rect+"-border-topleft"))
201  margins.setTop(m_renderer.boundsOnElement(rect+"-border-topleft").toAlignedRect().height());
202  if (m_renderer.elementExists(rect+"-border-bottomleft"))
203  margins.setBottom(m_renderer.boundsOnElement(rect+"-border-bottomleft").toAlignedRect().height());
204  if (m_renderer.elementExists(rect+"-border-topleft"))
205  margins.setLeft(m_renderer.boundsOnElement(rect+"-border-topleft").toAlignedRect().width());
206  if (m_renderer.elementExists(rect+"-border-topright"))
207  margins.setRight(m_renderer.boundsOnElement(rect+"-border-topright").toAlignedRect().width());
208  return margins;
209 }
210 
211 QImage ThemedBackgroundRenderer::renderBackground(bool fastScale)
212 {
213  m_isFastScaledRender = false;
214 
215  QTime t = QTime::currentTime();
216  QImage image(m_rects[0].second.size(), QImage::Format_ARGB32_Premultiplied);
217  image.fill(QColor(Qt::transparent).rgba());
218  QPainter p(&image);
219 
220  QPair<QString, QRect> rect;
221  Q_FOREACH(rect, m_rects) {
222  if (!m_rects.isEmpty() && rect == m_rects[0]) {
223  QMargins margins = contentMargins();
224  rect.second = QRect(QPoint(margins.left(),margins.top()), rect.second.size()-QSize(margins.right()+margins.left(), margins.bottom()+margins.top()));
225  }
226  renderRect(rect.first, rect.second, &p, fastScale);
227  }
228 
229  //kDebug() << "image rendered, time:" << t.elapsed();
230  return image;
231 }
232 
233 void ThemedBackgroundRenderer::renderRect(const QString& name, const QRect& rect, QPainter *p, bool fastScale)
234 {
235  renderItem(name, "center", rect, p, fastScale, Rect, Qt::IgnoreAspectRatio, Center, Centered, true);
236  renderItem(name, "center-ratio", rect, p, fastScale, Rect, Qt::IgnoreAspectRatio, Center, Centered, true);
237  renderItem(name, "center-noscale", rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, Center, Centered, true);
238 
239  renderItem(name, "border-topleft", rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, Top, Corner, false);
240  renderItem(name, "border-topright", rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, Right, Corner, false);
241  renderItem(name, "border-bottomleft", rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, Left, Corner, false);
242  renderItem(name, "border-bottomright", rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, Bottom, Corner, false);
243 
244  QStringList edges;
245  edges << "top" << "bottom" << "left" << "right";
246  Q_FOREACH(const QString& edge, edges) {
247  ScaleBase scaleBase;
248  Edge alignEdge;
249  if(edge == QLatin1String("top")) {
250  alignEdge = Top;
251  scaleBase = Horizontal;
252  } else if(edge == QLatin1String("bottom")) {
253  alignEdge = Bottom;
254  scaleBase = Horizontal;
255  } else if(edge == QLatin1String("right")) {
256  alignEdge = Right;
257  scaleBase = Vertical;
258  } else {
259  alignEdge = Left;
260  scaleBase = Vertical;
261  }
262  for(int inside = 1; inside>=0; inside--) {
263  renderItem(name, QString(inside?"inside":"border")+"-"+edge, rect, p, fastScale, scaleBase, Qt::IgnoreAspectRatio, alignEdge, Centered, inside);
264  renderItem(name, QString(inside?"inside":"border")+"-"+edge+"-ratio", rect, p, fastScale, scaleBase, Qt::KeepAspectRatio, alignEdge, Centered, inside);
265  renderItem(name, QString(inside?"inside":"border")+"-"+edge+"-noscale", rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, alignEdge, Centered, inside);
266  renderItem(name, QString(inside?"inside":"border")+"-"+edge+"-repeat", rect, p, fastScale, scaleBase, Qt::IgnoreAspectRatio, alignEdge, Repeated, inside);
267  renderItem(name, QString(inside?"inside":"border")+"-"+edge+"-"+(scaleBase==Vertical?"top":"left"), rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, alignEdge, LeftTop, inside);
268  renderItem(name, QString(inside?"inside":"border")+"-"+edge+"-"+(scaleBase==Vertical?"bottom":"right"), rect, p, fastScale, NoScale, Qt::IgnoreAspectRatio, alignEdge, RightBottom, inside);
269  }
270  }
271 }
272 
273 void ThemedBackgroundRenderer::renderItem(const QString& idBase, const QString& idSuffix, const QRect& rect, QPainter *p, bool fastScale, ScaleBase scaleBase, Qt::AspectRatioMode aspectRatio, Edge edge, Align align, bool inside)
274 {
275  // the id without the mapping, which we need to use for caching
276  // (otherwise, images could share a place in the cache which makes it useless if they have different sizes)
277  QString id = idBase+'-'+idSuffix;
278  // the id according to the mapping specified in the desktop file
279  QString mappedId = m_rectMappings.contains(idBase)? m_rectMappings.value(idBase)+'-'+idSuffix : id;
280 
281  if (!m_renderer.elementExists(mappedId))
282  return;
283  QRectF itemRectF = m_renderer.boundsOnElement(mappedId);
284  if (itemRectF.isNull() || rect.isNull())
285  return;
286 
287  //kDebug() << "draw item" << id;
288 // kDebug() << "original item rect:" << itemRect << m_renderer.boundsOnElement(id);
289  QRect itemRect = scaleRect(itemRectF, rect, scaleBase, aspectRatio);
290 // kDebug() << "scaled" << itemRect;
291  itemRect = alignRect(itemRect, rect, edge, align, inside);
292 // kDebug() << "aligned" << itemRect;
293 
294  QImage image;
295  if (m_cache.imageSize(id) == itemRect.size()) {
296  // kDebug() << "found in cache:" << id;
297  image = m_cache.getImage(id);
298  } else if(fastScale && !m_cache.imageSize(id).isEmpty()) {
299  // kDebug() << "FAST SCALE for:" << id;
300  image = m_cache.getImage(id).scaled(itemRect.size(), Qt::IgnoreAspectRatio, Qt::FastTransformation);
301  m_isFastScaledRender = true;
302  } else {
303  // kDebug() << "NOT IN CACHE, render svg:" << id;
304  image = QImage(itemRect.size(), QImage::Format_ARGB32_Premultiplied);
305  image.fill(QColor(Qt::transparent).rgba());
306  QPainter painter(&image);
307  if(align == Repeated) {
308  QImage tile(itemRectF.toRect().size(), QImage::Format_ARGB32_Premultiplied);
309  tile.fill(QColor(Qt::transparent).rgba());
310  QPainter tilePainter(&tile);
311  m_renderer.render(&tilePainter, mappedId, QRect(QPoint(0, 0), tile.size()));
312  painter.fillRect(image.rect(), QBrush(tile));
313  } else if(aspectRatio == Qt::KeepAspectRatioByExpanding) {
314  m_renderer.render(&painter, mappedId, QRect(QPoint(0, 0), itemRect.size()));
315  painter.end();
316  QRect croppedRect = rect;
317  croppedRect.moveCenter(itemRect.center());
318  image = image.copy(croppedRect);
319  } else {
320  m_renderer.render(&painter, mappedId, QRect(QPoint(0, 0), itemRect.size()));
321  }
322  m_cache.updateImage(id, image);
323  m_haveCache = true;
324  }
325  p->drawImage(itemRect.topLeft(), image);
326 }
327 
328 QRect ThemedBackgroundRenderer::scaleRect(QRectF itemRect, const QRect& baseRect, ScaleBase scaleBase, Qt::AspectRatioMode aspectRatio)
329 {
330  qreal verticalFactor = 0;
331  qreal horizontalFactor = 0;
332  switch (scaleBase) {
333  case NoScale:
334  return itemRect.toRect();
335  case Horizontal:
336  switch (aspectRatio) {
337  case Qt::IgnoreAspectRatio:
338  itemRect.setWidth(baseRect.width());
339  return itemRect.toRect();
340  case Qt::KeepAspectRatio:
341  horizontalFactor = baseRect.width()/itemRect.width();
342  itemRect.setWidth(baseRect.width());
343  itemRect.setHeight(itemRect.height()*horizontalFactor);
344  return itemRect.toRect();
345  case Qt::KeepAspectRatioByExpanding:
346  kWarning() << "KeepAspectRatioByExpanding only works for the center";
347  return itemRect.toRect();
348  }
349  break;
350  case Vertical:
351  switch (aspectRatio) {
352  case Qt::IgnoreAspectRatio:
353  itemRect.setHeight(baseRect.height());
354  return itemRect.toRect();
355  case Qt::KeepAspectRatio:
356  verticalFactor = baseRect.height()/itemRect.height();
357  itemRect.setHeight(baseRect.height());
358  itemRect.setWidth(itemRect.width()*verticalFactor);
359  return itemRect.toRect();
360  case Qt::KeepAspectRatioByExpanding:
361  kWarning() << "KeepAspectRatioByExpanding only works for the center";
362  return itemRect.toRect();
363  }
364  break;
365  case Rect:
366  switch (aspectRatio) {
367  case Qt::IgnoreAspectRatio:
368  itemRect.setWidth(baseRect.width());
369  itemRect.setHeight(baseRect.height());
370  return itemRect.toRect();
371  case Qt::KeepAspectRatio:
372  horizontalFactor = baseRect.width()/itemRect.width();
373  verticalFactor = baseRect.height()/itemRect.height();
374  if (verticalFactor < horizontalFactor) {
375  itemRect.setHeight(baseRect.height());
376  itemRect.setWidth(itemRect.width()*verticalFactor);
377  } else {
378  itemRect.setWidth(baseRect.width());
379  itemRect.setHeight(itemRect.height()*horizontalFactor);
380  }
381  return itemRect.toRect();
382  case Qt::KeepAspectRatioByExpanding:
383  horizontalFactor = baseRect.width()/itemRect.width();
384  verticalFactor = baseRect.height()/itemRect.height();
385  if (verticalFactor > horizontalFactor) {
386  itemRect.setHeight(baseRect.height());
387  itemRect.setWidth(itemRect.width()*verticalFactor);
388  } else {
389  itemRect.setWidth(baseRect.width());
390  itemRect.setHeight(itemRect.height()*horizontalFactor);
391  }
392  return itemRect.toRect();
393  }
394  break;
395  }
396  // kDebug() << "unhandled scaling option";
397  return itemRect.toRect();
398 }
399 
400 QRect ThemedBackgroundRenderer::alignRect(QRect itemRect, const QRect &baseRect, Edge edge, Align align, bool inside)
401 {
402  if (edge == Center) {
403  int x = baseRect.x() + (baseRect.width()-itemRect.width())/2;
404  int y = baseRect.y() + (baseRect.height()-itemRect.height())/2;
405  itemRect.moveTo(x, y);
406  return itemRect;
407  }
408 
409  if (edge == Top || edge == Bottom) {
410  // set x coordinate
411  int x = 0;
412  switch(align) {
413  case Corner:
414  if (edge == Top) {
415  x = baseRect.x() - itemRect.width();
416  } else {
417  x = baseRect.x() + baseRect.width();
418  }
419  break;
420  case LeftTop:
421  x = baseRect.x();
422  break;
423  case Centered:
424  case Repeated:
425  x = baseRect.x() + (baseRect.width()-itemRect.width())/2;
426  break;
427  case RightBottom:
428  x = baseRect.x() + baseRect.width() - itemRect.width();
429  break;
430  }
431  // set y coordinate
432  int y = baseRect.y();
433  if (edge == Bottom) {
434  y += baseRect.height()-itemRect.height();
435  }
436  if ((!inside) && edge == Top) {
437  y -= itemRect.height();
438  } else if(!inside) {
439  y += itemRect.height();
440  }
441  itemRect.moveTo(x, y);
442  return itemRect;
443  } else if (edge == Left || edge == Right) {
444  // set y coordinate
445  int y = 0;
446  switch(align) {
447  case Corner:
448  if (edge == Right) {
449  y = baseRect.y() - itemRect.height();
450  } else {
451  y = baseRect.y() + baseRect.height();
452  }
453  break;
454  case LeftTop:
455  y = baseRect.y();
456  break;
457  case Centered:
458  case Repeated:
459  y = baseRect.y() + (baseRect.height()-itemRect.height())/2;
460  break;
461  case RightBottom:
462  y = baseRect.y() + baseRect.height() - itemRect.height();
463  break;
464  }
465  // set x coordinate
466  int x = baseRect.x();
467  if (edge == Right) {
468  x += baseRect.width()-itemRect.width();
469  }
470  if ((!inside) && edge == Left) {
471  x -= itemRect.width();
472  } else if (!inside) {
473  x += itemRect.width();
474  }
475  itemRect.moveTo(x, y);
476  return itemRect;
477  }
478  // kDebug() << "unhandled alignment option";
479  return itemRect;
480 }
481 
482 #include "themedbackgroundrenderer.moc"
Practice::ImageCache::setSaveFilename
void setSaveFilename(const QString &filename)
Definition: imagecache.h:38
Practice::ThemedBackgroundRenderer::NoScale
Definition: themedbackgroundrenderer.h:36
Practice::ThemedBackgroundRenderer::LeftTop
Definition: themedbackgroundrenderer.h:52
Practice::ThemedBackgroundRenderer::updateBackgroundTimeout
void updateBackgroundTimeout()
Definition: themedbackgroundrenderer.cpp:128
KGameTheme::path
QString path() const
Definition: kgametheme.cpp:140
Practice::ThemedBackgroundRenderer::getScaledBackground
QPixmap getScaledBackground()
Definition: themedbackgroundrenderer.cpp:78
Practice::ThemedBackgroundRenderer::Edge
Edge
Definition: themedbackgroundrenderer.h:42
KGameTheme
Class for loading theme files.
Definition: kgametheme.h:42
Practice::ThemedBackgroundRenderer::Top
Definition: themedbackgroundrenderer.h:43
Practice::ThemedBackgroundRenderer::contentMargins
QMargins contentMargins()
Definition: themedbackgroundrenderer.cpp:190
QObject
KGameTheme::graphics
virtual QString graphics() const
Definition: kgametheme.cpp:158
Practice::ThemedBackgroundRenderer::Left
Definition: themedbackgroundrenderer.h:45
Practice::ThemedBackgroundRenderer::fontColor
QColor fontColor(const QString &context, const QColor &fallback)
Definition: themedbackgroundrenderer.cpp:106
Practice::ThemedBackgroundRenderer::Corner
Definition: themedbackgroundrenderer.h:51
Practice::ThemedBackgroundRenderer::addRect
void addRect(const QString &name, const QRect &rect)
Definition: themedbackgroundrenderer.cpp:69
Practice::ThemedBackgroundRenderer::getSizeForId
QSizeF getSizeForId(const QString &id)
Definition: themedbackgroundrenderer.cpp:154
Practice::ThemedBackgroundRenderer::getRectForId
QRectF getRectForId(const QString &id)
Definition: themedbackgroundrenderer.cpp:161
Practice::ImageCache::saveCache
void saveCache()
Definition: imagecache.cpp:91
KGameTheme::load
virtual bool load(const QString &file)
Load a specific theme file.
Definition: kgametheme.cpp:66
Practice::ImageCache::imageSize
QSize imageSize(const QString &id)
Definition: imagecache.cpp:44
Practice::ImageCache::updateImage
void updateImage(const QString &id, const QImage &image)
Definition: imagecache.cpp:39
Practice::ThemedBackgroundRenderer::setTheme
void setTheme(const QString &theme)
Definition: themedbackgroundrenderer.cpp:50
Practice::ImageCache::getImage
QImage getImage(const QString &id)
Definition: imagecache.cpp:52
Practice::ThemedBackgroundRenderer::Repeated
Definition: themedbackgroundrenderer.h:54
Practice::ThemedBackgroundRenderer::ThemedBackgroundRenderer
ThemedBackgroundRenderer(QObject *parent, const QString &cacheFilename)
Definition: themedbackgroundrenderer.cpp:29
Practice::ImageCache::isEmpty
bool isEmpty()
Definition: imagecache.h:36
Practice::ThemedBackgroundRenderer::Rect
Definition: themedbackgroundrenderer.h:39
Practice::ThemedBackgroundRenderer::backgroundChanged
void backgroundChanged(QPixmap pixmap)
Practice::ThemedBackgroundRenderer::RightBottom
Definition: themedbackgroundrenderer.h:55
Practice::ThemedBackgroundRenderer::ScaleBase
ScaleBase
Definition: themedbackgroundrenderer.h:35
Practice::ThemedBackgroundRenderer::updateBackground
void updateBackground()
Definition: themedbackgroundrenderer.cpp:119
Practice::ThemedBackgroundRenderer::getPixmapForId
QPixmap getPixmapForId(const QString &id, QSize size=QSize())
Definition: themedbackgroundrenderer.cpp:168
Practice::ThemedBackgroundRenderer::Center
Definition: themedbackgroundrenderer.h:47
kgametheme.h
Practice::ThemedBackgroundRenderer::Horizontal
Definition: themedbackgroundrenderer.h:37
Practice::ThemedBackgroundRenderer::~ThemedBackgroundRenderer
~ThemedBackgroundRenderer()
Definition: themedbackgroundrenderer.cpp:40
Practice::ThemedBackgroundRenderer::Centered
Definition: themedbackgroundrenderer.h:53
Practice::ThemedBackgroundRenderer::clearRects
void clearRects()
Definition: themedbackgroundrenderer.cpp:63
Practice::ThemedBackgroundRenderer::Bottom
Definition: themedbackgroundrenderer.h:44
themedbackgroundrenderer.h
Practice::ThemedBackgroundRenderer::Right
Definition: themedbackgroundrenderer.h:46
Practice::ImageCache::setFilenames
void setFilenames(const QStringList &filename)
Definition: imagecache.cpp:25
Practice::ThemedBackgroundRenderer::renderingFinished
void renderingFinished()
Definition: themedbackgroundrenderer.cpp:144
Practice::ThemedBackgroundRenderer::Vertical
Definition: themedbackgroundrenderer.h:38
KGameTheme::property
QString property(const QString &key) const
Definition: kgametheme.cpp:128
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:42:06 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

parley

Skip menu "parley"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal