From 21347cd71f5e842af4e09fa39753f39e68b95c6f Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@digia.com>
Date: Wed, 14 Aug 2013 14:39:12 +0200
Subject: [PATCH] QmlDesinger: Add combo box to add imports

Change-Id: Ic626f07d4a2bde32495b70b8c5726cb4b6821da3
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
---
 .../components/importmanager/importlabel.cpp  |  5 ++
 .../components/importmanager/importlabel.h    |  1 +
 .../importmanager/importmanagerview.cpp       | 31 ++++++++---
 .../importmanager/importmanagerview.h         |  1 +
 .../importmanager/importswidget.cpp           | 52 ++++++++++++++++++-
 .../components/importmanager/importswidget.h  | 17 +++++-
 6 files changed, 99 insertions(+), 8 deletions(-)

diff --git a/src/plugins/qmldesigner/components/importmanager/importlabel.cpp b/src/plugins/qmldesigner/components/importmanager/importlabel.cpp
index f3652ae8df4..d93ae208332 100644
--- a/src/plugins/qmldesigner/components/importmanager/importlabel.cpp
+++ b/src/plugins/qmldesigner/components/importmanager/importlabel.cpp
@@ -63,6 +63,11 @@ void ImportLabel::setImport(const Import &import)
     m_import = import;
 }
 
+const Import ImportLabel::import() const
+{
+    return m_import;
+}
+
 void ImportLabel::emitRemoveImport()
 {
     emit removeImport(m_import);
diff --git a/src/plugins/qmldesigner/components/importmanager/importlabel.h b/src/plugins/qmldesigner/components/importmanager/importlabel.h
index 45b5b89d7a7..29ff948b7cb 100644
--- a/src/plugins/qmldesigner/components/importmanager/importlabel.h
+++ b/src/plugins/qmldesigner/components/importmanager/importlabel.h
@@ -44,6 +44,7 @@ public:
     explicit ImportLabel(QWidget *parent = 0);
 
     void setImport(const Import &import);
+    const Import import() const;
 
 signals:
     void removeImport(const Import &import);
diff --git a/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp b/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp
index 763ae306f29..d4ab61053a1 100644
--- a/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp
+++ b/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp
@@ -55,6 +55,8 @@ WidgetInfo ImportManagerView::widgetInfo()
     if (m_importsWidget == 0) {
         m_importsWidget = new ImportsWidget;
         connect(m_importsWidget, SIGNAL(removeImport(Import)), this, SLOT(removeImport(Import)));
+        connect(m_importsWidget, SIGNAL(addImport(Import)), this, SLOT(addImport(Import)));
+
         if (model())
             m_importsWidget->setImports(model()->imports());
     }
@@ -66,26 +68,34 @@ void ImportManagerView::modelAttached(Model *model)
 {
     AbstractView::modelAttached(model);
 
-    if (m_importsWidget)
+    if (m_importsWidget) {
         m_importsWidget->setImports(model->imports());
+        m_importsWidget->setPossibleImports(model->possibleImports());
+        m_importsWidget->setUsedImports(model->usedImports());
+    }
 }
 
 void ImportManagerView::modelAboutToBeDetached(Model *model)
 {
-    if (m_importsWidget)
-        m_importsWidget->removeAllImports();
+    if (m_importsWidget) {
+        m_importsWidget->removeImports();
+        m_importsWidget->removePossibleImports();
+        m_importsWidget->removeUsedImports();
+    }
 
     AbstractView::modelAboutToBeDetached(model);
 }
 
 void ImportManagerView::nodeCreated(const ModelNode &createdNode)
 {
-// handle case that the import is used
+    if (m_importsWidget)
+        m_importsWidget->setUsedImports(model()->usedImports());
 }
 
 void ImportManagerView::nodeAboutToBeRemoved(const ModelNode &removedNode)
 {
-// handle case that the import is unused
+    if (m_importsWidget)
+        m_importsWidget->setUsedImports(model()->usedImports());
 }
 
 void ImportManagerView::nodeRemoved(const ModelNode &/*removedNode*/, const NodeAbstractProperty &/*parentProperty*/, AbstractView::PropertyChangeFlags /*propertyChange*/)
@@ -210,8 +220,11 @@ void ImportManagerView::nodeOrderChanged(const NodeListProperty &/*listProperty*
 
 void ImportManagerView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
 {
-    if (m_importsWidget)
+    if (m_importsWidget) {
         m_importsWidget->setImports(model()->imports());
+        m_importsWidget->setPossibleImports(model()->possibleImports());
+        m_importsWidget->setUsedImports(model()->usedImports());
+    }
 }
 
 void ImportManagerView::auxiliaryDataChanged(const ModelNode &/*node*/, const PropertyName &/*name*/, const QVariant &/*data*/)
@@ -235,4 +248,10 @@ void ImportManagerView::removeImport(const Import &import)
         model()->changeImports(QList<Import>(), QList<Import>() << import);
 }
 
