/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ****************************************************************************/ #ifndef EXAMPLESLISTMODEL_H #define EXAMPLESLISTMODEL_H #include #include #include #include #include namespace QtSupport { namespace Internal { class QtVersionsModel : public QStandardItemModel { Q_OBJECT public: QtVersionsModel(QObject *parent); int findHighestQtVersion(); void setupQtVersions(); int indexForUniqueId(int uniqueId); public slots: QVariant get(int i); QVariant getId(int i); }; enum ExampleRoles { Name = Qt::UserRole, ProjectPath, Description, ImageUrl, DocUrl, FilesToOpen, Tags, Difficulty, HasSourceCode, Type, Dependencies, IsVideo, VideoUrl, VideoLength, Platforms, IsHighlighted }; enum InstructionalType { Example = 0, Demo, Tutorial }; struct ExampleItem { ExampleItem(): difficulty(0), isVideo(false), isHighlighted(false) {} QString name; QString projectPath; QString description; QString imageUrl; QString docUrl; QStringList filesToOpen; QStringList tags; QStringList dependencies; InstructionalType type; int difficulty; bool hasSourceCode; bool isVideo; bool isHighlighted; QString videoUrl; QString videoLength; QStringList platforms; }; class ExamplesListModel : public QAbstractListModel { Q_OBJECT public: explicit ExamplesListModel(QObject *parent); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QStringList tags() const; void beginReset() { beginResetModel(); } void endReset() { endResetModel(); } void setUniqueQtId(int id); void updateExamples(); signals: void tagsUpdated(); private: void parseExamples(QXmlStreamReader *reader, const QString &projectsOffset, const QString &examplesInstallPath); void parseDemos(QXmlStreamReader *reader, const QString &projectsOffset, const QString &demosInstallPath); void parseTutorials(QXmlStreamReader *reader, const QString &projectsOffset); QStringList exampleSources(QString *examplesInstallPath, QString *demosInstallPath, QString *examplesFallback, QString *demosFallback, QString *sourceFallback); QList m_exampleItems; QStringList m_tags; int m_uniqueQtId; }; class ExamplesListModelFilter : public QSortFilterProxyModel { Q_OBJECT public: Q_PROPERTY(bool showTutorialsOnly READ showTutorialsOnly WRITE setShowTutorialsOnly NOTIFY showTutorialsOnlyChanged) Q_PROPERTY(QStringList filterTags READ filterTags WRITE setFilterTags NOTIFY filterTagsChanged) Q_PROPERTY(QStringList searchStrings READ searchStrings WRITE setSearchStrings NOTIFY searchStrings) Q_PROPERTY(QAbstractItemModel* qtVersionModel READ qtVersionModel) Q_PROPERTY(int qtVersionIndex READ qtVersionIndex NOTIFY qtVersionIndexChanged) explicit ExamplesListModelFilter(ExamplesListModel *sourceModel, QObject *parent); bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; bool showTutorialsOnly() { return m_showTutorialsOnly; } QStringList filterTags() const { return m_filterTags; } QStringList searchStrings() const { return m_searchString; } int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QAbstractItemModel* qtVersionModel(); Q_INVOKABLE void filterForQtById(int id); public slots: void setFilterTags(const QStringList &arg) { if (m_filterTags != arg) { m_filterTags = arg; emit filterTagsChanged(arg); } } void updateFilter(); void setSearchStrings(const QStringList &arg) { if (m_searchString != arg) { m_searchString = arg; emit searchStrings(arg); delayedUpdateFilter(); } } void parseSearchString(const QString &arg); void setShowTutorialsOnly(bool showTutorialsOnly); void handleQtVersionsChanged(); signals: void showTutorialsOnlyChanged(); void filterTagsChanged(const QStringList &arg); void searchStrings(const QStringList &arg); void qtVersionIndexChanged(); private slots: void qtVersionManagerLoaded(); void helpManagerInitialized(); private: void exampleDataRequested() const; void tryToInitialize(); void timerEvent(QTimerEvent *event); void delayedUpdateFilter(); int qtVersionIndex() const; bool m_showTutorialsOnly; QStringList m_filterTags; QStringList m_searchString; ExamplesListModel *m_sourceModel; int m_timerId; QtVersionsModel* m_qtVersionModel; bool m_blockIndexUpdate; bool m_qtVersionManagerInitialized; bool m_helpManagerInitialized; bool m_initalized; bool m_exampleDataRequested; }; } // namespace Internal } // namespace QtSupport #endif // EXAMPLESLISTMODEL_H