/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef ARCHIVEMODEL_H #define ARCHIVEMODEL_H #include #include #include #include #include #include "smtreemodel.h" class ArchiveCollector; class ArchiveModel : public SmTreeModel { Q_OBJECT public: enum CustomRoles { NameRole = Qt::UserRole + 1, GenericIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, CountRole = Qt::UserRole + 8 }; enum Fields { Name = 0, GenericId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, Count = 7 }; enum Order { SeriesName, Actor, Genre, NoOrder }; enum { NumFields = 8 }; enum NodeType { SeriesNode, SeriesPartNode, GenreNode, ActorNode }; explicit ArchiveModel(const QStringList &headers, QObject *parent = 0); const QStringList availableOrders() const; const QHash availableOrdersHash() const { return mAvailableOrders; } virtual QVariant data(const QModelIndex &index, int role) const; virtual bool setData(const QModelIndex &idx, const QVariant &value, int role); virtual bool matchRecursive(const QModelIndex &parent, const QRegExp ®ex, int column = 0) const; virtual bool removeNode(const QModelIndex &idx); QStringList indexToPath(const QModelIndex &idx) const; QModelIndexList pathToIndex(const QStringList &path) const; signals: void needRefresh(); void databaseError(const QString &error); void message(const QString &msg); void collectorAboutToBeDone(); void collectorDone(); public slots: void setOrder(int order); void setOrder(const QString &order); void refresh(); private slots: void collectorFinished(QObject *thread); private: bool checkParents(const SmTreeItem *item, const QRegExp ®ex, int column) const; void emitDatabaseError(const QSqlError &e); void writeCache(int o, SmTreeItem *rItem); void writeRecursive(SmTreeItem *start, QDataStream &stream); void writeItem(SmTreeItem *item, QDataStream &stream); SmTreeItem *readCache(int o); SmTreeItem *readItem(QDataStream &stream) const; const QString cacheFile(int o) const; QSqlDatabase mDb; QHash mAvailableOrders; QMutex mDoneMx; QList mCollectors; int mOrder; }; class ArchiveCollector : public QThread { Q_OBJECT public: explicit ArchiveCollector(int numFields, int order, QObject *parent = 0); SmTreeItem *rootItem() { return mRootItem; } int sortOrder() const { return mSortOrder; } signals: void message(const QString message); protected: virtual void run(); private: void populateBySeriesName(); void populateByGenre(); void populateByActor(); void fetchChildren(SmTreeItem *parent); void fetchSeries(const QVariant &id, SmTreeItem *parent); void fetchParts(const QVariant &id, SmTreeItem *parent); QSqlDatabase mDb; SmTreeItem *mRootItem; QMutex mAccessMx; int mNumFields; int mSortOrder; }; #endif // ARCHIVEMODEL_H