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