1 #ifndef TABLEMODEL_H
2 #define TABLEMODEL_H
3 
4 #include <QAbstractItemModel>
5 #include <QModelIndex>
6 #include <QVariant>
7 #include <QSqlQuery>
8 #include <QSqlDatabase>
9 #include <QUrl>
10 
11 #include "yacreader_global_gui.h"
12 
13 class ComicDB;
14 
15 class ComicItem;
16 
17 using namespace YACReader;
18 
19 class ComicModel : public QAbstractItemModel
20 {
21     Q_OBJECT
22 
23 public:
24     enum Columns {
25         Number = 0,
26         Title = 1,
27         FileName = 2,
28         NumPages = 3,
29         Id = 4,
30         Parent_Id = 5,
31         Path = 6,
32         Hash = 7,
33         ReadColumn = 8,
34         IsBis = 9,
35         CurrentPage = 10,
36         Rating = 11,
37         HasBeenOpened = 12
38     };
39 
40     enum Roles {
41         NumberRole = Qt::UserRole + 1,
42         TitleRole,
43         FileNameRole,
44         NumPagesRole,
45         IdRole,
46         Parent_IdRole,
47         PathRole,
48         HashRole,
49         ReadColumnRole,
50         IsBisRole,
51         CurrentPageRole,
52         RatingRole,
53         HasBeenOpenedRole,
54         CoverPathRole
55 
56     };
57 
58     enum Mode {
59         Folder,
60         Favorites,
61         Reading,
62         Label,
63         ReadingList
64     };
65 
66 public:
67     explicit ComicModel(QObject *parent = nullptr);
68     explicit ComicModel(QSqlQuery &sqlquery, QObject *parent = nullptr);
69     ~ComicModel() override;
70 
71     QVariant data(const QModelIndex &index, int role) const override;
72     Qt::ItemFlags flags(const QModelIndex &index) const override;
73     QVariant headerData(int section, Qt::Orientation orientation,
74                         int role = Qt::DisplayRole) const override;
75     QModelIndex index(int row, int column,
76                       const QModelIndex &parent = QModelIndex()) const override;
77     QModelIndex parent(const QModelIndex &index) const override;
78     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
79     int columnCount(const QModelIndex &parent = QModelIndex()) const override;
80     bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override;
81     bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
82     bool canBeResorted();
83     QMimeData *mimeData(const QModelIndexList &indexes) const override;
84     QStringList mimeTypes() const override;
85 
86     void setupFolderModelData(unsigned long long int parentFolder, const QString &databasePath);
87     void setupLabelModelData(unsigned long long int parentLabel, const QString &databasePath);
88     void setupReadingListModelData(unsigned long long int parentReadingList, const QString &databasePath);
89     void setupFavoritesModelData(const QString &databasePath);
90     void setupReadingModelData(const QString &databasePath);
91 
92     //Métodos de conveniencia
93     QStringList getPaths(const QString &_source);
94     QString getComicPath(QModelIndex mi);
getCurrentPath()95     QString getCurrentPath() { return QString(_databasePath).remove("/.yacreaderlibrary"); }
96     ComicDB getComic(const QModelIndex &mi); //--> para la edición
97     //ComicDB getComic(int row);
98     QVector<YACReaderComicReadStatus> getReadList();
99     QVector<YACReaderComicReadStatus> setAllComicsRead(YACReaderComicReadStatus readStatus);
100     QList<ComicDB> getComics(QList<QModelIndex> list); //--> recupera la información común a los comics seleccionados
101     QList<ComicDB> getAllComics();
102     QModelIndex getIndexFromId(quint64 id);
103     QList<QModelIndex> getIndexesFromIds(const QList<qulonglong> &comicIds);
104     //setcomicInfo(QModelIndex & mi); --> inserta en la base datos
105     //setComicInfoForAllComics(); --> inserta la información común a todos los cómics de una sola vez.
106     //setComicInfoForSelectedComis(QList<QModelIndex> list); -->inserta la información común para los comics seleccionados
107     QVector<YACReaderComicReadStatus> setComicsRead(QList<QModelIndex> list, YACReaderComicReadStatus read);
108     void setComicsManga(QList<QModelIndex> list, bool isManga);
109     qint64 asignNumbers(QList<QModelIndex> list, int startingNumber);
110     //void remove(ComicDB * comic, int row);
111     void removeInTransaction(int row);
112     void reload(const ComicDB &comic);
113     void resetComicRating(const QModelIndex &mi);
114 
115     Q_INVOKABLE QUrl getCoverUrlPathForComicHash(const QString &hash) const;
116 
117     void addComicsToFavorites(const QList<QModelIndex> &comicsList);
118     void addComicsToLabel(const QList<QModelIndex> &comicsList, qulonglong labelId);
119     void addComicsToReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId);
120 
121     void deleteComicsFromFavorites(const QList<QModelIndex> &comicsList);
122     void deleteComicsFromReading(const QList<QModelIndex> &comicsList);
123     void deleteComicsFromSpecialList(const QList<QModelIndex> &comicsList, qulonglong specialListId);
124     void deleteComicsFromLabel(const QList<QModelIndex> &comicsList, qulonglong labelId);
125     void deleteComicsFromReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId);
126 
127     void deleteComicsFromModel(const QList<QModelIndex> &comicsList);
128 
129     bool isFavorite(const QModelIndex &index);
130 
getMode()131     ComicModel::Mode getMode() { return mode; }
getSourceId()132     unsigned long long int getSourceId() { return sourceId; }
133 
134     QHash<int, QByteArray> roleNames() const override;
135 
136 public slots:
137     void remove(int row);
138     void startTransaction();
139     void finishTransaction();
140     void updateRating(int rating, QModelIndex mi);
141 
142     void addComicsToFavorites(const QList<qulonglong> &comicIds);
143     void addComicsToLabel(const QList<qulonglong> &comicIds, qulonglong labelId);
144     void addComicsToReadingList(const QList<qulonglong> &comicIds, qulonglong readingListId);
145 
146     void setModelData(QList<ComicItem *> *data, const QString &databasePath);
147 
148 protected:
149 private:
150     void setupModelData(QSqlQuery &sqlquery);
151     void setupModelDataForList(QSqlQuery &sqlquery);
152     ComicDB _getComic(const QModelIndex &mi);
153     QList<ComicItem *> _data;
154 
155     QString _databasePath;
156     QString _databaseConnection;
157 
158     bool enableResorting;
159     Mode mode;
160     qulonglong sourceId;
161 
162 signals:
163     void beforeReset();
164     void reset();
165     void isEmpty();
166     void searchNumResults(int);
167     void resortedIndexes(QList<int>);
168     void newSelectedIndex(const QModelIndex &);
169 };
170 
171 #endif
172