9 Library *Library::mInstance = 0;
11 Library::Library(QObject *parent): QAbstractListModel(parent)
21 Library *Library::instance()
24 mInstance = new Library();
29 int Library::rowCount(const QModelIndex &parent) const
31 if (parent.isValid()) {
38 QVariant Library::data(const QModelIndex &index, int role) const
40 if (!index.isValid()) {
46 return mBooks[index.row()]->name();
47 case Qt::DecorationRole:
48 return QPixmap::fromImage(mBooks[index.row()]->cover);
54 Book *Library::book(const QModelIndex &index)
56 if (index.isValid()) {
57 if ((index.row() >= 0) && (index.row() < mBooks.size())) {
58 return mBooks[index.row()];
60 qCritical() << "Library::book: Bad index" << index.row();
76 int size = settings.value("lib/size").toInt();
77 for (int i = 0; i < size; i++) {
78 QString key = "lib/book" + QString::number(i);
79 QString path = settings.value(key).toString();
80 Book *book = new Book(path);
81 connect(book, SIGNAL(opened(const QString &)),
82 this, SLOT(onBookOpened(const QString &)));
86 QString currentPath = settings.value("lib/nowreading").toString();
87 mNowReading = find(currentPath);
88 mFolders = settings.value("lib/folders").toStringList();
94 settings.setValue("lib/size", mBooks.size());
95 for (int i = 0; i < mBooks.size(); i++) {
96 QString key = "lib/book" + QString::number(i);
97 settings.setValue(key, mBooks[i]->path());
99 Book *currentBook = book(mNowReading);
100 settings.setValue("lib/nowreading",
101 currentBook? currentBook->path(): QString());
102 settings.setValue("lib/folders", mFolders);
105 bool Library::add(const QString &path)
107 Trace t("Library::add " + path);
109 qCritical() << "Library::add: Empty path";
112 if (find(path).isValid()) {
113 qDebug() << "Book already exists in library";
116 int size = mBooks.size();
117 beginInsertRows(QModelIndex(), size, size);
118 Book *book = new Book(path);
126 void Library::remove(const QModelIndex &index)
128 Book *toRemove = book(index);
132 int row = index.row();
133 beginRemoveRows(QModelIndex(), row, row);
134 mBooks.removeAt(row);
137 if (index == mNowReading) {
138 mNowReading = QModelIndex();
139 emit nowReadingChanged();
144 void Library::remove(const QString &path)
149 QModelIndex Library::nowReading() const
154 void Library::setNowReading(const QModelIndex &index)
158 emit nowReadingChanged();
161 void Library::clear()
163 for (int i = 0; i < mBooks.size(); i++) {
167 mNowReading = QModelIndex();
170 QModelIndex Library::find(QString path) const
173 QString absolutePath = QFileInfo(path).absoluteFilePath();
174 for (int i = 0; i < mBooks.size(); i++) {
175 if (absolutePath == mBooks[i]->path()) {
180 return QModelIndex();
183 QModelIndex Library::find(const Book *book) const
186 for (int i = 0; i < mBooks.size(); i++) {
187 if (book == mBooks[i]) {
192 return QModelIndex();
195 void Library::onBookOpened(const QString &path)
197 Trace t("Library::onBookOpened " + path);
198 QModelIndex index = find(path);
199 if (index.isValid()) {
200 emit dataChanged(index, index);
204 QStringList Library::bookPaths()
207 foreach (Book *book, mBooks) {
208 ret.append(book->path());
213 QStringList Library::folders() const
218 bool Library::addFolder(const QString &folder)
220 if (!mFolders.contains(folder)) {
221 mFolders.append(folder);
229 bool Library::removeFolder(const QString &folder)
231 if (mFolders.contains(folder)) {
232 mFolders.removeOne(folder);
240 void Library::scanFolders()