X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=bookview.cpp;h=96b9b6e7bd5dfa4060b1f52974d0c6e8f839d0df;hb=d32af855518f5b94cda767f60c8a1b98b4602f99;hp=fda10b91e14596a868b13990fda0ab15fbb8bc0f;hpb=3c911546d4367fa1da0a21c70872159a1044a170;p=dorian diff --git a/bookview.cpp b/bookview.cpp index fda10b9..96b9b6e 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")); } } @@ -157,7 +168,7 @@ void BookView::goNext() } } -void BookView::setLastBookmark() +void BookView::setLastBookmark(bool fast) { TRACE; if (mBook) { @@ -166,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)"; } } @@ -189,6 +202,7 @@ void BookView::goToBookmark(const Book::Bookmark &bookmark) positionAfterLoad = bookmark.pos; loadContent(bookmark.part); } else { + emit partLoadEnd(contentIndex); goToPosition(bookmark.pos); } } @@ -236,8 +250,36 @@ void BookView::onLoadFinished(bool ok) onSettingsChanged("scheme"); onSettingsChanged("zoom"); onSettingsChanged("font"); + scheduleRestoreAfterLoad(); +} - QTimer::singleShot(210, this, SLOT(restoreAfterLoad())); +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); +} + +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() @@ -341,14 +383,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(); } @@ -395,11 +439,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: @@ -418,11 +463,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)); @@ -433,6 +480,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()) / @@ -454,10 +502,22 @@ 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(); @@ -483,7 +543,6 @@ void BookView::goNextPage() if (pos == frame->scrollPosition().y()) { goNext(); } else { - // setLastBookmark(); showProgress(); } }