23 #include <KIconLoader>
24 #include <KIconEffect>
26 #include <QPropertyAnimation>
27 #include <QStyleOptionGraphicsItem>
29 #include <Plasma/PaintUtils>
39 m_animation =
new QPropertyAnimation(
this);
40 connect(m_animation, SIGNAL(valueChanged(QVariant)),
41 this, SLOT(valueChanged(QVariant)));
42 connect(m_animation, SIGNAL(finished()),
43 this, SLOT(animationFinished()));
44 m_animation->setTargetObject(
this);
45 m_animation->setEasingCurve(QEasingCurve::InOutQuad);
46 m_animation->setDuration(250);
48 setFlag(QGraphicsItem::ItemHasNoContents,
false);
50 connect(KIconLoader::global(), SIGNAL(iconLoaderSettingsChanged()),
52 connect(KIconLoader::global(), SIGNAL(iconLoaderSettingsChanged()),
56 connect(
this, SIGNAL(enabledChanged()),
57 this, SLOT(loadPixmap()));
71 if (source == m_source) {
77 if (source.canConvert<QIcon>()) {
78 m_icon = source.value<QIcon>();
79 m_imageIcon = QImage();
80 m_pixmapIcon = QPixmap();
84 }
else if (source.canConvert<QString>()) {
86 m_svgIcon =
new Plasma::Svg(
this);
88 const QString element = source.toString();
89 const QString filename = element.split(
'-').first();
91 m_svgIcon->setImagePath(
"toolbar-icons/" + filename);
94 if (!m_svgIcon->isValid() || !m_svgIcon->hasElement(element)) {
95 m_svgIcon->setImagePath(
"icons/" + filename);
97 m_svgIcon->setContainsMultipleImages(
true);
100 if (m_svgIcon->isValid() && m_svgIcon->hasElement(element)) {
104 m_icon = KIcon(element);
109 m_imageIcon = QImage();
110 m_pixmapIcon = QPixmap();
112 }
else if (source.canConvert<QPixmap>()) {
114 m_imageIcon = QImage();
115 m_pixmapIcon = source.value<QPixmap>();
119 }
else if (source.canConvert<QImage>()) {
121 m_imageIcon = source.value<QImage>();
122 m_pixmapIcon = QPixmap();
128 m_imageIcon = QImage();
129 m_pixmapIcon = QPixmap();
134 if (width() > 0 && height() > 0) {
154 if (m_active == active) {
169 QDeclarativeItem::setImplicitWidth(width);
176 return QDeclarativeItem::implicitWidth();
185 QDeclarativeItem::setImplicitHeight(height);
192 return QDeclarativeItem::implicitHeight();
197 if (smooth == m_smooth) {
211 return !m_icon.isNull() || m_svgIcon || !m_pixmapIcon.isNull() || !m_imageIcon.isNull();
214 void IconItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
219 if (m_iconPixmaps.isEmpty()) {
223 painter->setRenderHint(QPainter::Antialiasing, m_smooth);
224 painter->setRenderHint(QPainter::SmoothPixmapTransform, m_smooth);
226 const QRect destRect(QPointF(boundingRect().center() - QPointF(m_iconPixmaps.first().width()/2, m_iconPixmaps.first().height()/2)).toPoint(),
227 m_iconPixmaps.first().size());
229 if (m_animation->state() == QAbstractAnimation::Running) {
230 QPixmap result = m_iconPixmaps.first();
231 result = Plasma::PaintUtils::transition(result,
232 m_iconPixmaps.last(), m_animValue);
233 painter->drawPixmap(destRect, result);
236 painter->drawPixmap(destRect, m_iconPixmaps.first());
242 void IconItem::animationFinished()
244 while (m_iconPixmaps.count() > 1) {
245 m_iconPixmaps.pop_front();
249 void IconItem::valueChanged(
const QVariant &value)
251 m_animValue = value.toReal();
255 void IconItem::loadPixmap()
257 int size = qMin(width(), height());
260 if (m_svgIcon && m_svgIcon->imagePath().contains(
"icons/") &&
261 size > KIconLoader::SizeSmallMedium &&
262 size < KIconLoader::SizeMedium) {
266 }
else if (size < KIconLoader::SizeSmall) {
268 }
else if (size < KIconLoader::SizeSmallMedium) {
269 size = KIconLoader::SizeSmall;
270 }
else if (size < KIconLoader::SizeMedium) {
271 size = KIconLoader::SizeSmallMedium;
272 }
else if (size < KIconLoader::SizeLarge) {
273 size = KIconLoader::SizeMedium;
274 }
else if (size < KIconLoader::SizeHuge) {
275 size = KIconLoader::SizeLarge;
286 }
else if (m_svgIcon) {
287 m_svgIcon->resize(size, size);
288 result = m_svgIcon->pixmap(m_source.toString());
289 }
else if (!m_icon.isNull() && size>0) {
290 result = m_icon.pixmap(QSize(size, size));
291 }
else if (!m_pixmapIcon.isNull()) {
292 result = m_pixmapIcon;
293 }
else if (!m_imageIcon.isNull()) {
294 result = QPixmap::fromImage(m_imageIcon);
296 m_iconPixmaps.clear();
303 result = KIconLoader::global()->iconEffect()->apply(result, KIconLoader::Desktop, KIconLoader::DisabledState);
304 }
else if (m_active) {
305 result = KIconLoader::global()->iconEffect()->apply(result, KIconLoader::Desktop, KIconLoader::ActiveState);
309 while (m_iconPixmaps.count() > 1) {
310 m_iconPixmaps.pop_front();
313 m_iconPixmaps << result;
316 if (m_animation->state() == QAbstractAnimation::Running) {
318 m_iconPixmaps.pop_front();
319 }
else if (m_iconPixmaps.count() > 1) {
320 m_animation->setStartValue((qreal)0);
321 m_animation->setEndValue((qreal)1);
322 m_animation->start();
328 const QRectF &oldGeometry)
330 if (newGeometry.size() != oldGeometry.size()) {
331 m_iconPixmaps.clear();
332 if (newGeometry.width() > 0 && newGeometry.height() > 0) {
336 QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
340 #include "iconitem.moc"
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
void implicitWidthChanged()
void setSource(const QVariant &source)
void setImplicitHeight(qreal height)
void implicitHeightChanged()
IconItem(QDeclarativeItem *parent=0)
qreal implicitHeight() const
qreal implicitWidth() const
void setSmooth(const bool smooth)
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
void setActive(bool active)
void setImplicitWidth(qreal width)