rhodes 5.5.0.3 → 5.5.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/lib/commonAPI/coreapi/ext/platform/android/src/com/rho/notification/NotificationSingleton.java +20 -8
  4. data/lib/commonAPI/coreapi/ext/platform/iphone/cpp_based_impl/SystemImpl.mm +1 -2
  5. data/lib/commonAPI/coreapi/ext/system.xml +1 -1
  6. data/platform/android/build/android.rake +1 -0
  7. data/platform/iphone/Classes/AppManager/AppManager.m +44 -3
  8. data/platform/iphone/Classes/NativeView/RhoNativeViewManager.mm +4 -3
  9. data/platform/iphone/Classes/NativeView/RhoNativeViewManagerOC.h +1 -1
  10. data/platform/iphone/Classes/RhoMainView.h +8 -2
  11. data/platform/iphone/Classes/RhoUIWebView.h +75 -0
  12. data/platform/iphone/Classes/RhoUIWebView.m +142 -0
  13. data/platform/iphone/Classes/RhoWKWebView.h +87 -0
  14. data/platform/iphone/Classes/RhoWKWebView.m +187 -0
  15. data/platform/iphone/Classes/RhoWebView.h +72 -0
  16. data/platform/iphone/Classes/RhoWebViewFabrique.h +35 -0
  17. data/platform/iphone/Classes/RhoWebViewFabrique.m +87 -0
  18. data/platform/iphone/Classes/Rhodes.m +17 -6
  19. data/platform/iphone/Classes/Signature.old/SignatureDelegate.m +11 -4
  20. data/platform/iphone/Classes/Signature/SignatureDelegate.m +3 -4
  21. data/platform/iphone/Classes/SimpleMainView.h +7 -5
  22. data/platform/iphone/Classes/SimpleMainView.m +174 -179
  23. data/platform/iphone/Classes/SplitView/RightViewController.h +2 -2
  24. data/platform/iphone/Classes/SplitView/RightViewController.m +9 -10
  25. data/platform/iphone/Classes/SplitView/SplittedMainView.h +2 -3
  26. data/platform/iphone/Classes/SplitView/SplittedMainView.m +10 -7
  27. data/platform/iphone/Classes/TabbedMainView.h +2 -1
  28. data/platform/iphone/Classes/TabbedMainView.m +13 -10
  29. data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.m +21 -5
  30. data/platform/iphone/Classes/WebView.m +1 -1
  31. data/platform/iphone/RhoAppBaseLib/RhoAppBaseLib.xcodeproj/project.pbxproj +40 -3
  32. data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +4 -0
  33. data/platform/iphone/rbuild/iphone.rake +51 -0
  34. data/platform/shared/common/RhoNativeViewManager.h +9 -9
  35. data/platform/shared/common/RhodesApp.cpp +13 -1
  36. data/platform/shared/net/HttpServer.cpp +12 -2
  37. data/platform/shared/qt/rhodes/ExternalWebView.ui +11 -2
  38. data/platform/shared/qt/rhodes/QtMainWindow.cpp +9 -7
  39. data/platform/shared/qt/rhodes/QtMainWindow.ui +13 -4
  40. data/platform/shared/qt/rhodes/qkineticscroller.cpp +1245 -0
  41. data/platform/shared/qt/rhodes/qkineticscroller.h +165 -0
  42. data/platform/shared/qt/rhodes/qkineticscroller_p.h +168 -0
  43. data/platform/shared/qt/rhodes/qtflickgesture.cpp +696 -0
  44. data/platform/shared/qt/rhodes/qtflickgesture_p.h +107 -0
  45. data/platform/shared/qt/rhodes/qtscroller.cpp +2080 -0
  46. data/platform/shared/qt/rhodes/qtscroller.h +138 -0
  47. data/platform/shared/qt/rhodes/qtscroller_p.h +205 -0
  48. data/platform/shared/qt/rhodes/qtscrollerfilter.cpp +350 -0
  49. data/platform/shared/qt/rhodes/qtscrollerfilter_p.h +110 -0
  50. data/platform/shared/qt/rhodes/qtscrollerproperties.cpp +412 -0
  51. data/platform/shared/qt/rhodes/qtscrollerproperties.h +135 -0
  52. data/platform/shared/qt/rhodes/qtscrollerproperties_p.h +90 -0
  53. data/platform/shared/qt/rhodes/qtscrollevent.cpp +190 -0
  54. data/platform/shared/qt/rhodes/qtscrollevent.h +100 -0
  55. data/platform/shared/qt/rhodes/qtscrollevent_p.h +33 -0
  56. data/platform/shared/qt/rhodes/qwebviewkineticscroller.cpp +347 -0
  57. data/platform/shared/qt/rhodes/qwebviewkineticscroller.h +90 -0
  58. data/platform/shared/qt/rhodes/qwebviewselectionsuppressor.h +113 -0
  59. data/platform/shared/qt/rhodes/rhodes.pro +19 -0
  60. data/res/generators/rhogen.rb +307 -15
  61. data/res/generators/templates/application/app/Settings/err_sync.erb +12 -6
  62. data/res/generators/templates/application/app/Settings/home.erb +32 -17
  63. data/res/generators/templates/application/app/Settings/index.erb +55 -26
  64. data/res/generators/templates/application/app/Settings/javascript_index.html +111 -0
  65. data/res/generators/templates/application/app/Settings/javascript_login.html +65 -0
  66. data/res/generators/templates/application/app/Settings/login.erb +25 -19
  67. data/res/generators/templates/application/app/Settings/reset.erb +18 -9
  68. data/res/generators/templates/application/app/Settings/wait.erb +10 -7
  69. data/res/generators/templates/application/app/index.erb +32 -20
  70. data/res/generators/templates/application/app/javascript_index.html +66 -0
  71. data/res/generators/templates/application/app/javascript_index.js +250 -0
  72. data/res/generators/templates/application/app/layout.erb +12 -67
  73. data/res/generators/templates/application/javascript_build.yml +41 -0
  74. data/res/generators/templates/application/javascript_rhoconfig.txt +123 -0
  75. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap-theme.css +587 -0
  76. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap-theme.css.map +1 -0
  77. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap-theme.min.css +6 -0
  78. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap-theme.min.css.map +1 -0
  79. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap.css +6757 -0
  80. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap.css.map +1 -0
  81. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap.min.css +6 -0
  82. data/res/generators/templates/application/public/bootstrap-3.3.7/css/bootstrap.min.css.map +1 -0
  83. data/res/generators/templates/application/public/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
  84. data/res/generators/templates/application/public/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg +288 -0
  85. data/res/generators/templates/application/public/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
  86. data/res/generators/templates/application/public/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
  87. data/res/generators/templates/application/public/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
  88. data/res/generators/templates/application/public/bootstrap-3.3.7/js/bootstrap.js +2377 -0
  89. data/res/generators/templates/application/public/bootstrap-3.3.7/js/bootstrap.min.js +7 -0
  90. data/res/generators/templates/application/public/bootstrap-3.3.7/js/npm.js +13 -0
  91. data/res/generators/templates/application/public/css/style.css +3 -0
  92. data/res/generators/templates/application/public/jquery/jquery-3.1.1.min.js +4 -0
  93. data/res/generators/templates/application/public/jquery/jquery-3.1.1.min.map +1 -0
  94. data/res/generators/templates/application/rhoconfig.txt +16 -0
  95. data/res/generators/templates/iphone_project/Bremen7.xcodeproj/project.pbxproj +4 -0
  96. data/res/generators/templates/model/edit.erb +22 -21
  97. data/res/generators/templates/model/index.erb +24 -22
  98. data/res/generators/templates/model/javascript_edit.html +65 -0
  99. data/res/generators/templates/model/javascript_index.html +56 -0
  100. data/res/generators/templates/model/javascript_index.js +83 -0
  101. data/res/generators/templates/model/javascript_model.js +16 -0
  102. data/res/generators/templates/model/javascript_new.html +64 -0
  103. data/res/generators/templates/model/javascript_show.html +66 -0
  104. data/res/generators/templates/model/new.erb +22 -19
  105. data/res/generators/templates/model/show.erb +22 -14
  106. data/res/prebuild_base_app/app/index.erb +31 -18
  107. data/res/prebuild_base_app/app/layout.erb +11 -56
  108. data/version +1 -1
  109. metadata +59 -24
  110. data/res/generators/templates/application/public/css/android.css +0 -418
  111. data/res/generators/templates/application/public/css/iphone.css +0 -378
  112. data/res/generators/templates/application/public/css/jqmobile-patch.css +0 -62
  113. data/res/generators/templates/application/public/css/re_webkit.css +0 -736
  114. data/res/generators/templates/application/public/css/re_webkit_flat.css +0 -753
  115. data/res/generators/templates/application/public/css/windows_mobile.css +0 -327
  116. data/res/generators/templates/application/public/jqmobile/images/ajax-loader.gif +0 -0
  117. data/res/generators/templates/application/public/jqmobile/images/icon-search-black.png +0 -0
  118. data/res/generators/templates/application/public/jqmobile/images/icons-18-black.png +0 -0
  119. data/res/generators/templates/application/public/jqmobile/images/icons-18-white.png +0 -0
  120. data/res/generators/templates/application/public/jqmobile/images/icons-36-black.png +0 -0
  121. data/res/generators/templates/application/public/jqmobile/images/icons-36-white.png +0 -0
  122. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.4.5.min.css +0 -3
  123. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.4.5.min.js +0 -10
  124. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.4.5.min.map +0 -1
  125. data/res/generators/templates/application/public/jqmobile/jquery.mobile.structure-1.4.5.min.css +0 -3
  126. data/res/generators/templates/application/public/jqmobile/jquery.mobile.theme-1.4.5.min.css +0 -3
  127. data/res/generators/templates/application/public/jquery/jquery-1.9.1.min.js +0 -5
  128. data/res/generators/templates/application/public/jquery/jquery-1.9.1.min.map +0 -1
  129. data/res/generators/templates/application/public/js/application.js +0 -1
  130. data/res/generators/templates/application/public/js/jqmobile-patch.js +0 -466
  131. data/res/generators/templates/application/public/js/syncengine.js +0 -504
