X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=model%2Fbook.cpp;h=751666503c5085fbc7e5b17351469129e1225a77;hb=17bbd5548e70759286f56acd2e0cd6ea61dab473;hp=c24d53f1156dbc9ef81aed7d00b35d7deb2f5eae;hpb=86f8b4db28c0a66442d43ba292f3013cd0974a4e;p=dorian diff --git a/model/book.cpp b/model/book.cpp index c24d53f..7516665 100644 --- a/model/book.cpp +++ b/model/book.cpp @@ -1,4 +1,5 @@ #include // Qt::escape is currently defined here... +#include #include "book.h" #include "opshandler.h" @@ -12,13 +13,7 @@ const int COVER_WIDTH = 53; const int COVER_HEIGHT = 59; - -static QImage makeCover(const QString &path) -{ - return QImage(path).scaled(COVER_WIDTH, COVER_HEIGHT, - Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation). - scaled(COVER_WIDTH, COVER_HEIGHT, Qt::KeepAspectRatio); -} +const int COVER_MAX = 512 * 1024; Book::Book(const QString &p, QObject *parent): QObject(parent), loaded(false) { @@ -27,7 +22,6 @@ Book::Book(const QString &p, QObject *parent): QObject(parent), loaded(false) QFileInfo info(p); mPath = info.absoluteFilePath(); title = info.baseName(); - cover = makeCover(":/icons/book.png"); mTempFile.open(); } } @@ -59,6 +53,7 @@ bool Book::open() if (!parse()) { return false; } + dateOpened = QDateTime::currentDateTime().toUTC(); save(); emit opened(path()); return true; @@ -196,8 +191,8 @@ bool Book::parse() cover = makeCover(coverPath); } - // If there is an "ncx" item in content, parse it: That's the real table of - // contents + // If there is an "ncx" item in content, parse it: That's the real table + // of contents QString ncxFileName; if (content.contains("ncx")) { ncxFileName = content["ncx"].href; @@ -298,8 +293,7 @@ void Book::load() rights = data["rights"].toString(); mLastBookmark.part = data["lastpart"].toInt(); mLastBookmark.pos = data["lastpos"].toReal(); - cover = data["cover"].value().scaled(COVER_WIDTH, - COVER_HEIGHT, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + cover = data["cover"].value(); if (cover.isNull()) { cover = makeCover(":/icons/book.png"); } @@ -310,6 +304,8 @@ void Book::load() QString note = data[QString("bookmark%1note").arg(i)].toString(); mBookmarks.append(Bookmark(part, pos, note)); } + dateAdded = data["dateadded"].toDateTime(); + dateOpened = data["dateopened"].toDateTime(); } void Book::save() @@ -335,16 +331,23 @@ void Book::save() data[QString("bookmark%1pos").arg(i)] = mBookmarks[i].pos; data[QString("bookmark%1note").arg(i)] = mBookmarks[i].note; } + data["dateadded"] = dateAdded; + data["dateopened"] = dateOpened; BookDb::instance()->save(path(), data); } -void Book::setLastBookmark(int part, qreal position) +void Book::setLastBookmark(int part, qreal position, bool fast) { TRACE; - load(); + qDebug() << "Part" << part << "position" << position << "fast?" << fast; + if (!fast) { + load(); + } mLastBookmark.part = part; mLastBookmark.pos = position; - save(); + if (!fast) { + save(); + } } Book::Bookmark Book::lastBookmark() @@ -361,6 +364,16 @@ void Book::addBookmark(int part, qreal position, const QString ¬e) save(); } +void Book::setBookmarkNote(int index, const QString ¬e) +{ + load(); + if (index >= 0 && index < mBookmarks.length()) { + mBookmarks[index].note = note; + } + save(); + +} + void Book::deleteBookmark(int index) { load(); @@ -411,15 +424,11 @@ QString Book::name() if (title.size()) { QString ret = title; if (creators.length()) { - ret += "\nBy " + creators[0]; - for (int i = 1; i < creators.length(); i++) { - ret += ", " + creators[i]; - } + ret += "\nBy " + creators.join(", "); } return ret; - } else { - return path(); } + return path(); } QString Book::shortName() @@ -446,18 +455,17 @@ int Book::chapterFromPart(int index) for (int i = 0; i < chapters.size(); i++) { QString id = chapters[i]; QString href = content[id].href; - QString baseRef(href); - QUrl url(QString("file://") + href); - if (url.hasFragment()) { - QString fragment = url.fragment(); - baseRef.chop(fragment.length() + 1); + int hashPos = href.indexOf("#"); + if (hashPos != -1) { + href = href.left(hashPos); } - if (baseRef == partHref) { + if (href == partHref) { ret = i; // Don't break, keep looking } } + qDebug() << "Part" << index << partId << partHref << ":" << ret; return ret; } @@ -511,7 +519,7 @@ bool Book::extractMetaData() { QStringList excludedExtensions; excludedExtensions << ".html" << ".xhtml" << ".xht" << ".htm" << ".gif" - << ".png" << ".css" << "*.ttf" << "mimetype"; + << ".css" << "*.ttf" << "mimetype"; return extract(excludedExtensions); } @@ -520,7 +528,6 @@ void Book::upgrade() TRACE; // Load book from old database (QSettings) - QSettings settings; QString key = "book/" + path() + "/"; title = settings.value(key + "title").toString(); @@ -534,10 +541,11 @@ void Book::upgrade() rights = settings.value(key + "rights").toString(); mLastBookmark.part = settings.value(key + "lastpart").toInt(); mLastBookmark.pos = settings.value(key + "lastpos").toReal(); - cover = settings.value(key + "cover").value().scaled(COVER_WIDTH, - COVER_HEIGHT, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + cover = settings.value(key + "cover").value(); if (cover.isNull()) { cover = makeCover(":/icons/book.png"); + } else { + cover = makeCover(QPixmap::fromImage(cover)); } int size = settings.value(key + "bookmarks").toInt(); for (int i = 0; i < size; i++) { @@ -550,8 +558,10 @@ void Book::upgrade() mBookmarks.append(Bookmark(part, pos)); } - // Save book to new database + // Remove QSettings + settings.remove("book/" + path()); + // Save book to new database save(); } @@ -561,3 +571,34 @@ void Book::remove() close(); BookDb::instance()->remove(path()); } + +QImage Book::makeCover(const QString &fileName) +{ + TRACE; + qDebug() << fileName; + QFileInfo info(fileName); + if (info.isReadable() && (info.size() < COVER_MAX)) { + return makeCover(QPixmap(fileName)); + } + return makeCover(QPixmap(":/icons/book.png")); +} + +QImage Book::makeCover(const QPixmap &pixmap) +{ + TRACE; + QPixmap src = pixmap.scaled(COVER_WIDTH, COVER_HEIGHT, + Qt::KeepAspectRatio, Qt::SmoothTransformation); + QPixmap transparent(COVER_WIDTH, COVER_HEIGHT); + transparent.fill(Qt::transparent); + + QPainter p; + p.begin(&transparent); + p.setCompositionMode(QPainter::CompositionMode_Source); + p.drawPixmap((COVER_WIDTH - src.width()) / 2, + (COVER_HEIGHT - src.height()) / 2, src); + p.end(); + + return transparent.toImage(); +} + +