X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=model%2Fbook.cpp;h=d2098165497f2bc8183792b2dc67794f41fd6022;hb=b855b46f739479ca0d6dd15b73a4c56a8d8a2d2c;hp=5942d6bdc52310590d3b922dec91146af50c23dd;hpb=7ef2c6826dd0e880f1df76d1ea4abdf0ec8f18d0;p=dorian diff --git a/model/book.cpp b/model/book.cpp index 5942d6b..d209816 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,11 +22,15 @@ 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(); } } +Book::~Book() +{ + close(); +} + QString Book::path() { return mPath; @@ -293,8 +292,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"); } @@ -406,15 +404,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() @@ -423,6 +417,12 @@ QString Book::shortName() return (title.isEmpty())? QFileInfo(path()).baseName(): title; } +QImage Book::coverImage() +{ + load(); + return cover; +} + int Book::chapterFromPart(int index) { TRACE; @@ -435,18 +435,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; } @@ -500,7 +499,7 @@ bool Book::extractMetaData() { QStringList excludedExtensions; excludedExtensions << ".html" << ".xhtml" << ".xht" << ".htm" << ".gif" - << ".png" << ".css"; + << ".css" << "*.ttf" << "mimetype"; return extract(excludedExtensions); } @@ -509,7 +508,6 @@ void Book::upgrade() TRACE; // Load book from old database (QSettings) - QSettings settings; QString key = "book/" + path() + "/"; title = settings.value(key + "title").toString(); @@ -523,10 +521,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++) { @@ -539,14 +538,47 @@ 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(); } void Book::remove() { TRACE; - load(); + 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(); +} + +