Handle the case when there is no 3D Nodes in the qml doc

When there is no 3D node in the qml doc, the view 3D will still be
enabled and manipulate-able. Also few relevant tweaks.

Task-number: QDS-1693
Change-Id: I758f783108b317a6971703bee8e3fb564400ed8b
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Mahmoud Badri
2020-02-26 15:03:02 +02:00
parent a75cb04442
commit 55b3d53213
7 changed files with 78 additions and 69 deletions

View File

@@ -62,14 +62,16 @@ Item {
onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective)
onShowEditLightChanged: _generalHelper.storeToolState(sceneId,"showEditLight", showEditLight)
onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation)
onActiveSceneChanged: updateActiveScene();
onActiveSceneChanged: {
function updateActiveScene()
{
if (editView) {
// Destroy is async, so make sure we don't get any more updates for the old editView
_generalHelper.enableItemUpdate(editView, false);
editView.destroy();
}
if (activeScene) {
// importScene cannot be updated after initial set, so we need to reconstruct entire View3D
var component = Qt.createComponent("SceneView3D.qml");
if (component.status === Component.Ready) {
@@ -87,6 +89,13 @@ Item {
updateToolStates(_generalHelper.getToolStates(sceneId), true);
}
}
function clearActiveScene()
{
activeScene = null;
sceneId = "";
updateActiveScene();
}
// Disables edit view update if scene doesn't match current activeScene.

View File

@@ -420,14 +420,22 @@ void Qt5InformationNodeInstanceServer::updateActiveSceneToEditView3D()
sceneIdVar = QVariant::fromValue(sceneId);
sceneIdProperty.write(sceneIdVar);
QVariantMap toolStates;
// if m_active3DScene is null, QQmlProperty::write() doesn't work so invoke the updateActiveScene
// qml method directly
if (!m_active3DScene) {
QMetaObject::invokeMethod(m_editView3DRootItem, "clearActiveScene", Qt::QueuedConnection);
toolStates.insert("sceneInstanceId", QVariant::fromValue(-1));
} else {
QQmlProperty sceneProperty(m_editView3DRootItem, "activeScene", context());
sceneProperty.write(activeSceneVar);
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
QVariantMap toolStates;
if (helper)
toolStates = helper->getToolStates(sceneId);
toolStates.insert("sceneInstanceId", QVariant::fromValue(sceneInstance.instanceId()));
}
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ActiveSceneChanged,
toolStates});
@@ -514,7 +522,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView()
{
static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW");
if (m_editView3DRootItem && !showEditView) {
auto t = std::chrono::steady_clock::now();
if (!m_editView3DContentItem) {
m_editView3DContentItem = QQmlProperty::read(m_editView3DRootItem, "contentItem").value<QQuickItem *>();
if (m_editView3DContentItem) {
@@ -544,10 +551,6 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView()
// send the rendered image to creator process
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Render3DView,
QVariant::fromValue(imgContainer)});
qDebug() << "\x1b[42m \x1b[1m" << __FUNCTION__
<< ", t=" << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()-t).count()
<< "\x1b[m";
if (m_needRender) {
m_renderTimer.start(0);
m_needRender = false;
@@ -880,7 +883,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
m_active3DScene = m_3DSceneMap.begin().key();
m_active3DView = findView3DForSceneRoot(m_active3DScene);
}
if (m_active3DScene) {
createEditView3D();
if (!m_editView3DRootItem) {
m_active3DScene = nullptr;
@@ -905,7 +908,6 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
updateActiveSceneToEditView3D();
createCameraAndLightGizmos(instanceList);
}
#else
Q_UNUSED(instanceList)
Q_UNUSED(toolStates)

View File

@@ -117,9 +117,7 @@ void Edit3DCanvas::dropEvent(QDropEvent *e)
{
Q_UNUSED(e)
QmlVisualNode::createQmlVisualNode(m_parent->view(), m_itemLibraryEntry, m_activeScene, {});
QmlVisualNode::createQml3DNode(m_parent->view(), m_itemLibraryEntry, m_activeScene);
}
}

View File

@@ -59,7 +59,7 @@ protected:
private:
QPointer<Edit3DWidget> m_parent;
QImage m_image;
qint32 m_activeScene;
qint32 m_activeScene = -1;
ItemLibraryEntry m_itemLibraryEntry;
};

View File

@@ -102,9 +102,9 @@ public:
const Position &position,
NodeAbstractProperty parentproperty);
static QmlVisualNode createQmlVisualNode(AbstractView *view,
static QmlVisualNode createQml3DNode(AbstractView *view,
const ItemLibraryEntry &itemLibraryEntry,
qint32 sceneRootId, const QVector3D &position);
qint32 sceneRootId = -1, const QVector3D &position = {});
static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId);

View File

@@ -1452,7 +1452,7 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm
QDataStream stream(command.itemData());
ItemLibraryEntry itemLibraryEntry;
stream >> itemLibraryEntry;
QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, command.sceneRootId(), {});
QmlVisualNode::createQml3DNode(this, itemLibraryEntry, command.sceneRootId(), {});
}
void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command)

View File

@@ -294,15 +294,16 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
return newQmlObjectNode;
}
QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view,
QmlVisualNode QmlVisualNode::createQml3DNode(AbstractView *view,
const ItemLibraryEntry &itemLibraryEntry,
qint32 sceneRootId, const QVector3D &position)
{
NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view, sceneRootId);
QTC_ASSERT(sceneNodeProperty.isValid(), return {});
ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
NodeAbstractProperty sceneNodeProperty = sceneRootId != -1 ? findSceneNodeProperty(view, sceneRootId)
: view->rootModelNode().defaultNodeAbstractProperty();
return node;
QTC_ASSERT(sceneNodeProperty.isValid(), return {});
return createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
}
NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId)
@@ -318,8 +319,7 @@ NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32
bool QmlVisualNode::isFlowTransition(const ModelNode &node)
{
return node.metaInfo().isValid()
&& node.metaInfo().isSubclassOf("FlowView.FlowTransition");
return node.metaInfo().isValid() && node.metaInfo().isSubclassOf("FlowView.FlowTransition");
}
bool QmlVisualNode::isFlowTransition() const