diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml index 1f4ad7ddfd0..2f792372331 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml @@ -139,7 +139,10 @@ ScrollView { bottomPadding: 0 expanded: importExpanded expandOnClick: false - onToggleExpand: importExpanded = !importExpanded + onToggleExpand: { + if (categoryModel.rowCount() > 0) + importExpanded = !importExpanded + } onShowContextMenu: { importToRemove = importUsed ? "" : importUrl contextMenu.popup() diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp index fbb2eee9f35..1845c025400 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp @@ -96,6 +96,18 @@ QHash ItemLibraryCategoriesModel::roleNames() const return m_roleNames; } +void ItemLibraryCategoriesModel::expandCategories(bool expand) +{ + int i = 0; + for (const auto &category : std::as_const(m_categoryList)) { + if (category->categoryExpanded() != expand) { + category->setExpanded(expand); + emit dataChanged(index(i), index(i), {m_roleNames.key("categoryExpanded")}); + } + ++i; + } +} + void ItemLibraryCategoriesModel::addCategory(ItemLibraryCategory *category) { m_categoryList.append(category); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.h index fb1a7e0e050..982083569d0 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.h @@ -48,6 +48,7 @@ public: QHash roleNames() const override; void addCategory(ItemLibraryCategory *category); + void expandCategories(bool expand = true); const QList> &categorySections() const; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategory.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategory.cpp index cb244839bd0..1662b0ce966 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategory.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategory.cpp @@ -78,6 +78,10 @@ bool ItemLibraryCategory::updateItemVisibility(const QString &searchText, bool * hasVisibleItems = true; } + // expand category if it has an item matching search criteria + if (hasVisibleItems && !categoryExpanded()) + setExpanded(true); + return hasVisibleItems; } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.cpp index ef1d0e7da72..da508e7a6a7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.cpp @@ -77,25 +77,28 @@ QObject *ItemLibraryImport::categoryModel() return &m_categoryModel; } +void ItemLibraryImport::expandCategories(bool expand) +{ + m_categoryModel.expandCategories(expand); +} + bool ItemLibraryImport::updateCategoryVisibility(const QString &searchText, bool *changed) { - bool hasVisibleItems = false; - + bool hasVisibleCategories = false; *changed = false; for (const auto &category : m_categoryModel.categorySections()) { bool categoryChanged = false; - hasVisibleItems = category->updateItemVisibility(searchText, &categoryChanged); + bool hasVisibleItems = category->updateItemVisibility(searchText, &categoryChanged); categoryChanged |= category->setVisible(hasVisibleItems); *changed |= categoryChanged; - *changed |= hasVisibleItems; + + if (hasVisibleItems) + hasVisibleCategories = true; } - if (*changed) - m_categoryModel.resetModel(); - - return hasVisibleItems; + return hasVisibleCategories; } Import ItemLibraryImport::importEntry() const diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.h index 8db549c3ae5..c922e984084 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryimport.h @@ -63,6 +63,7 @@ public: void setImportUsed(bool importUsed); void sortCategorySections(); void setImportExpanded(bool expanded = true); + void expandCategories(bool expand = true); static QString userComponentsTitle(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 761c450b317..317a5ed9834 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -60,34 +60,28 @@ bool ItemLibraryModel::loadExpandedState(const QString §ionName) void ItemLibraryModel::expandAll() { - bool changed = false; + int i = 0; for (const QPointer &import : std::as_const(m_importList)) { - if (import->hasCategories() && !import->importExpanded()) { - changed = true; + if (!import->importExpanded()) { import->setImportExpanded(); + emit dataChanged(index(i), index(i), {m_roleNames.key("importExpanded")}); saveExpandedState(true, import->importUrl()); } - } - - if (changed) { - beginResetModel(); - endResetModel(); + import->expandCategories(true); + ++i; } } void ItemLibraryModel::collapseAll() { - bool changed = false; + int i = 0; for (const QPointer &import : std::as_const(m_importList)) { if (import->hasCategories() && import->importExpanded()) { - changed = true; import->setImportExpanded(false); + emit dataChanged(index(i), index(i), {m_roleNames.key("importExpanded")}); saveExpandedState(false, import->importUrl()); } - } - if (changed) { - beginResetModel(); - endResetModel(); + ++i; } } @@ -324,9 +318,18 @@ void ItemLibraryModel::updateVisibility(bool *changed) { for (ItemLibraryImport *import : std::as_const(m_importList)) { bool categoryChanged = false; - import->updateCategoryVisibility(m_searchText, &categoryChanged); + bool hasVisibleItems = import->updateCategoryVisibility(m_searchText, &categoryChanged); *changed |= categoryChanged; + + // expand import if it has an item matching search criteria + if (hasVisibleItems && !import->importExpanded()) + import->setImportExpanded(); + } + + if (changed) { + beginResetModel(); + endResetModel(); } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index dc31d169459..37ce58ab493 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -268,6 +268,7 @@ void ItemLibraryWidget::handleAddImport(int index) m_model->changeImports({import}, {}); QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManager(); m_stackedWidget->setCurrentIndex(0); // switch to the Components view after import is added + updateSearch(); } void ItemLibraryWidget::delayedUpdateModel()