From defcfadd1746428c14440e6e9660ffb126f0668e Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@digia.com>
Date: Thu, 26 Sep 2013 18:46:39 +0200
Subject: [PATCH] QmlDesigner: Add master to component view

Change-Id: I236f78b73b8eea2b780e64d833fdedcfa7d246d1
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
---
 .../components/componentcore/crumblebar.cpp   |  9 ++++--
 .../integration/componentaction.cpp           |  7 +++--
 .../components/integration/componentaction.h  |  1 +
 .../components/integration/componentview.cpp  | 30 +++++++++++++++++++
 .../components/integration/componentview.h    |  3 ++
 .../components/integration/designdocument.cpp | 14 +++++++++
 .../components/integration/designdocument.h   |  1 +
 .../designercore/include/viewmanager.h        |  1 +
 .../designercore/model/viewmanager.cpp        |  8 +++++
 src/plugins/qmldesigner/qmldesignerplugin.cpp |  1 +
 10 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp
index 47cbdcdf40e..891a82c4f7c 100644
--- a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp
@@ -147,15 +147,18 @@ void CrumbleBar::onCrumblePathElementClicked(const QVariant &data)
             && clickedCrumbleBarInfo.fileName == currentDesignDocument()->fileName()) {
         nextFileIsCalledInternally();
         currentDesignDocument()->changeToDocumentModel();
+        QmlDesignerPlugin::instance()->viewManager().setComponentViewToMaster();
     } else {
         crumblePath()->popElement();
         nextFileIsCalledInternally();
         Core::EditorManager::openEditor(clickedCrumbleBarInfo.fileName, Core::Id(),
                                         Core::EditorManager::DoNotMakeVisible);
         if (!clickedCrumbleBarInfo.componentId.isEmpty()) {
-            currentDesignDocument()->changeToSubComponent(
-                        currentDesignDocument()->rewriterView()->modelNodeForId(clickedCrumbleBarInfo.componentId));
-            //pushInFileComponent(clickedCrumbleBarInfo.componentId);
+            ModelNode componentNode = currentDesignDocument()->rewriterView()->modelNodeForId(clickedCrumbleBarInfo.componentId);
+            currentDesignDocument()->changeToSubComponent(componentNode);
+            QmlDesignerPlugin::instance()->viewManager().setComponentNode(componentNode);
+        } else {
+            QmlDesignerPlugin::instance()->viewManager().setComponentViewToMaster();
         }
     }
     updateVisibility();
diff --git a/src/plugins/qmldesigner/components/integration/componentaction.cpp b/src/plugins/qmldesigner/components/integration/componentaction.cpp
index 78667b67769..194e3ebb083 100644
--- a/src/plugins/qmldesigner/components/integration/componentaction.cpp
+++ b/src/plugins/qmldesigner/components/integration/componentaction.cpp
@@ -68,9 +68,12 @@ void ComponentAction::emitCurrentComponentChanged(int index)
     if (dontEmitCurrentComponentChanged)
         return;
 
-    ModelNode componentNode = m_componentView->modelNode(index);
+    ModelNode componentModelNode = m_componentView->modelNode(index);
 
-    emit currentComponentChanged(componentNode);
+    if (componentModelNode.isRootNode())
+        emit changedToMaster();
+    else
+        emit currentComponentChanged(componentModelNode);
 }
 
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/integration/componentaction.h b/src/plugins/qmldesigner/components/integration/componentaction.h
index d421d2f5dae..875ddacc141 100644
--- a/src/plugins/qmldesigner/components/integration/componentaction.h
+++ b/src/plugins/qmldesigner/components/integration/componentaction.h
@@ -56,6 +56,7 @@ protected:
 
 signals:
     void currentComponentChanged(const ModelNode &node);
+    void changedToMaster();
     void currentIndexChanged(int index);
 
 public slots:
diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp
index 80c0489a647..082b3e220b9 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.cpp
+++ b/src/plugins/qmldesigner/components/integration/componentview.cpp
@@ -71,6 +71,11 @@ void ComponentView::setComponentNode(const ModelNode &node)
     m_componentAction->setCurrentIndex(indexForNode(node));
 }
 
