diff options
Diffstat (limited to 'src/tools/qml2puppet/qml2puppet/instances/qt5captureimagenodeinstanceserver.cpp')
-rw-r--r-- | src/tools/qml2puppet/qml2puppet/instances/qt5captureimagenodeinstanceserver.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5captureimagenodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5captureimagenodeinstanceserver.cpp new file mode 100644 index 0000000000..de779748ae --- /dev/null +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5captureimagenodeinstanceserver.cpp @@ -0,0 +1,79 @@ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#include "qt5captureimagenodeinstanceserver.h" +#include "servernodeinstance.h" + +#include <captureddatacommand.h> +#include <createscenecommand.h> +#include <nodeinstanceclientinterface.h> + +#include <QImage> +#include <QQuickItem> +#include <QQuickView> + +#include <private/qquickdesignersupport_p.h> + +namespace QmlDesigner { + +namespace { + +QImage renderImage(ServerNodeInstance rootNodeInstance, QSize minimumSize, QSize maximumSize) +{ + rootNodeInstance.updateDirtyNodeRecursive(); + + QSize previewImageSize = rootNodeInstance.boundingRect().size().toSize(); + if (previewImageSize.isEmpty()) { + previewImageSize = minimumSize; + } else if (previewImageSize.width() < minimumSize.width() + || previewImageSize.height() < minimumSize.height()) { + previewImageSize.scale(minimumSize, Qt::KeepAspectRatio); + } + + if (previewImageSize.width() > maximumSize.width() + || previewImageSize.height() > maximumSize.height()) { + previewImageSize.scale(maximumSize, Qt::KeepAspectRatio); + } + + QImage previewImage = rootNodeInstance.renderPreviewImage(previewImageSize); + + return previewImage; +} +} // namespace + +void Qt5CaptureImageNodeInstanceServer::collectItemChangesAndSendChangeCommands() +{ + static bool inFunction = false; + + if (!rootNodeInstance().holdsGraphical()) { + nodeInstanceClient()->capturedData(CapturedDataCommand{}); + return; + } + + if (!inFunction) { + inFunction = true; + + auto rooNodeInstance = rootNodeInstance(); + if (QQuickItem *qitem = rooNodeInstance.rootQuickItem()) + qitem->setClip(true); + + QQuickDesignerSupport::polishItems(quickWindow()); + + QImage image = renderImage(rooNodeInstance, m_minimumSize, m_maximumSize); + + nodeInstanceClient()->capturedData(CapturedDataCommand{std::move(image)}); + + slowDownRenderTimer(); + inFunction = false; + } +} + +void QmlDesigner::Qt5CaptureImageNodeInstanceServer::createScene(const CreateSceneCommand &command) +{ + m_minimumSize = command.captureImageMinimumSize; + m_maximumSize = command.captureImageMaximumSize; + + Qt5PreviewNodeInstanceServer::createScene(command); +} + +} // namespace |