X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=bookview.cpp;h=b751393c174e51fba51ab53e049d6af3df2e65cb;hb=HEAD;hp=aaa3326973bb862920968e0466a0550dee293b16;hpb=8f61c1b666e9c4ad58d4689094c074c9cd05e387;p=dorian diff --git a/bookview.cpp b/bookview.cpp index aaa3326..b751393 100644 --- a/bookview.cpp +++ b/bookview.cpp @@ -22,6 +22,9 @@ BookView::BookView(QWidget *parent): QWebView(parent), contentIndex(-1), { TRACE; + // Create timer for scheduling restores + restoreTimer = new QTimer(this); + // Set up web view defaults settings()->setAttribute(QWebSettings::AutoLoadImages, true); settings()->setAttribute(QWebSettings::JavascriptEnabled, true); @@ -29,7 +32,8 @@ BookView::BookView(QWidget *parent): QWebView(parent), contentIndex(-1), settings()->setAttribute(QWebSettings::PluginsEnabled, false); settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, true); settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, false); - settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, false); + settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, + false); settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, false); settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, @@ -45,7 +49,8 @@ BookView::BookView(QWidget *parent): QWebView(parent), contentIndex(-1), frame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); #endif frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); - connect(this, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool))); + connect(this, SIGNAL(loadFinished(bool)), + this, SLOT(onLoadFinished(bool))); connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addJavaScriptObjects())); @@ -109,26 +114,34 @@ void BookView::setBook(Book *book) { TRACE; - // Save position in current book + // Bail out if new book is the same as current book + if (book == mBook) { + return; + } + + // Save reading position of current book setLastBookmark(); - // Open new book, restore last position - if (book != mBook) { - mBook = book; - if (book) { - contentIndex = -1; - if (book->open()) { - restoreLastBookmark(); - } else { - mBook = 0; - contentIndex = 0; - setHtml(tr("Failed to open book")); - } - } - else { - contentIndex = 0; - setHtml(tr("No book")); - } + // Set new book as the current book + mBook = book; + + // Bail out if new book is null + if (!book) { + contentIndex = 0; + setHtml(tr("No book")); + return; + } + + // Open new book + if (book->open()) { + // Restore last reading position - this will force + // a reload as well + contentIndex = -1; + restoreLastBookmark(); + } else { + mBook = 0; + contentIndex = 0; + setHtml(tr("Failed to open book")); } } @@ -155,7 +168,7 @@ void BookView::goNext() } } -void BookView::setLastBookmark() +void BookView::setLastBookmark(bool fast) { TRACE; if (mBook) { @@ -164,7 +177,9 @@ void BookView::setLastBookmark() int pos = frame->scrollPosition().y(); qDebug() << QString("At %1 (%2%, height %3)"). arg(pos).arg((qreal)pos / (qreal)height * 100).arg(height); - mBook->setLastBookmark(contentIndex, (qreal)pos / (qreal)height); + mBook->setLastBookmark(contentIndex, (qreal)pos / (qreal)height, fast); + } else { + qDebug() << "(no book)"; } } @@ -187,6 +202,7 @@ void BookView::goToBookmark(const Book::Bookmark &bookmark) positionAfterLoad = bookmark.pos; loadContent(bookmark.part); } else { + emit partLoadEnd(contentIndex); goToPosition(bookmark.pos); } } @@ -219,7 +235,6 @@ void BookView::goToFragment(const QString &fragment) QVariant ret = page()->mainFrame()->evaluateJavaScript( QString("window.location='") + fragment + "'"); qDebug() << ret; - // FIXME: setLastBookmark(); } } @@ -234,8 +249,36 @@ void BookView::onLoadFinished(bool ok) onSettingsChanged("scheme"); onSettingsChanged("zoom"); onSettingsChanged("font"); + scheduleRestoreAfterLoad(); +} + +void BookView::scheduleRestoreAfterLoad() +{ + TRACE; + if (restoreTimer->isActive()) { + // Ignore request if a restore is already in progress + return; + } + + disconnect(restoreTimer, SIGNAL(timeout()), this, 0); + connect(restoreTimer, SIGNAL(timeout()), this, SLOT(restoreAfterLoad())); + restoreTimer->setSingleShot(true); + restoreTimer->start(210); +} - QTimer::singleShot(210, this, SLOT(restoreAfterLoad())); +void BookView::scheduleRestoreLastBookmark() +{ + TRACE; + if (restoreTimer->isActive()) { + // Ignore request if a restore is already in progress + return; + } + + disconnect(restoreTimer, SIGNAL(timeout()), this, 0); + connect(restoreTimer, SIGNAL(timeout()), this, + SLOT(restoreLastBookmark())); + restoreTimer->setSingleShot(true); + restoreTimer->start(210); } void BookView::restoreAfterLoad() @@ -312,6 +355,19 @@ void BookView::paintEvent(QPaintEvent *e) int bookmarkPos = (int)((qreal)height * (qreal)b.pos); painter.drawPixmap(2, bookmarkPos - scrollPos.y(), bookmarkPixmap); } + + // Paint page separator(s) + QPen pen(Qt::gray); + pen.setStyle(Qt::DotLine); + pen.setWidth(3); + painter.setPen(pen); + if (contentIndex > 0) { + painter.drawLine(0, -scrollPos.y(), width(), -scrollPos.y()); + } + if (contentIndex < (mBook->parts.size() - 1)) { + int h = contentsHeight - scrollPos.y() - 1; + painter.drawLine(0, h, width(), h); + } } void BookView::mousePressEvent(QMouseEvent *e) @@ -326,14 +382,16 @@ void BookView::mousePressEvent(QMouseEvent *e) if (scroller) { scrollerMonitor = startTimer(500); } +#elif defined(Q_OS_SYMBIAN) + // Do nothing #else - // Handle mouse presses on the scroll bar + // Handle mouse press on the scroll bar QWebFrame *frame = page()->mainFrame(); if (frame->scrollBarGeometry(Qt::Vertical).contains(e->pos())) { e->accept(); return; } -#endif // Q_WS_MAEMO_5 +#endif e->ignore(); } @@ -380,11 +438,12 @@ bool BookView::eventFilter(QObject *o, QEvent *e) // Work around Qt bug that sometimes selects web view contents during swipe switch (e->type()) { case QEvent::MouseButtonPress: - emit suppressedMouseButtonPress(); mousePressed = true; break; case QEvent::MouseButtonRelease: +#ifndef Q_OS_SYMBIAN // Too heavy on Symbian showProgress(); +#endif mousePressed = false; break; case QEvent::MouseMove: @@ -403,23 +462,13 @@ bool BookView::eventFilter(QObject *o, QEvent *e) void BookView::addJavaScriptObjects() { - page()->mainFrame()->addToJavaScriptWindowObject("bv", this); -} - -#ifdef Q_WS_MAEMO_5 - -void BookView::leaveEvent(QEvent *e) -{ TRACE; - // Save current position, to be restored later, in MainWindow::resizeEvent() - setLastBookmark(); - QWebView::leaveEvent(e); + page()->mainFrame()->addToJavaScriptWindowObject("bv", this); } -#endif // Q_WS_MAEMO_5 - void BookView::goToPosition(qreal position) { + TRACE; int contentsHeight = page()->mainFrame()->contentsSize().height(); int scrollPos = (int)((qreal)contentsHeight * position); page()->mainFrame()->setScrollPosition(QPoint(0, scrollPos)); @@ -430,6 +479,7 @@ void BookView::goToPosition(qreal position) void BookView::showProgress() { + TRACE; if (mBook) { int contentsHeight = page()->mainFrame()->contentsSize().height(); qreal pos = (qreal)(page()->mainFrame()->scrollPosition().y()) / @@ -451,15 +501,27 @@ void BookView::timerEvent(QTimerEvent *e) scrollerMonitor = -1; } } -#endif +#endif // Q_WS_MAEMO_5 + QWebView::timerEvent(e); } +void BookView::hideEvent(QHideEvent *e) +{ + Trace t("BookView::hideEvent"); + +#if defined(Q_OS_SYMBIAN) + setLastBookmark(); +#endif + + QWebView::hideEvent(e); +} + void BookView::goPreviousPage() { QWebFrame *frame = page()->mainFrame(); - int pos = frame->scrollPosition().y(); - frame->scroll(0, -height()); + const int pos = frame->scrollPosition().y(); + frame->scroll(0, -1); if (pos == frame->scrollPosition().y()) { if (contentIndex > 0) { Book::Bookmark bookmark(contentIndex - 1, 1.0); @@ -468,6 +530,15 @@ void BookView::goPreviousPage() } } else { showProgress(); + QPropertyAnimation *slide = + new QPropertyAnimation(frame, "scrollPosition"); + const QPoint *offset = new QPoint(0, height() - 18); + slide->setDuration(400); + slide->setStartValue(frame->scrollPosition()); + slide->setEndValue(frame->scrollPosition() - *offset); + slide->setEasingCurve(QEasingCurve::OutQuad); + slide->start(QAbstractAnimation::DeleteWhenStopped); + delete offset; } } @@ -475,13 +546,21 @@ void BookView::goNextPage() { TRACE; QWebFrame *frame = page()->mainFrame(); - int pos = frame->scrollPosition().y(); - frame->scroll(0, height()); + const int pos = frame->scrollPosition().y(); + frame->scroll(0, 1); if (pos == frame->scrollPosition().y()) { goNext(); } else { - setLastBookmark(); showProgress(); + QPropertyAnimation *slide = + new QPropertyAnimation(frame, "scrollPosition"); + const QPoint *offset = new QPoint(0, (height() - 18)); + slide->setDuration(400); + slide->setStartValue(frame->scrollPosition()); + slide->setEndValue(frame->scrollPosition() + *offset); + slide->setEasingCurve(QEasingCurve::OutQuad); + slide->start(QAbstractAnimation::DeleteWhenStopped); + delete offset; } }