X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=bookview.cpp;h=1e80aa143651cb3e81e93306924107957c54149e;hb=b843ed247e4cbaa89d81c528902f0b5d7080c216;hp=bda16e4077605bfc9eb5999a5ea563aa715da701;hpb=d4cbc4dac9cc7cf159220ef56a9b1014c68b46c1;p=dorian diff --git a/bookview.cpp b/bookview.cpp index bda16e4..1e80aa1 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); @@ -111,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")); } } @@ -167,6 +178,8 @@ void BookView::setLastBookmark(bool fast) qDebug() << QString("At %1 (%2%, height %3)"). arg(pos).arg((qreal)pos / (qreal)height * 100).arg(height); mBook->setLastBookmark(contentIndex, (qreal)pos / (qreal)height, fast); + } else { + qDebug() << "(no book)"; } } @@ -189,6 +202,7 @@ void BookView::goToBookmark(const Book::Bookmark &bookmark) positionAfterLoad = bookmark.pos; loadContent(bookmark.part); } else { + emit partLoadEnd(contentIndex); goToPosition(bookmark.pos); } } @@ -221,7 +235,6 @@ void BookView::goToFragment(const QString &fragment) QVariant ret = page()->mainFrame()->evaluateJavaScript( QString("window.location='") + fragment + "'"); qDebug() << ret; - // FIXME: setLastBookmark(); } } @@ -236,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; + } - QTimer::singleShot(210, this, SLOT(restoreAfterLoad())); + disconnect(restoreTimer, SIGNAL(timeout()), this, 0); + connect(restoreTimer, SIGNAL(timeout()), this, SLOT(restoreAfterLoad())); + restoreTimer->setSingleShot(true); + restoreTimer->start(210); +} + +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() @@ -400,7 +441,9 @@ bool BookView::eventFilter(QObject *o, QEvent *e) mousePressed = true; break; case QEvent::MouseButtonRelease: +#ifndef Q_OS_SYMBIAN // Too heavy on Symbian showProgress(); +#endif mousePressed = false; break; case QEvent::MouseMove: @@ -419,11 +462,13 @@ bool BookView::eventFilter(QObject *o, QEvent *e) void BookView::addJavaScriptObjects() { + TRACE; page()->mainFrame()->addToJavaScriptWindowObject("bv", this); } void BookView::goToPosition(qreal position) { + TRACE; int contentsHeight = page()->mainFrame()->contentsSize().height(); int scrollPos = (int)((qreal)contentsHeight * position); page()->mainFrame()->setScrollPosition(QPoint(0, scrollPos)); @@ -434,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()) / @@ -460,11 +506,22 @@ void BookView::timerEvent(QTimerEvent *e) 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() - 19)); + 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); @@ -473,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; } } @@ -480,12 +546,21 @@ void BookView::goNextPage() { TRACE; QWebFrame *frame = page()->mainFrame(); - int pos = frame->scrollPosition().y(); - frame->scroll(0, height() - 19); + const int pos = frame->scrollPosition().y(); + frame->scroll(0, 1); if (pos == frame->scrollPosition().y()) { goNext(); } 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; } } @@ -513,16 +588,3 @@ void BookView::onMediaKeysPressed(MediaKeysObserver::MediaKeys key) } #endif // Q_OS_SYMBIAN - -void BookView::adjustPosition() -{ - QSize desktop = QApplication::desktop()->size(); - qreal ratio = (qreal)(desktop.width()) / (qreal)(desktop.height()); - if (mBook) { - QWebFrame *frame = page()->mainFrame(); - int height = frame->contentsSize().height(); - int pos = frame->scrollPosition().y(); - qreal relativePos = (qreal)pos / (qreal)height; - // FIXME: Finish me - } -}