diff options
| author | Ariya Hidayat <ariya.hidayat@nokia.com> | 2009-06-05 15:25:44 +0200 |
|---|---|---|
| committer | Ariya Hidayat <ariya.hidayat@nokia.com> | 2009-06-05 15:25:44 +0200 |
| commit | 9c8824c2525816769f21dfab90daaa0778855bd8 (patch) | |
| tree | 8a691a4a69ba40d8bfb4a3e786b034a68a79a42f | |
| parent | 0244b8fbc3d50c40f9e10270ce41a3c8a1ff46f7 (diff) | |
New example on how to do simple snap-scrolling on QWebView.
| -rw-r--r-- | snapscroll/snapscroll.cpp | 123 | ||||
| -rw-r--r-- | snapscroll/snapscroll.pro | 2 |
2 files changed, 125 insertions, 0 deletions
diff --git a/snapscroll/snapscroll.cpp b/snapscroll/snapscroll.cpp new file mode 100644 index 0000000..41a73c3 --- /dev/null +++ b/snapscroll/snapscroll.cpp @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Graphics Dojo project on Qt Labs. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 or 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include <QtCore> +#include <QtGui> +#include <QtWebKit> + +#if QT_VERSION < 0x0040500 +#error You need Qt 4.5 or newer +#endif + +#define SNAP_THRESHOLD 10 + +class SnapView: public QWebView +{ +public: + + SnapView(): QWebView(), snapEnabled(true) { + setWindowTitle("Snap-scrolling is ON"); + } + +private: + + bool snapEnabled; + + // rects hit by the line, in main frame's view coordinate + QList<QRect> hitBoundingRects(const QLine &line) { + QList<QRect> hitRects; + + const int points = 8; + QPoint delta(line.dx() / points, line.dy() / points); + + QPoint point = line.p1(); + for (int i = 0; i < points - 1; ++i) { + point += delta; + QWebHitTestResult hit = page()->mainFrame()->hitTestContent(point); + if (!hit.boundingRect().isEmpty()) + hitRects += hit.boundingRect(); + } + + return hitRects; + } + + void keyPressEvent(QKeyEvent *event) { + + // toggle snapping + if (event->key() == Qt::Key_F3) { + snapEnabled = !snapEnabled; + if (snapEnabled) + setWindowTitle("Snap-scrolling is ON"); + else + setWindowTitle("Snap-scrolling is OFF"); + event->accept(); + return; + } + + // no snapping? do not bother... + if (!snapEnabled) { + QWebView::keyReleaseEvent(event); + return; + } + + QPoint previousOffset = page()->mainFrame()->scrollPosition(); + + QWebView::keyReleaseEvent(event); + if (!event->isAccepted()) + return; + + if (event->key() == Qt::Key_Down) { + QPoint ofs = page()->mainFrame()->scrollPosition(); + int jump = ofs.y() - previousOffset.y(); + if (jump == 0) + return; + + jump += SNAP_THRESHOLD; + + QList<QRect> rects = hitBoundingRects(QLine(1, 1, width() - 1, 1)); + for (int i = 0; i < rects.count(); ++i) { + int j = rects[i].top() - previousOffset.y(); + if (j > SNAP_THRESHOLD && j < jump) + jump = j; + } + + page()->mainFrame()->setScrollPosition(previousOffset + QPoint(0, jump)); + } + } +}; + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + SnapView view; + view.load(QUrl("http://news.bbc.co.uk/text_only.stm")); + view.resize(320, 500); + view.show(); + + QMessageBox::information(&view, "Hint", "Use F3 to toggle snapping on and off"); + + return app.exec(); +} + + diff --git a/snapscroll/snapscroll.pro b/snapscroll/snapscroll.pro new file mode 100644 index 0000000..4291b80 --- /dev/null +++ b/snapscroll/snapscroll.pro @@ -0,0 +1,2 @@ +SOURCES = snapscroll.cpp +QT += webkit network |
