forked from qt-creator/qt-creator
QmlDesigner: Get the material image based on request id
A request id is used for comparing requests instead of image sizes Returned image sizes was not always the same as requested ones because of pixelRateRatio. Fixes: QDS-12961 Change-Id: I2f0ed7ea00047f296872a02958322f3448984f09 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
@@ -10,13 +10,17 @@ namespace QmlDesigner {
|
|||||||
|
|
||||||
RequestModelNodePreviewImageCommand::RequestModelNodePreviewImageCommand() = default;
|
RequestModelNodePreviewImageCommand::RequestModelNodePreviewImageCommand() = default;
|
||||||
|
|
||||||
RequestModelNodePreviewImageCommand::RequestModelNodePreviewImageCommand(qint32 id, const QSize &size,
|
RequestModelNodePreviewImageCommand::RequestModelNodePreviewImageCommand(
|
||||||
const QString &componentPath,
|
qint32 id,
|
||||||
qint32 renderItemId)
|
const QSize &size,
|
||||||
|
const QString &componentPath,
|
||||||
|
qint32 renderItemId,
|
||||||
|
const QByteArray &requestId)
|
||||||
: m_instanceId(id)
|
: m_instanceId(id)
|
||||||
, m_size(size)
|
, m_size(size)
|
||||||
, m_componentPath(componentPath)
|
, m_componentPath(componentPath)
|
||||||
, m_renderItemId(renderItemId)
|
, m_renderItemId(renderItemId)
|
||||||
|
, m_requestId(requestId)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,12 +44,18 @@ qint32 RequestModelNodePreviewImageCommand::renderItemId() const
|
|||||||
return m_renderItemId;
|
return m_renderItemId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray RequestModelNodePreviewImageCommand::requestId() const
|
||||||
|
{
|
||||||
|
return m_requestId;
|
||||||
|
}
|
||||||
|
|
||||||
QDataStream &operator<<(QDataStream &out, const RequestModelNodePreviewImageCommand &command)
|
QDataStream &operator<<(QDataStream &out, const RequestModelNodePreviewImageCommand &command)
|
||||||
{
|
{
|
||||||
out << int(command.instanceId());
|
out << int(command.instanceId());
|
||||||
out << command.size();
|
out << command.size();
|
||||||
out << command.componentPath();
|
out << command.componentPath();
|
||||||
out << command.renderItemId();
|
out << command.renderItemId();
|
||||||
|
out << command.requestId();
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@@ -56,6 +66,7 @@ QDataStream &operator>>(QDataStream &in, RequestModelNodePreviewImageCommand &co
|
|||||||
in >> command.m_size;
|
in >> command.m_size;
|
||||||
in >> command.m_componentPath;
|
in >> command.m_componentPath;
|
||||||
in >> command.m_renderItemId;
|
in >> command.m_renderItemId;
|
||||||
|
in >> command.m_requestId;
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +76,8 @@ QDebug operator <<(QDebug debug, const RequestModelNodePreviewImageCommand &comm
|
|||||||
<< "instanceId: " << command.instanceId() << ", "
|
<< "instanceId: " << command.instanceId() << ", "
|
||||||
<< "size: " << command.size() << ", "
|
<< "size: " << command.size() << ", "
|
||||||
<< "componentPath: " << command.componentPath() << ", "
|
<< "componentPath: " << command.componentPath() << ", "
|
||||||
<< "renderItemId: " << command.renderItemId() << ")";
|
<< "renderItemId: " << command.renderItemId() << ", "
|
||||||
|
<< "requestId: " << command.requestId() << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
@@ -18,38 +18,46 @@ class RequestModelNodePreviewImageCommand
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
RequestModelNodePreviewImageCommand();
|
RequestModelNodePreviewImageCommand();
|
||||||
explicit RequestModelNodePreviewImageCommand(qint32 id, const QSize &size,
|
explicit RequestModelNodePreviewImageCommand(
|
||||||
const QString &componentPath, qint32 renderItemId);
|
qint32 id,
|
||||||
|
const QSize &size,
|
||||||
|
const QString &componentPath,
|
||||||
|
qint32 renderItemId,
|
||||||
|
const QByteArray &requestId = {});
|
||||||
|
|
||||||
qint32 instanceId() const;
|
qint32 instanceId() const;
|
||||||
QSize size() const;
|
QSize size() const;
|
||||||
QString componentPath() const;
|
QString componentPath() const;
|
||||||
qint32 renderItemId() const;
|
qint32 renderItemId() const;
|
||||||
|
QByteArray requestId() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qint32 m_instanceId;
|
qint32 m_instanceId;
|
||||||
QSize m_size;
|
QSize m_size;
|
||||||
QString m_componentPath;
|
QString m_componentPath;
|
||||||
qint32 m_renderItemId;
|
qint32 m_renderItemId;
|
||||||
|
QByteArray m_requestId;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool operator==(const RequestModelNodePreviewImageCommand &first,
|
inline bool operator==(const RequestModelNodePreviewImageCommand &first,
|
||||||
const RequestModelNodePreviewImageCommand &second)
|
const RequestModelNodePreviewImageCommand &second)
|
||||||
{
|
{
|
||||||
return first.instanceId() == second.instanceId()
|
return first.instanceId() == second.instanceId() && first.size() == second.size()
|
||||||
&& first.size() == second.size()
|
&& first.componentPath() == second.componentPath()
|
||||||
&& first.componentPath() == second.componentPath()
|
&& first.renderItemId() == second.renderItemId()
|
||||||
&& first.renderItemId() == second.renderItemId();
|
&& first.requestId() == second.requestId();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline size_t qHash(const RequestModelNodePreviewImageCommand &key, size_t seed = 0)
|
inline size_t qHash(const RequestModelNodePreviewImageCommand &key, size_t seed = 0)
|
||||||
{
|
{
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
return ::qHash(key.instanceId(), seed)
|
return ::qHash(key.instanceId(), seed)
|
||||||
^ ::qHash(std::make_pair(key.size().width(), key.size().height()), seed)
|
^ ::qHash(std::make_pair(key.size().width(), key.size().height()), seed)
|
||||||
^ ::qHash(key.componentPath(), seed) ^ ::qHash(key.renderItemId(), seed);
|
^ ::qHash(key.componentPath(), seed) ^ ::qHash(key.renderItemId(), seed)
|
||||||
|
^ ::qHash(key.requestId(), seed);
|
||||||
#else
|
#else
|
||||||
return qHashMulti(seed, key.instanceId(), key.size(), key.componentPath(), key.renderItemId());
|
return qHashMulti(
|
||||||
|
seed, key.instanceId(), key.size(), key.componentPath(), key.renderItemId(), key.requestId());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -56,6 +56,11 @@ QRectF ImageContainer::rect() const
|
|||||||
return m_rect;
|
return m_rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray ImageContainer::requestId() const
|
||||||
|
{
|
||||||
|
return m_requestId;
|
||||||
|
}
|
||||||
|
|
||||||
void ImageContainer::setImage(const QImage &image)
|
void ImageContainer::setImage(const QImage &image)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_image.isNull(), /**/);
|
QTC_ASSERT(m_image.isNull(), /**/);
|
||||||
@@ -68,6 +73,11 @@ void ImageContainer::setRect(const QRectF &rectangle)
|
|||||||
m_rect = rectangle;
|
m_rect = rectangle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImageContainer::setRequestId(const QByteArray &newRequestId)
|
||||||
|
{
|
||||||
|
m_requestId = newRequestId;
|
||||||
|
}
|
||||||
|
|
||||||
void ImageContainer::removeSharedMemorys(const QVector<qint32> &keyNumberVector)
|
void ImageContainer::removeSharedMemorys(const QVector<qint32> &keyNumberVector)
|
||||||
{
|
{
|
||||||
for (qint32 keyNumber : keyNumberVector) {
|
for (qint32 keyNumber : keyNumberVector) {
|
||||||
@@ -151,6 +161,7 @@ QDataStream &operator<<(QDataStream &out, const ImageContainer &container)
|
|||||||
out << container.instanceId();
|
out << container.instanceId();
|
||||||
out << container.keyNumber();
|
out << container.keyNumber();
|
||||||
out << container.rect();
|
out << container.rect();
|
||||||
|
out << container.requestId();
|
||||||
|
|
||||||
const QImage image = container.image();
|
const QImage image = container.image();
|
||||||
|
|
||||||
@@ -236,6 +247,7 @@ QDataStream &operator>>(QDataStream &in, ImageContainer &container)
|
|||||||
in >> container.m_instanceId;
|
in >> container.m_instanceId;
|
||||||
in >> container.m_keyNumber;
|
in >> container.m_keyNumber;
|
||||||
in >> container.m_rect;
|
in >> container.m_rect;
|
||||||
|
in >> container.m_requestId;
|
||||||
in >> sharedMemoryIsUsed;
|
in >> sharedMemoryIsUsed;
|
||||||
|
|
||||||
if (sharedMemoryIsUsed) {
|
if (sharedMemoryIsUsed) {
|
||||||
@@ -259,10 +271,11 @@ bool operator <(const ImageContainer &first, const ImageContainer &second)
|
|||||||
|
|
||||||
QDebug operator <<(QDebug debug, const ImageContainer &container)
|
QDebug operator <<(QDebug debug, const ImageContainer &container)
|
||||||
{
|
{
|
||||||
return debug.nospace() << "ImageContainer("
|
debug.nospace() << "ImageContainer("
|
||||||
<< "instanceId: " << container.instanceId() << ", "
|
<< "instanceId: " << container.instanceId() << ", ";
|
||||||
<< "size: " << container.image().size() << ")";
|
if (!container.requestId().isEmpty())
|
||||||
|
debug << "requestId: " << container.requestId() << ", ";
|
||||||
|
return debug << "size: " << container.image().size() << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
@@ -23,9 +23,11 @@ public:
|
|||||||
QImage image() const;
|
QImage image() const;
|
||||||
qint32 keyNumber() const;
|
qint32 keyNumber() const;
|
||||||
QRectF rect() const;
|
QRectF rect() const;
|
||||||
|
QByteArray requestId() const;
|
||||||
|
|
||||||
void setImage(const QImage &image);
|
void setImage(const QImage &image);
|
||||||
void setRect(const QRectF &rectangle);
|
void setRect(const QRectF &rectangle);
|
||||||
|
void setRequestId(const QByteArray &newRequestId);
|
||||||
|
|
||||||
static void removeSharedMemorys(const QVector<qint32> &keyNumberVector);
|
static void removeSharedMemorys(const QVector<qint32> &keyNumberVector);
|
||||||
|
|
||||||
@@ -34,6 +36,7 @@ private:
|
|||||||
qint32 m_instanceId;
|
qint32 m_instanceId;
|
||||||
qint32 m_keyNumber;
|
qint32 m_keyNumber;
|
||||||
QRectF m_rect;
|
QRectF m_rect;
|
||||||
|
QByteArray m_requestId;
|
||||||
};
|
};
|
||||||
|
|
||||||
QDataStream &operator<<(QDataStream &out, const ImageContainer &container);
|
QDataStream &operator<<(QDataStream &out, const ImageContainer &container);
|
||||||
|
@@ -333,16 +333,16 @@ void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedN
|
|||||||
m_widget->materialBrowserModel()->selectMaterial(idx);
|
m_widget->materialBrowserModel()->selectMaterial(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaterialBrowserView::modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap)
|
void MaterialBrowserView::modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId)
|
||||||
{
|
{
|
||||||
if (!isMaterial(node))
|
if (!isMaterial(node))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// There might be multiple requests for different preview pixmap sizes.
|
// There might be multiple requests for different preview pixmap sizes.
|
||||||
// Here only the one with the default size is picked.
|
// Here only the one with the default size is picked.
|
||||||
const double ratio = externalDependencies().formEditorDevicePixelRatio();
|
if (requestId.isEmpty())
|
||||||
const int dim = Constants::MODELNODE_PREVIEW_IMAGE_DIMENSIONS * ratio;
|
|
||||||
if (pixmap.width() == dim && pixmap.height() == dim)
|
|
||||||
m_widget->updateMaterialPreview(node, pixmap);
|
m_widget->updateMaterialPreview(node, pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,7 +34,9 @@ public:
|
|||||||
void modelAboutToBeDetached(Model *model) override;
|
void modelAboutToBeDetached(Model *model) override;
|
||||||
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
|
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
|
||||||
const QList<ModelNode> &lastSelectedNodeList) override;
|
const QList<ModelNode> &lastSelectedNodeList) override;
|
||||||
void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) override;
|
void modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId) override;
|
||||||
void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override;
|
void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override;
|
||||||
void variantPropertiesChanged(const QList<VariantProperty> &propertyList, PropertyChangeFlags propertyChange) override;
|
void variantPropertiesChanged(const QList<VariantProperty> &propertyList, PropertyChangeFlags propertyChange) override;
|
||||||
void propertiesRemoved(const QList<AbstractProperty> &propertyList) override;
|
void propertiesRemoved(const QList<AbstractProperty> &propertyList) override;
|
||||||
|
@@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
|
|
||||||
|
static const char MATERIAL_EDITOR_IMAGE_REQUEST_ID[] = "MaterialEditor";
|
||||||
|
|
||||||
MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDependencies)
|
MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDependencies)
|
||||||
: AbstractView{externalDependencies}
|
: AbstractView{externalDependencies}
|
||||||
, m_stackedWidget(new QStackedWidget)
|
, m_stackedWidget(new QStackedWidget)
|
||||||
@@ -859,10 +861,12 @@ void MaterialEditorView::propertiesAboutToBeRemoved(const QList<AbstractProperty
|
|||||||
// request render image for the selected material node
|
// request render image for the selected material node
|
||||||
void MaterialEditorView::requestPreviewRender()
|
void MaterialEditorView::requestPreviewRender()
|
||||||
{
|
{
|
||||||
if (model() && model()->nodeInstanceView() && m_selectedMaterial.isValid())
|
if (model() && model()->nodeInstanceView() && m_selectedMaterial.isValid()) {
|
||||||
model()->nodeInstanceView()->previewImageDataForGenericNode(m_selectedMaterial,
|
model()->nodeInstanceView()->previewImageDataForGenericNode(m_selectedMaterial,
|
||||||
{},
|
{},
|
||||||
m_previewSize);
|
m_previewSize,
|
||||||
|
MATERIAL_EDITOR_IMAGE_REQUEST_ID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MaterialEditorView::hasWidget() const
|
bool MaterialEditorView::hasWidget() const
|
||||||
@@ -946,15 +950,15 @@ void MaterialEditorView::rootNodeTypeChanged(const QString &type, int, int)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaterialEditorView::modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap)
|
void MaterialEditorView::modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId)
|
||||||
{
|
{
|
||||||
if (node != m_selectedMaterial)
|
if (node != m_selectedMaterial)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_previewSize.isValid() && pixmap.size() != m_previewSize)
|
if (requestId == MATERIAL_EDITOR_IMAGE_REQUEST_ID)
|
||||||
return;
|
m_qmlBackEnd->updateMaterialPreview(pixmap);
|
||||||
|
|
||||||
m_qmlBackEnd->updateMaterialPreview(pixmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaterialEditorView::importsChanged([[maybe_unused]] const Imports &addedImports,
|
void MaterialEditorView::importsChanged([[maybe_unused]] const Imports &addedImports,
|
||||||
|
@@ -55,7 +55,9 @@ public:
|
|||||||
|
|
||||||
void nodeTypeChanged(const ModelNode& node, const TypeName &type, int majorVersion, int minorVersion) override;
|
void nodeTypeChanged(const ModelNode& node, const TypeName &type, int majorVersion, int minorVersion) override;
|
||||||
void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override;
|
void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override;
|
||||||
void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) override;
|
void modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId) override;
|
||||||
void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
|
void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
|
||||||
void customNotification(const AbstractView *view, const QString &identifier,
|
void customNotification(const AbstractView *view, const QString &identifier,
|
||||||
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
|
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
|
||||||
|
@@ -364,13 +364,13 @@ void NavigatorView::enableWidget()
|
|||||||
m_widget->enableNavigator();
|
m_widget->enableNavigator();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NavigatorView::modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap)
|
void NavigatorView::modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId)
|
||||||
{
|
{
|
||||||
// There might be multiple requests for different preview pixmap sizes.
|
// There might be multiple requests for different preview pixmap sizes.
|
||||||
// Here only the one with the default size is picked.
|
// Here only the one with the default size is picked.
|
||||||
const double ratio = externalDependencies().formEditorDevicePixelRatio();
|
if (requestId.isEmpty())
|
||||||
const int dim = Constants::MODELNODE_PREVIEW_IMAGE_DIMENSIONS * ratio;
|
|
||||||
if (pixmap.width() == dim && pixmap.height() == dim)
|
|
||||||
m_treeModel->updateToolTipPixmap(node, pixmap);
|
m_treeModel->updateToolTipPixmap(node, pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -83,7 +83,9 @@ public:
|
|||||||
void disableWidget() override;
|
void disableWidget() override;
|
||||||
void enableWidget() override;
|
void enableWidget() override;
|
||||||
|
|
||||||
void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) override;
|
void modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ModelNode modelNodeForIndex(const QModelIndex &modelIndex) const;
|
ModelNode modelNodeForIndex(const QModelIndex &modelIndex) const;
|
||||||
|
@@ -57,7 +57,9 @@ void PreviewToolTip::setInfo(const QString &info)
|
|||||||
|
|
||||||
void PreviewToolTip::setPixmap(const QPixmap &pixmap)
|
void PreviewToolTip::setPixmap(const QPixmap &pixmap)
|
||||||
{
|
{
|
||||||
m_ui->imageLabel->setPixmap(pixmap);
|
QPixmap scaled = pixmap.scaled(m_ui->labelBackground->size(), Qt::KeepAspectRatio);
|
||||||
|
scaled.setDevicePixelRatio(1.);
|
||||||
|
m_ui->imageLabel->setPixmap(scaled);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString PreviewToolTip::id() const
|
QString PreviewToolTip::id() const
|
||||||
|
@@ -148,7 +148,9 @@ public:
|
|||||||
void emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector);
|
void emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector);
|
||||||
void emitRenderImage3DChanged(const QImage &image);
|
void emitRenderImage3DChanged(const QImage &image);
|
||||||
void emitUpdateActiveScene3D(const QVariantMap &sceneState);
|
void emitUpdateActiveScene3D(const QVariantMap &sceneState);
|
||||||
void emitModelNodelPreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap);
|
void emitModelNodelPreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId);
|
||||||
void emitImport3DSupportChanged(const QVariantMap &supportMap);
|
void emitImport3DSupportChanged(const QVariantMap &supportMap);
|
||||||
void emitNodeAtPosResult(const ModelNode &modelNode, const QVector3D &pos3d);
|
void emitNodeAtPosResult(const ModelNode &modelNode, const QVector3D &pos3d);
|
||||||
void emitView3DAction(View3DActionType type, const QVariant &value);
|
void emitView3DAction(View3DActionType type, const QVariant &value);
|
||||||
@@ -227,7 +229,9 @@ public:
|
|||||||
virtual void updateActiveScene3D(const QVariantMap &sceneState);
|
virtual void updateActiveScene3D(const QVariantMap &sceneState);
|
||||||
virtual void updateImport3DSupport(const QVariantMap &supportMap);
|
virtual void updateImport3DSupport(const QVariantMap &supportMap);
|
||||||
virtual void nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos3d);
|
virtual void nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos3d);
|
||||||
virtual void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap);
|
virtual void modelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId);
|
||||||
|
|
||||||
virtual void view3DAction(View3DActionType type, const QVariant &value);
|
virtual void view3DAction(View3DActionType type, const QVariant &value);
|
||||||
|
|
||||||
|
@@ -136,14 +136,16 @@ public:
|
|||||||
void view3DAction(View3DActionType type, const QVariant &value) override;
|
void view3DAction(View3DActionType type, const QVariant &value) override;
|
||||||
void requestModelNodePreviewImage(const ModelNode &node,
|
void requestModelNodePreviewImage(const ModelNode &node,
|
||||||
const ModelNode &renderNode,
|
const ModelNode &renderNode,
|
||||||
const QSize &size = {}) const;
|
const QSize &size = {},
|
||||||
|
const QByteArray &requestId = {}) const;
|
||||||
void edit3DViewResized(const QSize &size) const;
|
void edit3DViewResized(const QSize &size) const;
|
||||||
|
|
||||||
void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override;
|
void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override;
|
||||||
|
|
||||||
QVariant previewImageDataForGenericNode(const ModelNode &modelNode,
|
QVariant previewImageDataForGenericNode(const ModelNode &modelNode,
|
||||||
const ModelNode &renderNode,
|
const ModelNode &renderNode,
|
||||||
const QSize &size = {}) const;
|
const QSize &size = {},
|
||||||
|
const QByteArray &requestId = {}) const;
|
||||||
QVariant previewImageDataForImageNode(const ModelNode &modelNode) const;
|
QVariant previewImageDataForImageNode(const ModelNode &modelNode) const;
|
||||||
|
|
||||||
void setCrashCallback(std::function<void()> crashCallback)
|
void setCrashCallback(std::function<void()> crashCallback)
|
||||||
@@ -229,7 +231,9 @@ private: // functions
|
|||||||
QString info;
|
QString info;
|
||||||
};
|
};
|
||||||
QVariant modelNodePreviewImageDataToVariant(const ModelNodePreviewImageData &imageData) const;
|
QVariant modelNodePreviewImageDataToVariant(const ModelNodePreviewImageData &imageData) const;
|
||||||
void updatePreviewImageForNode(const ModelNode &modelNode, const QImage &image);
|
void updatePreviewImageForNode(const ModelNode &modelNode,
|
||||||
|
const QImage &image,
|
||||||
|
const QByteArray &requestId);
|
||||||
|
|
||||||
void updateWatcher(const QString &path);
|
void updateWatcher(const QString &path);
|
||||||
void handleShaderChanges();
|
void handleShaderChanges();
|
||||||
|
@@ -1779,7 +1779,7 @@ void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand
|
|||||||
if (node.isValid()) {
|
if (node.isValid()) {
|
||||||
const double ratio = m_externalDependencies.formEditorDevicePixelRatio();
|
const double ratio = m_externalDependencies.formEditorDevicePixelRatio();
|
||||||
image.setDevicePixelRatio(ratio);
|
image.setDevicePixelRatio(ratio);
|
||||||
updatePreviewImageForNode(node, image);
|
updatePreviewImageForNode(node, image, container.requestId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (command.type() == PuppetToCreatorCommand::Import3DSupport) {
|
} else if (command.type() == PuppetToCreatorCommand::Import3DSupport) {
|
||||||
@@ -1824,7 +1824,8 @@ void NodeInstanceView::view3DAction(View3DActionType type, const QVariant &value
|
|||||||
|
|
||||||
void NodeInstanceView::requestModelNodePreviewImage(const ModelNode &node,
|
void NodeInstanceView::requestModelNodePreviewImage(const ModelNode &node,
|
||||||
const ModelNode &renderNode,
|
const ModelNode &renderNode,
|
||||||
const QSize &size) const
|
const QSize &size,
|
||||||
|
const QByteArray &requestId) const
|
||||||
{
|
{
|
||||||
if (m_nodeInstanceServer && node.isValid() && hasInstanceForModelNode(node)) {
|
if (m_nodeInstanceServer && node.isValid() && hasInstanceForModelNode(node)) {
|
||||||
auto instance = instanceForModelNode(node);
|
auto instance = instanceForModelNode(node);
|
||||||
@@ -1842,16 +1843,17 @@ void NodeInstanceView::requestModelNodePreviewImage(const ModelNode &node,
|
|||||||
componentPath = ModelUtils::componentFilePath(node);
|
componentPath = ModelUtils::componentFilePath(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const double ratio = m_externalDependencies.formEditorDevicePixelRatio();
|
||||||
|
|
||||||
if (size.isValid()) {
|
if (size.isValid()) {
|
||||||
imageSize = size;
|
imageSize = size * ratio;
|
||||||
} else {
|
} else {
|
||||||
const double ratio = m_externalDependencies.formEditorDevicePixelRatio();
|
|
||||||
const int dim = Constants::MODELNODE_PREVIEW_IMAGE_DIMENSIONS * ratio;
|
const int dim = Constants::MODELNODE_PREVIEW_IMAGE_DIMENSIONS * ratio;
|
||||||
imageSize = {dim, dim};
|
imageSize = {dim, dim};
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nodeInstanceServer->requestModelNodePreviewImage(RequestModelNodePreviewImageCommand(
|
m_nodeInstanceServer->requestModelNodePreviewImage(RequestModelNodePreviewImageCommand(
|
||||||
instance.instanceId(), imageSize, componentPath, renderItemId));
|
instance.instanceId(), imageSize, componentPath, renderItemId, requestId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1997,7 +1999,8 @@ void NodeInstanceView::endNanotrace()
|
|||||||
|
|
||||||
QVariant NodeInstanceView::previewImageDataForGenericNode(const ModelNode &modelNode,
|
QVariant NodeInstanceView::previewImageDataForGenericNode(const ModelNode &modelNode,
|
||||||
const ModelNode &renderNode,
|
const ModelNode &renderNode,
|
||||||
const QSize &size) const
|
const QSize &size,
|
||||||
|
const QByteArray &requestId) const
|
||||||
{
|
{
|
||||||
if (!modelNode.isValid())
|
if (!modelNode.isValid())
|
||||||
return {};
|
return {};
|
||||||
@@ -2014,23 +2017,23 @@ QVariant NodeInstanceView::previewImageDataForGenericNode(const ModelNode &model
|
|||||||
imageData.id = id;
|
imageData.id = id;
|
||||||
|
|
||||||
// There might be multiple requests for different preview pixmap sizes.
|
// There might be multiple requests for different preview pixmap sizes.
|
||||||
// Here only the one with the default size is stored.
|
// Here only the one with no request id is stored.
|
||||||
const double ratio = externalDependencies().formEditorDevicePixelRatio();
|
if (requestId.isEmpty())
|
||||||
const int dim = Constants::MODELNODE_PREVIEW_IMAGE_DIMENSIONS * ratio;
|
|
||||||
if (size.width() == dim && size.height() == dim)
|
|
||||||
m_imageDataMap.insert(id, imageData);
|
m_imageDataMap.insert(id, imageData);
|
||||||
}
|
}
|
||||||
requestModelNodePreviewImage(modelNode, renderNode, size);
|
requestModelNodePreviewImage(modelNode, renderNode, size, requestId);
|
||||||
|
|
||||||
return modelNodePreviewImageDataToVariant(imageData);
|
return modelNodePreviewImageDataToVariant(imageData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceView::updatePreviewImageForNode(const ModelNode &modelNode, const QImage &image)
|
void NodeInstanceView::updatePreviewImageForNode(const ModelNode &modelNode,
|
||||||
|
const QImage &image,
|
||||||
|
const QByteArray &requestId)
|
||||||
{
|
{
|
||||||
QPixmap pixmap = QPixmap::fromImage(image);
|
QPixmap pixmap = QPixmap::fromImage(image);
|
||||||
if (m_imageDataMap.contains(modelNode.id()))
|
if (m_imageDataMap.contains(modelNode.id()))
|
||||||
m_imageDataMap[modelNode.id()].pixmap = pixmap;
|
m_imageDataMap[modelNode.id()].pixmap = pixmap;
|
||||||
emitModelNodelPreviewPixmapChanged(modelNode, pixmap);
|
emitModelNodelPreviewPixmapChanged(modelNode, pixmap, requestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeInstanceView::updateWatcher(const QString &path)
|
void NodeInstanceView::updateWatcher(const QString &path)
|
||||||
|
@@ -385,7 +385,9 @@ void AbstractView::updateImport3DSupport(const QVariantMap &/*supportMap*/)
|
|||||||
// position of the requested view position.
|
// position of the requested view position.
|
||||||
void AbstractView::nodeAtPosReady(const ModelNode &/*modelNode*/, const QVector3D &/*pos3d*/) {}
|
void AbstractView::nodeAtPosReady(const ModelNode &/*modelNode*/, const QVector3D &/*pos3d*/) {}
|
||||||
|
|
||||||
void AbstractView::modelNodePreviewPixmapChanged(const ModelNode &/*node*/, const QPixmap &/*pixmap*/)
|
void AbstractView::modelNodePreviewPixmapChanged(const ModelNode & /*node*/,
|
||||||
|
const QPixmap & /*pixmap*/,
|
||||||
|
const QByteArray & /*requestId*/)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -749,10 +751,12 @@ void AbstractView::emitUpdateActiveScene3D(const QVariantMap &sceneState)
|
|||||||
model()->d->notifyUpdateActiveScene3D(sceneState);
|
model()->d->notifyUpdateActiveScene3D(sceneState);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractView::emitModelNodelPreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap)
|
void AbstractView::emitModelNodelPreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId)
|
||||||
{
|
{
|
||||||
if (model())
|
if (model())
|
||||||
model()->d->notifyModelNodePreviewPixmapChanged(node, pixmap);
|
model()->d->notifyModelNodePreviewPixmapChanged(node, pixmap, requestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractView::emitImport3DSupportChanged(const QVariantMap &supportMap)
|
void AbstractView::emitImport3DSupportChanged(const QVariantMap &supportMap)
|
||||||
|
@@ -715,10 +715,12 @@ void ModelPrivate::notifyUpdateActiveScene3D(const QVariantMap &sceneState)
|
|||||||
notifyInstanceChanges([&](AbstractView *view) { view->updateActiveScene3D(sceneState); });
|
notifyInstanceChanges([&](AbstractView *view) { view->updateActiveScene3D(sceneState); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelPrivate::notifyModelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap)
|
void ModelPrivate::notifyModelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId)
|
||||||
{
|
{
|
||||||
notifyInstanceChanges(
|
notifyInstanceChanges(
|
||||||
[&](AbstractView *view) { view->modelNodePreviewPixmapChanged(node, pixmap); });
|
[&](AbstractView *view) { view->modelNodePreviewPixmapChanged(node, pixmap, requestId); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelPrivate::notifyImport3DSupportChanged(const QVariantMap &supportMap)
|
void ModelPrivate::notifyImport3DSupportChanged(const QVariantMap &supportMap)
|
||||||
|
@@ -221,7 +221,9 @@ public:
|
|||||||
|
|
||||||
void notifyRenderImage3DChanged(const QImage &image);
|
void notifyRenderImage3DChanged(const QImage &image);
|
||||||
void notifyUpdateActiveScene3D(const QVariantMap &sceneState);
|
void notifyUpdateActiveScene3D(const QVariantMap &sceneState);
|
||||||
void notifyModelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap);
|
void notifyModelNodePreviewPixmapChanged(const ModelNode &node,
|
||||||
|
const QPixmap &pixmap,
|
||||||
|
const QByteArray &requestId);
|
||||||
void notifyImport3DSupportChanged(const QVariantMap &supportMap);
|
void notifyImport3DSupportChanged(const QVariantMap &supportMap);
|
||||||
void notifyNodeAtPosResult(const ModelNode &modelNode, const QVector3D &pos3d);
|
void notifyNodeAtPosResult(const ModelNode &modelNode, const QVector3D &pos3d);
|
||||||
void notifyView3DAction(View3DActionType type, const QVariant &value);
|
void notifyView3DAction(View3DActionType type, const QVariant &value);
|
||||||
|
@@ -1377,6 +1377,7 @@ void Qt5InformationNodeInstanceServer::doRenderModelNode3DImageView(
|
|||||||
// Key number is selected so that it is unlikely to conflict other ImageContainer use.
|
// Key number is selected so that it is unlikely to conflict other ImageContainer use.
|
||||||
ImageContainer imgContainer(cmd.instanceId(), {}, 2100000001 + cmd.instanceId());
|
ImageContainer imgContainer(cmd.instanceId(), {}, 2100000001 + cmd.instanceId());
|
||||||
imgContainer.setImage(renderImage);
|
imgContainer.setImage(renderImage);
|
||||||
|
imgContainer.setRequestId(cmd.requestId());
|
||||||
|
|
||||||
// send the rendered image to creator process
|
// send the rendered image to creator process
|
||||||
nodeInstanceClient()->handlePuppetToCreatorCommand(
|
nodeInstanceClient()->handlePuppetToCreatorCommand(
|
||||||
@@ -1472,6 +1473,7 @@ void Qt5InformationNodeInstanceServer::doRenderModelNode2DImageView(const Reques
|
|||||||
|
|
||||||
if (!renderImage.isNull()) {
|
if (!renderImage.isNull()) {
|
||||||
imgContainer.setImage(renderImage);
|
imgContainer.setImage(renderImage);
|
||||||
|
imgContainer.setRequestId(cmd.requestId());
|
||||||
|
|
||||||
// send the rendered image to creator process
|
// send the rendered image to creator process
|
||||||
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::RenderModelNodePreviewImage,
|
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::RenderModelNodePreviewImage,
|
||||||
|
Reference in New Issue
Block a user