diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/webview.cpp | 111 | ||||
| -rw-r--r-- | src/webview.h | 19 | 
2 files changed, 128 insertions, 2 deletions
| 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 <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); @@ -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);  } - diff --git a/src/webview.h b/src/webview.h index 3388348d..d3f58f2e 100644 --- a/src/webview.h +++ b/src/webview.h @@ -37,13 +37,24 @@  // 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);      ~WebView(); @@ -71,10 +82,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 | 
