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