+void ComponentView::setComponentToMaster()
+{
+    m_componentAction->setCurrentIndex(indexOfMaster());
+}
+
 void ComponentView::removeSingleNodeFromList(const ModelNode &node)
 {
     for (int row = 0; row < m_standardItemModel->rowCount(); row++) {
@@ -89,6 +94,24 @@ int ComponentView::indexForNode(const ModelNode &node)
     return -1;
 }
 
+int ComponentView::indexOfMaster()
+{
+    for (int row = 0; row < m_standardItemModel->rowCount(); row++) {
+        if (m_standardItemModel->item(row)->data(ModelNodeRole).toInt() == 0)
+            return row;
+    }
+
+    return -1;
+}
+
+void ComponentView::addMasterDocument()
+{
+    QStandardItem *item = new QStandardItem("master");
+    item->setData(QVariant::fromValue(0), ModelNodeRole);
+    item->setEditable(false);
+    m_standardItemModel->appendRow(item);
+}
+
 void ComponentView::modelAttached(Model *model)
 {
     if (AbstractView::model() == model)
@@ -129,8 +152,15 @@ void ComponentView::searchForComponentAndAddToList(const ModelNode &node)
     nodeList.append(node.allSubModelNodes());
 
 
+    bool masterNotAdded = true;
+
     foreach (const ModelNode &node, nodeList) {
         if (node.nodeSourceType() == ModelNode::NodeWithComponentSource) {
+            if (masterNotAdded) {
+                masterNotAdded = true;
+                addMasterDocument();
+            }
+
             if (!node.id().isEmpty()) {
                 QStandardItem *item = new QStandardItem(node.id());
                 item->setData(QVariant::fromValue(node.internalId()), ModelNodeRole);
diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h
index 3c5f3ab74b2..43842dcab03 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.h
+++ b/src/plugins/qmldesigner/components/integration/componentview.h
@@ -116,6 +116,7 @@ public:
     ModelNode modelNode(int index) const;
 
     void setComponentNode(const ModelNode &node);
+    void setComponentToMaster();
 
 signals:
     void componentListChanged(const QStringList &componentList);
@@ -126,6 +127,8 @@ private: //functions
     void searchForComponentAndRemoveFromList(const ModelNode &node);
     void removeSingleNodeFromList(const ModelNode &node);
     int indexForNode(const ModelNode &node);
+    int indexOfMaster();
+    void addMasterDocument();
 
 private:
     QStandardItemModel *m_standardItemModel;
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp
index 510022e76b2..6855346372e 100644
--- a/src/plugins/qmldesigner/components/integration/designdocument.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp
@@ -264,6 +264,7 @@ void DesignDocument::changeToDocumentModel()
     viewManager().detachRewriterView();
     viewManager().detachViewsExceptRewriterAndComponetView();
 
+
     m_inFileComponentModel.reset();
 
     viewManager().attachRewriterView();
@@ -297,6 +298,19 @@ void DesignDocument::changeToSubComponent(const ModelNode &componentNode)
         attachRewriterToModel();
 
     QmlDesignerPlugin::instance()->viewManager().pushInFileComponentOnCrumbleBar(componentNode);
+    QmlDesignerPlugin::instance()->viewManager().setComponentNode(componentNode);
+}
+
+void DesignDocument::changeToMaster()
+{
+    if (QmlDesignerPlugin::instance()->currentDesignDocument() != this)
+        return;
+
+    if (m_inFileComponentModel)
+        changeToDocumentModel();
+
+    QmlDesignerPlugin::instance()->viewManager().pushFileOnCrumbleBar(fileName());
+    QmlDesignerPlugin::instance()->viewManager().setComponentNode(rootModelNode());
 }
 
 void DesignDocument::attachRewriterToModel()
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.h b/src/plugins/qmldesigner/components/integration/designdocument.h
index e4178b03282..36261b99f4e 100644
--- a/src/plugins/qmldesigner/components/integration/designdocument.h
+++ b/src/plugins/qmldesigner/components/integration/designdocument.h
@@ -118,6 +118,7 @@ public slots:
     void redo();
     void updateActiveQtVersion();
     void changeToSubComponent(const ModelNode &componentNode);
+    void changeToMaster();
 
 private slots:
     void updateFileName(const QString &oldFileName, const QString &newFileName);
diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h
index fb2e7b71c0d..97d7367c5c4 100644
--- a/src/plugins/qmldesigner/designercore/include/viewmanager.h
+++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h
@@ -70,6 +70,7 @@ public:
 
     void setItemLibraryViewResourcePath(const QString &resourcePath);
     void setComponentNode(const ModelNode &componentNode);
+    void setComponentViewToMaster();
     void setNodeInstanceViewQtPath(const QString & qtPath);
 
     void resetPropertyEditorView();
diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
index 6ed7323f2c1..2dd3c68ce02 100644
--- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
@@ -132,11 +132,14 @@ void ViewManager::attachComponentView()
 {
     documentModel()->attachView(&m_componentView);
     QObject::connect(m_componentView.action(), SIGNAL(currentComponentChanged(ModelNode)), currentDesignDocument(), SLOT(changeToSubComponent(ModelNode)));
+    QObject::connect(m_componentView.action(), SIGNAL(changedToMaster()), currentDesignDocument(), SLOT(changeToMaster()));
 }
 
 void ViewManager::detachComponentView()
 {
     QObject::disconnect(m_componentView.action(), SIGNAL(currentComponentChanged(ModelNode)), currentDesignDocument(), SLOT(changeToSubComponent(ModelNode)));
+    QObject::disconnect(m_componentView.action(), SIGNAL(changedToMaster()), currentDesignDocument(), SLOT(changeToMaster()));
+
     documentModel()->detachView(&m_componentView);
 }
 
@@ -166,6 +169,11 @@ void ViewManager::setComponentNode(const ModelNode &componentNode)
     m_componentView.setComponentNode(componentNode);
 }
 
+void ViewManager::setComponentViewToMaster()
+{
+    m_componentView.setComponentToMaster();
+}
+
 void ViewManager::setNodeInstanceViewQtPath(const QString &qtPath)
 {
     m_nodeInstanceView.setPathToQt(qtPath);
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp
index d9e93b30293..0c7f9b33ced 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.cpp
+++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp
@@ -233,6 +233,7 @@ void QmlDesignerPlugin::changeEditor()
     if (m_documentManager.hasCurrentDesignDocument()) {
         activateAutoSynchronization();
         m_viewManager.pushFileOnCrumbleBar(m_documentManager.currentDesignDocument()->fileName());
+        m_viewManager.setComponentViewToMaster();
     }
 
     m_shortCutManager.updateUndoActions(currentDesignDocument());
-- 
GitLab