From 0b74df58a5f657b68480e393f3f9528c1d7a0707 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 4 Aug 2014 14:01:04 +0200 Subject: [PATCH] QmlDesigner.DocumentManager: Fix goIntoComponent for Loader We have have to check and handle sourceComponent and component (Tab). Change-Id: I736648fc09fe4ee3333c4524666e3acea500804a Reviewed-by: Tim Jenssen --- src/plugins/qmldesigner/documentmanager.cpp | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 88ab5a45566..0ba3dfa90ea 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -120,6 +121,34 @@ static void openFileComponentForDelegate(const ModelNode &modelNode) openFileComponent(modelNode.nodeProperty("delegate").modelNode()); } +static void openComponentSourcePropertyOfLoader(const ModelNode &modelNode) +{ + QmlDesignerPlugin::instance()->viewManager().nextFileIsCalledInternally(); + + QHash propertyHash; + + getProperties(modelNode, propertyHash); + + ModelNode componentModelNode; + + if (modelNode.hasNodeProperty("sourceComponent")) { + componentModelNode = modelNode.nodeProperty("sourceComponent").modelNode(); + } else if (modelNode.hasNodeListProperty("component")) { + + /* + * The component property should be a NodeProperty, but currently is a NodeListProperty, because + * the default property is always implcitly a NodeListProperty. This is something that has to be fixed. + */ + + componentModelNode = modelNode.nodeListProperty("component").toModelNodeList().first(); + } + + Core::EditorManager::openEditor(componentModelNode.metaInfo().componentFileName(), Core::Id(), Core::EditorManager::DoNotMakeVisible); + + ModelNode rootModelNode = currentDesignDocument()->rewriterView()->rootModelNode(); + applyProperties(rootModelNode, propertyHash); +} + static void openSourcePropertyOfLoader(const ModelNode &modelNode) { QmlDesignerPlugin::instance()->viewManager().nextFileIsCalledInternally(); @@ -202,6 +231,22 @@ static bool hasDelegateWithFileComponent(const ModelNode &node) return false; } +static bool isLoaderWithSourceComponent(const ModelNode &modelNode) +{ + if (modelNode.isValid() + && modelNode.metaInfo().isValid() + && modelNode.metaInfo().isSubclassOf("QtQuick.Loader", -1, -1)) { + + if (modelNode.hasNodeProperty("sourceComponent")) + return true; + if (modelNode.hasNodeListProperty("component")) + return true; + } + + return false; + +} + static bool hasSourceWithFileComponent(const ModelNode &modelNode) { if (modelNode.isValid() @@ -265,6 +310,8 @@ void DocumentManager::goIntoComponent(const ModelNode &modelNode) openFileComponentForDelegate(modelNode); else if (hasSourceWithFileComponent(modelNode)) openSourcePropertyOfLoader(modelNode); + else if (isLoaderWithSourceComponent(modelNode)) + openComponentSourcePropertyOfLoader(modelNode); else openInlineComponent(modelNode); }