19b27ae9ec5c1de1d8354bec68eeb298aff3d277
[WebKit-https.git] / Source / WebKit2 / UIProcess / qt / PageViewportControllerClientQt.h
1 /*
2  * Copyright (C) 2011, 2012 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 PageViewportControllerClientQt_h
23 #define PageViewportControllerClientQt_h
24
25 #include "PageViewportController.h"
26 #include "PageViewportControllerClient.h"
27 #include <QObject>
28 #include <QPointF>
29 #include <QScopedPointer>
30 #include <QVariant>
31 #include <QVariantAnimation>
32
33 QT_BEGIN_NAMESPACE
34 class QRectF;
35 QT_END_NAMESPACE
36
37 class QQuickWebPage;
38 class QQuickWebView;
39 class QWebKitTest;
40
41 namespace WebKit {
42
43 class PageViewportControllerClientQt : public QObject, public PageViewportControllerClient {
44     Q_OBJECT
45
46 public:
47     PageViewportControllerClientQt(QQuickWebView*, QQuickWebPage*);
48     ~PageViewportControllerClientQt();
49
50     virtual void setContentsPosition(const WebCore::FloatPoint& localPoint);
51     virtual void setContentsScale(float localScale, bool treatAsInitialValue);
52
53     virtual void didResumeContent();
54     virtual void didChangeContentsSize();
55     virtual void didChangeVisibleContents();
56     virtual void didChangeViewportAttributes();
57
58     virtual void setController(PageViewportController* controller) { m_controller = controller; }
59
60     // Additional methods currently only relevant in the QQuick context.
61     void touchBegin();
62     void touchEnd();
63
64     bool scrollAnimationActive() const;
65     void cancelScrollAnimation();
66
67     bool panGestureActive() const;
68     void panGestureStarted(const QPointF& position, qint64 eventTimestampMillis);
69     void panGestureRequestUpdate(const QPointF& position, qint64 eventTimestampMillis);
70     void panGestureEnded(const QPointF& position, qint64 eventTimestampMillis);
71     void panGestureCancelled();
72
73     bool scaleAnimationActive() const;
74     void interruptScaleAnimation();
75
76     bool pinchGestureActive() const;
77     void pinchGestureStarted(const QPointF& pinchCenterInViewportCoordinates);
78     void pinchGestureRequestUpdate(const QPointF& pinchCenterInViewportCoordinates, qreal totalScaleFactor);
79     void pinchGestureEnded();
80     void pinchGestureCancelled();
81
82     void zoomToAreaGestureEnded(const QPointF& touchPoint, const QRectF& targetArea);
83     void focusEditableArea(const QRectF& caretArea, const QRectF& targetArea);
84
85 private Q_SLOTS:
86     // Respond to changes of position that are not driven by us.
87     void pageItemPositionChanged();
88
89     void scaleAnimationStateChanged(QAbstractAnimation::State, QAbstractAnimation::State);
90
91     void flickMoveStarted(); // Called when panning starts.
92     void flickMoveEnded(); //   Called when panning (+ kinetic animation) ends.
93
94 private:
95     class ScaleAnimation : public QVariantAnimation {
96         PageViewportControllerClientQt* m_controllerClient;
97     public:
98         ScaleAnimation(PageViewportControllerClientQt* parent)
99             : QVariantAnimation(parent)
100             , m_controllerClient(parent)
101         { }
102
103         virtual void updateCurrentValue(const QVariant&);
104     };
105
106     struct ScaleStackItem {
107         ScaleStackItem(qreal scale, qreal xPosition)
108             : scale(scale)
109             , xPosition(xPosition)
110         { }
111
112         qreal scale;
113         qreal xPosition;
114     };
115
116     friend class ScaleAnimation;
117     friend class ::QWebKitTest;
118
119     PageViewportController* m_controller;
120     QQuickWebView* const m_viewportItem;
121     QQuickWebPage* const m_pageItem;
122
123     float viewportScaleForRect(const QRectF&) const;
124     QRectF visibleContentsRect() const;
125     QRectF nearestValidVisibleContentsRect() const;
126
127     void setContentsRectToNearestValidBounds();
128     void updateViewportController(const QPointF& trajectory = QPointF(), qreal scale = -1);
129     void setContentRectVisiblePositionAtScale(const QPointF& location, qreal itemScale);
130     void animateContentRectVisible(const QRectF& contentRect);
131     void scaleContent(qreal itemScale, const QPointF& centerInCSSCoordinates = QPointF());
132
133     QScopedPointer<ViewportUpdateDeferrer> m_scaleUpdateDeferrer;
134     QScopedPointer<ViewportUpdateDeferrer> m_scrollUpdateDeferrer;
135     QScopedPointer<ViewportUpdateDeferrer> m_touchUpdateDeferrer;
136     QScopedPointer<ViewportUpdateDeferrer> m_animationUpdateDeferrer;
137
138     ScaleAnimation* m_scaleAnimation;
139     QPointF m_lastPinchCenterInViewportCoordinates;
140     QPointF m_lastScrollPosition;
141     qreal m_pinchStartScale;
142     qreal m_lastCommittedScale;
143     qreal m_zoomOutScale;
144     QList<ScaleStackItem> m_scaleStack;
145     bool m_ignoreViewportChanges;
146 };
147
148 } // namespace WebKit
149
150 #endif // PageViewportControllerClientQt_h