diff --git a/src/declarativeimports/core/iconitem.h b/src/declarativeimports/core/iconitem.h --- a/src/declarativeimports/core/iconitem.h +++ b/src/declarativeimports/core/iconitem.h @@ -119,6 +119,10 @@ */ Q_PROPERTY(int paintedHeight READ paintedHeight NOTIFY paintedSizeChanged) + Q_PROPERTY(int implicitHeight READ implicitHeight WRITE setImplicitHeight2 NOTIFY implicitHeightChanged2) + + Q_PROPERTY(int implicitWidth READ implicitWidth WRITE setImplicitWidth2 NOTIFY implicitWidthChanged2) + public: IconItem(QQuickItem *parent = 0); ~IconItem(); @@ -155,6 +159,9 @@ void setStatus(Plasma::Svg::Status status); Plasma::Svg::Status status() const; + void setImplicitHeight2(int height); + void setImplicitWidth2(int height); + void updatePolish() Q_DECL_OVERRIDE; QSGNode* updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * updatePaintNodeData) Q_DECL_OVERRIDE; @@ -176,6 +183,8 @@ void colorGroupChanged(); void paintedSizeChanged(); void statusChanged(); + void implicitHeightChanged2(); + void implicitWidthChanged2(); private Q_SLOTS: void schedulePixmapUpdate(); @@ -210,6 +219,8 @@ bool m_sizeChanged; bool m_allowNextAnimation; bool m_blockNextAnimation; + bool m_implicitHeightSetByUser; + bool m_implicitWidthSetByUser; QPixmap m_iconPixmap; QPixmap m_oldIconPixmap; diff --git a/src/declarativeimports/core/iconitem.cpp b/src/declarativeimports/core/iconitem.cpp --- a/src/declarativeimports/core/iconitem.cpp +++ b/src/declarativeimports/core/iconitem.cpp @@ -49,6 +49,8 @@ m_sizeChanged(false), m_allowNextAnimation(false), m_blockNextAnimation(false), + m_implicitHeightSetByUser(false), + m_implicitWidthSetByUser(false), m_colorGroup(Plasma::Theme::NormalColorGroup), m_animValue(0) { @@ -75,6 +77,9 @@ connect(this, SIGNAL(overlaysChanged()), this, SLOT(schedulePixmapUpdate())); + connect(this, &IconItem::implicitWidthChanged, this, &IconItem::implicitWidthChanged2); + connect(this, &IconItem::implicitHeightChanged, this, &IconItem::implicitHeightChanged2); + updateImplicitSize(); } @@ -88,7 +93,13 @@ const QSize &s = m_imageIcon.size(); if (s.isValid()) { - setImplicitSize(s.width(), s.height()); + if (!m_implicitWidthSetByUser && !m_implicitHeightSetByUser) { + setImplicitSize(s.width(), s.height()); + } else if (!m_implicitWidthSetByUser) { + setImplicitWidth(s.width()); + } else if (!m_implicitHeightSetByUser) { + setImplicitHeight(s.height()); + } return; } @@ -105,15 +116,28 @@ s = m_svgIcon->size(); } if (s.isValid()) { - setImplicitSize(s.width(), s.height()); + if (!m_implicitWidthSetByUser && !m_implicitHeightSetByUser) { + setImplicitSize(s.width(), s.height()); + } else if (!m_implicitWidthSetByUser) { + setImplicitWidth(s.width()); + } else if (!m_implicitHeightSetByUser) { + setImplicitHeight(s.height()); + } return; } } // Fall back to initializing implicit size to the Dialog size. const int implicitSize = KIconLoader::global()->currentSize(KIconLoader::Dialog); - setImplicitSize(implicitSize, implicitSize); + + if (!m_implicitWidthSetByUser && !m_implicitHeightSetByUser) { + setImplicitSize(implicitSize, implicitSize); + } else if (!m_implicitWidthSetByUser) { + setImplicitWidth(implicitSize); + } else if (!m_implicitHeightSetByUser) { + setImplicitHeight(implicitSize); + } } void IconItem::setSource(const QVariant &source) @@ -418,6 +442,20 @@ return m_status; } +void IconItem::setImplicitHeight2(int height) +{ + m_implicitHeightSetByUser = true; + setImplicitHeight(height); + emit implicitHeightChanged2(); +} + +void IconItem::setImplicitWidth2(int width) +{ + m_implicitWidthSetByUser = true; + setImplicitWidth(width); + emit implicitWidthChanged2(); +} + void IconItem::updatePolish() { QQuickItem::updatePolish();