[Qt][WK2] Move non-api classes to WebKit namespace at WebKit2/UiProcess/qt
[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 namespace WebKit {
39
40 class ViewportUpdateDeferrer;
41
42 class QtViewportInteractionEngine : public QObject {
43     Q_OBJECT
44
45 public:
46     QtViewportInteractionEngine(QQuickWebView*, QQuickWebPage*);
47     ~QtViewportInteractionEngine();
48
49     void reset();
50
51     bool hadUserInteraction() const { return m_hadUserInteraction; }
52
53     void setCSSScaleBounds(qreal minimum, qreal maximum);
54     void setCSSScale(qreal);
55
56     qreal currentCSSScale();
57
58     bool ensureContentWithinViewportBoundary(bool immediate = false);
59
60     void setAllowsUserScaling(bool allow) { m_allowsUserScaling = allow; }
61     void setContentToDevicePixelRatio(qreal ratio) {m_devicePixelRatio = ratio; }
62
63     void setItemRectVisible(const QRectF&);
64     bool animateItemRectVisible(const QRectF&);
65
66     void wheelEvent(QWheelEvent*);
67     void pagePositionRequest(const QPoint& pos);
68     void touchBegin();
69     void touchEnd();
70
71     bool scrollAnimationActive() const;
72     void cancelScrollAnimation();
73
74     bool panGestureActive() const;
75
76     void panGestureStarted(const QPointF& position, qint64 eventTimestampMillis);
77     void panGestureRequestUpdate(const QPointF& position, qint64 eventTimestampMillis);
78     void panGestureEnded(const QPointF& position, qint64 eventTimestampMillis);
79
80     void panGestureCancelled();
81
82     bool scaleAnimationActive() const;
83     void interruptScaleAnimation();
84
85     bool pinchGestureActive() const;
86     void pinchGestureStarted(const QPointF& pinchCenterInViewportCoordinates);
87     void pinchGestureRequestUpdate(const QPointF& pinchCenterInViewportCoordinates, qreal totalScaleFactor);
88     void pinchGestureEnded();
89     void pinchGestureCancelled();
90
91     void zoomToAreaGestureEnded(const QPointF& touchPoint, const QRectF& targetArea);
92     void focusEditableArea(const QRectF& caretArea, const QRectF& targetArea);
93
94 Q_SIGNALS:
95     void contentSuspendRequested();
96     void contentResumeRequested();
97
98     void contentViewportChanged(const QPointF& trajectory = QPointF());
99
100     void viewportTrajectoryVectorChanged(const QPointF&);
101     void visibleContentRectAndScaleChanged();
102
103 private Q_SLOTS:
104     // Respond to changes of content that are not driven by us, like the page resizing itself.
105     void itemSizeChanged();
106
107     void flickableMovingPositionUpdate();
108
109     void scaleAnimationStateChanged(QAbstractAnimation::State, QAbstractAnimation::State);
110     void scaleAnimationValueChanged(QVariant value) { setItemRectVisible(value.toRectF()); }
111
112     void flickableMoveStarted(); // Called when panning starts.
113     void flickableMoveEnded(); //   Called when panning (+ kinetic animation) ends.
114
115 private:
116     friend class ViewportUpdateDeferrer;
117     friend class QWebViewportInfo;
118
119     QQuickWebView* const m_viewport;
120     QQuickWebPage* const m_content;
121
122     qreal cssScaleFromItem(qreal);
123     qreal itemScaleFromCSS(qreal);
124     qreal itemCoordFromCSS(qreal);
125     QRectF itemRectFromCSS(const QRectF&);
126
127     qreal innerBoundedCSSScale(qreal);
128     qreal outerBoundedCSSScale(qreal);
129
130     bool m_allowsUserScaling;
131     qreal m_minimumScale;
132     qreal m_maximumScale;
133     qreal m_devicePixelRatio;
134
135     QSize m_layoutSize;
136
137     QRectF computePosRangeForItemAtScale(qreal itemScale) const;
138
139     void scaleContent(const QPointF& centerInCSSCoordinates, qreal cssScale);
140
141     int m_suspendCount;
142     bool m_hasSuspendedContent;
143     OwnPtr<ViewportUpdateDeferrer> m_scaleUpdateDeferrer;
144     OwnPtr<ViewportUpdateDeferrer> m_scrollUpdateDeferrer;
145     OwnPtr<ViewportUpdateDeferrer> m_touchUpdateDeferrer;
146
147     bool m_hadUserInteraction;
148
149     class ScaleAnimation : public QVariantAnimation {
150     public:
151         ScaleAnimation(QObject* parent = 0)
152             : QVariantAnimation(parent)
153         { }
154
155         virtual void updateCurrentValue(const QVariant&) { }
156     };
157
158     ScaleAnimation* m_scaleAnimation;
159     QPointF m_lastPinchCenterInViewportCoordinates;
160     QPointF m_lastScrollPosition;
161     qreal m_pinchStartScale;
162     qreal m_zoomOutScale;
163     QList<qreal> m_scaleStack;
164 };
165
166 } // namespace WebKit
167
168 #endif // QtViewportInteractionEngine_h