File indexing completed on 2024-05-19 15:09:25

0001 /*
0002     SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "qiconitem.h"
0009 
0010 #include <QIcon>
0011 #include <QQuickWindow>
0012 #include <quickaddons/imagetexturescache.h>
0013 #include <quickaddons/managedtexturenode.h>
0014 
0015 #if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 101)
0016 
0017 Q_GLOBAL_STATIC(ImageTexturesCache, s_iconImageCache)
0018 
0019 QIconItem::QIconItem(QQuickItem *parent)
0020     : QQuickItem(parent)
0021     , m_smooth(false)
0022     , m_state(DefaultState)
0023     , m_changed(false)
0024 {
0025     setFlag(ItemHasContents, true);
0026 }
0027 
0028 QIconItem::~QIconItem()
0029 {
0030 }
0031 
0032 void QIconItem::setIcon(const QVariant &icon)
0033 {
0034     if (icon.canConvert<QIcon>()) {
0035         m_icon = icon.value<QIcon>();
0036     } else if (icon.canConvert<QString>()) {
0037         m_icon = QIcon::fromTheme(icon.toString());
0038     } else {
0039         m_icon = QIcon();
0040     }
0041     m_changed = true;
0042     update();
0043     Q_EMIT iconChanged();
0044 }
0045 
0046 QIcon QIconItem::icon() const
0047 {
0048     return m_icon;
0049 }
0050 
0051 QIconItem::State QIconItem::state() const
0052 {
0053     return m_state;
0054 }
0055 
0056 void QIconItem::setState(QIconItem::State state)
0057 {
0058     if (m_state == state) {
0059         return;
0060     }
0061 
0062     m_state = state;
0063     m_changed = true;
0064     Q_EMIT stateChanged(state);
0065     update();
0066 }
0067 
0068 bool QIconItem::enabled() const
0069 {
0070     return (m_state == DefaultState);
0071 }
0072 
0073 void QIconItem::setEnabled(bool enabled)
0074 {
0075     if (enabled) {
0076         setState(DefaultState);
0077     } else {
0078         setState(DisabledState);
0079     }
0080 }
0081 
0082 int QIconItem::implicitWidth() const
0083 {
0084     return 32;
0085 }
0086 
0087 int QIconItem::implicitHeight() const
0088 {
0089     return 32;
0090 }
0091 
0092 void QIconItem::setSmooth(const bool smooth)
0093 {
0094     if (smooth == m_smooth) {
0095         return;
0096     }
0097     m_smooth = smooth;
0098     m_changed = true;
0099     update();
0100     Q_EMIT smoothChanged();
0101 }
0102 
0103 bool QIconItem::smooth() const
0104 {
0105     return m_smooth;
0106 }
0107 
0108 QSGNode *QIconItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData * /*data*/)
0109 {
0110     if (m_icon.isNull()) {
0111         delete node;
0112         return nullptr;
0113     }
0114 
0115     if (m_changed || node == nullptr) {
0116         m_changed = false;
0117 
0118         ManagedTextureNode *mNode = dynamic_cast<ManagedTextureNode *>(node);
0119         if (!mNode) {
0120             delete node;
0121             mNode = new ManagedTextureNode;
0122         }
0123 
0124         QIcon::Mode mode;
0125         switch (m_state) {
0126         case DefaultState:
0127             mode = QIcon::Normal;
0128             break;
0129         case ActiveState:
0130             mode = QIcon::Active;
0131             break;
0132         case DisabledState:
0133             mode = QIcon::Disabled;
0134             break;
0135         case SelectedState:
0136             mode = QIcon::Selected;
0137             break;
0138         }
0139 
0140         QImage img;
0141         const QSize size(width(), height());
0142         if (!size.isEmpty()) {
0143             img = m_icon.pixmap(size, mode, QIcon::On).toImage();
0144         }
0145         mNode->setTexture(s_iconImageCache->loadTexture(window(), img));
0146         mNode->setRect(QRect(QPoint(0, 0), size));
0147         node = mNode;
0148     }
0149 
0150     return node;
0151 }
0152 
0153 void QIconItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
0154 {
0155     if (newGeometry.size() != oldGeometry.size()) {
0156         m_changed = true;
0157         update();
0158     }
0159     QQuickItem::geometryChanged(newGeometry, oldGeometry);
0160 }
0161 
0162 #include "moc_qiconitem.cpp"
0163 
0164 #endif