From 0abc67a99faec44d46b0a12b8507956ab953ec88 Mon Sep 17 00:00:00 2001 From: Chinmoy Ranjan Pradhan Date: Tue, 2 Aug 2016 21:43:30 +0530 Subject: [PATCH] Add overlay support to Plasma IconItem. By default Plasma IconItem renders the icon without an overlay even when an overlay is required. This fixes this. REVIEW:128573 --- src/declarativeimports/core/iconitem.cpp | 34 +++++++++++++++++++++++- src/declarativeimports/core/iconitem.h | 11 ++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/declarativeimports/core/iconitem.cpp b/src/declarativeimports/core/iconitem.cpp index fae0330ca..29c7f05b5 100644 --- a/src/declarativeimports/core/iconitem.cpp +++ b/src/declarativeimports/core/iconitem.cpp @@ -19,7 +19,6 @@ */ #include "iconitem.h" - #include #include #include @@ -74,6 +73,9 @@ IconItem::IconItem(QQuickItem *parent) connect(this, &QQuickItem::windowChanged, this, &IconItem::schedulePixmapUpdate); + connect(this, SIGNAL(overlaysChanged()), + this, SLOT(schedulePixmapUpdate())); + //initialize implicit size to the Dialog size setImplicitWidth(KIconLoader::global()->currentSize(KIconLoader::Dialog)); setImplicitHeight(KIconLoader::global()->currentSize(KIconLoader::Dialog)); @@ -212,6 +214,22 @@ Plasma::Theme::ColorGroup IconItem::colorGroup() const return m_colorGroup; } + +void IconItem::setOverlays(const QStringList &overlays) +{ + if (overlays == m_overlays) { + return; + } + m_overlays = overlays; + emit overlaysChanged(); +} + +QStringList IconItem::overlays() const +{ + return m_overlays; +} + + bool IconItem::isActive() const { return m_active; @@ -451,6 +469,20 @@ void IconItem::loadPixmap() return; } + // Strangely KFileItem::overlays() returns empty string-values, so + // we need to check first whether an overlay must be drawn at all. + // It is more efficient to do it here, as KIconLoader::drawOverlays() + // assumes that an overlay will be drawn and has some additional + // setup time. + foreach (const QString& overlay, m_overlays) { + if (!overlay.isEmpty()) { + // There is at least one overlay, draw all overlays above m_pixmap + // and cancel the check + KIconLoader::global()->drawOverlays(m_overlays, result, KIconLoader::Desktop); + break; + } + } + if (!isEnabled()) { result = KIconLoader::global()->iconEffect()->apply(result, KIconLoader::Desktop, KIconLoader::DisabledState); } else if (m_active) { diff --git a/src/declarativeimports/core/iconitem.h b/src/declarativeimports/core/iconitem.h index 6a1d67c92..7ffaf8173 100644 --- a/src/declarativeimports/core/iconitem.h +++ b/src/declarativeimports/core/iconitem.h @@ -60,6 +60,11 @@ class IconItem : public QQuickItem */ Q_PROPERTY(Plasma::Theme::ColorGroup colorGroup READ colorGroup WRITE setColorGroup NOTIFY colorGroupChanged) + /** + * Specifies the overlay(s) for this icon + */ + Q_PROPERTY(QStringList overlays READ overlays WRITE setOverlays NOTIFY overlaysChanged) + /** * See QQuickItem::smooth */ @@ -119,6 +124,9 @@ public: void setColorGroup(Plasma::Theme::ColorGroup group); Plasma::Theme::ColorGroup colorGroup() const; + void setOverlays(const QStringList &overlays); + QStringList overlays() const; + bool isActive() const; void setActive(bool active); @@ -149,6 +157,7 @@ public: void componentComplete() Q_DECL_OVERRIDE; Q_SIGNALS: + void overlaysChanged(); void activeChanged(); void sourceChanged(); void smoothChanged(); @@ -193,6 +202,8 @@ private: QPixmap m_iconPixmap; QPixmap m_oldIconPixmap; + QStringList m_overlays; + Plasma::Theme::ColorGroup m_colorGroup; //animation on pixmap change