[Qt][WK2] Fix scrolling in touch mode
[WebKit-https.git] / Source / WebKit2 / UIProcess / qt / QtViewportInteractionEngine.h
1 /*
2  * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
3  * Copyright (C) 2011 Benjamin Poulain <benjamin@webkit.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this program; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #ifndef QtViewportInteractionEngine_h
23 #define QtViewportInteractionEngine_h
24
25 #include <QtCore/QObject>
26 #include <QtCore/QRectF>
27 #include <QtCore/QVariant>
28 #include <QtCore/QVariantAnimation>
29 #include <wtf/OwnPtr.h>
30
31 QT_BEGIN_NAMESPACE
32 class QPointF;
33 class QQuickWebPage;
34 class QQuickWebView;
35 class QWheelEvent;
36 QT_END_NAMESPACE
37
38 class QWebKitTest;
39
40 namespace WebKit {
41
42 class ViewportUpdateDeferrer;
43
44 class QtViewportInteractionEngine : public QObject {
45     Q_OBJECT
46
47 public:
48     QtViewportInteractionEngine(QQuickWebView*, QQuickWebPage*);
49     ~QtViewportInteractionEngine();
50
51     void reset();
52
53     bool hadUserInteraction() const { return m_hadUserInteraction; }
54
55     void setCSSScaleBounds(qreal minimum, qreal maximum);
56     void setCSSScale(qreal);
57
58     qreal currentCSSScale();
59
60     bool ensureContentWithinViewportBoundary(bool immediate = false);
61
62     void setAllowsUserScaling(bool allow) { m_allowsUserScaling = allow; }
63     void setContentToDevicePixelRatio(qreal ratio) {m_devicePixelRatio = ratio; }
64
65     void setItemRectVisible(const QRectF&);
66     bool animateItemRectVisible(const QRectF&);
67
68     void pagePositionRequest(const QPoint& pos);
69     void touchBegin();
70     void touchEnd();
71
72     bool scrollAnimationActive() const;
73     void cancelScrollAnimation();
74
75     bool panGestureActive() const;
76
77     void panGestureStarted(const QPointF& position, qint64 eventTimestampMillis);
78     void panGestureRequestUpdate(const QPointF& position, qint64 eventTimestampMillis);
79     void panGestureEnded(const QPointF& position, qint64 eventTimestampMillis);
80
81     void panGestureCancelled();
82
83     bool scaleAnimationActive() const;
84     void interruptScaleAnimation();
85
86     bool pinchGestureActive() const;
87     void pinchGestureStarted(const QPointF& pinchCenterInViewportCoordinates);
88     void pinchGestureRequestUpdate(const QPointF& pinchCenterInViewportCoordinates, qreal totalScaleFactor);
89     void pinchGestureEnded();
90     void pinchGestureCancelled();
91
92     void zoomToAreaGestureEnded(const QPointF& touchPoint, const QRectF& targetArea);
93     void focusEditableArea(const QRectF& caretArea, const QRectF& targetArea);
94
95 Q_SIGNALS:
96     void contentSuspendRequested();
97     void contentResumeRequested();
98
99     void contentViewportChanged(const QPointF& trajectory = QPointF());
100
101     void viewportTrajectoryVectorChanged(const QPointF&);
102     void visibleContentRectAndScaleChanged();
103
104 private Q_SLOTS:
105     // Respond to changes of content that are not driven by us, like the page resizing itself.
106     void itemSizeChanged();
107
108     void flickableMovingPositionUpdate();
109
110     void scaleAnimationStateChanged(QAbstractAnimation::State, QAbstractAnimation::State);
111     void scaleAnimationValueChanged(QVariant value) { setItemRectVisible(value.toRectF()); }
112
113     void flickableMoveStarted(); // Called when panning starts.
114     void flickableMoveEnded(); //   Called when panning (+ kinetic animation) ends.
115
116 private:
117     friend class ViewportUpdateDeferrer;
118     friend class ::QWebKitTest;
119
120     QQuickWebView* const m_viewport;
121     QQuickWebPage* const m_content;
122
123     qreal cssScaleFromItem(qreal);
124     qreal itemScaleFromCSS(qreal);
125     qreal itemCoordFromCSS(qreal);
126     QRectF itemRectFromCSS(const QRectF&);
127
128     qreal innerBoundedCSSScale(qreal);
129     qreal outerBoundedCSSScale(qreal);
130
131     bool m_allowsUserScaling;
132     qreal m_minimumScale;
133     qreal m_maximumScale;
134     qreal m_devicePixelRatio;
135
136     QSize m_layoutSize;
137
138     QRectF computePosRangeForItemAtScale(qreal itemScale) const;
139
140     void scaleContent(const QPointF& centerInCSSCoordinates, qreal cssScale);
141
142     int m_suspendCount;
143     bool m_hasSuspendedContent;
144     OwnPtr<ViewportUpdateDeferrer> m_scaleUpdateDeferrer;
145     OwnPtr<ViewportUpdateDeferrer> m_scrollUpdateDeferrer;
146     OwnPtr<ViewportUpdateDeferrer> m_touchUpdateDeferrer;
147
148     bool m_hadUserInteraction;
149
150     class ScaleAnimation : public QVariantAnimation {
151     public:
152         ScaleAnimation(QObject* parent = 0)
153             : QVariantAnimation(parent)
154         { }
155
156         virtual void updateCurrentValue(const QVariant&) { }
157     };
158
159     struct ScaleStackItem {
160         ScaleStackItem(qreal scale, qreal xPosition)
161             : scale(scale)
162             , xPosition(xPosition)
163         { }
164
165         qreal scale;
166         qreal xPosition;
167     };
168
169     ScaleAnimation* m_scaleAnimation;
170     QPointF m_lastPinchCenterInViewportCoordinates;
171     QPointF m_lastScrollPosition;
172     qreal m_pinchStartScale;
173     qreal m_zoomOutScale;
174     QList<ScaleStackItem> m_scaleStack;
175 };
176
177 } // namespace WebKit
178
179 #endif // QtViewportInteractionEngine_h