From e571c98661a5ea648889a46eb62e600510b655d7 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 30 Mar 2020 15:23:46 +0200 Subject: [PATCH] QmlDesigner: fix a rarely happen crash It was difficult to reproduce, but happen regular while importing something from design tools. Task-number: QTCREATORBUG-23707 Change-Id: I93e8c8cf9d44ecf20f5754ae48a0599f056a8610 Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/itemlibrary/itemlibrarymodel.cpp | 5 ++++- .../components/itemlibrary/itemlibrarysection.cpp | 2 +- .../components/itemlibrary/itemlibrarysectionmodel.cpp | 6 +++++- .../components/itemlibrary/itemlibrarysectionmodel.h | 5 +++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 3714f2bf076..7f2558220f0 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -290,13 +291,15 @@ void ItemLibraryModel::addRoleNames() void ItemLibraryModel::sortSections() { + int nullPointerSectionCount = m_sections.removeAll(QPointer()); + QTC_ASSERT(nullPointerSectionCount == 0,;); auto sectionSort = [](ItemLibrarySection *first, ItemLibrarySection *second) { return QString::localeAwareCompare(first->sortingName(), second->sortingName()) < 1; }; std::sort(m_sections.begin(), m_sections.end(), sectionSort); - foreach (ItemLibrarySection *itemLibrarySection, m_sections) + for (auto itemLibrarySection : m_sections) itemLibrarySection->sortItems(); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysection.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysection.cpp index 994f72f1844..b1db4d128e5 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysection.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysection.cpp @@ -74,7 +74,7 @@ bool ItemLibrarySection::updateSectionVisibility(const QString &searchText, bool *changed = false; - foreach(ItemLibraryItem *itemLibraryItem, m_sectionEntries.items()) { + for (auto itemLibraryItem : m_sectionEntries.items()) { bool itemVisible = itemLibraryItem->itemName().toLower().contains(searchText) || itemLibraryItem->typeName().toLower().contains(searchText); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp index 5a60dd1eb78..6f7e57763c3 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp @@ -27,6 +27,8 @@ #include "itemlibraryitem.h" +#include + #include namespace QmlDesigner { @@ -79,13 +81,15 @@ void ItemLibrarySectionModel::addItem(ItemLibraryItem *element) element->setVisible(true); } -const QList &ItemLibrarySectionModel::items() const +const QList> &ItemLibrarySectionModel::items() const { return m_itemList; } void ItemLibrarySectionModel::sortItems() { + int nullPointerSectionCount = m_itemList.removeAll(QPointer()); + QTC_ASSERT(nullPointerSectionCount == 0,;); auto itemSort = [](ItemLibraryItem *first, ItemLibraryItem *second) { return QString::localeAwareCompare(first->itemName(), second->itemName()) < 1; }; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h index 6e1771a52f0..4995e0c8c58 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h @@ -28,6 +28,7 @@ #include "itemlibrarymodel.h" #include +#include namespace QmlDesigner { @@ -47,7 +48,7 @@ public: void addItem(ItemLibraryItem *item); - const QList &items() const; + const QList > &items() const; void sortItems(); void resetModel(); @@ -56,7 +57,7 @@ private: // functions void addRoleNames(); private: // variables - QList m_itemList; + QList> m_itemList; QHash m_roleNames; };