+void ImportManagerView::addImport(const Import &import)
+{
+    if (model())
+        model()->changeImports(QList<Import>() << import, QList<Import>());
+}
+
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/importmanager/importmanagerview.h b/src/plugins/qmldesigner/components/importmanager/importmanagerview.h
index f9c4a74affb..3e8bb196b86 100644
--- a/src/plugins/qmldesigner/components/importmanager/importmanagerview.h
+++ b/src/plugins/qmldesigner/components/importmanager/importmanagerview.h
@@ -95,6 +95,7 @@ public:
 
 private slots:
     void removeImport(const Import &import);
+    void addImport(const Import &import);
 
 private:
     ImportsWidget *m_importsWidget;
diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp
index 380d4881720..5a0cd1ca34d 100644
--- a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp
+++ b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp
@@ -30,6 +30,7 @@
 #include "importswidget.h"
 
 #include <QVBoxLayout>
+#include <QComboBox>
 
 #include "importlabel.h"
 
@@ -39,15 +40,54 @@ ImportsWidget::ImportsWidget(QWidget *parent) :
     QWidget(parent)
 {
     setWindowTitle(tr("Import Manager"));
+    m_addImportComboBox = new QComboBox(this);
+    connect(m_addImportComboBox, SIGNAL(activated(int)), this, SLOT(addSelectedImport(int)));
 }
 
-void ImportsWidget::removeAllImports()
+void ImportsWidget::removeImports()
 {
     qDeleteAll(m_importLabels);
     m_importLabels.clear();
     updateLayout();
 }
 
+static bool isImportAlreadyUsed(const Import &import, QList<ImportLabel*> importLabels)
+{
+    foreach (ImportLabel *importLabel, importLabels) {
+        if (importLabel->import() == import)
+            return true;
+    }
+
+    return false;
+}
+
+void ImportsWidget::setPossibleImports(const QList<Import> &possibleImports)
+{
+    m_addImportComboBox->clear();
+    foreach (const Import &possibleImport, possibleImports) {
+        if (!isImportAlreadyUsed(possibleImport, m_importLabels))
+            m_addImportComboBox->addItem(possibleImport.toString(true), QVariant::fromValue(possibleImport));
+    }
+}
+
+void ImportsWidget::removePossibleImports()
+{
+    m_addImportComboBox->clear();
+}
+
+void ImportsWidget::setUsedImports(const QList<Import> &usedImports)
+{
+    foreach (ImportLabel *importLabel, m_importLabels)
+        importLabel->setDisabled(usedImports.contains(importLabel->import()));
+
+}
+
+void ImportsWidget::removeUsedImports()
+{
+    foreach (ImportLabel *importLabel, m_importLabels)
+        importLabel->setEnabled(true);
+}
+
 static bool importLess(const Import &firstImport, const Import &secondImport)
 {
     if (firstImport.url() == "QtQuick")
@@ -90,6 +130,7 @@ void ImportsWidget::setImports(const QList<Import> &imports)
     updateLayout();
 }
 
+
 void ImportsWidget::updateLayout()
 {
     delete layout();
@@ -97,10 +138,19 @@ void ImportsWidget::updateLayout()
     QVBoxLayout *layout = new QVBoxLayout(this);
     layout->setSpacing(0);
 
+    layout->addWidget(m_addImportComboBox);
+
     foreach (ImportLabel *importLabel, m_importLabels)
         layout->addWidget(importLabel);
 
     layout->addStretch();
 }
 
+void ImportsWidget::addSelectedImport(int addImportComboBoxIndex)
+{
+    Import selectedImport = m_addImportComboBox->itemData(addImportComboBoxIndex).value<Import>();
+
+    emit addImport(selectedImport);
+}
+
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.h b/src/plugins/qmldesigner/components/importmanager/importswidget.h
index 9e94ec4e52e..0938cbb13ef 100644
--- a/src/plugins/qmldesigner/components/importmanager/importswidget.h
+++ b/src/plugins/qmldesigner/components/importmanager/importswidget.h
@@ -34,6 +34,10 @@
 
 #include <QWidget>
 
+QT_BEGIN_NAMESPACE
+class QComboBox;
+QT_END_NAMESPACE
+
 namespace QmlDesigner {
 
 class ImportLabel;
@@ -45,16 +49,27 @@ public:
     explicit ImportsWidget(QWidget *parent = 0);
 
     void setImports(const QList<Import> &imports);
-    void removeAllImports();
+    void removeImports();
+
+    void setPossibleImports(const QList<Import> &possibleImports);
+    void removePossibleImports();
+
+    void setUsedImports(const QList<Import> &possibleImports);
+    void removeUsedImports();
 
 signals:
     void removeImport(const Import &import);
+    void addImport(const Import &import);
 
 protected:
     void updateLayout();
 
+private slots:
+    void addSelectedImport(int addImportComboBoxIndex);
+
 private:
     QList<ImportLabel*> m_importLabels;
+    QComboBox *m_addImportComboBox;
 };
 
 } // namespace QmlDesigner
-- 
GitLab