diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index c24395efaab3afe766ad20d41d23692ee2767e64..2d5d43ec51f04917a7be718681ac60e3335b7019 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -171,24 +171,24 @@ void IdItemDelegate::paint(QPainter *painter, if (icon.isNull()) { // 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.entriesForNodeMetaInfo(node.metaInfo()); - foreach (const ItemLibraryEntry &entry, infoList) - { - if (entry.typeName()==node.metaInfo().typeName()) { + QList <ItemLibraryEntry> infoList = libraryInfo.entriesForType(typeInfo.typeName(), + typeInfo.majorVersion(), + typeInfo.minorVersion()); + foreach (const ItemLibraryEntry &entry, infoList) { + if (!icon.isNull()) { icon = entry.icon(); break; } } - - // if the library was also empty, use the default icon } } + // if the library was also empty, use the default icon if (icon.isNull()) icon = QIcon(":/ItemLibrary/images/item-default-icon.png"); - // If no icon is present, leave an empty space of 24 pixels anyway int pixmapSide = 16; QPixmap pixmap = icon.pixmap(pixmapSide, pixmapSide); diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index 2aa7042d5ea81e1d34dbcbc3d5c1e606e6cc7623..0efcc50ccf7556955fcee88ba46b22d0ad096f32 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -32,20 +32,13 @@ #include "corelib_global.h" -#include <QExplicitlySharedDataPointer> -#include <QList> -#include <QString> -#include <QIcon> #include "propertycontainer.h" -#include <qdeclarative.h> +#include <QSharedPointer> namespace QmlDesigner { -class NodeMetaInfo; - namespace Internal { -class MetaInfoPrivate; class ItemLibraryEntryData; class ItemLibraryInfoPrivate; @@ -58,8 +51,8 @@ CORESHARED_EXPORT QDataStream& operator>>(QDataStream& stream, ItemLibraryEntry class CORESHARED_EXPORT ItemLibraryEntry { - friend class QmlDesigner::MetaInfo; - friend class QmlDesigner::Internal::MetaInfoParser; + //friend class QmlDesigner::MetaInfo; + //friend class QmlDesigner::Internal::MetaInfoParser; friend CORESHARED_EXPORT QDataStream& QmlDesigner::operator<<(QDataStream& stream, const ItemLibraryEntry &itemLibraryEntry); friend CORESHARED_EXPORT QDataStream& QmlDesigner::operator>>(QDataStream& stream, ItemLibraryEntry &itemLibraryEntry); public: @@ -82,9 +75,7 @@ public: QList<Property> properties() const; - void setTypeName(const QString &typeName); - void setMajorVersion(int majorNumber); - void setMinorVersion(int minorNumber); + void setType(const QString &typeName, int majorVersion, int minorVersion); void setName(const QString &name); void setIcon(const QIcon &icon); void addProperty(const Property &p); @@ -110,12 +101,12 @@ public: bool isValid(); QList<ItemLibraryEntry> entries() const; - QList<ItemLibraryEntry> entriesForNodeMetaInfo(const NodeMetaInfo &nodeMetaInfo) const; + QList<ItemLibraryEntry> entriesForType(const QString &typeName, int majorVersion, int minorVersion) const; ItemLibraryEntry entry(const QString &name) const; - ItemLibraryEntry addItemLibraryEntry(const NodeMetaInfo &nodeMetaInfo, const QString &itemLibraryRepresentationName); - void remove(const NodeMetaInfo &nodeMetaInfo); - void clear(); + void addEntry(const ItemLibraryEntry &entry); + bool removeEntry(const QString &name); + void clearEntries(); private: static ItemLibraryInfo createItemLibraryInfo(const ItemLibraryInfo &parentInfo); diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index 15f681ea74945335db4bb9b846a797346df524dd..3485e4f0ed7a3e73279422ff515afa010da9f013 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -58,8 +58,7 @@ public: typedef QSharedPointer<ItemLibraryInfoPrivate> Pointer; typedef QSharedPointer<ItemLibraryInfoPrivate> WeakPointer; - QMultiHash<NodeMetaInfo, ItemLibraryEntry> itemLibraryInfoHash; - QHash<QString, ItemLibraryEntry> itemLibraryInfoHashAll; + QHash<QString, ItemLibraryEntry> nameToEntryHash; Pointer parentData; }; @@ -157,9 +156,11 @@ void ItemLibraryEntry::setName(const QString &name) m_data->name = name; } -void ItemLibraryEntry::setTypeName(const QString &typeName) +void ItemLibraryEntry::setType(const QString &typeName, int majorVersion, int minorVersion) { m_data->typeName = typeName; + m_data->majorVersion = majorVersion; + m_data->minorVersion = minorVersion; } void ItemLibraryEntry::setIcon(const QIcon &icon) @@ -167,16 +168,6 @@ void ItemLibraryEntry::setIcon(const QIcon &icon) m_data->icon = icon; } -void ItemLibraryEntry::setMajorVersion(int majorVersion) -{ - m_data->majorVersion = majorVersion; -} - -void ItemLibraryEntry::setMinorVersion(int minorVersion) -{ - m_data->minorVersion = minorVersion; -} - void ItemLibraryEntry::setQml(const QString &qml) { m_data->qml = qml; @@ -254,66 +245,70 @@ ItemLibraryInfo ItemLibraryInfo::createItemLibraryInfo(const ItemLibraryInfo &pa return info; } -QList<ItemLibraryEntry> ItemLibraryInfo::entriesForNodeMetaInfo(const NodeMetaInfo &nodeMetaInfo) const +QList<ItemLibraryEntry> ItemLibraryInfo::entriesForType(const QString &typeName, int majorVersion, int minorVersion) const { - QList<ItemLibraryEntry> itemLibraryItems; + QList<ItemLibraryEntry> entries; Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data); while (pointer) { - itemLibraryItems += pointer->itemLibraryInfoHash.values(nodeMetaInfo); + foreach (const ItemLibraryEntry &entry, m_data->nameToEntryHash.values()) { + if (entry.typeName() == typeName + && entry.majorVersion() == majorVersion + && entry.minorVersion() == minorVersion) + entries += entry; + } + pointer = pointer->parentData; } - return itemLibraryItems; + + return entries; } ItemLibraryEntry ItemLibraryInfo::entry(const QString &name) const { Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data); while (pointer) { - if (pointer->itemLibraryInfoHashAll.contains(name)) - return pointer->itemLibraryInfoHashAll.value(name); + if (pointer->nameToEntryHash.contains(name)) + return pointer->nameToEntryHash.value(name); pointer = pointer->parentData; } return ItemLibraryEntry(); } - QList<ItemLibraryEntry> ItemLibraryInfo::entries() const { QList<ItemLibraryEntry> list; Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data); while (pointer) { - list += pointer->itemLibraryInfoHashAll.values(); + list += pointer->nameToEntryHash.values(); pointer = pointer->parentData; } return list; } -ItemLibraryEntry ItemLibraryInfo::addItemLibraryEntry(const NodeMetaInfo &nodeMetaInfo, - const QString &itemLibraryRepresentationName) +void ItemLibraryInfo::addEntry(const ItemLibraryEntry &entry) { - ItemLibraryEntry itemLibraryType; - itemLibraryType.setName(itemLibraryRepresentationName); - itemLibraryType.setTypeName(nodeMetaInfo.typeName()); - itemLibraryType.setMajorVersion(nodeMetaInfo.majorVersion()); - itemLibraryType.setMinorVersion(nodeMetaInfo.minorVersion()); - m_data->itemLibraryInfoHash.insert(nodeMetaInfo, itemLibraryType); - m_data->itemLibraryInfoHashAll.insert(itemLibraryRepresentationName, itemLibraryType); - return itemLibraryType; + if (m_data->nameToEntryHash.contains(entry.name())) + throw InvalidMetaInfoException(__LINE__, __FUNCTION__, __FILE__); + m_data->nameToEntryHash.insert(entry.name(), entry); } -void ItemLibraryInfo::remove(const NodeMetaInfo &info) +bool ItemLibraryInfo::removeEntry(const QString &name) { - m_data->itemLibraryInfoHash.remove(info); - m_data->itemLibraryInfoHashAll.remove(info.typeName()); + Internal::ItemLibraryInfoPrivate::WeakPointer pointer(m_data); + while (pointer) { + if (pointer->nameToEntryHash.remove(name)) + return true; + pointer = pointer->parentData; + } + return false; } -void ItemLibraryInfo::clear() +void ItemLibraryInfo::clearEntries() { - m_data->itemLibraryInfoHash.clear(); - m_data->itemLibraryInfoHashAll.clear(); + m_data->nameToEntryHash.clear(); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index 71a47df255275dfef147716f01030ad9c9dad45b..e8a2ba80c4ca27617da5a9d60ca2a98affff6ab0 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -102,7 +102,7 @@ void MetaInfoPrivate::clear() m_superClassHash.clear(); m_nodeMetaInfoHash.clear(); m_enumeratorMetaInfoHash.clear(); - m_itemLibraryInfo.clear(); + m_itemLibraryInfo.clearEntries(); m_isInitialized = false; } @@ -608,7 +608,10 @@ void MetaInfo::removeNodeInfo(NodeMetaInfo &info) m_p->m_superClassHash.remove(info.typeName()); // TODO: Other types might specify type as parent type - m_p->m_itemLibraryInfo.remove(info); + foreach (const ItemLibraryEntry &entry, + m_p->m_itemLibraryInfo.entriesForType(info.typeName(), info.majorVersion(), info.minorVersion())) { + m_p->m_itemLibraryInfo.removeEntry(entry.name()); + } } else if (!isGlobal()) { global().removeNodeInfo(info); diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp index 6b899b73eb347cb4f573a5d625bf3a753771f1e7..5eb7ce77962d1918b5480444894bc7f52b4cd434 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp @@ -198,21 +198,27 @@ void MetaInfoParser::handleNodeItemLibraryEntryElement(QXmlStreamReader &reader, { if (reader.isStartElement() && reader.name() == "itemlibraryentry") { - QString name = reader.attributes().value("name").toString(); - ItemLibraryEntry itemLibraryEntry = m_metaInfo.itemLibraryInfo().addItemLibraryEntry(m_metaInfo.nodeMetaInfo(className), name); + const QString name = reader.attributes().value("name").toString(); + const NodeMetaInfo typeInfo = m_metaInfo.nodeMetaInfo(className); + + ItemLibraryEntry entry; + entry.setType(typeInfo.typeName(), typeInfo.majorVersion(), typeInfo.minorVersion()); + entry.setName(name); QString iconPath = reader.attributes().value("icon").toString(); if (!iconPath.isEmpty()) - itemLibraryEntry.setIcon(QIcon(iconPath)); + entry.setIcon(QIcon(iconPath)); QString category = reader.attributes().value("category").toString(); if (!category.isEmpty()) - itemLibraryEntry.setCategory(category); + entry.setCategory(category); while (!reader.atEnd() && !(reader.isEndElement() && reader.name() == "itemlibraryentry")) { reader.readNext(); - handleItemLibraryEntryPropertyElement(reader, itemLibraryEntry); + handleItemLibraryEntryPropertyElement(reader, 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 8bae3ebba174ab5fbc86fc654f6971589545aae8..082c693b05f59708e1f297525f49e61d33e86fe9 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -303,8 +303,11 @@ void SubComponentManagerPrivate::registerQmlFile(const QFileInfo &fileInfo, cons nodeInfo.setQmlFile(fileInfo.filePath()); // Add file components to the library - ItemLibraryEntry itemLibType = m_metaInfo.itemLibraryInfo().addItemLibraryEntry(nodeInfo, componentName); - itemLibType.setCategory(tr("QML Components")); + ItemLibraryEntry itemLibraryEntry; + itemLibraryEntry.setType(nodeInfo.typeName(), nodeInfo.majorVersion(), nodeInfo.minorVersion()); + itemLibraryEntry.setName(componentName); + itemLibraryEntry.setCategory(tr("QML Components")); + m_metaInfo.itemLibraryInfo().addEntry(itemLibraryEntry); m_metaInfo.addNodeInfo(nodeInfo, baseType);