diff options
author | Marco Bubke <marco.bubke@qt.io> | 2021-12-28 16:50:51 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2022-01-04 12:00:18 +0000 |
commit | b1760d15fedbd5b9e7b867e6e9b42459594e62b9 (patch) | |
tree | 8c6fd02712585650035ee0c4443e9894d3d8d749 | |
parent | 24087bd8b6c4051d9e9077788b22caf701184a9e (diff) | |
download | qt-creator-b1760d15fedbd5b9e7b867e6e9b42459594e62b9.tar.gz |
QmlDesigner: Add ExplicitImageCacheImageProvider
Task-number: QDS-5860
Change-Id: I755ddedebbfb9f7bcf0b6c93069f3e762706cb7f
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
3 files changed, 156 insertions, 0 deletions
diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 7bc91483f9..f2dbb1ae9f 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -343,6 +343,7 @@ extend_qtc_plugin(QmlDesigner include/propertybinding.h include/qml3dnode.h include/qmlvisualnode.h + ) extend_qtc_plugin(QmlDesigner @@ -353,6 +354,14 @@ extend_qtc_plugin(QmlDesigner ) extend_qtc_plugin(QmlDesigner + SOURCES_PREFIX designercore/imagecache + SOURCES + explicitimagecacheimageprovider.cpp + explicitimagecacheimageprovider.h + +) + +extend_qtc_plugin(QmlDesigner SOURCES_PREFIX designercore PUBLIC_INCLUDES designercore SOURCES diff --git a/src/plugins/qmldesigner/designercore/imagecache/explicitimagecacheimageprovider.cpp b/src/plugins/qmldesigner/designercore/imagecache/explicitimagecacheimageprovider.cpp new file mode 100644 index 0000000000..2597d80d5a --- /dev/null +++ b/src/plugins/qmldesigner/designercore/imagecache/explicitimagecacheimageprovider.cpp @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "explicitimagecacheimageprovider.h" + +#include <asynchronousexplicitimagecache.h> + +#include <QMetaObject> +#include <QQuickImageResponse> + +namespace QmlDesigner { + +class ImageRespose : public QQuickImageResponse +{ +public: + ImageRespose(const QImage &defaultImage) + : m_image(defaultImage) + {} + + QQuickTextureFactory *textureFactory() const override + { + return QQuickTextureFactory::textureFactoryForImage(m_image); + } + + void setImage(const QImage &image) + { + m_image = image; + + emit finished(); + } + + void abort() { emit finished(); } + +private: + QImage m_image; +}; + +QQuickImageResponse *ExplicitImageCacheImageProvider::requestImageResponse(const QString &id, + const QSize &) +{ + auto response = std::make_unique<ImageRespose>(m_defaultImage); + + m_cache.requestSmallImage( + id, + [response = QPointer<ImageRespose>(response.get())](const QImage &image) { + QMetaObject::invokeMethod( + response, + [response, image] { + if (response) + response->setImage(image); + }, + Qt::QueuedConnection); + }, + [response = QPointer<ImageRespose>(response.get())](ImageCache::AbortReason abortReason) { + QMetaObject::invokeMethod( + response, + [response, abortReason] { + switch (abortReason) { + case ImageCache::AbortReason::Failed: + if (response) + response->abort(); + break; + case ImageCache::AbortReason::Abort: + response->cancel(); + break; + } + }, + Qt::QueuedConnection); + }); + + return response.release(); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/imagecache/explicitimagecacheimageprovider.h b/src/plugins/qmldesigner/designercore/imagecache/explicitimagecacheimageprovider.h new file mode 100644 index 0000000000..0cefea4ff1 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/imagecache/explicitimagecacheimageprovider.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include <QQuickAsyncImageProvider> +#include <QQuickImageResponse> + +namespace QmlDesigner { + +class AsynchronousExplicitImageCache; + +class ExplicitImageCacheImageProvider : public QQuickAsyncImageProvider +{ +public: + ExplicitImageCacheImageProvider(AsynchronousExplicitImageCache &imageCache, + const QImage &defaultImage) + : m_cache(imageCache) + , m_defaultImage(defaultImage) + {} + + QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override; + +private: + AsynchronousExplicitImageCache &m_cache; + QImage m_defaultImage; +}; + +} // namespace QmlDesigner |