#include <qtextdocument.h> // Qt::escape is currently defined here...
+#include <QtGui>
#include "book.h"
#include "opshandler.h"
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)
{
QFileInfo info(p);
mPath = info.absoluteFilePath();
title = info.baseName();
- cover = makeCover(":/icons/book.png");
mTempFile.open();
}
}
+Book::~Book()
+{
+ close();
+}
+
QString Book::path()
{
return mPath;
rights = data["rights"].toString();
mLastBookmark.part = data["lastpart"].toInt();
mLastBookmark.pos = data["lastpos"].toReal();
- cover = data["cover"].value<QImage>().scaled(COVER_WIDTH,
- COVER_HEIGHT, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ cover = data["cover"].value<QImage>();
if (cover.isNull()) {
cover = makeCover(":/icons/book.png");
}
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()
return (title.isEmpty())? QFileInfo(path()).baseName(): title;
}
+QImage Book::coverImage()
+{
+ load();
+ return cover;
+}
+
int Book::chapterFromPart(int index)
{
TRACE;
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;
}
{
QStringList excludedExtensions;
excludedExtensions << ".html" << ".xhtml" << ".xht" << ".htm" << ".gif"
- << ".png" << ".css";
+ << ".css" << "*.ttf" << "mimetype";
return extract(excludedExtensions);
}
TRACE;
// Load book from old database (QSettings)
-
QSettings settings;
QString key = "book/" + path() + "/";
title = settings.value(key + "title").toString();
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<QImage>().scaled(COVER_WIDTH,
- COVER_HEIGHT, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ cover = settings.value(key + "cover").value<QImage>();
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++) {
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();
+}
+
+