From 4ff4cffe0da584f271ce844fe175feda0a8bbdcb Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 14 Dec 2010 16:52:29 +0100 Subject: [PATCH] QMlDesigner.itemLibrary: adds an import manager/filter We create a special sidebar item for the item library that contains a ToolButton. The ToolButton manages the imports for components. --- .../components/itemlibrary/itemlibrarywidget.cpp | 135 ++++++++++++++++++++- .../components/itemlibrary/itemlibrarywidget.h | 22 ++++ src/plugins/qmldesigner/designmodewidget.cpp | 23 +++- src/plugins/qmldesigner/designmodewidget.h | 3 +- 4 files changed, 178 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index b7489f7c05..becdc8d8a0 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -30,6 +30,7 @@ #include "itemlibrarywidget.h" #include +#include #include "itemlibrarycomponents.h" #include "itemlibrarymodel.h" #include "itemlibraryimageprovider.h" @@ -46,6 +47,7 @@ #include #include #include +#include #include #include @@ -121,14 +123,16 @@ ItemLibraryWidgetPrivate::ItemLibraryWidgetPrivate(QObject *object) : m_resourcesView(0), m_itemIconSize(24, 24), m_resIconSize(24, 24), - m_iconProvider(m_resIconSize) + m_iconProvider(m_resIconSize), + model(0) { Q_UNUSED(object); } ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : QFrame(parent), - m_d(new ItemLibraryWidgetPrivate(this)) + m_d(new ItemLibraryWidgetPrivate(this)), + m_filterFlag(QtBasic) { setWindowTitle(tr("Library", "Title of library view")); @@ -259,6 +263,61 @@ void ItemLibraryWidget::setItemLibraryInfo(ItemLibraryInfo *itemLibraryInfo) updateSearch(); } +void ItemLibraryWidget::updateImports() +{ + FilterChangeFlag filter; + filter = QtBasic; + if (m_d->model) { + QStringList imports; + foreach (const Import &import, m_d->model->imports()) + if (import.isLibraryImport()) + imports << import.url(); + if (imports.contains("Qt.labs.Symbian", Qt::CaseInsensitive)) + filter = Symbian; + if (imports.contains("com.Meego", Qt::CaseInsensitive)) + filter = Meego; + } + + setImportFilter(filter); +} + +QList ItemLibraryWidget::createToolBarWidgets() +{ + QList buttons; + buttons << new QToolButton(); + buttons.first()->setText("I "); + buttons.first()->setIcon(QIcon(QLatin1String(Core::Constants::ICON_FILTER))); + buttons.first()->setToolTip("Manage imports for components"); + buttons.first()->setPopupMode(QToolButton::InstantPopup); + QMenu * menu = new QMenu; + QAction * basicQtAction = new QAction(menu); + basicQtAction->setCheckable(true); + basicQtAction->setText("Basic Qt Quick only"); + QAction * symbianAction = new QAction(menu); + symbianAction->setCheckable(true); + symbianAction->setText("Symbian Components"); + QAction * meegoAction= new QAction(menu); + meegoAction->setCheckable(true); + meegoAction->setText("Meego Components"); + menu->addAction(basicQtAction); + menu->addAction(meegoAction); + menu->addAction(symbianAction); + buttons.first()->setMenu(menu); + + connect(basicQtAction, SIGNAL(toggled(bool)), this, SLOT(onQtBasicOnlyChecked(bool))); + connect(this, SIGNAL(qtBasicOnlyChecked(bool)), basicQtAction, SLOT(setChecked(bool))); + + connect(symbianAction, SIGNAL(toggled(bool)), this, SLOT(onSymbianChecked(bool))); + connect(this, SIGNAL(symbianChecked(bool)), symbianAction, SLOT(setChecked(bool))); + + connect(meegoAction, SIGNAL(toggled(bool)), this, SLOT(onMeegoChecked(bool))); + connect(this, SIGNAL(meegoChecked(bool)), meegoAction, SLOT(setChecked(bool))); + + updateImports(); + + return buttons; +} + void ItemLibraryWidget::setSearchFilter(const QString &searchFilter) { if (m_d->m_stackedWidget->currentIndex() == 0) { @@ -277,7 +336,7 @@ void ItemLibraryWidget::setSearchFilter(const QString &searchFilter) m_d->m_resourcesDirModel->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot); m_d->m_resourcesDirModel->setNameFilters(nameFilterList); - m_d->m_resourcesView->expandToDepth(1); + m_d->m_resourcesView->expandToDepth(1); m_d->m_resourcesView->scrollToTop(); } } @@ -291,9 +350,61 @@ void ItemLibraryWidget::setModel(Model *model) updateModel(); } + +void ItemLibraryWidget::setImportFilter(FilterChangeFlag flag) +{ + if (!m_d->model) + return; + if (flag == m_filterFlag) + return; + + m_filterFlag = flag; + if (flag == QtBasic) { + removeImport(QLatin1String("com.Meego")); + removeImport(QLatin1String("Qt.labs.Symbian")); + emit qtBasicOnlyChecked(true); + emit meegoChecked(false); + emit symbianChecked(false); + } else if (flag == Symbian) { + addImport(QLatin1String("Qt.labs.Symbian"), QLatin1String("1.0")); + removeImport(QLatin1String("com.Meego")); + emit qtBasicOnlyChecked(false); + emit meegoChecked(false); + emit symbianChecked(true); + } else if (flag == Meego) { + addImport(QLatin1String("com.Meego"), QLatin1String("1.0")); + removeImport(QLatin1String("Qt.labs.Symbian")); + emit qtBasicOnlyChecked(false); + emit meegoChecked(true); + emit symbianChecked(false); + } +} + +void ItemLibraryWidget::onQtBasicOnlyChecked(bool b) +{ + if (b) + setImportFilter(QtBasic); + +} + +void ItemLibraryWidget::onMeegoChecked(bool b) +{ + if (b) + setImportFilter(Meego); +} + +void ItemLibraryWidget::onSymbianChecked(bool b) +{ + if (b) + setImportFilter(Symbian); +} + + + void ItemLibraryWidget::updateModel() { m_d->m_itemLibraryModel->update(m_d->m_itemLibraryInfo.data(), m_d->model); + updateImports(); updateSearch(); } @@ -340,4 +451,22 @@ void ItemLibraryWidget::wheelEvent(QWheelEvent *event) QFrame::wheelEvent(event); } + void ItemLibraryWidget::removeImport(const QString &name) + { + if (!m_d->model) + return; + foreach (const Import &import, m_d->model->imports()) + if (import.isLibraryImport() && import.url().compare(name, Qt::CaseInsensitive) == 0) + m_d->model->removeImport(import); + } + + void ItemLibraryWidget::addImport(const QString &name, const QString &version) + { + if (!m_d->model) + return; + + m_d->model->addImport(Import::createLibraryImport(name, version)); + + } + } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h index 1961b89397..75556abb19 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h @@ -32,6 +32,7 @@ #include "itemlibraryinfo.h" #include +#include namespace QmlDesigner { @@ -45,11 +46,20 @@ class ItemLibraryWidget : public QFrame Q_OBJECT Q_DISABLE_COPY(ItemLibraryWidget) + enum FilterChangeFlag { + QtBasic = 0x0, + Meego = 0x1, + Symbian = 0x2, + }; + public: ItemLibraryWidget(QWidget *parent = 0); virtual ~ItemLibraryWidget(); void setItemLibraryInfo(ItemLibraryInfo *itemLibraryInfo); + QList createToolBarWidgets(); + + void updateImports(); public Q_SLOTS: void setSearchFilter(const QString &searchFilter); @@ -63,16 +73,28 @@ public Q_SLOTS: void setModel(Model *model); + void setImportFilter(FilterChangeFlag flag); + + void onQtBasicOnlyChecked(bool b); + void onMeegoChecked(bool b); + void onSymbianChecked(bool b); + protected: void wheelEvent(QWheelEvent *event); + void removeImport(const QString &name); + void addImport(const QString &name, const QString &version); signals: void itemActivated(const QString& itemName); void scrollItemsView(QVariant delta); void resetItemsView(); + void qtBasicOnlyChecked(bool b); + void meegoChecked(bool b); + void symbianChecked(bool b); private: ItemLibraryWidgetPrivate *m_d; + FilterChangeFlag m_filterFlag; }; } diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 53476dd9bf..8bdea1f33c 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -129,6 +129,27 @@ void DocumentWarningWidget::setError(const RewriterView::Error &error) resize(layout()->totalSizeHint()); } +class ItemLibrarySideBarItem : public Core::SideBarItem +{ +public: + explicit ItemLibrarySideBarItem(ItemLibraryWidget *widget, const QString &id); + virtual ~ItemLibrarySideBarItem(); + + virtual QList createToolBarWidgets(); +}; + +ItemLibrarySideBarItem::ItemLibrarySideBarItem(ItemLibraryWidget *widget, const QString &id) : Core::SideBarItem(widget, id) {} + +ItemLibrarySideBarItem::~ItemLibrarySideBarItem() +{ + +} + +QList ItemLibrarySideBarItem::createToolBarWidgets() +{ + return qobject_cast(widget())->createToolBarWidgets(); +} + void DocumentWarningWidget::goToError() { m_designModeWidget->textEditor()->gotoLine(m_error.line(), m_error.column()); @@ -644,7 +665,7 @@ void DesignModeWidget::setup() m_warningWidget->setVisible(false); Core::SideBarItem *navigatorItem = new Core::SideBarItem(m_navigator->widget(), QLatin1String(SB_NAVIGATOR)); - Core::SideBarItem *libraryItem = new Core::SideBarItem(m_itemLibraryView->widget(), QLatin1String(SB_LIBRARY)); + Core::SideBarItem *libraryItem = new ItemLibrarySideBarItem(m_itemLibraryView->widget(), QLatin1String(SB_LIBRARY)); Core::SideBarItem *propertiesItem = new Core::SideBarItem(m_allPropertiesBox.data(), QLatin1String(SB_PROPERTIES)); // default items diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index e46523987a..6339fb5240 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -45,7 +45,6 @@ #include #include - #include #include #include @@ -71,6 +70,8 @@ namespace Core { namespace QmlDesigner { +class ItemLibraryWidget; + namespace Internal { class DesignMode; -- 2.11.0