6 static const char *DORIAN_VERSION =
7 #include "pkg/version.txt"
10 static Library *theInstance = 0;
12 Library::Library(QObject *parent): QAbstractListModel(parent)
21 Library *Library::instance()
24 theInstance = new Library();
29 int Library::rowCount(const QModelIndex &parent) const
31 if (parent.isValid()) {
38 QVariant Library::data(const QModelIndex &index, int role) const
43 if (!index.isValid()) {
49 qDebug() << mBooks[index.row()]->name();
50 ret = mBooks[index.row()]->name();
52 case Qt::DecorationRole:
53 qDebug() << "(cover)";
54 ret.setValue(mBooks[index.row()]->cover);
63 Book *Library::book(const QModelIndex &index)
65 if (index.isValid()) {
66 if ((index.row() >= 0) && (index.row() < mBooks.size())) {
67 return mBooks[index.row()];
69 qCritical() << "Library::book: Bad index" << index.row();
86 QStringList books = BookDb::instance()->books();
87 emit beginLoad(books.size());
89 foreach(QString path, books) {
91 Book *book = new Book(path);
92 connect(book, SIGNAL(opened(const QString &)),
93 this, SLOT(onBookOpened(const QString &)));
99 QString currentPath = settings.value("lib/nowreading").toString();
100 mNowReading = find(currentPath);
108 Book *currentBook = book(mNowReading);
109 settings.setValue("lib/nowreading",
110 currentBook? currentBook->path(): QString());
113 bool Library::add(const QString &path)
117 qCritical() << "Library::add: Empty path";
120 if (find(path).isValid()) {
121 qDebug() << "Book already exists in library";
124 int size = mBooks.size();
125 beginInsertRows(QModelIndex(), size, size);
126 Book *book = new Book(path);
134 void Library::remove(const QModelIndex &index)
137 Book *toRemove = book(index);
141 if (index == mNowReading) {
142 mNowReading = QModelIndex();
143 emit nowReadingChanged();
146 int row = index.row();
147 beginRemoveRows(QModelIndex(), row, row);
148 mBooks.removeAt(row);
154 void Library::remove(const QString &path)
159 QModelIndex Library::nowReading() const
164 void Library::setNowReading(const QModelIndex &index)
168 emit nowReadingChanged();
171 void Library::clear()
173 for (int i = 0; i < mBooks.size(); i++) {
177 mNowReading = QModelIndex();
180 QModelIndex Library::find(QString path) const
183 QString absolutePath = QFileInfo(path).absoluteFilePath();
184 for (int i = 0; i < mBooks.size(); i++) {
185 if (absolutePath == mBooks[i]->path()) {
190 return QModelIndex();
193 QModelIndex Library::find(const Book *book) const
196 for (int i = 0; i < mBooks.size(); i++) {
197 if (book == mBooks[i]) {
202 return QModelIndex();
205 void Library::onBookOpened(const QString &path)
208 QModelIndex index = find(path);
209 if (index.isValid()) {
210 emit dataChanged(index, index);
214 QStringList Library::bookPaths()
217 foreach (Book *book, mBooks) {
218 ret.append(book->path());
223 void Library::upgrade()
227 QString oldVersion = settings.value("lib/version").toString();
228 if (oldVersion.isEmpty()) {
229 int size = settings.value("lib/size").toInt();
230 emit beginUpgrade(size);
231 for (int i = 0; i < size; i++) {
232 QString key = "lib/book" + QString::number(i);
233 QString path = settings.value(key).toString();
234 emit upgrading(path);
235 Book *book = new Book(path);
239 emit beginUpgrade(0);
241 settings.setValue("lib/version", QString(DORIAN_VERSION));