diff --git a/src/qtquick/BookDatabase.cpp b/src/qtquick/BookDatabase.cpp --- a/src/qtquick/BookDatabase.cpp +++ b/src/qtquick/BookDatabase.cpp @@ -58,7 +58,7 @@ return true; QSqlQuery q; - if (!q.exec(QLatin1String("create table books(filename varchar primary key, filetitle varchar, title varchar, series varchar, author varchar, publisher varchar, created datetime, lastOpenedTime datetime, totalPages integer, currentPage integer, thumbnail varchar, description varchar, comment varchar, tags varchar, rating integer)"))) { + if (!q.exec(QLatin1String("create table books(filename varchar primary key, filetitle varchar, title varchar, series varchar, author varchar, publisher varchar, created datetime, lastOpenedTime datetime, totalPages integer, currentPage integer, thumbnail varchar, description varchar, comment varchar, tags varchar, rating integer, seriesVolumes varchar, seriesNumbers varchar)"))) { qDebug() << "Database could not create the table books"; return false; } @@ -89,7 +89,7 @@ } QList entries; - QSqlQuery allEntries("SELECT filename, filetitle, title, series, author, publisher, created, lastOpenedTime, totalPages, currentPage, thumbnail, description, comment, tags, rating FROM books"); + QSqlQuery allEntries("SELECT filename, filetitle, title, series, author, publisher, created, lastOpenedTime, totalPages, currentPage, thumbnail, description, comment, tags, rating, seriesNumbers, seriesVolumes FROM books"); while(allEntries.next()) { BookEntry* entry = new BookEntry(); @@ -108,6 +108,8 @@ entry->comment = allEntries.value(12).toString(); entry->tags = allEntries.value(13).toString().split(","); entry->rating = allEntries.value(14).toInt(); + entry->seriesNumbers = allEntries.value(15).toString().split(","); + entry->seriesVolumes = allEntries.value(16).toString().split(","); entries.append(entry); } @@ -123,8 +125,8 @@ qDebug() << "Adding newly discovered book to the database" << entry->filename; QSqlQuery newEntry; - newEntry.prepare("INSERT INTO books (filename, filetitle, title, series, author, publisher, created, lastOpenedTime, totalPages, currentPage, thumbnail, description, comment, tags, rating) " - "VALUES (:filename, :filetitle, :title, :series, :author, :publisher, :created, :lastOpenedTime, :totalPages, :currentPage, :thumbnail, :description, :comment, :tags, :rating)"); + newEntry.prepare("INSERT INTO books (filename, filetitle, title, series, author, publisher, created, lastOpenedTime, totalPages, currentPage, thumbnail, description, comment, tags, rating, seriesNumbers, seriesVolumes) " + "VALUES (:filename, :filetitle, :title, :series, :author, :publisher, :created, :lastOpenedTime, :totalPages, :currentPage, :thumbnail, :description, :comment, :tags, :rating, :seriesNumbers, :seriesVolumes)"); newEntry.bindValue(":filename", entry->filename); newEntry.bindValue(":filetitle", entry->filetitle); newEntry.bindValue(":title", entry->title); @@ -141,6 +143,8 @@ newEntry.bindValue(":comment", entry->comment); newEntry.bindValue(":tags", entry->tags.join(",")); newEntry.bindValue(":rating", entry->rating); + newEntry.bindValue(":seriesNumbers", entry->seriesNumbers.join(",")); + newEntry.bindValue(":seriesVolumes", entry->seriesVolumes.join(",")); newEntry.exec(); d->closeDb(); diff --git a/src/qtquick/BookListModel.cpp b/src/qtquick/BookListModel.cpp --- a/src/qtquick/BookListModel.cpp +++ b/src/qtquick/BookListModel.cpp @@ -124,7 +124,7 @@ authorCategoryModel->addCategoryEntry(entry->author.at(i), entry); } for (int i=0; iseries.size(); i++) { - seriesCategoryModel->addCategoryEntry(entry->series.at(i), entry); + seriesCategoryModel->addCategoryEntry(entry->series.at(i), entry, SeriesRole); } if (newlyAddedCategoryModel->indexOfFile(entry->filename) == -1) { newlyAddedCategoryModel->append(entry, CreatedRole); @@ -211,8 +211,11 @@ QStringList splitName = entry->filename.split("/"); if (!splitName.isEmpty()) entry->filetitle = splitName.takeLast(); - if(!splitName.isEmpty()) + if(!splitName.isEmpty()) { entry->series = QStringList(splitName.takeLast()); // hahahaheuristics (dumb assumptions about filesystems, go!) + entry->seriesNumbers = QStringList("0"); + entry->seriesVolumes = QStringList("0"); + } // just in case we end up without a title... using complete basename here, // as we would rather have "book one. part two" and the odd "book one - part two.tar" QFileInfo fileinfo(entry->filename); @@ -267,7 +270,16 @@ AdvancedComicBookFormat::Document* acbfDocument = qobject_cast(bookModel->acbfData()); if(acbfDocument) { for(AdvancedComicBookFormat::Sequence* sequence : acbfDocument->metaData()->bookInfo()->sequence()) { - entry->series.append(sequence->title()); + if (!entry->series.contains(sequence->title())) { + entry->series.append(sequence->title()); + entry->seriesNumbers.append(QString::number(sequence->number())); + entry->seriesVolumes.append(QString::number(sequence->volume())); + } else { + int series = entry->series.indexOf(sequence->title()); + entry->seriesNumbers.replace(series, QString::number(sequence->number())); + entry->seriesVolumes.replace(series, QString::number(sequence->volume())); + } + } for(AdvancedComicBookFormat::Author* author : acbfDocument->metaData()->bookInfo()->author()) { entry->author.append(author->displayName()); diff --git a/src/qtquick/CategoryEntriesModel.h b/src/qtquick/CategoryEntriesModel.h --- a/src/qtquick/CategoryEntriesModel.h +++ b/src/qtquick/CategoryEntriesModel.h @@ -38,6 +38,8 @@ QString filetitle; QString title; QStringList series; + QStringList seriesNumbers; + QStringList seriesVolumes; QStringList author; QString publisher; QDateTime created; @@ -80,6 +82,8 @@ FiletitleRole, TitleRole, SeriesRole, + SeriesNumbersRole, + SeriesVolumesRole, AuthorRole, PublisherRole, CreatedRole, @@ -130,7 +134,7 @@ * * This also adds it to the model's list of entries. */ - void addCategoryEntry(const QString& categoryName, BookEntry* entry); + void addCategoryEntry(const QString& categoryName, BookEntry* entry, Roles compareRole = TitleRole); /** * @param index an integer index pointing at the desired book. diff --git a/src/qtquick/CategoryEntriesModel.cpp b/src/qtquick/CategoryEntriesModel.cpp --- a/src/qtquick/CategoryEntriesModel.cpp +++ b/src/qtquick/CategoryEntriesModel.cpp @@ -81,6 +81,8 @@ roles[FiletitleRole] = "filetitle"; roles[TitleRole] = "title"; roles[SeriesRole] = "series"; + roles[SeriesNumbersRole] = "seriesNumber"; + roles[SeriesVolumesRole] = "seriesVolume"; roles[AuthorRole] = "author"; roles[PublisherRole] = "publisher"; roles[CreatedRole] = "created"; @@ -140,6 +142,12 @@ case SeriesRole: result.setValue(entry->series); break; + case SeriesNumbersRole: + result.setValue(entry->seriesNumbers); + break; + case SeriesVolumesRole: + result.setValue(entry->seriesVolumes); + break; case AuthorRole: result.setValue(entry->author); break; @@ -198,14 +206,45 @@ void CategoryEntriesModel::append(BookEntry* entry, Roles compareRole) { int insertionIndex = 0; + int seriesOne = -1; int seriesTwo = -1; + if(compareRole == SeriesRole) { + seriesOne = entry->series.indexOf(name()); + if (entry->series.contains(name(), Qt::CaseInsensitive) && seriesOne == -1){ + for (int s=0; sseries.size();s++) { + if (name().toLower() == entry->series.at(s).toLower()) { + seriesOne = s; + } + } + } + } for(; insertionIndex < d->entries.count(); ++insertionIndex) { + if(compareRole == SeriesRole) { + seriesTwo = d->entries.at(insertionIndex)->series.indexOf(name()); + if ( d->entries.at(insertionIndex)->series.contains(name(), Qt::CaseInsensitive) && seriesTwo == -1){ + for (int s=0; s< d->entries.at(insertionIndex)->series.size();s++) { + if (name().toLower() == d->entries.at(insertionIndex)->series.at(s).toLower()) { + seriesTwo = s; + } + } + } + } if(compareRole == CreatedRole) { if(entry->created <= d->entries.at(insertionIndex)->created) { continue; } break; } + else if((seriesOne>-1 && seriesTwo>-1) + && entry->seriesNumbers.at(seriesOne).toInt() > 0 + && d->entries.at(insertionIndex)->seriesNumbers.at(seriesTwo).toInt() > 0) + { + if (entry->seriesVolumes.at(seriesOne).toInt() >= d->entries.at(insertionIndex)->seriesVolumes.at(seriesTwo).toInt() + && entry->seriesNumbers.at(seriesOne).toInt() > d->entries.at(insertionIndex)->seriesNumbers.at(seriesTwo).toInt()) + {continue;} + qDebug() << name() << entry->seriesNumbers.at(seriesOne).toInt() << d->entries.at(insertionIndex)->seriesNumbers.at(seriesTwo).toInt(); + break; + } else { if(QString::localeAwareCompare(d->entries.at(insertionIndex)->title, entry->title) > 0) @@ -249,7 +288,7 @@ return model; } -void CategoryEntriesModel::addCategoryEntry(const QString& categoryName, BookEntry* entry) +void CategoryEntriesModel::addCategoryEntry(const QString& categoryName, BookEntry* entry, Roles compareRole) { if(categoryName.length() > 0) { @@ -285,7 +324,7 @@ endInsertRows(); } if (categoryModel->indexOfFile(entry->filename) == -1) { - categoryModel->append(entry); + categoryModel->append(entry, compareRole); } categoryModel->addCategoryEntry(splitName.join("/"), entry); }