@@ -0,0 +1,138 @@
1
+ /****************************************************************************
2
+ **
3
+ ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ** All rights reserved.
5
+ ** Contact: Nokia Corporation (qt-info@nokia.com)
6
+ **
7
+ ** This file is part of the QtGui module of the Qt Toolkit.
8
+ **
9
+ ** $QT_BEGIN_LICENSE:LGPL$
10
+ ** No Commercial Usage
11
+ ** This file contains pre-release code and may not be distributed.
12
+ ** You may use this file in accordance with the terms and conditions
13
+ ** contained in the Technology Preview License Agreement accompanying
14
+ ** this package.
15
+ **
16
+ ** GNU Lesser General Public License Usage
17
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
18
+ ** General Public License version 2.1 as published by the Free Software
19
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
20
+ ** packaging of this file. Please review the following information to
21
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
22
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23
+ **
24
+ ** In addition, as a special exception, Nokia gives you certain additional
25
+ ** rights. These rights are described in the Nokia Qt LGPL Exception
26
+ ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27
+ **
28
+ ** If you have questions regarding the use of this file, please contact
29
+ ** Nokia at qt-info@nokia.com.
30
+ **
31
+ **
32
+ **
33
+ **
34
+ **
35
+ **
36
+ **
37
+ **
38
+ ** $QT_END_LICENSE$
39
+ **
40
+ ****************************************************************************/
41
+
42
+ #ifndef QTSCROLLER_H
43
+ #define QTSCROLLER_H
44
+
45
+ #include <QtCore/QObject>
46
+ #include <QtCore/QPointF>
47
+ #include "qtscrollerproperties.h"
48
+
49
+ class QWidget;
50
+ class QtScrollerPrivate;
51
+ class QtScrollerProperties;
52
+ class QtFlickGestureRecognizer;
53
+
54
+ class QtScroller : public QObject
55
+ {
56
+ Q_OBJECT
57
+ Q_PROPERTY(State state READ state NOTIFY stateChanged)
58
+ Q_PROPERTY(QtScrollerProperties scrollerProperties READ scrollerProperties WRITE setScrollerProperties NOTIFY scrollerPropertiesChanged)
59
+ Q_ENUMS(State)
60
+
61
+ public:
62
+ enum State
63
+ {
64
+ Inactive,
65
+ Pressed,
66
+ Dragging,
67
+ Scrolling
68
+ };
69
+
70
+ enum ScrollerGestureType
71
+ {
72
+ TouchGesture,
73
+ LeftMouseButtonGesture,
74
+ RightMouseButtonGesture,
75
+ MiddleMouseButtonGesture
76
+ };
77
+
78
+ enum Input
79
+ {
80
+ InputPress = 1,
81
+ InputMove,
82
+ InputRelease
83
+ };
84
+
85
+ static bool hasScroller(QObject *target);
86
+
87
+ static QtScroller *scroller(QObject *target);
88
+ static const QtScroller *scroller(const QObject *target);
89
+
90
+ static Qt::GestureType grabGesture(QObject *target, ScrollerGestureType gestureType = TouchGesture);
91
+ static Qt::GestureType grabbedGesture(QObject *target);
92
+ static void ungrabGesture(QObject *target);
93
+
94
+ static QList<QtScroller *> activeScrollers();
95
+
96
+ QObject *target() const;
97
+
98
+ State state() const;
99
+
100
+ bool handleInput(Input input, const QPointF &position, qint64 timestamp = 0);
101
+
102
+ void stop();
103
+ QPointF velocity() const;
104
+ QPointF finalPosition() const;
105
+ QPointF pixelPerMeter() const;
106
+
107
+ QtScrollerProperties scrollerProperties() const;
108
+
109
+ void setSnapPositionsX( const QList<qreal> &positions );
110
+ void setSnapPositionsX( qreal first, qreal interval );
111
+ void setSnapPositionsY( const QList<qreal> &positions );
112
+ void setSnapPositionsY( qreal first, qreal interval );
113
+
114
+ public Q_SLOTS:
115
+ void setScrollerProperties(const QtScrollerProperties &prop);
116
+ void scrollTo(const QPointF &pos);
117
+ void scrollTo(const QPointF &pos, int scrollTime);
118
+ void ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin);
119
+ void ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime);
120
+ void resendPrepareEvent();
121
+
122
+ Q_SIGNALS:
123
+ void stateChanged(QtScroller::State newstate);
124
+ void scrollerPropertiesChanged(const QtScrollerProperties &);
125
+
126
+ private:
127
+ QtScrollerPrivate* d_ptr;
128
+
129
+ QtScroller(QObject *target);
130
+ virtual ~QtScroller();
131
+
132
+ Q_DISABLE_COPY(QtScroller)
133
+ Q_DECLARE_PRIVATE(QtScroller)
134
+
135
+ friend class QtFlickGestureRecognizer;
136
+ };
137
+
138
+ #endif // QTSCROLLER_H
@@ -0,0 +1,205 @@
1
+ /****************************************************************************
2
+ **
3
+ ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ** All rights reserved.
5
+ ** Contact: Nokia Corporation (qt-info@nokia.com)
6
+ **
7
+ ** This file is part of the QtGui module of the Qt Toolkit.
8
+ **
9
+ ** $QT_BEGIN_LICENSE:LGPL$
10
+ ** No Commercial Usage
11
+ ** This file contains pre-release code and may not be distributed.
12
+ ** You may use this file in accordance with the terms and conditions
13
+ ** contained in the Technology Preview License Agreement accompanying
14
+ ** this package.
15
+ **
16
+ ** GNU Lesser General Public License Usage
17
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
18
+ ** General Public License version 2.1 as published by the Free Software
19
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
20
+ ** packaging of this file. Please review the following information to
21
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
22
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23
+ **
24
+ ** In addition, as a special exception, Nokia gives you certain additional
25
+ ** rights. These rights are described in the Nokia Qt LGPL Exception
26
+ ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27
+ **
28
+ ** If you have questions regarding the use of this file, please contact
29
+ ** Nokia at qt-info@nokia.com.
30
+ **
31
+ **
32
+ **
33
+ **
34
+ **
35
+ **
36
+ **
37
+ **
38
+ ** $QT_END_LICENSE$
39
+ **
40
+ ****************************************************************************/
41
+
42
+ #ifndef QTSCROLLER_P_H
43
+ #define QTSCROLLER_P_H
44
+
45
+ //
46
+ // W A R N I N G
47
+ // -------------
48
+ //
49
+ // This file is not part of the Qt API. It exists purely as an
50
+ // implementation detail. This header file may change from version to
51
+ // version without notice, or even be removed.
52
+ //
53
+ // We mean it.
54
+ //
55
+
56
+ #include <QObject>
57
+ #include <QPointer>
58
+ #include <QQueue>
59
+ #include <QSet>
60
+ #include <QEasingCurve>
61
+ #if (QT_VERSION < QT_VERSION_CHECK(4, 7, 0))
62
+ # include <QTime>
63
+ typedef QTime QElapsedTimer;
64
+ #else
65
+ # include <QElapsedTimer>
66
+ #endif
67
+ #include <QSizeF>
68
+ #include <QPointF>
69
+ #include <QRectF>
70
+ #include "qtscroller.h"
71
+ #include "qtscrollerproperties.h"
72
+ #include "qtscrollerproperties_p.h"
73
+ #include <QAbstractAnimation>
74
+
75
+ class QtFlickGestureRecognizer;
76
+
77
+ class QScrollTimer;
78
+
79
+ class QtScrollerPrivate : public QObject
80
+ {
81
+ Q_OBJECT
82
+ Q_DECLARE_PUBLIC(QtScroller)
83
+
84
+ public:
85
+ QtScrollerPrivate(QtScroller *q, QObject *target);
86
+ void init();
87
+
88
+ void sendEvent(QObject *o, QEvent *e);
89
+
90
+ void setState(QtScroller::State s);
91
+
92
+ enum ScrollType {
93
+ ScrollTypeFlick = 0,
94
+ ScrollTypeScrollTo,
95
+ ScrollTypeOvershoot
96
+ };
97
+
98
+ struct ScrollSegment {
99
+ qint64 startTime;
100
+ qint64 deltaTime;
101
+ qreal startPos;
102
+ qreal deltaPos;
103
+ QEasingCurve curve;
104
+ qreal stopProgress; // whatever is..
105
+ qreal stopPos; // ..reached first
106
+ ScrollType type;
107
+ };
108
+
109
+ bool pressWhileInactive(const QPointF &position, qint64 timestamp);
110
+ bool moveWhilePressed(const QPointF &position, qint64 timestamp);
111
+ bool releaseWhilePressed(const QPointF &position, qint64 timestamp);
112
+ bool moveWhileDragging(const QPointF &position, qint64 timestamp);
113
+ bool releaseWhileDragging(const QPointF &position, qint64 timestamp);
114
+ bool pressWhileScrolling(const QPointF &position, qint64 timestamp);
115
+
116
+ void timerTick();
117
+ void timerEventWhileDragging();
118
+ void timerEventWhileScrolling();
119
+
120
+ bool prepareScrolling(const QPointF &position);
121
+ void handleDrag(const QPointF &position, qint64 timestamp);
122
+
123
+ QPointF realDpi(int screen);
124
+ QPointF dpi() const;
125
+ void setDpi(const QPointF &dpi);
126
+ void setDpiFromWidget(QWidget *widget);
127
+
128
+ void updateVelocity(const QPointF &deltaPixelRaw, qint64 deltaTime);
129
+ void pushSegment(ScrollType type, qreal deltaTime, qreal stopProgress, qreal startPos, qreal deltaPos, qreal stopPos, QEasingCurve::Type curve, Qt::Orientation orientation);
130
+ void recalcScrollingSegments(bool force = false);
131
+ qreal scrollingSegmentsEndPos(Qt::Orientation orientation) const;
132
+ bool scrollingSegmentsValid(Qt::Orientation orientation);
133
+ void createScrollToSegments(qreal v, qreal deltaTime, qreal endPos, Qt::Orientation orientation, ScrollType type);
134
+ void createScrollingSegments(qreal v, qreal startPos, qreal ppm, Qt::Orientation orientation);
135
+
136
+ void setContentPositionHelperDragging(const QPointF &deltaPos);
137
+ void setContentPositionHelperScrolling();
138
+
139
+ qreal nextSnapPos(qreal p, int dir, Qt::Orientation orientation);
140
+ static qreal nextSegmentPosition(QQueue<ScrollSegment> &segments, qint64 now, qreal oldPos);
141
+
142
+ inline int frameRateSkip() const { return properties.d.data()->frameRate; }
143
+
144
+ static const char *stateName(QtScroller::State state);
145
+ static const char *inputName(QtScroller::Input input);
146
+
147
+ public slots:
148
+ void targetDestroyed();
149
+
150
+ public:
151
+ // static
152
+ static QMap<QObject *, QtScroller *> allScrollers;
153
+ static QSet<QtScroller *> activeScrollers;
154
+
155
+ // non static
156
+ QObject *target;
157
+ QtScrollerProperties properties;
158
+ QtFlickGestureRecognizer *recognizer;
159
+ Qt::GestureType recognizerType;
160
+
161
+ // scroller state:
162
+
163
+ // QPointer<QObject> scrollTarget;
164
+ QSizeF viewportSize;
165
+ QRectF contentPosRange;
166
+ QPointF contentPosition;
167
+ QPointF overshootPosition; // the number of pixels we are overshooting (before overshootDragResistanceFactor)
168
+
169
+ // state
170
+
171
+ bool enabled;
172
+ QtScroller::State state;
173
+ bool firstScroll; // true if we haven't already send a scroll event
174
+
175
+ QPointF oldVelocity; // the release velocity of the last drag
176
+
177
+ QPointF pressPosition;
178
+ QPointF lastPosition;
179
+ qint64 pressTimestamp;
180
+ qint64 lastTimestamp;
181
+
182
+ QPointF dragDistance; // the distance we should move during the next drag timer event
183
+
184
+ QQueue<ScrollSegment> xSegments;
185
+ QQueue<ScrollSegment> ySegments;
186
+
187
+ // snap positions
188
+ QList<qreal> snapPositionsX;
189
+ qreal snapFirstX;
190
+ qreal snapIntervalX;
191
+ QList<qreal> snapPositionsY;
192
+ qreal snapFirstY;
193
+ qreal snapIntervalY;
194
+
195
+ QPointF pixelPerMeter;
196
+
197
+ QElapsedTimer monotonicTimer;
198
+
199
+ QPointF releaseVelocity; // the starting velocity of the scrolling state
200
+ QScrollTimer *scrollTimer;
201
+
202
+ QtScroller *q_ptr;
203
+ };
204
+
205
+ #endif // QTSCROLLER_P_H
@@ -0,0 +1,350 @@
1
+ #include <qtscrollerfilter_p.h>
2
+ #include <qtscrollevent.h>
3
+ #include <qtscroller.h>
4
+ #include <QAbstractItemView>
5
+ #include <QScrollBar>
6
+ #include <QGestureEvent>
7
+ #include <QGesture>
8
+ #include <QGraphicsView>
9
+ #include <QGraphicsItem>
10
+ #include <QCoreApplication>
11
+
12
+ #ifndef QTSCROLLER_NO_WEBKIT
13
+ # include <QWebFrame>
14
+ # include <QWebView>
15
+ #endif // QTSCROLLER_NO_WEBKIT
16
+
17
+ #ifdef Q_WS_WIN
18
+ # include <qlibrary.h>
19
+ # include <windows.h>
20
+ #endif
21
+
22
+ #ifdef Q_WS_MAEMO_5
23
+ # include <QAbstractKineticScroller>
24
+ #endif
25
+
26
+ #include <QtDebug>
27
+
28
+ bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event)
29
+ {
30
+ return QCoreApplication::sendSpontaneousEvent(receiver, event);
31
+ }
32
+
33
+
34
+ QtScrollerFilter *QtScrollerFilter::inst = 0;
35
+
36
+ QtScrollerFilter *QtScrollerFilter::instance()
37
+ {
38
+ if (!inst)
39
+ inst = new QtScrollerFilter();
40
+ return inst;
41
+ }
42
+
43
+ QtScrollerFilter::QtScrollerFilter()
44
+ : ignoreMove(false)
45
+ { }
46
+
47
+ void QtScrollerFilter::add(QObject *target)
48
+ {
49
+ target->installEventFilter(this);
50
+ connect(QtScroller::scroller(target), SIGNAL(stateChanged(QtScroller::State)),
51
+ this, SLOT(stateChanged(QtScroller::State)));
52
+ #ifdef Q_WS_MAEMO_5
53
+ // disable the kinetic scroller on scrollArea
54
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(target->parent()))
55
+ target = target->parent();
56
+ if (QAbstractKineticScroller *m5s = target->property("kineticScroller").value<QAbstractKineticScroller *>()) {
57
+ if (m5s)
58
+ m5s->setEnabled(false);
59
+ }
60
+ #endif
61
+ #ifndef QTSCROLLER_NO_WEBKIT
62
+ if (QWebView *web = qobject_cast<QWebView *>(target)) {
63
+ if (web->page() && web->page()->mainFrame()) {
64
+ web->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
65
+ web->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
66
+ }
67
+ }
68
+ #endif
69
+ }
70
+
71
+ void QtScrollerFilter::remove(QObject *target)
72
+ {
73
+ disconnect(QtScroller::scroller(target), SIGNAL(stateChanged(QtScroller::State)),
74
+ this, SLOT(stateChanged(QtScroller::State)));
75
+ target->removeEventFilter(this);
76
+ }
77
+
78
+ void QtScrollerFilter::stateChanged(QtScroller::State state)
79
+ {
80
+ if (QtScroller *scroller = qobject_cast<QtScroller *>(sender())) {
81
+ if (QObject *o = scroller->target()) {
82
+ if (o->isWidgetType()) {
83
+ QWidget *w = static_cast<QWidget *>(o);
84
+
85
+ if (w->parentWidget()) {
86
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(w->parentWidget())) {
87
+ if (area->viewport() == w) {
88
+ if (QAbstractItemView *view = qobject_cast<QAbstractItemView *>(area))
89
+ stateChanged_QAbstractItemView(view, state);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ bool QtScrollerFilter::eventFilter(QObject *o, QEvent *e)
99
+ {
100
+ bool result = false;
101
+
102
+ //qWarning() << o << e->type();
103
+
104
+ if (o->isWidgetType()) {
105
+ QWidget *w = static_cast<QWidget *>(o);
106
+
107
+ #ifndef QTSCROLLER_NO_WEBKIT
108
+ if (QWebView *web = qobject_cast<QWebView *>(w))
109
+ result |= eventFilter_QWebView(web, e);
110
+ #endif // QTSCROLLER_NO_WEBKIT
111
+
112
+ if (w->parentWidget()) {
113
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(w->parentWidget())) {
114
+ if (area->viewport() == w) {
115
+ if (QAbstractItemView *view = qobject_cast<QAbstractItemView *>(area))
116
+ result |= eventFilter_QAbstractItemView(view, e);
117
+
118
+ result |= eventFilter_QAbstractScrollArea(area, e);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ return result;
124
+ }
125
+
126
+ #ifndef QTSCROLLER_NO_WEBKIT
127
+
128
+ bool QtScrollerFilter::eventFilter_QWebView(QWebView *view, QEvent *event)
129
+ {
130
+ switch (event->type()) {
131
+ case QtScrollPrepareEvent::ScrollPrepare: {
132
+ QtScrollPrepareEvent *se = static_cast<QtScrollPrepareEvent *>(event);
133
+ scrollingFrames[view] = 0;
134
+
135
+ if (view->page()) {
136
+ if (QWebFrame *frame = scrollingFrameAt_QWebView(view, se->startPos().toPoint())) {
137
+ scrollingFrames[view] = frame;
138
+
139
+ // there's no way to do that from outside of QtWebKit
140
+ //// remember old selection so that we can restore it later
141
+ //oldWebSelection = d->frame->selection()->selection();
142
+
143
+ se->setViewportSize(frame->geometry().size());
144
+ QSize s = frame->contentsSize() - frame->geometry().size();
145
+ se->setContentPosRange(QRectF(0, 0, qMax(0, s.width()), qMax(0, s.height())));
146
+ se->setContentPos(QPointF(frame->scrollPosition()));
147
+ se->accept();
148
+ return true;
149
+ }
150
+ }
151
+ return false;
152
+ }
153
+ case QtScrollEvent::Scroll: {
154
+ if (QWebFrame *frame = scrollingFrames.value(view)) {
155
+ QtScrollEvent *se = static_cast<QtScrollEvent *>(event);
156
+ // no way to do that from outside of QtWebKit
157
+ //// restore the old selection
158
+ //if (se->scrollState() == QScrollEvent::ScrollStarted)
159
+ // frame->d->frame->selection()->setSelection(d->oldWebSelection, CharacterGranularity);
160
+
161
+ frame->setScrollPosition(se->contentPos().toPoint());
162
+
163
+ } else {
164
+ return false;
165
+ }
166
+ }
167
+ default:
168
+ return false;
169
+ }
170
+ }
171
+
172
+ QWebFrame *QtScrollerFilter::scrollingFrameAt_QWebView(QWebView *view, const QPoint &pos) const
173
+ {
174
+ if (!view->page())
175
+ return 0;
176
+
177
+ QWebFrame *mainFrame = view->page()->mainFrame();
178
+ QWebHitTestResult hitTest = mainFrame->hitTestContent(pos);
179
+ QWebFrame *hitFrame = hitTest.frame();
180
+
181
+ if (!hitFrame)
182
+ return 0;
183
+
184
+ QRect vsbrect = hitFrame->scrollBarGeometry(Qt::Vertical);
185
+ QRect hsbrect = hitFrame->scrollBarGeometry(Qt::Horizontal);
186
+
187
+ if (!vsbrect.isEmpty() && vsbrect.contains(hitTest.pos() - hitFrame->scrollPosition()))
188
+ return 0;
189
+ if (!hsbrect.isEmpty() && hsbrect.contains(hitTest.pos() - hitFrame->scrollPosition()))
190
+ return 0;
191
+
192
+ QSize range = hitFrame->contentsSize() - hitFrame->geometry().size();
193
+
194
+ while (hitFrame && range.width() <= 1 && range.height() <= 1)
195
+ hitFrame = hitFrame->parentFrame();
196
+ return hitFrame;
197
+ }
198
+
199
+ #endif // QTSCROLLER_NO_WEBKIT
200
+
201
+ bool QtScrollerFilter::eventFilter_QAbstractScrollArea(QAbstractScrollArea *area, QEvent *event)
202
+ {
203
+ switch (event->type()) {
204
+ case QtScrollPrepareEvent::ScrollPrepare:
205
+ {
206
+ QtScrollPrepareEvent *se = static_cast<QtScrollPrepareEvent *>(event);
207
+ if (canStartScrollingAt_QAbstractScrollArea(area, se->startPos().toPoint())) {
208
+ QScrollBar *hBar = area->horizontalScrollBar();
209
+ QScrollBar *vBar = area->verticalScrollBar();
210
+
211
+ se->setViewportSize(QSizeF(area->viewport()->size()));
212
+ se->setContentPosRange(QRectF(0, 0, hBar->maximum(), vBar->maximum()));
213
+ se->setContentPos(QPointF(hBar->value(), vBar->value()));
214
+ se->accept();
215
+ return true;
216
+ }
217
+ return false;
218
+ }
219
+ case QtScrollEvent::Scroll:
220
+ {
221
+ QtScrollEvent *se = static_cast<QtScrollEvent *>(event);
222
+
223
+ QScrollBar *hBar = area->horizontalScrollBar();
224
+ QScrollBar *vBar = area->verticalScrollBar();
225
+ hBar->setValue(se->contentPos().x());
226
+ vBar->setValue(se->contentPos().y());
227
+
228
+ QPoint os = overshoot.value(area);
229
+ #ifdef Q_WS_WIN
230
+ typedef BOOL (*PtrBeginPanningFeedback)(HWND);
231
+ typedef BOOL (*PtrUpdatePanningFeedback)(HWND, LONG, LONG, BOOL);
232
+ typedef BOOL (*PtrEndPanningFeedback)(HWND, BOOL);
233
+
234
+ static PtrBeginPanningFeedback ptrBeginPanningFeedback = 0;
235
+ static PtrUpdatePanningFeedback ptrUpdatePanningFeedback = 0;
236
+ static PtrEndPanningFeedback ptrEndPanningFeedback = 0;
237
+
238
+ if (!ptrBeginPanningFeedback)
239
+ ptrBeginPanningFeedback = (PtrBeginPanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "BeginPanningFeedback");
240
+ if (!ptrUpdatePanningFeedback)
241
+ ptrUpdatePanningFeedback = (PtrUpdatePanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "UpdatePanningFeedback");
242
+ if (!ptrEndPanningFeedback)
243
+ ptrEndPanningFeedback = (PtrEndPanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "EndPanningFeedback");
244
+
245
+ if (ptrBeginPanningFeedback && ptrUpdatePanningFeedback && ptrEndPanningFeedback) {
246
+ WId wid = area->window()->winId();
247
+
248
+ if (!se->overshootDistance().isNull() && os.isNull())
249
+ ptrBeginPanningFeedback(wid);
250
+ if (!se->overshootDistance().isNull())
251
+ ptrUpdatePanningFeedback(wid, -se->overshootDistance().x(), -se->overshootDistance().y(), false);
252
+ if (se->overshootDistance().isNull() && !os.isNull())
253
+ ptrEndPanningFeedback(wid, true);
254
+ } else
255
+ #endif
256
+ {
257
+ QPoint delta = os - se->overshootDistance().toPoint();
258
+ if (!delta.isNull()) {
259
+ ignoreMove = true;
260
+ area->viewport()->move(area->viewport()->pos() + delta);
261
+ ignoreMove = false;
262
+ }
263
+ }
264
+ overshoot[area] = se->overshootDistance().toPoint();
265
+ return true;
266
+ }
267
+ case QEvent::Move: {
268
+ if (!ignoreMove && !overshoot.value(area).isNull()) {
269
+ ignoreMove = true;
270
+ area->viewport()->move(area->viewport()->pos() - overshoot.value(area));
271
+ ignoreMove = false;
272
+ }
273
+ return false;
274
+ }
275
+ default:
276
+ return false;
277
+ }
278
+ }
279
+
280
+ struct HackedAbstractItemView : public QAbstractItemView
281
+ {
282
+ void hackedExecuteDelayedItemsLayout()
283
+ {
284
+ executeDelayedItemsLayout();
285
+ }
286
+ };
287
+
288
+ void QtScrollerFilter::stateChanged_QAbstractItemView(QAbstractItemView *view, QtScroller::State state)
289
+ {
290
+ switch (state) {
291
+ case QtScroller::Pressed:
292
+ if (view->selectionModel()) {
293
+ oldSelection = view->selectionModel()->selection();
294
+ oldCurrent = view->selectionModel()->currentIndex();
295
+ } else {
296
+ oldSelection = QItemSelection();
297
+ oldCurrent = QModelIndex();
298
+ }
299
+ break;
300
+
301
+ case QtScroller::Dragging:
302
+ // restore the old selection if we really start scrolling
303
+ if (view->selectionModel()) {
304
+ view->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect);
305
+ view->selectionModel()->setCurrentIndex(oldCurrent, QItemSelectionModel::NoUpdate);
306
+ }
307
+ // fall through
308
+
309
+ default:
310
+ oldSelection = QItemSelection();
311
+ oldCurrent = QModelIndex();
312
+ break;
313
+ }
314
+ }
315
+
316
+ bool QtScrollerFilter::eventFilter_QAbstractItemView(QAbstractItemView *view, QEvent *event)
317
+ {
318
+ switch (event->type()) {
319
+ case QtScrollPrepareEvent::ScrollPrepare:
320
+ static_cast<HackedAbstractItemView *>(view)->hackedExecuteDelayedItemsLayout();
321
+ break;
322
+
323
+ default:
324
+ break;
325
+ }
326
+
327
+ return false;
328
+ }
329
+
330
+ bool QtScrollerFilter::canStartScrollingAt_QAbstractScrollArea(QAbstractScrollArea *area, const QPoint &startPos) const
331
+ {
332
+ // don't start scrolling when a drag mode has been set.
333
+ // don't start scrolling on a movable item.
334
+ if (QGraphicsView *view = qobject_cast<QGraphicsView *>(area)) {
335
+ if (view->dragMode() != QGraphicsView::NoDrag)
336
+ return false;
337
+
338
+ QGraphicsItem *childItem = view->itemAt(startPos);
339
+
340
+ if (childItem && (childItem->flags() & QGraphicsItem::ItemIsMovable))
341
+ return false;
342
+ }
343
+
344
+ // don't start scrolling on a QAbstractSlider
345
+ if (qobject_cast<QAbstractSlider *>(area->viewport()->childAt(startPos))) {
346
+ return false;
347
+ }
348
+
349
+ return true;
350
+ }