From a105fdc65be75c13bfc2c18e418b00d53c56fb50 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Tue, 20 Oct 2009 17:04:22 +0200 Subject: WebView Scrolling. Patch from Johannes Zellner (thanks). I changed just the keyPressEvent function to better test it.. --- src/webview.cpp | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) (limited to 'src/webview.cpp') diff --git a/src/webview.cpp b/src/webview.cpp index 1815e871..834ddcd9 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -52,12 +52,18 @@ #include #include #include +#include WebView::WebView(QWidget* parent) : QWebView(parent) , m_page(new WebPage(this)) , m_progress(0) + , m_scrollTimer(new QTimer(this)) + , m_scrollDirection(WebView::NoScroll) + , m_scrollSpeedVertical(0) + , m_scrollSpeedHorizontal(0) + { setPage(m_page); @@ -65,6 +71,10 @@ WebView::WebView(QWidget* parent) connect(this, SIGNAL(loadProgress(int)), this, SLOT(slotUpdateProgress(int))); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool))); connect(this, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); + + connect(m_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollFrameChanged())); + m_scrollTimer->setInterval(50); + } @@ -107,6 +117,7 @@ void WebView::setStatusBarText(const QString &string) m_statusBarText = string; } + void WebView::contextMenuEvent(QContextMenuEvent *event) { QWebHitTestResult result = page()->mainFrame()->hitTestContent(event->pos()); @@ -329,8 +340,82 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } +void WebView::stopScrollAnimation() +{ + m_scrollTimer->stop(); + m_scrollSpeedVertical = 0; + m_scrollSpeedHorizontal = 0; + m_scrollDirection = WebView::NoScroll; +} + + +void WebView::startScrollAnimation(ScrollDirection direction) +{ + // if no scrollspeed, set the requested direction, otherwise it's just a slowdown or speedup + if (m_scrollSpeedVertical == 0 && (direction == WebView::Up || direction == WebView::Down)) + m_scrollDirection |= direction; + if (m_scrollSpeedHorizontal == 0 && (direction == WebView::Left || direction == WebView::Right)) + m_scrollDirection |= direction; + + // update scrollspeed + switch (direction) + { + case WebView::Up: + --m_scrollSpeedVertical; + break; + case WebView::Down: + ++m_scrollSpeedVertical; + break; + case WebView::Left: + --m_scrollSpeedHorizontal; + break; + case WebView::Right: + ++m_scrollSpeedHorizontal; + break; + default: + break; + } + + if (!m_scrollTimer->isActive()) + m_scrollTimer->start(); + + return; +} + + +void WebView::scrollFrameChanged() +{ + // clear finished scrolling + if (m_scrollSpeedVertical == 0) + m_scrollDirection &= ~WebView::Up | ~WebView::Down; + if (m_scrollSpeedHorizontal == 0) + m_scrollDirection &= ~WebView::Left | ~WebView::Right; + + // all scrolling finished + if (m_scrollDirection == WebView::NoScroll) + { + m_scrollTimer->stop(); + return; + } + + // do the scrolling + page()->currentFrame()->scroll(m_scrollSpeedHorizontal, m_scrollSpeedVertical); + + // check if we reached the end + int y = page()->currentFrame()->scrollPosition().y(); + int x = page()->currentFrame()->scrollPosition().x(); + + if (y == 0 || y == page()->currentFrame()->scrollBarMaximum(Qt::Vertical)) + m_scrollSpeedVertical = 0; + if (x == 0 || x == page()->currentFrame()->scrollBarMaximum(Qt::Horizontal)) + m_scrollSpeedHorizontal = 0; +} + + void WebView::mousePressEvent(QMouseEvent *event) { + stopScrollAnimation(); + m_page->m_pressedButtons = event->buttons(); m_page->m_keyboardModifiers = event->modifiers(); @@ -359,6 +444,8 @@ void WebView::mouseMoveEvent(QMouseEvent *event) void WebView::wheelEvent(QWheelEvent *event) { + stopScrollAnimation(); + if (QApplication::keyboardModifiers() & Qt::ControlModifier) { int numDegrees = event->delta() / 8; @@ -430,7 +517,6 @@ void WebView::openLinkInNewTab() } -// HACK short term hack: remove this function, unuseful in kdewebkit porting void WebView::keyPressEvent(QKeyEvent *event) { if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_C)) @@ -438,6 +524,27 @@ void WebView::keyPressEvent(QKeyEvent *event) triggerPageAction(QWebPage::Copy); return; } + + if (event->modifiers() == Qt::ShiftModifier) + { + switch (event->key()) + { + case Qt::Key_Down: + startScrollAnimation(WebView::Down); + return; + case Qt::Key_Up: + startScrollAnimation(WebView::Up); + return; + case Qt::Key_Left: + startScrollAnimation(WebView::Left); + return; + case Qt::Key_Right: + startScrollAnimation(WebView::Right); + return; + default: + break; + } + } + QWebView::keyPressEvent(event); } - -- cgit v1.2.1