1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "itemlibraryinfo.h"
35 #include "nodemetainfo.h"
37 #include <QSharedData>
39 namespace QmlDesigner {
43 class ItemLibraryEntryData : public QSharedData
46 ItemLibraryEntryData() : majorVersion(-1), minorVersion(-1)
56 QList<PropertyContainer> properties;
58 QString requiredImport;
61 class ItemLibraryInfoPrivate
64 QHash<QString, ItemLibraryEntry> nameToEntryHash;
66 QWeakPointer<ItemLibraryInfo> baseInfo;
69 } // namespace Internal
75 ItemLibraryEntry::ItemLibraryEntry(const ItemLibraryEntry &other)
76 : m_data(other.m_data)
80 ItemLibraryEntry& ItemLibraryEntry::operator=(const ItemLibraryEntry &other)
83 m_data = other.m_data;
88 void ItemLibraryEntry::setDragIcon(const QIcon &icon)
90 m_data->dragIcon = icon;
93 void ItemLibraryEntry::setIcon(const QIcon &icon)
98 QIcon ItemLibraryEntry::dragIcon() const
100 return m_data->dragIcon;
103 void ItemLibraryEntry::addProperty(const Property &property)
105 m_data->properties.append(property);
108 QList<ItemLibraryEntry::Property> ItemLibraryEntry::properties() const
110 return m_data->properties;
113 ItemLibraryEntry::ItemLibraryEntry() : m_data(new Internal::ItemLibraryEntryData)
115 m_data->name.clear();
118 ItemLibraryEntry::~ItemLibraryEntry()
122 QString ItemLibraryEntry::name() const
127 QString ItemLibraryEntry::typeName() const
129 return m_data->typeName;
132 QString ItemLibraryEntry::qml() const
137 QString ItemLibraryEntry::requiredImport() const
139 return m_data->requiredImport;
142 int ItemLibraryEntry::majorVersion() const
144 return m_data->majorVersion;
147 int ItemLibraryEntry::minorVersion() const
149 return m_data->minorVersion;
152 QString ItemLibraryEntry::category() const
154 return m_data->category;
157 void ItemLibraryEntry::setCategory(const QString &category)
159 m_data->category = category;
162 QIcon ItemLibraryEntry::icon() const
167 QString ItemLibraryEntry::iconPath() const
169 return m_data->iconPath;
172 void ItemLibraryEntry::setName(const QString &name)
177 void ItemLibraryEntry::setType(const QString &typeName, int majorVersion, int minorVersion)
179 m_data->typeName = typeName;
180 m_data->majorVersion = majorVersion;
181 m_data->minorVersion = minorVersion;
184 void ItemLibraryEntry::setIconPath(const QString &iconPath)
186 m_data->iconPath = iconPath;
189 void ItemLibraryEntry::setQml(const QString &qml)
194 void ItemLibraryEntry::setRequiredImport(const QString &requiredImport)
196 m_data->requiredImport = requiredImport;
199 void ItemLibraryEntry::addProperty(QString &name, QString &type, QString &value)
202 property.set(name, type, value);
203 addProperty(property);
206 QDataStream& operator<<(QDataStream& stream, const ItemLibraryEntry &itemLibraryEntry)
208 stream << itemLibraryEntry.name();
209 stream << itemLibraryEntry.typeName();
210 stream << itemLibraryEntry.majorVersion();
211 stream << itemLibraryEntry.minorVersion();
212 stream << itemLibraryEntry.icon();
213 stream << itemLibraryEntry.iconPath();
214 stream << itemLibraryEntry.category();
215 stream << itemLibraryEntry.dragIcon();
216 stream << itemLibraryEntry.requiredImport();
218 stream << itemLibraryEntry.m_data->properties;
223 QDataStream& operator>>(QDataStream& stream, ItemLibraryEntry &itemLibraryEntry)
225 stream >> itemLibraryEntry.m_data->name;
226 stream >> itemLibraryEntry.m_data->typeName;
227 stream >> itemLibraryEntry.m_data->majorVersion;
228 stream >> itemLibraryEntry.m_data->minorVersion;
229 stream >> itemLibraryEntry.m_data->icon;
230 stream >> itemLibraryEntry.m_data->iconPath;
231 stream >> itemLibraryEntry.m_data->category;
232 stream >> itemLibraryEntry.m_data->dragIcon;
233 stream >> itemLibraryEntry.m_data->requiredImport;
235 stream >> itemLibraryEntry.m_data->properties;
244 ItemLibraryInfo::ItemLibraryInfo(QObject *parent) :
246 m_d(new Internal::ItemLibraryInfoPrivate())
250 ItemLibraryInfo::~ItemLibraryInfo()
254 QList<ItemLibraryEntry> ItemLibraryInfo::entriesForType(const QString &typeName, int majorVersion, int minorVersion) const
256 QList<ItemLibraryEntry> entries;
258 foreach (const ItemLibraryEntry &entry, m_d->nameToEntryHash.values()) {
259 if (entry.typeName() == typeName
260 && entry.majorVersion() >= majorVersion
261 && entry.minorVersion() >= minorVersion)
266 entries += m_d->baseInfo->entriesForType(typeName, majorVersion, minorVersion);
271 ItemLibraryEntry ItemLibraryInfo::entry(const QString &name) const
273 if (m_d->nameToEntryHash.contains(name))
274 return m_d->nameToEntryHash.value(name);
277 return m_d->baseInfo->entry(name);
279 return ItemLibraryEntry();
282 QList<ItemLibraryEntry> ItemLibraryInfo::entries() const
284 QList<ItemLibraryEntry> list = m_d->nameToEntryHash.values();
286 list += m_d->baseInfo->entries();
290 static inline QString keyForEntry(const ItemLibraryEntry &entry)
292 return entry.name() + entry.category();
295 void ItemLibraryInfo::addEntry(const ItemLibraryEntry &entry)
297 const QString key = keyForEntry(entry);
298 if (m_d->nameToEntryHash.contains(key))
299 throw InvalidMetaInfoException(__LINE__, __FUNCTION__, __FILE__);
300 m_d->nameToEntryHash.insert(key, entry);
302 emit entriesChanged();
305 bool ItemLibraryInfo::containsEntry(const ItemLibraryEntry &entry)
307 const QString key = keyForEntry(entry);
308 return m_d->nameToEntryHash.contains(key);
311 void ItemLibraryInfo::clearEntries()
313 m_d->nameToEntryHash.clear();
314 emit entriesChanged();
317 void ItemLibraryInfo::setBaseInfo(ItemLibraryInfo *baseInfo)
319 m_d->baseInfo = baseInfo;
322 } // namespace QmlDesigner