-#include <QSettings>
-#include <QDebug>
-#include <QFileInfo>
-
#include "library.h"
#include "book.h"
#include "trace.h"
+#include "bookdb.h"
+
+static const char *DORIAN_VERSION =
+#include "pkg/version.txt"
+;
-Library *Library::mInstance = 0;
+static Library *theInstance = 0;
Library::Library(QObject *parent): QAbstractListModel(parent)
{
- load();
}
Library::~Library()
Library *Library::instance()
{
- if (!mInstance) {
- mInstance = new Library();
+ if (!theInstance) {
+ theInstance = new Library();
}
- return mInstance;
+ return theInstance;
}
int Library::rowCount(const QModelIndex &parent) const
QVariant Library::data(const QModelIndex &index, int role) const
{
+ QVariant ret;
if (!index.isValid()) {
- return QVariant();
+ return ret;
}
switch (role) {
case Qt::DisplayRole:
- return mBooks[index.row()]->name();
+ ret = mBooks[index.row()]->name();
+ break;
case Qt::DecorationRole:
- return QPixmap::fromImage(mBooks[index.row()]->cover);
+ ret.setValue(mBooks[index.row()]->coverImage());
+ break;
default:
- return QVariant();
+ ;
}
+
+ return ret;
}
Book *Library::book(const QModelIndex &index)
void Library::close()
{
- delete mInstance;
- mInstance = 0;
+ delete theInstance;
+ theInstance = 0;
}
void Library::load()
{
- QSettings settings;
+ TRACE;
+
clear();
- int size = settings.value("lib/size").toInt();
- for (int i = 0; i < size; i++) {
- QString key = "lib/book" + QString::number(i);
- QString path = settings.value(key).toString();
+ QStringList books = BookDb::instance()->books();
+ emit beginLoad(books.size());
+
+ foreach(QString path, books) {
+ emit loading(path);
Book *book = new Book(path);
connect(book, SIGNAL(opened(const QString &)),
this, SLOT(onBookOpened(const QString &)));
- book->load();
+ // book->load();
mBooks.append(book);
}
+
+ QSettings settings;
QString currentPath = settings.value("lib/nowreading").toString();
mNowReading = find(currentPath);
- mFolders = settings.value("lib/folders").toStringList();
+ emit endLoad();
}
void Library::save()
{
+ TRACE;
QSettings settings;
- settings.setValue("lib/size", mBooks.size());
- for (int i = 0; i < mBooks.size(); i++) {
- QString key = "lib/book" + QString::number(i);
- settings.setValue(key, mBooks[i]->path());
- }
Book *currentBook = book(mNowReading);
settings.setValue("lib/nowreading",
currentBook? currentBook->path(): QString());
- settings.setValue("lib/folders", mFolders);
}
bool Library::add(const QString &path)
{
- Trace t("Library::add " + path);
+ TRACE;
if (path == "") {
qCritical() << "Library::add: Empty path";
return false;
}
if (find(path).isValid()) {
- t.trace("Book already exists in library");
+ qDebug() << "Book already exists in library";
return false;
}
int size = mBooks.size();
void Library::remove(const QModelIndex &index)
{
+ TRACE;
Book *toRemove = book(index);
if (!toRemove) {
return;
}
+ if (index == mNowReading) {
+ mNowReading = QModelIndex();
+ emit nowReadingChanged();
+ }
+ toRemove->remove();
int row = index.row();
beginRemoveRows(QModelIndex(), row, row);
mBooks.removeAt(row);
save();
endRemoveRows();
- if (index == mNowReading) {
- mNowReading = QModelIndex();
- emit nowReadingChanged();
- }
delete toRemove;
}
void Library::remove(const QString &path)
{
+ TRACE;
remove(find(path));
}
void Library::clear()
{
+ TRACE;
for (int i = 0; i < mBooks.size(); i++) {
delete mBooks[i];
}
QModelIndex Library::find(QString path) const
{
+ TRACE;
if (path != "") {
QString absolutePath = QFileInfo(path).absoluteFilePath();
for (int i = 0; i < mBooks.size(); i++) {
QModelIndex Library::find(const Book *book) const
{
+ TRACE;
if (book) {
for (int i = 0; i < mBooks.size(); i++) {
if (book == mBooks[i]) {
void Library::onBookOpened(const QString &path)
{
- Trace t("Library::onBookOpened " + path);
+ TRACE;
QModelIndex index = find(path);
if (index.isValid()) {
emit dataChanged(index, index);
return ret;
}
-QStringList Library::folders() const
-{
- return mFolders;
-}
-
-bool Library::addFolder(const QString &folder)
+void Library::upgrade()
{
- if (!mFolders.contains(folder)) {
- mFolders.append(folder);
- save();
- return true;
- } else {
- return false;
- }
-}
-
-bool Library::removeFolder(const QString &folder)
-{
- if (mFolders.contains(folder)) {
- mFolders.removeOne(folder);
- save();
- return true;
+ TRACE;
+ QSettings settings;
+ QString oldVersion = settings.value("lib/version").toString();
+ if (oldVersion.isEmpty()) {
+ int size = settings.value("lib/size").toInt();
+ emit beginUpgrade(size);
+ for (int i = 0; i < size; i++) {
+ QString key = "lib/book" + QString::number(i);
+ QString path = settings.value(key).toString();
+ emit upgrading(path);
+ Book *book = new Book(path);
+ book->upgrade();
+ }
} else {
- return false;
+ emit beginUpgrade(0);
}
-}
-
-void Library::scanFolders()
-{
+ settings.setValue("lib/version", QString(DORIAN_VERSION));
+ emit endUpgrade();
}