From 29ceaade9cce90c09033fe3092cd75cdb56b4bca Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 5 Jun 2020 14:52:45 +0300 Subject: [PATCH] QmlDesigner: Restore the previously active 3D scene on scene creation Store the last active scene in global 3D tool state and restore it when a scene is created after puppet relaunch. Change-Id: Ie2d69f6db6798ab383c66d38b2dea7eba13adc97 Fixes: QDS-2239 Reviewed-by: Thomas Hartmann --- .../qml2puppet/editor3d/generalhelper.cpp | 12 +++++ .../qml2puppet/editor3d/generalhelper.h | 2 + .../qt5informationnodeinstanceserver.cpp | 46 +++++++++++++------ 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp index 7e38e31bf10..ae2f235673f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp @@ -48,6 +48,8 @@ namespace QmlDesigner { namespace Internal { const QString _globalStateId = QStringLiteral("@GTS"); // global tool state +const QString _lastSceneIdKey = QStringLiteral("lastSceneId"); +const QString _rootSizeKey = QStringLiteral("rootSize"); GeneralHelper::GeneralHelper() : QObject() @@ -280,6 +282,16 @@ QString GeneralHelper::globalStateId() const return _globalStateId; } +QString GeneralHelper::lastSceneIdKey() const +{ + return _lastSceneIdKey; +} + +QString GeneralHelper::rootSizeKey() const +{ + return _rootSizeKey; +} + bool GeneralHelper::isMacOS() const { #ifdef Q_OS_MACOS diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h index 15795ac28bd..5e3adbf16bb 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h @@ -78,6 +78,8 @@ public: Q_INVOKABLE void enableItemUpdate(QQuickItem *item, bool enable); Q_INVOKABLE QVariantMap getToolStates(const QString &sceneId); QString globalStateId() const; + QString lastSceneIdKey() const; + QString rootSizeKey() const; bool isMacOS() const; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 5608a813835..b6f38c850df 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -367,6 +367,10 @@ void Qt5InformationNodeInstanceServer::updateActiveSceneToEditView3D() Q_ARG(QVariant, QVariant::fromValue(sceneId))); updateView3DRect(m_active3DView); + + auto helper = qobject_cast(m_3dHelper); + if (helper) + helper->storeToolState(helper->globalStateId(), helper->lastSceneIdKey(), QVariant(sceneId), 0); #endif } @@ -804,19 +808,9 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList(m_3dHelper); if (helper) { auto it = toolStates.constBegin(); @@ -824,9 +818,31 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QListinitToolStates(it.key(), it.value()); ++it; } - if (toolStates.contains(helper->globalStateId()) - && toolStates[helper->globalStateId()].contains("rootSize")) { - m_editView3DRootItem->setSize(toolStates[helper->globalStateId()]["rootSize"].value()); + if (toolStates.contains(helper->globalStateId())) { + if (toolStates[helper->globalStateId()].contains(helper->rootSizeKey())) + m_editView3DRootItem->setSize(toolStates[helper->globalStateId()][helper->rootSizeKey()].value()); + if (toolStates[helper->globalStateId()].contains(helper->lastSceneIdKey())) + lastSceneId = toolStates[helper->globalStateId()][helper->lastSceneIdKey()].toString(); + } + } + + // Find a scene to show + m_active3DScene = nullptr; + m_active3DView = nullptr; + if (m_editView3DRootItem && !m_3DSceneMap.isEmpty()) { + // Restore the previous scene if possible + if (!lastSceneId.isEmpty()) { + const auto keys = m_3DSceneMap.uniqueKeys(); + for (const auto key : keys) { + m_active3DScene = key; + m_active3DView = findView3DForSceneRoot(m_active3DScene); + ServerNodeInstance sceneInstance = active3DSceneInstance(); + if (lastSceneId == sceneInstance.id()) + break; + } + } else { + m_active3DScene = m_3DSceneMap.begin().key(); + m_active3DView = findView3DForSceneRoot(m_active3DScene); } } @@ -1248,7 +1264,7 @@ void Qt5InformationNodeInstanceServer::update3DViewState(const Update3dViewState m_editView3DRootItem->setSize(command.size()); auto helper = qobject_cast(m_3dHelper); if (helper) - helper->storeToolState(helper->globalStateId(), "rootSize", QVariant(command.size()), 0); + helper->storeToolState(helper->globalStateId(), helper->rootSizeKey(), QVariant(command.size()), 0); // Queue two renders to make sure icon gizmos update properly render3DEditView(2); }