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