Changeset 54034 in webkit


Ignore:
Timestamp:
Jan 28, 2010, 5:49:18 PM (16 years ago)
Author:
eric@webkit.org
Message:

2010-01-28 Andreas Kling <andreas.kling@nokia.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Support kinetic scrolling on Maemo 5

https://bugs.webkit.org/show_bug.cgi?id=34267

Patch by Ralf Engels <ralf.engels@nokia.com> and
Robert Griebl <rgriebl@trolltech.com>

  • Api/qwebview.cpp: (QWebViewKineticScroller::QWebViewKineticScroller): (QWebViewKineticScroller::eventFilter): (QWebViewKineticScroller::currentFrame): (QWebViewKineticScroller::scrollingFrameAt): (QWebViewKineticScroller::attachToWidget): (QWebViewKineticScroller::removeFromWidget): (QWebViewKineticScroller::positionRange): (QWebViewKineticScroller::position): (QWebViewKineticScroller::viewportSize): (QWebViewKineticScroller::setPosition): (QWebView::QWebView):
Location:
trunk/WebKit/qt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/qt/Api/qwebview.cpp

    r53618 r54034  
    5959}
    6060
     61#ifdef Q_WS_MAEMO_5
     62#include "qabstractkineticscroller.h"
     63
     64class QWebViewKineticScroller : public QAbstractKineticScroller {
     65public:
     66    QWebViewKineticScroller() : QAbstractKineticScroller() {}
     67    // remember the frame where the button was pressed
     68    bool eventFilter(QObject* o, QEvent* ev)
     69    {
     70        switch (ev->type()) {
     71        case QEvent::MouseButtonPress: {
     72            QWebFrame* hitFrame = scrollingFrameAt(static_cast<QMouseEvent*>(ev)->pos());
     73            if (hitFrame)
     74                m_frame = hitFrame;
     75            break;
     76        }
     77        default:
     78            break;
     79        }
     80        return QAbstractKineticScroller::eventFilter(o, ev);
     81    }
     82
     83protected:
     84    QWebFrame* currentFrame() const
     85    {
     86        if (!m_frame.isNull())
     87            return m_frame.data();
     88
     89        QWebView* view = static_cast<QWebView*>(widget());
     90        QWebFrame* frame = view->page()->mainFrame();
     91        return frame;
     92    }
     93
     94    // Returns the innermost frame at the given position that can scroll.
     95    QWebFrame* scrollingFrameAt(const QPoint& pos) const
     96    {
     97        QWebView* view = static_cast<QWebView*>(widget());
     98        QWebFrame* mainFrame = view->page()->mainFrame();
     99        QWebFrame* hitFrame = mainFrame->hitTestContent(pos).frame();
     100        QSize range = hitFrame->contentsSize() - hitFrame->geometry().size();
     101
     102        while (hitFrame && range.width() <= 1 && range.height() <= 1)
     103            hitFrame = hitFrame->parentFrame();
     104
     105        return hitFrame;
     106    }
     107
     108    void attachToWidget()
     109    {
     110        QWebView* view = static_cast<QWebView*>(widget());
     111        QWebFrame* mainFrame = view->page()->mainFrame();
     112        m_oldHorizontalScrollBarPolicy = mainFrame->scrollBarPolicy(Qt::Horizontal);
     113        m_oldVerticalScrollBarPolicy = mainFrame->scrollBarPolicy(Qt::Vertical);
     114        mainFrame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
     115        mainFrame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
     116        view->installEventFilter(this);
     117    }
     118
     119    void removeFromWidget()
     120    {
     121        QWebView* view = static_cast<QWebView*>(widget());
     122        view->removeEventFilter(this);
     123        QWebFrame* mainFrame = view->page()->mainFrame();
     124        mainFrame->setScrollBarPolicy(Qt::Vertical, m_oldVerticalScrollBarPolicy);
     125        mainFrame->setScrollBarPolicy(Qt::Horizontal, m_oldHorizontalScrollBarPolicy);
     126    }
     127
     128    QRect positionRange() const
     129    {
     130        QRect r;
     131        QWebFrame* frame = currentFrame();
     132        r.setSize(frame->contentsSize() - frame->geometry().size());
     133        return r;
     134    }
     135
     136    QPoint position() const
     137    {
     138        QWebFrame* frame = currentFrame();
     139        return frame->scrollPosition();
     140    }
     141
     142    QSize viewportSize() const
     143    {
     144        return static_cast<QWebView*>(widget())->page()->viewportSize();
     145    }
     146
     147    void setPosition(const QPoint& point, const QPoint& /* overShootDelta */)
     148    {
     149        QWebFrame* frame = currentFrame();
     150        frame->setScrollPosition(point);
     151    }
     152
     153    QPointer<QWebFrame> m_frame;
     154    Qt::ScrollBarPolicy m_oldVerticalScrollBarPolicy;
     155    Qt::ScrollBarPolicy m_oldHorizontalScrollBarPolicy;
     156};
     157
     158#endif // Q_WS_MAEMO_5
     159
     160
    61161/*!
    62162    \class QWebView
     
    158258    setAttribute(Qt::WA_AcceptTouchEvents);
    159259#endif
    160 
     260#if defined(Q_WS_MAEMO_5)
     261    QAbstractKineticScroller* scroller = new QWebViewKineticScroller();
     262    scroller->setWidget(this);
     263    setProperty("kineticScroller", QVariant::fromValue(scroller));
     264#endif
    161265    setAcceptDrops(true);
    162266
  • trunk/WebKit/qt/ChangeLog

    r53999 r54034  
     12010-01-28  Andreas Kling  <andreas.kling@nokia.com>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] Support kinetic scrolling on Maemo 5
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=34267
     8
     9        Patch by Ralf Engels <ralf.engels@nokia.com> and
     10        Robert Griebl <rgriebl@trolltech.com>
     11
     12        * Api/qwebview.cpp:
     13        (QWebViewKineticScroller::QWebViewKineticScroller):
     14        (QWebViewKineticScroller::eventFilter):
     15        (QWebViewKineticScroller::currentFrame):
     16        (QWebViewKineticScroller::scrollingFrameAt):
     17        (QWebViewKineticScroller::attachToWidget):
     18        (QWebViewKineticScroller::removeFromWidget):
     19        (QWebViewKineticScroller::positionRange):
     20        (QWebViewKineticScroller::position):
     21        (QWebViewKineticScroller::viewportSize):
     22        (QWebViewKineticScroller::setPosition):
     23        (QWebView::QWebView):
     24
    1252010-01-28  Kenneth Rohde Christiansen  <kenneth@webkit.org>
    226
Note: See TracChangeset for help on using the changeset viewer.