From a68fffd0671a6c7c7aee23b6220fe03bc9379ee9 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Wed, 12 May 2010 11:56:23 +0200
Subject: [PATCH] QuickDesigner: Update ItemLibrary when imported directories
 change

ItemLibraryInfo has now a signal "entriesChanged()", which the ItemLibrary
connects to. To allow this, ItemLibraryInfo was moved from a stack-based to
a heap-based class.

Reviewed-by: Thomas Hartmann
---
 .../components/formeditor/itemcreatortool.cpp |  2 +-
 .../integration/designdocumentcontroller.cpp  |  2 +-
 .../components/itemlibrary/itemlibrary.cpp    | 22 ++++-
 .../components/itemlibrary/itemlibrary.h      |  4 +-
 .../itemlibrary/itemlibrarymodel.cpp          | 15 +--
 .../components/itemlibrary/itemlibrarymodel.h |  5 +-
 .../navigator/navigatortreeview.cpp           |  8 +-
 .../designercore/include/itemlibraryinfo.h    | 19 ++--
 .../designercore/include/metainfo.h           |  2 +-
 .../designercore/metainfo/itemlibraryinfo.cpp | 98 +++++++------------
 .../designercore/metainfo/metainfo.cpp        | 15 +--
 .../designercore/metainfo/metainfoparser.cpp  |  2 +-
 .../metainfo/subcomponentmanager.cpp          |  2 +-
 13 files changed, 91 insertions(+), 105 deletions(-)

diff --git a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp
index b9da6c86f19..0237c40ded1 100644
--- a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp
@@ -170,7 +170,7 @@ void ItemCreatorTool::createAtItem(const QRectF &rect)
         return;
     if (list.first() == "item") {
         RewriterTransaction transaction = view()->beginRewriterTransaction();
-        ItemLibraryEntry itemLibraryEntry = view()->model()->metaInfo().itemLibraryInfo().entry(list.at(1));
+        ItemLibraryEntry itemLibraryEntry = view()->model()->metaInfo().itemLibraryInfo()->entry(list.at(1));
         QmlItemNode newNode = view()->createQmlItemNode(itemLibraryEntry, pos, parentNode);
         newNode.modelNode().variantProperty("width") = rect.width();
         newNode.modelNode().variantProperty("height") = rect.height();
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
index d56c1bce82f..3c693197693 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
@@ -344,7 +344,7 @@ void DesignDocumentController::loadCurrentModel()
     m_d->model->setMasterModel(m_d->masterModel.data());
 
     m_d->model->attachView(m_d->navigator.data());
-    m_d->itemLibrary->setMetaInfo(m_d->model->metaInfo());
+    m_d->itemLibrary->setItemLibraryInfo(m_d->model->metaInfo().itemLibraryInfo());
     m_d->itemLibrary->setResourcePath(QFileInfo(m_d->fileName).absolutePath());
 
     if (!m_d->componentAction) {
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp
index 0df2950211e..a812f298680 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp
@@ -101,6 +101,7 @@ public:
     Utils::FilterLineEdit *m_lineEdit;
     QDeclarativeView *m_itemsView;
     Internal::ItemLibraryTreeView *m_resourcesView;
+    QWeakPointer<ItemLibraryInfo> m_itemLibraryInfo;
 
     QSize m_itemIconSize, m_resIconSize;
     MyFileIconProvider m_iconProvider;
@@ -233,9 +234,20 @@ ItemLibrary::~ItemLibrary()
     delete m_d;
 }
 
-void ItemLibrary::setMetaInfo(const MetaInfo &metaInfo)
+void ItemLibrary::setItemLibraryInfo(ItemLibraryInfo *itemLibraryInfo)
 {
-    m_d->m_itemLibraryModel->update(metaInfo);
+    if (m_d->m_itemLibraryInfo.data() == itemLibraryInfo)
+        return;
+
+    if (m_d->m_itemLibraryInfo)
+        disconnect(m_d->m_itemLibraryInfo.data(), SIGNAL(entriesChanged()),
+                   this, SLOT(updateModel()));
+    m_d->m_itemLibraryInfo = itemLibraryInfo;
+    if (itemLibraryInfo)
+        connect(m_d->m_itemLibraryInfo.data(), SIGNAL(entriesChanged()),
+                this, SLOT(updateModel()));
+
+    updateModel();
     updateSearch();
 }
 
@@ -262,6 +274,12 @@ void ItemLibrary::setSearchFilter(const QString &searchFilter)
     }
 }
 
