Jump to exact position on page, as identified by TOC entry. Handle
authorAkos Polster <akos@pipacs.com>
Wed, 3 Nov 2010 23:29:46 +0000 (00:29 +0100)
committerAkos Polster <akos@pipacs.com>
Wed, 3 Nov 2010 23:29:46 +0000 (00:29 +0100)
enter/leave events only on Maemo.

bookmarksdialog.cpp
bookview.cpp
bookview.h
mainwindow.cpp
model/book.cpp
model/book.h
pkg/changelog

index 9902643..a14bb49 100644 (file)
@@ -75,8 +75,7 @@ void BookmarksDialog::onAdd()
 {
     bool ok;
     QString text = QInputDialog::getText(this, tr("Add bookmark"),
-                                         tr("Note:"), QLineEdit::Normal,
-                                         QString(), &ok);
+        tr("Note (optional):"), QLineEdit::Normal, QString(), &ok);
     if (ok) {
         emit addBookmark(text);
         close();
index 3d00f9c..e11f56e 100644 (file)
@@ -93,8 +93,7 @@ void BookView::loadContent(int index)
     QString contentFile(mBook->content[mBook->parts[index]].href);
     if (mBook->parts[index] == "error") {
         setHtml(contentFile);
-    }
-    else {
+    } else {
         loaded = false;
         emit partLoadStart(index);
         QUrl u = QUrl::fromLocalFile(QDir(mBook->rootPath()).
@@ -191,6 +190,33 @@ void BookView::goToBookmark(const Book::Bookmark &bookmark)
     }
 }
 
+void BookView::goToPart(int part, const QString &fragment)
+{
+    TRACE;
+    if (mBook) {
+        if (part != contentIndex) {
+            qDebug() << "Loading new part" << part;
+            restoreFragmentAfterLoad = true;
+            fragmentAfterLoad = fragment;
+            loadContent(part);
+        } else {
+            goToFragment(fragment);
+            showProgress();
+        }
+    }
+}
+
+void BookView::goToFragment(const QString &fragment)
+{
+    TRACE;
+    if (!fragment.isEmpty()) {
+        QVariant ret = page()->mainFrame()->evaluateJavaScript(
+                QString("window.location='") + fragment + "'");
+        qDebug() << ret;
+        setLastBookmark();
+    }
+}
+
 void BookView::onLoadFinished(bool ok)
 {
     TRACE;
@@ -344,14 +370,21 @@ void BookView::addJavaScriptObjects()
 
 void BookView::onContentsSizeChanged(const QSize &size)
 {
+    TRACE;
     contentsHeight = size.height();
-    if (restorePositionAfterLoad) {
-        qDebug() << "BookView::onContentSizeChanged: Time to restore";
-        restorePositionAfterLoad = false;
+    if (restoreFragmentAfterLoad) {
+        qDebug() << "Restorint to fragment" << fragmentAfterLoad;
+        goToFragment(fragmentAfterLoad);
+    } else if (restorePositionAfterLoad) {
+        qDebug() << "Restoring to position";
         goToPosition(positionAfterLoad);
     }
+    restorePositionAfterLoad = false;
+    restoreFragmentAfterLoad = false;
 }
 
+#ifdef Q_WS_MAEMO_5
+
 void BookView::leaveEvent(QEvent *e)
 {
     TRACE;
@@ -369,6 +402,8 @@ void BookView::enterEvent(QEvent *e)
     QWebView::enterEvent(e);
 }
 
+#endif // Q_WS_MAEMO_5
+
 void BookView::goToPosition(qreal position)
 {
     int scrollPos = (int)((qreal)contentsHeight * position);
index 1c5bbd9..30af1f9 100644 (file)
@@ -29,12 +29,14 @@ public:
     void addBookmark(const QString &note);
     void setLastBookmark();
     void restoreLastBookmark();
+    void goToPart(int part, const QString &fragment);
+    void goToFragment(const QString &fragment);
 
 signals:
     void partLoadStart(int index);
     void partLoadEnd(int index);
 
-    /** Signal button press when the real event has been suppressed. */
+    /** Signal button press, when the real event has been suppressed. */
     void suppressedMouseButtonPress();
 
     /** Signal progress in reading the book. */
@@ -67,8 +69,10 @@ protected:
     void mousePressEvent(QMouseEvent *e);
     void wheelEvent(QWheelEvent *);
     bool eventFilter(QObject *o, QEvent *e);
+#ifdef Q_WS_MAEMO_5
     void leaveEvent(QEvent *e);
     void enterEvent(QEvent *e);
+#endif // Q_WS_MAEMO_5
     void timerEvent(QTimerEvent *e);
     void keyPressEvent(QKeyEvent *e);
 
@@ -91,6 +95,10 @@ private:
                         /**< If true, restore current position after load. */
     qreal positionAfterLoad;
                         /**< Position to be restored after load. */
+    bool restoreFragmentAfterLoad;
+                        /**< If true, restore fragment location after load. */
+    QString fragmentAfterLoad;
+                        /**< Fragment location to be restored after load. */
     QImage bookmarkImage;
                         /**< Bookmark icon pre-loaded. */
     bool loaded;        /**< True if content has been loaded. */
index dcdcf56..c0d614c 100755 (executable)
@@ -377,6 +377,13 @@ void MainWindow::onAddBookmark(const QString &note)
 {
     TRACE;
     view->addBookmark(note);
+#ifdef Q_WS_MAEMO_5
+    QMaemo5InformationBox::information(this,
+        tr("Bookmarked current position"), QMaemo5InformationBox::DefaultTimeout);
+#else
+    (void)QMessageBox::information(this, tr("Dorian"),
+        tr("Bookmarked current position"), QMessageBox::Ok);
+#endif // Q_WS_MAEMO_5}
 }
 
 void MainWindow::onGoToBookmark(int index)
@@ -404,9 +411,10 @@ void MainWindow::onGoToChapter(int index)
 
     Book *book = Library::instance()->book(mCurrent);
     if (book) {
-        int partIndex = book->partFromChapter(index);
+        QString fragment;
+        int partIndex = book->partFromChapter(index, fragment);
         if (partIndex != -1) {
-            view->goToBookmark(Book::Bookmark(partIndex, 0));
+            view->goToPart(partIndex, fragment);
         }
     }
 }
@@ -462,7 +470,7 @@ void MainWindow::about()
     label->setText(tr("<b>Dorian %1</b><br><br>Copyright &copy; 2010 "
         "Akos Polster &lt;akos@pipacs.com&gt;<br>"
         "Licensed under GNU General Public License, Version 3<br>"
-        "Source code: <a href='https://garage.maemo.org/projects/dorian/'>"
+        "Source code:<br><a href='https://garage.maemo.org/projects/dorian/'>"
         "garage.maemo.org/projects/dorian</a>").arg(Platform::version()));
     aboutDialog->addWidget(label);
     aboutDialog->addStretch();
index c2d3c99..c28af23 100644 (file)
@@ -429,19 +429,22 @@ int Book::chapterFromPart(int index)
     return ret;
 }
 
-int Book::partFromChapter(int index)
+int Book::partFromChapter(int index, QString &fragment)
 {
     Trace t("Book::partFromChapter");
+    fragment.clear();
     QString id = chapters[index];
     QString href = content[id].href;
     int hashPos = href.indexOf("#");
     if (hashPos != -1) {
+        fragment = href.mid(hashPos);
         href = href.left(hashPos);
     }
 
     qDebug() << "Chapter" << index;
     qDebug() << " id" << id;
     qDebug() << " href" << href;
+    qDebug() << " fragment" << fragment;
 
     for (int i = 0; i < parts.size(); i++) {
         QString partId = parts[i];
index 49de447..034b539 100644 (file)
@@ -107,8 +107,8 @@ public:
     /** Get chapter index from part index. */
     int chapterFromPart(int index);
 
-    /** Get part index from chapter index. */
-    int partFromChapter(int index);
+    /** Get part index and URL fragment from chapter index. */
+    int partFromChapter(int index, QString &fragment);
 
     /** Get progress (0..1) corresponding to part index and part position. */
     qreal getProgress(int part, qreal position);
index 1c0b74a..04c32c4 100644 (file)
@@ -1,6 +1,7 @@
 dorian (0.3.3-1) unstable; urgency=low
 
   * Fix font scaling on Symbian
+  * Jump to the exact position on page, as described in TOC
 
  -- Akos Polster <akos@pipacs.com>  Wed,  3 Nov 2010 02:00:00 +0100