From 13033734a1b1bf88d2f33b5391360a37e9afc6d4 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 12 Aug 2013 17:30:50 +0200 Subject: [PATCH] QmlDesigner: Fix crumble bar for infile components CrumbleBarInfo contains the ModelNode to properly identify the node. We cannot use the id, because no every component has an id. If the crumble bar only contains one item it is hidden. Change-Id: I4d421eaad8962aa9043567e1f27957b1aa089766 Reviewed-by: Marco Bubke --- .../components/componentcore/crumblebar.cpp | 60 +++++++++++++++---- .../components/componentcore/crumblebar.h | 7 ++- .../components/integration/designdocument.cpp | 11 +--- .../components/integration/designdocument.h | 1 - .../designercore/include/viewmanager.h | 3 +- .../designercore/model/viewmanager.cpp | 5 +- 6 files changed, 60 insertions(+), 27 deletions(-) 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()