Add new columns to the comics model

This commit is contained in:
Luis Ángel San Martín 2023-10-09 19:26:53 +02:00
parent 737c8e7638
commit e6e5208001
2 changed files with 60 additions and 30 deletions

View File

@ -43,7 +43,7 @@ int ComicModel::columnCount(const QModelIndex &parent) const
Q_UNUSED(parent) Q_UNUSED(parent)
if (_data.isEmpty()) if (_data.isEmpty())
return 0; return 0;
return _data.first()->columnCount(); return _data.first()->columnCount() + 1 /* + the number of calculated columns */;
} }
bool ComicModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const bool ComicModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
@ -238,7 +238,6 @@ QHash<int, QByteArray> ComicModel::roleNames() const
roles[PathRole] = "path"; roles[PathRole] = "path";
roles[HashRole] = "hash"; roles[HashRole] = "hash";
roles[ReadColumnRole] = "read_column"; roles[ReadColumnRole] = "read_column";
roles[IsBisRole] = "is_bis";
roles[CurrentPageRole] = "current_page"; roles[CurrentPageRole] = "current_page";
roles[RatingRole] = "rating"; roles[RatingRole] = "rating";
roles[HasBeenOpenedRole] = "has_been_opened"; roles[HasBeenOpenedRole] = "has_been_opened";
@ -249,6 +248,10 @@ QHash<int, QByteArray> ComicModel::roleNames() const
roles[TypeRole] = "type"; roles[TypeRole] = "type";
roles[ShowRecentRole] = "show_recent"; roles[ShowRecentRole] = "show_recent";
roles[RecentRangeRole] = "recent_range"; roles[RecentRangeRole] = "recent_range";
roles[SizeRole] = "size";
roles[SeriesRole] = "series";
roles[VolumeRole] = "volume";
roles[StoryArcRole] = "story_arc";
return roles; return roles;
} }
@ -269,7 +272,7 @@ QVariant ComicModel::data(const QModelIndex &index, int role) const
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
case ComicModel::NumPages: case ComicModel::NumPages:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
case ComicModel::Hash: case ComicModel::Size:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
case ComicModel::CurrentPage: case ComicModel::CurrentPage:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
@ -283,6 +286,10 @@ QVariant ComicModel::data(const QModelIndex &index, int role) const
auto item = static_cast<ComicItem *>(index.internalPointer()); auto item = static_cast<ComicItem *>(index.internalPointer());
auto sizeString = [=] {
return QString::number(item->data(ComicModel::Hash).toString().right(item->data(ComicModel::Hash).toString().length() - 40).toInt() / 1024.0 / 1024.0, 'f', 2) + "Mb";
};
if (role == NumberRole) if (role == NumberRole)
return item->data(Number); return item->data(Number);
else if (role == TitleRole) else if (role == TitleRole)
@ -306,7 +313,7 @@ QVariant ComicModel::data(const QModelIndex &index, int role) const
else if (role == ReadColumnRole) else if (role == ReadColumnRole)
return item->data(ReadColumn).toBool(); return item->data(ReadColumn).toBool();
else if (role == HasBeenOpenedRole) else if (role == HasBeenOpenedRole)
return item->data(ComicModel::HasBeenOpened); return item->data(HasBeenOpened);
else if (role == IdRole) else if (role == IdRole)
return item->data(Id); return item->data(Id);
else if (role == PublicationDateRole) else if (role == PublicationDateRole)
@ -317,14 +324,24 @@ QVariant ComicModel::data(const QModelIndex &index, int role) const
return item->data(Type); return item->data(Type);
else if (role == ShowRecentRole) else if (role == ShowRecentRole)
return showRecent; return showRecent;
else if (role == ComicModel::RecentRangeRole) else if (role == RecentRangeRole)
return recentDays * 86400; return recentDays * 86400;
else if (role == SizeRole)
return sizeString();
else if (role == SeriesRole)
return item->data(Series);
else if (role == VolumeRole)
return item->data(Volume);
else if (role == StoryArcRole)
return item->data(StoryArc);
if (role != Qt::DisplayRole) if (role != Qt::DisplayRole)
return QVariant(); return QVariant();
if (index.column() == ComicModel::Hash) if (index.column() == ComicModel::Hash)
return QString::number(item->data(index.column()).toString().right(item->data(index.column()).toString().length() - 40).toInt() / 1024.0 / 1024.0, 'f', 2) + "Mb"; return item->data(ComicModel::Hash).toString();
if (index.column() == ComicModel::Size)
return sizeString();
if (index.column() == ComicModel::ReadColumn) if (index.column() == ComicModel::ReadColumn)
return (item->data(ComicModel::CurrentPage).toInt() == item->data(ComicModel::NumPages).toInt() || item->data(ComicModel::ReadColumn).toBool()) ? QVariant(tr("yes")) : QVariant(tr("no")); return (item->data(ComicModel::CurrentPage).toInt() == item->data(ComicModel::NumPages).toInt() || item->data(ComicModel::ReadColumn).toBool()) ? QVariant(tr("yes")) : QVariant(tr("no"));
if (index.column() == ComicModel::CurrentPage) if (index.column() == ComicModel::CurrentPage)
@ -353,8 +370,7 @@ QVariant ComicModel::headerData(int section, Qt::Orientation orientation,
int role) const int role) const
{ {
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
switch (section) // TODO obtener esto de la query switch (section) {
{
case ComicModel::Number: case ComicModel::Number:
return QVariant(QString("#")); return QVariant(QString("#"));
case ComicModel::Title: case ComicModel::Title:
@ -363,7 +379,7 @@ QVariant ComicModel::headerData(int section, Qt::Orientation orientation,
return QVariant(QString(tr("File Name"))); return QVariant(QString(tr("File Name")));
case ComicModel::NumPages: case ComicModel::NumPages:
return QVariant(QString(tr("Pages"))); return QVariant(QString(tr("Pages")));
case ComicModel::Hash: case ComicModel::Size:
return QVariant(QString(tr("Size"))); return QVariant(QString(tr("Size")));
case ComicModel::ReadColumn: case ComicModel::ReadColumn:
return QVariant(QString(tr("Read"))); return QVariant(QString(tr("Read")));
@ -373,17 +389,22 @@ QVariant ComicModel::headerData(int section, Qt::Orientation orientation,
return QVariant(QString(tr("Publication Date"))); return QVariant(QString(tr("Publication Date")));
case ComicModel::Rating: case ComicModel::Rating:
return QVariant(QString(tr("Rating"))); return QVariant(QString(tr("Rating")));
case ComicModel::Series:
return QVariant(QString(tr("Series")));
case ComicModel::Volume:
return QVariant(QString(tr("Volume")));
case ComicModel::StoryArc:
return QVariant(QString(tr("Story Arc")));
} }
} }
if (orientation == Qt::Horizontal && role == Qt::TextAlignmentRole) { if (orientation == Qt::Horizontal && role == Qt::TextAlignmentRole) {
switch (section) // TODO obtener esto de la query switch (section) {
{
case ComicModel::Number: case ComicModel::Number:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
case ComicModel::NumPages: case ComicModel::NumPages:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
case ComicModel::Hash: case ComicModel::Size:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
case ComicModel::CurrentPage: case ComicModel::CurrentPage:
return QVariant(Qt::AlignRight | Qt::AlignVCenter); return QVariant(Qt::AlignRight | Qt::AlignVCenter);
@ -461,7 +482,7 @@ QStringList ComicModel::getPaths(const QString &_source)
return paths; return paths;
} }
#define COMIC_MODEL_QUERY_FIELDS "ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened,ci.date,ci.added,ci.type,ci.lastTimeOpened" #define COMIC_MODEL_QUERY_FIELDS "ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.currentPage,ci.rating,ci.hasBeenOpened,ci.date,ci.added,ci.type,ci.lastTimeOpened,ci.series,ci.volume,ci.storyArc"
QList<ComicItem *> ComicModel::createFolderModelData(unsigned long long folderId, const QString &databasePath) const QList<ComicItem *> ComicModel::createFolderModelData(unsigned long long folderId, const QString &databasePath) const
{ {

View File

@ -23,22 +23,28 @@ class ComicModel : public QAbstractItemModel
public: public:
enum Columns { enum Columns {
Number = 0, Number = 0,
Title = 1, Title,
FileName = 2, FileName,
NumPages = 3, NumPages,
Id = 4, Id,
Parent_Id = 5, Parent_Id,
Path = 6, Path,
Hash = 7, Hash,
ReadColumn = 8, ReadColumn,
IsBis = 9, // TODO_METADATA: Remove this column CurrentPage,
CurrentPage = 10, Rating,
Rating = 11, HasBeenOpened,
HasBeenOpened = 12, PublicationDate,
PublicationDate = 13, Added,
Added = 14, Type,
Type = 15, LastTimeOpened,
LastTimeOpened = 16, Series,
Volume,
StoryArc,
};
enum CalculatedColumns {
Size = Columns::StoryArc + 1,
}; };
enum Roles { enum Roles {
@ -51,7 +57,6 @@ public:
PathRole, PathRole,
HashRole, HashRole,
ReadColumnRole, ReadColumnRole,
IsBisRole,
CurrentPageRole, CurrentPageRole,
RatingRole, RatingRole,
HasBeenOpenedRole, HasBeenOpenedRole,
@ -62,6 +67,10 @@ public:
TypeRole, TypeRole,
ShowRecentRole, ShowRecentRole,
RecentRangeRole, RecentRangeRole,
SizeRole,
SeriesRole,
VolumeRole,
StoryArcRole,
}; };
enum Mode { enum Mode {