Hello,

as promised, I wrote the auto scrolling ability.
It works now also if child-frames are active and the speed can be adjusted 
with pressing the arrow-keys + modifier (Shift+up/down/right/left) again.

It is also working now Horizontal and Vertical.

The patch is attached and I will try to find more time for adding mouse 
support.

Thanks,
Johannes
diff --git a/src/webview.cpp b/src/webview.cpp
index 8a74e76..13a8ecf 100644
--- a/src/webview.cpp
+++ b/src/webview.cpp
@@ -52,18 +52,26 @@
 #include <QtGui/QClipboard>
 #include <QtGui/QKeyEvent>
 #include <QtGui/QAction>
+#include <QtCore/QTimer>
 
 
 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);
     
     connect(page(), SIGNAL(statusBarMessage(const QString&)), this, SLOT(setStatusBarText(const QString&)));
     connect(this, SIGNAL(loadProgress(int)), this, SLOT(slotUpdateProgress(int)));
     connect(this, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool)));
+
+    connect(m_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollFrameChanged()));
+    m_scrollTimer->setInterval(50);
 }
 
 
@@ -282,6 +290,30 @@ void WebView::contextMenuEvent(QContextMenuEvent *event)
 
 void WebView::keyPressEvent(QKeyEvent *event)
 {
+    if ((event->modifiers() == Qt::ShiftModifier) && (event->key() == Qt::Key_Down))
+    {
+        startScrollAnimation(WebView::Down);
+        return;
+    }
+
+    if ((event->modifiers() == Qt::ShiftModifier) && (event->key() == Qt::Key_Up))
+    {
+        startScrollAnimation(WebView::Up);
+        return;
+    }
+
+    if ((event->modifiers() == Qt::ShiftModifier) && (event->key() == Qt::Key_Left))
+    {
+        startScrollAnimation(WebView::Left);
+        return;
+    }
+
+    if ((event->modifiers() == Qt::ShiftModifier) && (event->key() == Qt::Key_Right))
+    {
+        startScrollAnimation(WebView::Right);
+        return;
+    }
+
     if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_Tab))
     {
         emit ctrlTabPressed();
@@ -298,8 +330,82 @@ void WebView::keyPressEvent(QKeyEvent *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();
     
@@ -319,6 +425,8 @@ void WebView::mousePressEvent(QMouseEvent *event)
 
 void WebView::wheelEvent(QWheelEvent *event)
 {
+    stopScrollAnimation();
+
     if (QApplication::keyboardModifiers() & Qt::ControlModifier)
     {
         int numDegrees = event->delta() / 8;
diff --git a/src/webview.h b/src/webview.h
index f1e5272..47badf2 100644
--- a/src/webview.h
+++ b/src/webview.h
@@ -37,13 +37,23 @@
 
 // Forward Declarations
 class WebPage;
+class QTimer;
 
 
 class WebView : public QWebView
 {
     Q_OBJECT
+    Q_ENUMS(ScrollDirection)
 
 public:
+    enum ScrollDirection
+    {
+        NoScroll = 0,
+        Up = 2,
+        Down = 4,
+        Left = 6,
+        Right = 16
+    };
     explicit WebView(QWidget *parent = 0);
 
     WebPage *page();
@@ -77,10 +87,18 @@ private slots:
     void openLinkInNewWindow();
     void openLinkInNewTab();
 
+    void startScrollAnimation(ScrollDirection direction);
+    void stopScrollAnimation();
+    void scrollFrameChanged();
+
 private:
     WebPage *m_page;
     int m_progress;
     QString m_statusBarText;
+    QTimer *m_scrollTimer;
+    int m_scrollDirection;
+    int m_scrollSpeedVertical;
+    int m_scrollSpeedHorizontal;
 };
 
 #endif
_______________________________________________
rekonq mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/rekonq

Reply via email to