10 static const char *DORIAN_VERSION =
11 #include "pkg/version.txt"
14 Library *Library::mInstance = 0;
16 Library::Library(QObject *parent): QAbstractListModel(parent)
25 Library *Library::instance()
28 mInstance = new Library();
33 int Library::rowCount(const QModelIndex &parent) const
35 if (parent.isValid()) {
42 QVariant Library::data(const QModelIndex &index, int role) const
44 if (!index.isValid()) {
50 return mBooks[index.row()]->name();
51 case Qt::DecorationRole:
52 return QPixmap::fromImage(mBooks[index.row()]->cover);
58 Book *Library::book(const QModelIndex &index)
60 if (index.isValid()) {
61 if ((index.row() >= 0) && (index.row() < mBooks.size())) {
62 return mBooks[index.row()];
64 qCritical() << "Library::book: Bad index" << index.row();
78 Trace t("Library::load");
81 QStringList books = BookDb::instance()->books();
82 emit beginLoad(books.size());
84 foreach(QString path, books) {
86 Book *book = new Book(path);
87 connect(book, SIGNAL(opened(const QString &)),
88 this, SLOT(onBookOpened(const QString &)));
94 QString currentPath = settings.value("lib/nowreading").toString();
95 mNowReading = find(currentPath);
101 Trace t("Library::save");
103 Book *currentBook = book(mNowReading);
104 settings.setValue("lib/nowreading",
105 currentBook? currentBook->path(): QString());
108 bool Library::add(const QString &path)
110 Trace t("Library::add " + path);
112 qCritical() << "Library::add: Empty path";
115 if (find(path).isValid()) {
116 qDebug() << "Book already exists in library";
119 int size = mBooks.size();
120 beginInsertRows(QModelIndex(), size, size);
121 Book *book = new Book(path);
129 void Library::remove(const QModelIndex &index)
131 Trace t("Library::remove");
132 Book *toRemove = book(index);
137 int row = index.row();
138 beginRemoveRows(QModelIndex(), row, row);
139 mBooks.removeAt(row);
142 if (index == mNowReading) {
143 mNowReading = QModelIndex();
144 emit nowReadingChanged();
149 void Library::remove(const QString &path)
154 QModelIndex Library::nowReading() const
159 void Library::setNowReading(const QModelIndex &index)
163 emit nowReadingChanged();
166 void Library::clear()
168 for (int i = 0; i < mBooks.size(); i++) {
172 mNowReading = QModelIndex();
175 QModelIndex Library::find(QString path) const
178 QString absolutePath = QFileInfo(path).absoluteFilePath();
179 for (int i = 0; i < mBooks.size(); i++) {
180 if (absolutePath == mBooks[i]->path()) {
185 return QModelIndex();
188 QModelIndex Library::find(const Book *book) const
191 for (int i = 0; i < mBooks.size(); i++) {
192 if (book == mBooks[i]) {
197 return QModelIndex();
200 void Library::onBookOpened(const QString &path)
202 Trace t("Library::onBookOpened " + path);
203 QModelIndex index = find(path);
204 if (index.isValid()) {
205 emit dataChanged(index, index);
209 QStringList Library::bookPaths()
212 foreach (Book *book, mBooks) {
213 ret.append(book->path());
218 void Library::upgrade()
220 Trace t("Library::upgrade");
222 QString oldVersion = settings.value("lib/version").toString();
223 if (/* true */ oldVersion.isEmpty()) {
224 int size = settings.value("lib/size").toInt();
225 emit beginUpgrade(size);
226 for (int i = 0; i < size; i++) {
227 QString key = "lib/book" + QString::number(i);
228 QString path = settings.value(key).toString();
229 emit upgrading(path);
230 Book *book = new Book(path);
234 emit beginUpgrade(0);
236 settings.setValue("lib/version", QString(DORIAN_VERSION));