21 #include "desktopicon.h"
23 #include <QSGSimpleTextureNode>
24 #include <qquickwindow.h>
28 #include <QSGSimpleTextureNode>
30 #include <QSharedPointer>
33 class ManagedTextureNode :
public QSGSimpleTextureNode
35 Q_DISABLE_COPY(ManagedTextureNode)
39 void setTexture(QSharedPointer<QSGTexture> texture);
42 QSharedPointer<QSGTexture> m_texture;
45 ManagedTextureNode::ManagedTextureNode()
48 void ManagedTextureNode::setTexture(QSharedPointer<QSGTexture> texture)
51 QSGSimpleTextureNode::setTexture(texture.data());
54 typedef QHash<qint64, QHash<QWindow*, QWeakPointer<QSGTexture> > > TexturesCache;
56 struct ImageTexturesCachePrivate
61 class ImageTexturesCache
65 ~ImageTexturesCache();
73 QSharedPointer<QSGTexture> loadTexture(QQuickWindow *window,
const QImage &image, QQuickWindow::CreateTextureOptions options);
75 QSharedPointer<QSGTexture> loadTexture(QQuickWindow *window,
const QImage &image);
79 QScopedPointer<ImageTexturesCachePrivate> d;
83 ImageTexturesCache::ImageTexturesCache()
84 : d(new ImageTexturesCachePrivate)
88 ImageTexturesCache::~ImageTexturesCache()
92 QSharedPointer<QSGTexture> ImageTexturesCache::loadTexture(QQuickWindow *window,
const QImage &image, QQuickWindow::CreateTextureOptions options)
94 qint64
id = image.cacheKey();
95 QSharedPointer<QSGTexture> texture = d->cache.value(
id).value(window).toStrongRef();
98 auto cleanAndDelete = [
this, window, id](QSGTexture* texture) {
99 QHash<QWindow*, QWeakPointer<QSGTexture> >& textures = (d->cache)[
id];
100 textures.remove(window);
101 if (textures.isEmpty())
105 texture = QSharedPointer<QSGTexture>(window->createTextureFromImage(image, options), cleanAndDelete);
106 (d->cache)[
id][window] = texture.toWeakRef();
112 if (!(options & QQuickWindow::TextureCanUseAtlas) && texture->isAtlasTexture()) {
113 texture = QSharedPointer<QSGTexture>(window->createTextureFromImage(image, options));
119 QSharedPointer<QSGTexture> ImageTexturesCache::loadTexture(QQuickWindow *window,
const QImage &image)
121 return loadTexture(window, image, 0);
124 Q_GLOBAL_STATIC(ImageTexturesCache, s_iconImageCache)
126 DesktopIcon::DesktopIcon(QQuickItem *parent)
127 : QQuickItem(parent),
133 setFlag(ItemHasContents,
true);
137 DesktopIcon::~DesktopIcon()
141 void DesktopIcon::setSource(
const QVariant &icon)
143 if(icon.canConvert<QIcon>()) {
144 m_icon = icon.value<QIcon>();
145 }
else if(icon.canConvert<QString>()) {
146 m_icon = QIcon::fromTheme(icon.toString());
152 emit sourceChanged();
155 QIcon DesktopIcon::source()
const
160 void DesktopIcon::setEnabled(
const bool enabled)
162 if (enabled == QQuickItem::isEnabled()) {
165 QQuickItem::setEnabled(enabled);
168 emit enabledChanged();
172 void DesktopIcon::setActive(
const bool active)
174 if (active == m_active) {
180 emit activeChanged();
183 bool DesktopIcon::active()
const
188 bool DesktopIcon::valid()
const
190 return !m_icon.isNull();
193 void DesktopIcon::setSelected(
const bool selected)
195 if (selected == m_selected) {
198 m_selected = selected;
201 emit selectedChanged();
204 bool DesktopIcon::selected()
const
209 int DesktopIcon::implicitWidth()
const
214 int DesktopIcon::implicitHeight()
const
219 void DesktopIcon::setSmooth(
const bool smooth)
221 if (smooth == m_smooth) {
227 emit smoothChanged();
230 bool DesktopIcon::smooth()
const
235 QSGNode* DesktopIcon::updatePaintNode(QSGNode* node, QQuickItem::UpdatePaintNodeData* )
237 if (m_icon.isNull()) {
242 if (m_changed || node == 0) {
245 ManagedTextureNode* mNode =
dynamic_cast<ManagedTextureNode*
>(node);
248 mNode =
new ManagedTextureNode;
251 QIcon::Mode mode = QIcon::Normal;
253 mode = QIcon::Disabled;
254 }
else if (m_selected) {
255 mode = QIcon::Selected;
256 }
else if (m_active) {
257 mode = QIcon::Active;
261 const QSize size(width(), height());
262 if (!size.isEmpty()) {
263 img = m_icon.pixmap(size, mode, QIcon::On).toImage();
265 mNode->setTexture(s_iconImageCache->loadTexture(window(), img));
266 mNode->setRect(QRect(QPoint(0,0), size));
273 void DesktopIcon::geometryChanged(
const QRectF &newGeometry,
const QRectF &oldGeometry)
275 if (newGeometry.size() != oldGeometry.size()) {
279 QQuickItem::geometryChanged(newGeometry, oldGeometry);