diff --git a/src/plugins/qmldesigner/components/importmanager/importlabel.cpp b/src/plugins/qmldesigner/components/importmanager/importlabel.cpp index f3652ae8df4d263fa85a9c2173386d338e52c1b4..d93ae208332609b5014e91db74de206934fc90db 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 45b5b89d7a7152a8280f35d40f88622cd12b7cb3..29ff948b7cb946ac891b85acf353069a83ca15ef 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 763ae306f293e5cc19696ec22f08a35252417c08..d4ab61053a12342d8c7f430d214f802758827de9 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 f9c4a74affbbebdca3f070e0c6b3288343ca4756..3e8bb196b8693d1283686f5d1068a8a554153173 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 380d48817204c14eade3ee7147589163bc66fa4e..5a0cd1ca34d7af2360b260c0546eff1bf7009220 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 9e94ec4e52e982137d8dc51c00f963052d3e81f6..0938cbb13ef075d2619dee33e369cb5ceee2e748 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