diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 7b5cd1978ea..c1188feba11 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -257,17 +257,47 @@ void ItemLibraryModel::setExpanded(bool expanded, const QString §ion) } ItemLibraryModel::ItemLibraryModel(QObject *parent) - : ItemLibrarySortedModel(parent), - m_searchText(""), + : QAbstractListModel(parent), m_itemIconSize(64, 64), m_nextLibId(0) { + addRoleNames(); } ItemLibraryModel::~ItemLibraryModel() { + clearSections(); } +int ItemLibraryModel::rowCount(const QModelIndex & /*parent*/) const +{ + return visibleSectionCount(); +} + +QVariant ItemLibraryModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() +1 > visibleSectionCount()) + return QVariant(); + + + if (m_roleNames.contains(role)) { + QVariant value = visibleSections().at(index.row())->property(m_roleNames.value(role)); + + ItemLibrarySortedModel* model = qobject_cast(value.value()); + if (model) + return QVariant::fromValue(model); + + ItemLibraryModel* model2 = qobject_cast(value.value()); + if (model2) + return QVariant::fromValue(model2); + + return value; + } + + qWarning() << Q_FUNC_INFO << "invalid role requested"; + + return QVariant(); +} QString ItemLibraryModel::searchText() const { @@ -319,7 +349,7 @@ bool ItemLibraryModel::isItemVisible(int itemLibId) return false; int sectionLibId = m_sections.value(itemLibId); - if (!elementVisible(sectionLibId)) + if (section(sectionLibId)->isVisible()) return false; return section(sectionLibId)->isItemVisible(itemLibId); @@ -342,7 +372,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) QMap sections; - clearElements(); + clearSections(); m_itemInfos.clear(); m_sections.clear(); m_nextLibId = 0; @@ -371,7 +401,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) } else { sectionId = m_nextLibId++; sectionModel = new ItemLibrarySectionModel(sectionId, itemSectionName, this); - addElement(sectionModel, sectionId); + addSection(sectionModel, sectionId); sections.insert(itemSectionName, sectionId); } @@ -429,14 +459,65 @@ QIcon ItemLibraryModel::getIcon(int libId) return m_itemInfos.value(libId).icon(); } -ItemLibrarySectionModel *ItemLibraryModel::section(int libId) +ItemLibrarySectionModel *ItemLibraryModel::section(int libraryId) { - return elementByType(libId); + return m_sectionModels.value(libraryId); } QList ItemLibraryModel::sections() const { - return elementsByType(); + return m_sectionModels.values(); +} + +void ItemLibraryModel::addSection(ItemLibrarySectionModel *sectionModel, int sectionId) +{ + m_sectionModels.insert(sectionId, sectionModel); + sectionModel->setVisible(true); +} + +void ItemLibraryModel::clearSections() +{ + beginResetModel(); + qDeleteAll(m_sectionModels); + m_sectionModels.clear(); + endResetModel(); +} + +void ItemLibraryModel::registerQmlTypes() +{ + qmlRegisterType(); + qmlRegisterType(); +} + +int ItemLibraryModel::visibleSectionCount() const +{ + int visibleCount = 0; + + QMap::const_iterator sectionIterator = m_sectionModels.constBegin(); + while (sectionIterator != m_sectionModels.constEnd()) { + ItemLibrarySectionModel *sectionModel = sectionIterator.value(); + if (sectionModel->isVisible()) + ++visibleCount; + ++sectionIterator; + qDebug() << __FUNCTION__ << visibleCount; + } + + return visibleCount; +} + +QList ItemLibraryModel::visibleSections() const +{ + QList visibleSectionList; + + QMap::const_iterator sectionIterator = m_sectionModels.constBegin(); + while (sectionIterator != m_sectionModels.constEnd()) { + ItemLibrarySectionModel *sectionModel = sectionIterator.value(); + if (sectionModel->isVisible()) + visibleSectionList.append(sectionModel); + ++sectionIterator; + } + + return visibleSectionList; } void ItemLibraryModel::updateVisibility() @@ -445,14 +526,14 @@ void ItemLibraryModel::updateVisibility() endResetModel(); bool changed = false; - QMap::const_iterator sectionIt = elements().constBegin(); - while (sectionIt != elements().constEnd()) { - ItemLibrarySectionModel *sectionModel = section(sectionIt.key()); + QMap::const_iterator sectionIterator = m_sectionModels.constBegin(); + while (sectionIterator != m_sectionModels.constEnd()) { + ItemLibrarySectionModel *sectionModel = sectionIterator.value(); QString sectionSearchText = m_searchText; if (sectionModel->sectionName().toLower().contains(m_searchText)) - sectionSearchText = ""; + sectionSearchText.clear(); bool sectionChanged = false, sectionVisibility = sectionModel->updateSectionVisibility(sectionSearchText, @@ -460,17 +541,29 @@ void ItemLibraryModel::updateVisibility() if (sectionChanged) { changed = true; if (sectionVisibility) - emit sectionVisibilityChanged(sectionIt.key()); + emit sectionVisibilityChanged(sectionIterator.key()); } - changed |= setElementVisible(sectionIt.key(), sectionVisibility); - ++sectionIt; + changed |= sectionModel->setVisible(sectionVisibility); + ++sectionIterator; } if (changed) emit visibilityChanged(); } +void ItemLibraryModel::addRoleNames() +{ + int role = 0; + for (int propertyIndex = 0; propertyIndex < ItemLibrarySectionModel::staticMetaObject.propertyCount(); ++propertyIndex) { + QMetaProperty property = ItemLibrarySectionModel::staticMetaObject.property(propertyIndex); + m_roleNames.insert(role, property.name()); + ++role; + } + + setRoleNames(m_roleNames); +} + int ItemLibraryModel::getWidth(const ItemLibraryEntry &itemLibraryEntry) { foreach (const ItemLibraryEntry::Property &property, itemLibraryEntry.properties()) @@ -478,6 +571,7 @@ int ItemLibraryModel::getWidth(const ItemLibraryEntry &itemLibraryEntry) if (property.name() == "width") return property.value().toInt(); } + return 64; } @@ -488,6 +582,7 @@ int ItemLibraryModel::getHeight(const ItemLibraryEntry &itemLibraryEntry) if (property.name() == "height") return property.value().toInt(); } + return 64; } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h index d8e58a839c8..49bdee0f152 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h @@ -44,8 +44,6 @@ class ItemLibraryEntry; class Model; class ItemLibrarySectionModel; -void registerQmlTypes(); - class ItemLibrarySortedModel: public QAbstractListModel { Q_OBJECT @@ -98,7 +96,7 @@ private: QHash m_roleNames; }; -class ItemLibraryModel: public ItemLibrarySortedModel { +class ItemLibraryModel: public QAbstractListModel { Q_OBJECT Q_PROPERTY(QString searchText READ searchText WRITE setSearchText NOTIFY searchTextChanged) @@ -107,6 +105,9 @@ public: explicit ItemLibraryModel(QObject *parent = 0); ~ItemLibraryModel(); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + QString searchText() const; void update(ItemLibraryInfo *itemLibraryInfo, Model *model); @@ -115,8 +116,16 @@ public: QMimeData *getMimeData(int libId); QIcon getIcon(int libId); - ItemLibrarySectionModel* section(int libId); + ItemLibrarySectionModel* section(int libraryId); QList sections() const; + void addSection(ItemLibrarySectionModel *sectionModel, int sectionId); + + void clearSections(); + + static void registerQmlTypes(); + + int visibleSectionCount() const; + QList visibleSections() const; public slots: void setSearchText(const QString &searchText); @@ -133,15 +142,19 @@ signals: void visibilityChanged(); void sectionVisibilityChanged(int changedSectionLibId); -private: +private: // functions void updateVisibility(); + void addRoleNames(); int getWidth(const ItemLibraryEntry &entry); int getHeight(const ItemLibraryEntry &entry); QPixmap createDragPixmap(int width, int height); +private: // variables + QMap m_sectionModels; QMap m_itemInfos; QMap m_sections; + QHash m_roleNames; QString m_searchText; QSize m_itemIconSize; @@ -151,6 +164,6 @@ private: } // namespace QmlDesigner QML_DECLARE_TYPE(QmlDesigner::ItemLibrarySortedModel) - +QML_DECLARE_TYPE(QmlDesigner::ItemLibraryModel) #endif // ITEMLIBRARYMODEL_H diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp index 90e0ad1087f..ca22746bae1 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp @@ -36,9 +36,10 @@ namespace QmlDesigner { ItemLibrarySectionModel::ItemLibrarySectionModel(int sectionLibId, const QString §ionName, QObject *parent) : QObject(parent), m_name(sectionName), - m_sectionLibId(sectionLibId), + m_sectionLibraryId(sectionLibId), m_sectionExpanded(true), - m_sectionEntries(parent) + m_sectionEntries(parent), + m_isVisible(false) { // if (collapsedStateHash.contains(sectionName)) // m_sectionExpanded= collapsedStateHash.value(sectionName); @@ -50,9 +51,9 @@ QString ItemLibrarySectionModel::sectionName() const return m_name; } -int ItemLibrarySectionModel::sectionLibId() const +int ItemLibrarySectionModel::sectionLibraryId() const { - return m_sectionLibId; + return m_sectionLibraryId; } bool ItemLibrarySectionModel::sectionExpanded() const @@ -132,7 +133,22 @@ void ItemLibrarySectionModel::updateItemIconSize(const QSize &itemIconSize) { // foreach (ItemLibraryItemModel* itemLibraryItemModel, m_sectionEntries.elementsByType()) { // itemLibraryItemModel->setItemIconSize(itemIconSize); -// } + // } +} + +bool ItemLibrarySectionModel::setVisible(bool isVisible) +{ + if (isVisible != m_isVisible) { + m_isVisible = isVisible; + return true; + } + + return false; +} + +bool ItemLibrarySectionModel::isVisible() const +{ + return m_isVisible; } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h index 9f4762a172a..c47f53943d5 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h @@ -43,16 +43,16 @@ class ItemLibrarySectionModel: public QObject { Q_OBJECT Q_PROPERTY(QObject* sectionEntries READ sectionEntries NOTIFY sectionEntriesChanged FINAL) - Q_PROPERTY(int sectionLibId READ sectionLibId FINAL) + Q_PROPERTY(int sectionLibraryId READ sectionLibraryId FINAL) Q_PROPERTY(QString sectionName READ sectionName FINAL) Q_PROPERTY(bool sectionExpanded READ sectionExpanded FINAL) Q_PROPERTY(QVariant sortingRole READ sortingRole FINAL) public: - ItemLibrarySectionModel(int sectionLibId, const QString §ionName, QObject *parent = 0); + ItemLibrarySectionModel(int sectionLibraryId, const QString §ionName, QObject *parent = 0); QString sectionName() const; - int sectionLibId() const; + int sectionLibraryId() const; bool sectionExpanded() const; QVariant sortingRole() const; @@ -66,14 +66,18 @@ public: bool updateSectionVisibility(const QString &searchText, bool *changed); void updateItemIconSize(const QSize &itemIconSize); + bool setVisible(bool isVisible); + bool isVisible() const; + signals: void sectionEntriesChanged(); private: - QString m_name; - int m_sectionLibId; - bool m_sectionExpanded; ItemLibrarySortedModel m_sectionEntries; + QString m_name; + int m_sectionLibraryId; + bool m_sectionExpanded; + bool m_isVisible; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index f18f6e7a37b..00dba5f69cd 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -67,7 +67,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : m_filterFlag(QtBasic), m_itemLibraryId(-1) { - registerQmlTypes(); + ItemLibraryModel::registerQmlTypes(); setWindowTitle(tr("Library", "Title of library view"));