+void ItemLibrary::updateModel()
+{
+    m_d->m_itemLibraryModel->update(m_d->m_itemLibraryInfo.data());
+    updateSearch();
+}
+
 void ItemLibrary::updateSearch()
 {
     setSearchFilter(m_d->m_lineEdit->text());
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h
index 71f4fb6fb2b..26637e5a400 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h
@@ -30,6 +30,7 @@
 #ifndef ITEMLIBRARY_H
 #define ITEMLIBRARY_H
 
+#include "itemlibraryinfo.h"
 #include <QtGui/QFrame>
 
 namespace QmlDesigner {
@@ -47,10 +48,11 @@ public:
     ItemLibrary(QWidget *parent = 0);
     virtual ~ItemLibrary();
 
-    void setMetaInfo(const MetaInfo &metaInfo);
+    void setItemLibraryInfo(ItemLibraryInfo *itemLibraryInfo);
 
 public Q_SLOTS:
     void setSearchFilter(const QString &searchFilter);
+    void updateModel();
     void updateSearch();
     void clearLineEditFocus();
 
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
index 0ac8a3d4d6b..28764e0ad94 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
@@ -28,7 +28,7 @@
 **************************************************************************/
 
 #include "itemlibrarymodel.h"
-#include "metainfo.h"
+#include "itemlibraryinfo.h"
 
 #include <QVariant>
 #include <QMimeData>
@@ -317,7 +317,6 @@ bool ItemLibrarySectionModel::operator<(const ItemLibrarySectionModel &other) co
 ItemLibraryModel::ItemLibraryModel(QScriptEngine *scriptEngine, QObject *parent)
     : ItemLibrarySortedModel<ItemLibrarySectionModel>(parent),
       m_scriptEngine(scriptEngine),
-      m_metaInfo(0),
       m_searchText(""),
       m_itemIconSize(64, 64),
       m_nextLibId(0)
@@ -327,8 +326,6 @@ ItemLibraryModel::ItemLibraryModel(QScriptEngine *scriptEngine, QObject *parent)
 
 ItemLibraryModel::~ItemLibraryModel()
 {
-    if (m_metaInfo)
-        delete m_metaInfo;
 }
 
 
@@ -387,7 +384,7 @@ bool ItemLibraryModel::isItemVisible(int itemLibId)
     return elementModel(sectionLibId)->isItemVisible(itemLibId);
 }
 
-void ItemLibraryModel::update(const MetaInfo &metaInfo)
+void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo)
 {
     QMap<QString, int> sections;
 
@@ -396,13 +393,7 @@ void ItemLibraryModel::update(const MetaInfo &metaInfo)
     m_sections.clear();
     m_nextLibId = 0;
 
-    if (!m_metaInfo) {
-        m_metaInfo = new MetaInfo(metaInfo);
-    } else {
-        *m_metaInfo = metaInfo;
-    }
-
-    foreach (ItemLibraryEntry entry, metaInfo.itemLibraryInfo().entries()) {
+    foreach (ItemLibraryEntry entry, itemLibraryInfo->entries()) {
         QString itemSectionName = entry.category();
         ItemLibrarySectionModel *sectionModel;
         ItemLibraryItemModel *itemModel;
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h
index 693680d2b8e..896710f4118 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h
@@ -40,7 +40,7 @@ QT_FORWARD_DECLARE_CLASS(QMimeData);
 
 namespace QmlDesigner {
 
-class MetaInfo;
+class ItemLibraryInfo;
 class ItemLibraryEntry;
 
 namespace Internal {
@@ -131,7 +131,7 @@ public:
 
     QString searchText() const;
 
-    void update(const MetaInfo &metaInfo);
+    void update(ItemLibraryInfo *itemLibraryInfo);
 
     QString getTypeName(int libId);
     QMimeData *getMimeData(int libId);
@@ -159,7 +159,6 @@ private:
     QPixmap createDragPixmap(int width, int height);
 
     QWeakPointer<QScriptEngine> m_scriptEngine;
-    MetaInfo *m_metaInfo;
     QMap<int, ItemLibraryEntry> m_itemInfos;
     QMap<int, int> m_sections;
 
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp
index 2d5d43ec51f..13e61c24b00 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp
@@ -172,10 +172,10 @@ void IdItemDelegate::paint(QPainter *painter,
         {
             // if node has no own icon, search for it in the itemlibrary
             const NodeMetaInfo typeInfo = node.metaInfo();
-            const ItemLibraryInfo libraryInfo = node.metaInfo().metaInfo().itemLibraryInfo();
-            QList <ItemLibraryEntry> infoList = libraryInfo.entriesForType(typeInfo.typeName(),
-                                                                           typeInfo.majorVersion(),
-                                                                           typeInfo.minorVersion());
+            const ItemLibraryInfo *libraryInfo = node.metaInfo().metaInfo().itemLibraryInfo();
+            QList <ItemLibraryEntry> infoList = libraryInfo->entriesForType(typeInfo.typeName(),
+                                                                            typeInfo.majorVersion(),
+                                                                            typeInfo.minorVersion());
             foreach (const ItemLibraryEntry &entry, infoList) {
                 if (!icon.isNull()) {
                     icon = entry.icon();
diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h
index 0efcc50ccf7..35286f2f0b8 100644
--- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h
+++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h
@@ -87,19 +87,14 @@ private:
     QExplicitlySharedDataPointer<Internal::ItemLibraryEntryData> m_data;
 };
 
-
-class CORESHARED_EXPORT ItemLibraryInfo
+class CORESHARED_EXPORT ItemLibraryInfo : public QObject
 {
+    Q_OBJECT
+    Q_DISABLE_COPY(ItemLibraryInfo)
     friend class Internal::MetaInfoPrivate;
 public:
-    ItemLibraryInfo();
-    ItemLibraryInfo(const ItemLibraryInfo &other);
     ~ItemLibraryInfo();
 
-    ItemLibraryInfo& operator=(const ItemLibraryInfo &other);
-
-    bool isValid();
-
     QList<ItemLibraryEntry> entries() const;
     QList<ItemLibraryEntry> entriesForType(const QString &typeName, int majorVersion, int minorVersion) const;
     ItemLibraryEntry entry(const QString &name) const;
@@ -108,9 +103,13 @@ public:
     bool removeEntry(const QString &name);
     void clearEntries();
 
+signals:
+    void entriesChanged();
+
 private:
-    static ItemLibraryInfo createItemLibraryInfo(const ItemLibraryInfo &parentInfo);
-    QSharedPointer<Internal::ItemLibraryInfoPrivate> m_data;
+    ItemLibraryInfo(QObject *parent = 0);
+    void setBaseInfo(ItemLibraryInfo *baseInfo);
+    QScopedPointer<Internal::ItemLibraryInfoPrivate> m_d;
 };
 
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/include/metainfo.h b/src/plugins/qmldesigner/designercore/include/metainfo.h
index e6b0ead5bd3..38751b53c51 100644
--- a/src/plugins/qmldesigner/designercore/include/metainfo.h
+++ b/src/plugins/qmldesigner/designercore/include/metainfo.h
@@ -84,7 +84,7 @@ public:
     bool hasEnumerator(const QString &enumeratorName) const;
     EnumeratorMetaInfo enumerator(const QString &enumeratorName) const;
 
-    ItemLibraryInfo itemLibraryInfo() const;
+    ItemLibraryInfo *itemLibraryInfo() const;
 
     QString fromQtTypes(const QString &type) const;
 
diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
index 3485e4f0ed7..c640c77b769 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
@@ -55,12 +55,9 @@ public:
 class ItemLibraryInfoPrivate
 {
 public:
-    typedef QSharedPointer<ItemLibraryInfoPrivate> Pointer;
-    typedef QSharedPointer<ItemLibraryInfoPrivate> WeakPointer;
-
     QHash<QString, ItemLibraryEntry> nameToEntryHash;
 
-    Pointer parentData;
+    QWeakPointer<ItemLibraryInfo> baseInfo;
 };
 
 } // namespace Internal
@@ -212,13 +209,9 @@ QDataStream& operator>>(QDataStream& stream, ItemLibraryEntry &itemLibraryEntry)
 // ItemLibraryInfo
 //
 
-ItemLibraryInfo::ItemLibraryInfo(const ItemLibraryInfo &other) :
-        m_data(other.m_data)
-{
-}
-
-ItemLibraryInfo::ItemLibraryInfo() :
-        m_data(new Internal::ItemLibraryInfoPrivate())
+ItemLibraryInfo::ItemLibraryInfo(QObject *parent) :
+        QObject(parent),
+        m_d(new Internal::ItemLibraryInfoPrivate())
 {
 }
 
@@ -226,89 +219,72 @@ ItemLibraryInfo::~ItemLibraryInfo()
 {
 }
 
-ItemLibraryInfo& ItemLibraryInfo::operator=(const ItemLibraryInfo &other)
-{
-    m_data = other.m_data;
-    return *this;
-}
-
-bool ItemLibraryInfo::isValid()
-{
-    return m_data;
-}
-
-ItemLibraryInfo ItemLibraryInfo::createItemLibraryInfo(const ItemLibraryInfo &parentInfo)
-{
-    ItemLibraryInfo info;
-    Q_ASSERT(parentInfo.m_data);
-    info.m_data->parentData = parentInfo.m_data;
-    return info;
-}
-
 QList<ItemLibraryEntry> ItemLibraryInfo::entriesForType(const QString &typeName, int majorVersion, int minorVersion) const
 {
     QList<ItemLibraryEntry> entries;
 
-    Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data);
-    while (pointer) {
-        foreach (const ItemLibraryEntry &entry, m_data->nameToEntryHash.values()) {
-            if (entry.typeName() == typeName
-                && entry.majorVersion() == majorVersion
-                && entry.minorVersion() == minorVersion)
-                entries += entry;
-        }
-
-        pointer = pointer->parentData;
+    foreach (const ItemLibraryEntry &entry, m_d->nameToEntryHash.values()) {
+        if (entry.typeName() == typeName
+            && entry.majorVersion() == majorVersion
+            && entry.minorVersion() == minorVersion)
+            entries += entry;
     }
 
+    if (m_d->baseInfo)
+        entries += m_d->baseInfo->entriesForType(typeName, majorVersion, minorVersion);
+
     return entries;
 }
 
 ItemLibraryEntry ItemLibraryInfo::entry(const QString &name) const
 {
-    Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data);
-    while (pointer) {
-        if (pointer->nameToEntryHash.contains(name))
-            return pointer->nameToEntryHash.value(name);
-        pointer = pointer->parentData;
-    }
+    if (m_d->nameToEntryHash.contains(name))
+        return m_d->nameToEntryHash.value(name);
+
+    if (m_d->baseInfo)
+        return m_d->baseInfo->entry(name);
 
     return ItemLibraryEntry();
 }
 
 QList<ItemLibraryEntry> ItemLibraryInfo::entries() const
 {
-    QList<ItemLibraryEntry> list;
-
-    Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data);
-    while (pointer) {
-        list += pointer->nameToEntryHash.values();
-        pointer = pointer->parentData;
-    }
+    QList<ItemLibraryEntry> list = m_d->nameToEntryHash.values();
+    if (m_d->baseInfo)
+        list += m_d->baseInfo->entries();
     return list;
 }
 
 void ItemLibraryInfo::addEntry(const ItemLibraryEntry &entry)
 {
-    if (m_data->nameToEntryHash.contains(entry.name()))
+    if (m_d->nameToEntryHash.contains(entry.name()))
         throw InvalidMetaInfoException(__LINE__, __FUNCTION__, __FILE__);
-    m_data->nameToEntryHash.insert(entry.name(), entry);
+    m_d->nameToEntryHash.insert(entry.name(), entry);
+
+    emit entriesChanged();
 }
 
 bool ItemLibraryInfo::removeEntry(const QString &name)
 {
-    Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data);
-    while (pointer) {
-        if (pointer->nameToEntryHash.remove(name))
-            return true;
-        pointer = pointer->parentData;
+    if (m_d->nameToEntryHash.remove(name)) {
+        emit entriesChanged();
+        return true;
     }
+    if (m_d->baseInfo)
+        return m_d->baseInfo->removeEntry(name);
+
     return false;
 }
 
 void ItemLibraryInfo::clearEntries()
 {
-    m_data->nameToEntryHash.clear();
+    m_d->nameToEntryHash.clear();
+    emit entriesChanged();
+}
+
+void ItemLibraryInfo::setBaseInfo(ItemLibraryInfo *baseInfo)
+{
+    m_d->baseInfo = baseInfo;
 }
 
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp
index e8a2ba80c4c..1f28957a7d2 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp
@@ -83,18 +83,19 @@ public:
     QHash<QString, NodeMetaInfo> m_nodeMetaInfoHash;
     QHash<QString, EnumeratorMetaInfo> m_enumeratorMetaInfoHash;
     QHash<QString, QString> m_QtTypesToQmlTypes;
-    ItemLibraryInfo m_itemLibraryInfo;
+    QScopedPointer<ItemLibraryInfo> m_itemLibraryInfo;
 
     MetaInfo *m_q;
     bool m_isInitialized;
 };
 
 MetaInfoPrivate::MetaInfoPrivate(MetaInfo *q) :
+        m_itemLibraryInfo(new ItemLibraryInfo()),
         m_q(q),
         m_isInitialized(false)
 {
     if (!m_q->isGlobal())
-        m_itemLibraryInfo = ItemLibraryInfo::createItemLibraryInfo(m_q->global().itemLibraryInfo());
+        m_itemLibraryInfo->setBaseInfo(MetaInfo::global().itemLibraryInfo());
 }
 
 void MetaInfoPrivate::clear()
@@ -102,7 +103,7 @@ void MetaInfoPrivate::clear()
     m_superClassHash.clear();
     m_nodeMetaInfoHash.clear();
     m_enumeratorMetaInfoHash.clear();
-    m_itemLibraryInfo.clearEntries();
+    m_itemLibraryInfo->clearEntries();
     m_isInitialized = false;
 }
 
@@ -534,9 +535,9 @@ EnumeratorMetaInfo MetaInfo::enumerator(const QString &enumeratorName) const
     return EnumeratorMetaInfo();
 }
 
-ItemLibraryInfo MetaInfo::itemLibraryInfo() const
+ItemLibraryInfo *MetaInfo::itemLibraryInfo() const
 {
-    return m_p->m_itemLibraryInfo;
+    return m_p->m_itemLibraryInfo.data();
 }
 
 /*!
@@ -609,8 +610,8 @@ void MetaInfo::removeNodeInfo(NodeMetaInfo &info)
         m_p->m_superClassHash.remove(info.typeName());
         // TODO: Other types might specify type as parent type
         foreach (const ItemLibraryEntry &entry,
-                 m_p->m_itemLibraryInfo.entriesForType(info.typeName(), info.majorVersion(), info.minorVersion())) {
-            m_p->m_itemLibraryInfo.removeEntry(entry.name());
+                 m_p->m_itemLibraryInfo->entriesForType(info.typeName(), info.majorVersion(), info.minorVersion())) {
+            m_p->m_itemLibraryInfo->removeEntry(entry.name());
         }
 
     } else if (!isGlobal()) {
diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp
index 5eb7ce77962..e015fa87207 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp
@@ -218,7 +218,7 @@ void MetaInfoParser::handleNodeItemLibraryEntryElement(QXmlStreamReader &reader,
             handleItemLibraryEntryPropertyElement(reader, entry);
         }
 
-        m_metaInfo.itemLibraryInfo().addEntry(entry);
+        m_metaInfo.itemLibraryInfo()->addEntry(entry);
     }
 }
 
diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
index 082c693b05f..90f5cf5434c 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp
@@ -307,7 +307,7 @@ void SubComponentManagerPrivate::registerQmlFile(const QFileInfo &fileInfo, cons
     itemLibraryEntry.setType(nodeInfo.typeName(), nodeInfo.majorVersion(), nodeInfo.minorVersion());
     itemLibraryEntry.setName(componentName);
     itemLibraryEntry.setCategory(tr("QML Components"));
-    m_metaInfo.itemLibraryInfo().addEntry(itemLibraryEntry);
+    m_metaInfo.itemLibraryInfo()->addEntry(itemLibraryEntry);
 
     m_metaInfo.addNodeInfo(nodeInfo, baseType);
 
-- 
GitLab