QmlDesigner: Store 3D edit tool states per document

This way we avoid interference from scenes in other documents.

3D Edit view content is also cleared whenever a model is detached,
and puppet resize is automatically triggered if incorrectly sized
image is received to keep edit 3D view content up to date.

Change-Id: Ic7a71f1d89f0ebfe5a62b49ea62570242b8f5b1d
Fixes: QDS-1734
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2020-03-06 16:14:12 +02:00
parent 42f34c8a55
commit e8f76f0050
4 changed files with 19 additions and 3 deletions

View File

@@ -73,6 +73,10 @@ Edit3DWidget *Edit3DView::edit3DWidget() const
void Edit3DView::renderImage3DChanged(const QImage &img)
{
edit3DWidget()->canvas()->updateRenderImage(img);
// Notify puppet to resize if received image wasn't correct size
if (img.size() != canvasSize())
edit3DViewResized(canvasSize());
}
void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState)
@@ -118,6 +122,15 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState)
m_editLightAction->action()->setChecked(false);
}
void Edit3DView::modelAboutToBeDetached(Model *model)
{
Q_UNUSED(model)
// Clear the image when model is detached (i.e. changing documents)
QImage emptyImage;
edit3DWidget()->canvas()->updateRenderImage(emptyImage);
}
void Edit3DView::sendInputEvent(QInputEvent *e) const
{
nodeInstanceView()->sendInputEvent(e);

View File

@@ -55,6 +55,7 @@ public:
void renderImage3DChanged(const QImage &img) override;
void updateActiveScene3D(const QVariantMap &sceneState) override;
void modelAboutToBeDetached(Model *model) override;
void sendInputEvent(QInputEvent *e) const;
void edit3DViewResized(const QSize &size) const;

View File

@@ -209,7 +209,9 @@ private: // functions
ProjectExplorer::Target *m_currentTarget = nullptr;
int m_restartProcessTimerId;
RewriterTransaction m_puppetTransaction;
QHash<QString, QVariantMap> m_edit3DToolStates; // Key: instance qml id, value: related tool states
// key: fileUrl value: (key: instance qml id, value: related tool states)
QHash<QUrl, QHash<QString, QVariantMap>> m_edit3DToolStates;
};
} // namespace ProxyNodeInstanceView

View File

@@ -984,7 +984,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
importVector,
mockupTypesVector,
model()->fileUrl(),
m_edit3DToolStates);
m_edit3DToolStates[model()->fileUrl()]);
}
ClearSceneCommand NodeInstanceView::createClearSceneCommand() const
@@ -1454,7 +1454,7 @@ void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand
auto data = qvariant_cast<QVariantList>(command.data());
if (data.size() == 3) {
QString qmlId = data[0].toString();
m_edit3DToolStates[qmlId].insert(data[1].toString(), data[2]);
m_edit3DToolStates[model()->fileUrl()][qmlId].insert(data[1].toString(), data[2]);
}
}
} else if (command.type() == PuppetToCreatorCommand::Render3DView) {