Fix cover images.
[dorian] / model / library.cpp
index c210555..1a66639 100644 (file)
@@ -1,16 +1,16 @@
-#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()
@@ -20,10 +20,10 @@ 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
@@ -37,18 +37,23 @@ 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)
@@ -65,52 +70,51 @@ 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();
@@ -125,24 +129,27 @@ bool Library::add(const QString &path)
 
 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));
 }
 
@@ -160,6 +167,7 @@ void Library::setNowReading(const QModelIndex &index)
 
 void Library::clear()
 {
+    TRACE;
     for (int i = 0; i < mBooks.size(); i++) {
         delete mBooks[i];
     }
@@ -169,6 +177,7 @@ void Library::clear()
 
 QModelIndex Library::find(QString path) const
 {
+    TRACE;
     if (path != "") {
         QString absolutePath = QFileInfo(path).absoluteFilePath();
         for (int i = 0; i < mBooks.size(); i++) {
@@ -182,6 +191,7 @@ QModelIndex Library::find(QString path) const
 
 QModelIndex Library::find(const Book *book) const
 {
+    TRACE;
     if (book) {
         for (int i = 0; i < mBooks.size(); i++) {
             if (book == mBooks[i]) {
@@ -194,7 +204,7 @@ QModelIndex Library::find(const Book *book) const
 
 void Library::onBookOpened(const QString &path)
 {
-    Trace t("Library::onBookOpened " + path);
+    TRACE;
     QModelIndex index = find(path);
     if (index.isValid()) {
         emit dataChanged(index, index);
@@ -210,33 +220,24 @@ QStringList Library::bookPaths()
     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();
 }