diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp index 5bf7e6c56a3..47cbdcdf40e 100644 --- a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp +++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp @@ -31,11 +31,43 @@ #include "qmldesignerplugin.h" +#include + #include #include namespace QmlDesigner { +static DesignDocument *currentDesignDocument() +{ + return QmlDesignerPlugin::instance()->documentManager().currentDesignDocument(); +} + +static inline QString componentIdForModelNode(const ModelNode &modelNode) +{ + if (modelNode.id().isEmpty()) { + if (modelNode.hasParentProperty() + && modelNode.parentProperty().name() != "data" + && modelNode.parentProperty().name() != "children") { + return modelNode.parentProperty().name(); + } else { + return modelNode.simplifiedTypeName(); + } + } else { + return modelNode.id(); + } +} + +static CrumbleBarInfo createCrumbleBarInfoFromModelNode(const ModelNode &modelNode) +{ + CrumbleBarInfo crumbleBarInfo; + crumbleBarInfo.componentId = componentIdForModelNode(modelNode); + crumbleBarInfo.fileName = currentDesignDocument()->textEditor()->document()->filePath(); + crumbleBarInfo.modelNode = modelNode; + + return crumbleBarInfo; +} + CrumbleBar::CrumbleBar(QObject *parent) : QObject(parent), m_isInternalCalled(false), @@ -45,6 +77,8 @@ CrumbleBar::CrumbleBar(QObject *parent) : SIGNAL(elementClicked(QVariant)), this, SLOT(onCrumblePathElementClicked(QVariant))); + + updateVisibility(); } void CrumbleBar::pushFile(const QString &fileName) @@ -65,27 +99,24 @@ void CrumbleBar::pushFile(const QString &fileName) crumblePath()->pushElement(fileName.split("/").last(), QVariant::fromValue(crumbleBarInfo)); m_isInternalCalled = false; + + updateVisibility(); } -static DesignDocument *currentDesignDocument() +void CrumbleBar::pushInFileComponent(const ModelNode &modelNode) { - return QmlDesignerPlugin::instance()->documentManager().currentDesignDocument(); -} - -void CrumbleBar::pushInFileComponent(const QString &componentId) -{ - CrumbleBarInfo crumbleBarInfo; - crumbleBarInfo.componentId = componentId; - crumbleBarInfo.fileName = currentDesignDocument()->textEditor()->document()->filePath(); + CrumbleBarInfo crumbleBarInfo = createCrumbleBarInfoFromModelNode(modelNode); CrumbleBarInfo lastElementCrumbleBarInfo = crumblePath()->dataForLastIndex().value(); if (!lastElementCrumbleBarInfo.componentId.isEmpty()) crumblePath()->popElement(); - crumblePath()->pushElement(componentId, QVariant::fromValue(crumbleBarInfo)); + crumblePath()->pushElement(crumbleBarInfo.componentId, QVariant::fromValue(crumbleBarInfo)); m_isInternalCalled = false; + + updateVisibility(); } void CrumbleBar::nextFileIsCalledInternally() @@ -111,7 +142,6 @@ void CrumbleBar::onCrumblePathElementClicked(const QVariant &data) if (!crumblePath()->dataForLastIndex().value().componentId.isEmpty()) crumblePath()->popElement(); - m_isInternalCalled = true; if (clickedCrumbleBarInfo.componentId.isEmpty() && clickedCrumbleBarInfo.fileName == currentDesignDocument()->fileName()) { @@ -125,9 +155,15 @@ void CrumbleBar::onCrumblePathElementClicked(const QVariant &data) if (!clickedCrumbleBarInfo.componentId.isEmpty()) { currentDesignDocument()->changeToSubComponent( currentDesignDocument()->rewriterView()->modelNodeForId(clickedCrumbleBarInfo.componentId)); - pushInFileComponent(clickedCrumbleBarInfo.componentId); + //pushInFileComponent(clickedCrumbleBarInfo.componentId); } } + updateVisibility(); +} + +void CrumbleBar::updateVisibility() +{ + crumblePath()->setVisible(crumblePath()->length() > 1); } bool operator ==(const CrumbleBarInfo &first, const CrumbleBarInfo &second) diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.h b/src/plugins/qmldesigner/components/componentcore/crumblebar.h index c019d752f04..632edf3f2de 100644 --- a/src/plugins/qmldesigner/components/componentcore/crumblebar.h +++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.h @@ -32,6 +32,7 @@ #include #include +#include namespace QmlDesigner { @@ -42,7 +43,7 @@ public: explicit CrumbleBar(QObject *parent = 0); void pushFile(const QString &fileName); - void pushInFileComponent(const QString &componentId); + void pushInFileComponent(const ModelNode &modelNode); void nextFileIsCalledInternally(); @@ -51,6 +52,9 @@ public: private slots: void onCrumblePathElementClicked(const QVariant &data); +private: + void updateVisibility(); + private: bool m_isInternalCalled; Utils::CrumblePath *m_crumblePath; @@ -60,6 +64,7 @@ class CrumbleBarInfo { public: QString fileName; QString componentId; + ModelNode modelNode; }; bool operator ==(const CrumbleBarInfo &first, const CrumbleBarInfo &second); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index a83631abf78..0222893af5a 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -285,18 +285,11 @@ void DesignDocument::changeToInFileComponentModel(ComponentTextModifier *textMod viewManager().attachViewsExceptRewriterAndComponetView(); } -void DesignDocument::changeToSubComponentAndPushOnCrumblePath(const ModelNode &componentNode) +void DesignDocument::changeToSubComponent(const ModelNode &componentNode) { if (QmlDesignerPlugin::instance()->currentDesignDocument() != this) return; - changeToSubComponent(componentNode); - - QmlDesignerPlugin::instance()->viewManager().pushInFileComponentOnCrambleBar(componentNode.id()); -} - -void DesignDocument::changeToSubComponent(const ModelNode &componentNode) -{ if (m_inFileComponentModel) changeToDocumentModel(); @@ -304,6 +297,8 @@ void DesignDocument::changeToSubComponent(const ModelNode &componentNode) if (subComponentLoaded) attachRewriterToModel(); + + QmlDesignerPlugin::instance()->viewManager().pushInFileComponentOnCrumbleBar(componentNode); } void DesignDocument::attachRewriterToModel() diff --git a/src/plugins/qmldesigner/components/integration/designdocument.h b/src/plugins/qmldesigner/components/integration/designdocument.h index e2e789032d5..e4178b03282 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.h +++ b/src/plugins/qmldesigner/components/integration/designdocument.h @@ -117,7 +117,6 @@ public slots: void undo(); void redo(); void updateActiveQtVersion(); - void changeToSubComponentAndPushOnCrumblePath(const ModelNode &componentNode); void changeToSubComponent(const ModelNode &componentNode); private slots: diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index 9f9669d1563..5a4f76d0e88 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -81,8 +81,7 @@ public: void enableWidgets(); void pushFileOnCrumbleBar(const QString &fileName); - void pushInFileComponentOnCrambleBar(const QString &componentId); - + void pushInFileComponentOnCrumbleBar(const ModelNode &modelNode); void nextFileIsCalledInternally(); NodeInstanceView *nodeInstanceView(); diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index 6de517fb0f2..15068ac3788 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -213,10 +213,9 @@ void ViewManager::pushFileOnCrumbleBar(const QString &fileName) crumbleBar()->pushFile(fileName); } -void ViewManager::pushInFileComponentOnCrambleBar(const QString &componentId) - +void ViewManager::pushInFileComponentOnCrumbleBar(const ModelNode &modelNode) { - crumbleBar()->pushInFileComponent(componentId); + crumbleBar()->pushInFileComponent(modelNode); } void ViewManager::nextFileIsCalledInternally()