2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2020 The Qt Company Ltd.
|
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
2020-09-16 13:44:43 +02:00
|
|
|
|
|
|
|
|
#include "qt5captureimagenodeinstanceserver.h"
|
|
|
|
|
#include "servernodeinstance.h"
|
|
|
|
|
|
|
|
|
|
#include <captureddatacommand.h>
|
|
|
|
|
#include <createscenecommand.h>
|
|
|
|
|
#include <nodeinstanceclientinterface.h>
|
|
|
|
|
|
|
|
|
|
#include <QImage>
|
|
|
|
|
#include <QQuickItem>
|
|
|
|
|
#include <QQuickView>
|
|
|
|
|
|
2022-07-11 14:10:13 +02:00
|
|
|
#include <private/qquickdesignersupport_p.h>
|
|
|
|
|
|
2020-09-16 13:44:43 +02:00
|
|
|
namespace QmlDesigner {
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
2022-04-11 17:20:37 +02:00
|
|
|
QImage renderImage(ServerNodeInstance rootNodeInstance, QSize minimumSize, QSize maximumSize)
|
2020-09-16 13:44:43 +02:00
|
|
|
{
|
|
|
|
|
rootNodeInstance.updateDirtyNodeRecursive();
|
|
|
|
|
|
|
|
|
|
QSize previewImageSize = rootNodeInstance.boundingRect().size().toSize();
|
2022-04-11 17:20:37 +02:00
|
|
|
if (previewImageSize.isEmpty()) {
|
|
|
|
|
previewImageSize = minimumSize;
|
|
|
|
|
} else if (previewImageSize.width() < minimumSize.width()
|
|
|
|
|
|| previewImageSize.height() < minimumSize.height()) {
|
|
|
|
|
previewImageSize.scale(minimumSize, Qt::KeepAspectRatio);
|
|
|
|
|
}
|
2020-09-16 13:44:43 +02:00
|
|
|
|
2022-04-11 17:20:37 +02:00
|
|
|
if (previewImageSize.width() > maximumSize.width()
|
|
|
|
|
|| previewImageSize.height() > maximumSize.height()) {
|
|
|
|
|
previewImageSize.scale(maximumSize, Qt::KeepAspectRatio);
|
|
|
|
|
}
|
2020-09-16 13:44:43 +02:00
|
|
|
|
|
|
|
|
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();
|
2022-02-02 17:56:16 +02:00
|
|
|
if (QQuickItem *qitem = rooNodeInstance.rootQuickItem())
|
|
|
|
|
qitem->setClip(true);
|
2020-09-16 13:44:43 +02:00
|
|
|
|
2022-07-11 14:10:13 +02:00
|
|
|
QQuickDesignerSupport::polishItems(quickWindow());
|
2020-09-16 13:44:43 +02:00
|
|
|
|
2022-04-11 17:20:37 +02:00
|
|
|
QImage image = renderImage(rooNodeInstance, m_minimumSize, m_maximumSize);
|
2020-09-16 13:44:43 +02:00
|
|
|
|
|
|
|
|
nodeInstanceClient()->capturedData(CapturedDataCommand{std::move(image)});
|
|
|
|
|
|
|
|
|
|
slowDownRenderTimer();
|
|
|
|
|
inFunction = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-11 17:20:37 +02:00
|
|
|
void QmlDesigner::Qt5CaptureImageNodeInstanceServer::createScene(const CreateSceneCommand &command)
|
|
|
|
|
{
|
|
|
|
|
m_minimumSize = command.captureImageMinimumSize;
|
|
|
|
|
m_maximumSize = command.captureImageMaximumSize;
|
|
|
|
|
|
|
|
|
|
Qt5PreviewNodeInstanceServer::createScene(command);
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-16 13:44:43 +02:00
|
|
|
} // namespace
|