Merge lp:~zsombi/ubuntu-ui-toolkit/popover-dismiss-fix into lp:ubuntu-ui-toolkit

Proposed by Zsombor Egri
Status: Merged
Approved by: Tim Peeters
Approved revision: 361
Merged at revision: 366
Proposed branch: lp:~zsombi/ubuntu-ui-toolkit/popover-dismiss-fix
Merge into: lp:ubuntu-ui-toolkit
Diff against target: 241 lines (+49/-81)
2 files modified
modules/Ubuntu/Components/plugin/inversemouseareatype.cpp (+49/-80)
modules/Ubuntu/Components/plugin/inversemouseareatype.h (+0/-1)
To merge this branch: bzr merge lp:~zsombi/ubuntu-ui-toolkit/popover-dismiss-fix
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Tim Peeters Approve
Review via email: mp+149108@code.launchpad.net

Commit message

Fix for Popovers dismiss incorrectly.

Description of the change

Fix for Popovers dismiss incorrectly.

To post a comment you must log in.
Revision history for this message
Tim Peeters (tpeeters) wrote :

Code looks good, works on desktop. Tested on tablet by zsombi and osomon.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'modules/Ubuntu/Components/plugin/inversemouseareatype.cpp'
2--- modules/Ubuntu/Components/plugin/inversemouseareatype.cpp 2013-02-14 09:48:11 +0000
3+++ modules/Ubuntu/Components/plugin/inversemouseareatype.cpp 2013-02-18 17:27:31 +0000
4@@ -288,17 +288,7 @@
5 */
6 void InverseMouseAreaType::saveEvent(const QMouseEvent &event)
7 {
8- QPointF pos = mapToSensingArea(event.windowPos());
9- *m_event = QMouseEvent(event.type(), pos, event.button(), event.buttons(), event.modifiers());
10-}
11-
12-/*!
13- \internal
14- Maps the mouse point to the sensing area.
15- */
16-QPointF InverseMouseAreaType::mapToSensingArea(const QPointF &point)
17-{
18- return (m_sensingArea) ? m_sensingArea->mapFromScene(point) : QPointF();
19+ *m_event = event;
20 }
21
22 /*!
23@@ -323,7 +313,8 @@
24 */
25 bool InverseMouseAreaType::mousePress(QMouseEvent *event)
26 {
27- m_pressed = contains(event->windowPos());
28+ // events' positions are all in screen coordinates as we filter App events straight.
29+ m_pressed = contains(mapFromScene(event->windowPos()));
30 if (m_pressed && !(event->button() & m_acceptedButtons))
31 m_pressed = false;
32 if (m_pressed) {
33@@ -331,9 +322,8 @@
34 Q_EMIT pressedChanged();
35 Q_EMIT pressedButtonsChanged();
36 asyncEmit(&InverseMouseAreaType::pressed);
37- if (!m_propagateEvents)
38- event->accept();
39- return !m_propagateEvents;
40+ event->setAccepted(!m_propagateEvents);
41+ return true;
42 }
43 return false;
44 }
45@@ -344,19 +334,12 @@
46 */
47 bool InverseMouseAreaType::touchPressed(QTouchEvent *event)
48 {
49- QList<QTouchEvent::TouchPoint> points = event->touchPoints();
50- // check if any of the points fall into the area
51- Q_FOREACH(const QTouchEvent::TouchPoint &point, points) {
52- m_pressed = contains(point.scenePos());
53- if (m_pressed) {
54- saveEvent(QMouseEvent(QEvent::MouseButtonPress, point.scenePos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
55- Q_EMIT pressedChanged();
56- Q_EMIT pressedButtonsChanged();
57- asyncEmit(&InverseMouseAreaType::pressed);
58- if (!m_propagateEvents)
59- event->accept();
60- return !m_propagateEvents;
61- }
62+ // check only the first touch point
63+ QTouchEvent::TouchPoint point = event->touchPoints()[0];
64+ QMouseEvent mev(QEvent::MouseButtonPress, point.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
65+ if (mousePress(&mev)) {
66+ event->setAccepted(mev.isAccepted());
67+ return true;
68 }
69 return false;
70 }
71@@ -368,8 +351,8 @@
72 */
73 bool InverseMouseAreaType::mouseRelease(QMouseEvent *event)
74 {
75- bool consume = !m_propagateEvents;
76- if (m_pressed && contains(event->windowPos())) {
77+ bool consume = true;
78+ if (m_pressed && contains(mapFromScene(event->windowPos()))) {
79 // released outside (inside the sensing area)
80 saveEvent(*event);
81 m_pressed = false;
82@@ -383,8 +366,7 @@
83 reset();
84 consume = false;
85 }
86- if (consume)
87- event->accept();
88+ event->setAccepted(!m_propagateEvents && consume);
89 return consume;
90 }
91
92@@ -394,28 +376,14 @@
93 */
94 bool InverseMouseAreaType::touchReleased(QTouchEvent *event)
95 {
96- bool consume = !m_propagateEvents;
97- QList<QTouchEvent::TouchPoint> points = event->touchPoints();
98- // check if any of the points fall into the area
99- Q_FOREACH(const QTouchEvent::TouchPoint &point, points) {
100- if (m_pressed && contains(point.scenePos())) {
101- saveEvent(QMouseEvent(QEvent::MouseButtonRelease, point.scenePos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
102- m_pressed = false;
103- asyncEmit(&InverseMouseAreaType::released, !m_moved);
104- Q_EMIT pressedChanged();
105- if (!m_moved)
106- asyncEmit(&InverseMouseAreaType::clicked, true);
107- m_moved = false;
108- break;
109- } else {
110- // the release happened inside the area, which is outside of the active area
111- reset();
112- consume = false;
113- }
114+ // check only the first touch point
115+ QTouchEvent::TouchPoint point = event->touchPoints()[0];
116+ QMouseEvent mev(QEvent::MouseButtonRelease, point.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
117+ if (mouseRelease(&mev)) {
118+ event->setAccepted(mev.isAccepted());
119+ return true;
120 }
121- if (consume)
122- event->accept();
123- return consume;
124+ return false;
125 }
126
127 /*!
128@@ -426,12 +394,10 @@
129 */
130 bool InverseMouseAreaType::mouseMove(QMouseEvent *event)
131 {
132- QPointF mappedPos = mapToSensingArea(event->windowPos());
133 // use localPos as we saved the mapped position as
134- if (m_pressed && (mappedPos != m_event->localPos())) {
135+ if (m_pressed && (event->windowPos() != m_event->localPos())) {
136 m_moved = true;
137- if (!m_propagateEvents)
138- event->accept();
139+ event->setAccepted(!m_propagateEvents);
140 }
141 return false;
142 }
143@@ -443,31 +409,26 @@
144 bool InverseMouseAreaType::touchMoved(QTouchEvent *event)
145 {
146 if (m_pressed) {
147- QList<QTouchEvent::TouchPoint> points = event->touchPoints();
148- // check if any of the points fall into the area
149- Q_FOREACH(const QTouchEvent::TouchPoint &point, points) {
150- QPointF mappedPos = mapToSensingArea(point.scenePos());
151- // use localPos as we saved the mapped position as
152- if (mappedPos != m_event->localPos()) {
153- m_moved = true;
154- if (!m_propagateEvents)
155- event->accept();
156- break;
157- }
158- }
159+ // check only the first touch point
160+ QTouchEvent::TouchPoint point = event->touchPoints()[0];
161+ // use localPos as we saved the mapped position as
162+ QMouseEvent mev(QEvent::MouseMove, point.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
163+ mouseMove(&mev);
164+ event->setAccepted(mev.isAccepted());
165 }
166 return false;
167 }
168
169 /*
170- * Overrides QQuickItem's contains method.
171+ * Overrides QQuickItem's contains method. Point is in local coordinates.
172 */
173 bool InverseMouseAreaType::contains(const QPointF &point) const
174 {
175+ QPointF scenePos = mapToScene(point);
176 QRectF oskRect = QGuiApplication::inputMethod()->keyboardRectangle();
177- bool pointInArea = QQuickItem::contains(mapFromScene(point));
178- bool pointInOSK = oskRect.contains(QuickUtils::instance().rootObject()->mapFromScene(point));
179- bool pointOutArea = (m_sensingArea && m_sensingArea->contains(m_sensingArea->mapFromScene(point)));
180+ bool pointInArea = QQuickItem::contains(point);
181+ bool pointInOSK = oskRect.contains(scenePos);
182+ bool pointOutArea = (m_sensingArea && m_sensingArea->contains(m_sensingArea->mapFromScene(scenePos)));
183 return !pointInArea && !pointInOSK && pointOutArea;
184 }
185
186@@ -481,28 +442,36 @@
187
188 if (!isEnabled() || !isVisible())
189 return false;
190+
191+ bool handled = false;
192 switch (ev->type()) {
193 case QEvent::MouseButtonPress: {
194- return mousePress(static_cast<QMouseEvent*>(ev));
195+ handled = mousePress(static_cast<QMouseEvent*>(ev));
196+ break;
197 }
198 case QEvent::MouseButtonRelease: {
199- return mouseRelease(static_cast<QMouseEvent*>(ev));
200+ handled = mouseRelease(static_cast<QMouseEvent*>(ev));
201+ break;
202 }
203 case QEvent::MouseMove: {
204- return mouseMove(static_cast<QMouseEvent*>(ev));
205+ handled = mouseMove(static_cast<QMouseEvent*>(ev));
206+ break;
207 }
208 case QEvent::TouchBegin: {
209- return touchPressed(static_cast<QTouchEvent*>(ev));
210+ handled = touchPressed(static_cast<QTouchEvent*>(ev));
211+ break;
212 }
213 case QEvent::TouchUpdate: {
214- return touchMoved(static_cast<QTouchEvent*>(ev));
215+ handled = touchMoved(static_cast<QTouchEvent*>(ev));
216+ break;
217 }
218 case QEvent::TouchEnd: {
219- return touchReleased(static_cast<QTouchEvent*>(ev));
220+ handled = touchReleased(static_cast<QTouchEvent*>(ev));
221+ break;
222 }
223 default:
224 break;
225 }
226
227- return false;
228+ return (handled) ? !m_propagateEvents : false;
229 }
230
231=== modified file 'modules/Ubuntu/Components/plugin/inversemouseareatype.h'
232--- modules/Ubuntu/Components/plugin/inversemouseareatype.h 2013-02-14 09:48:11 +0000
233+++ modules/Ubuntu/Components/plugin/inversemouseareatype.h 2013-02-18 17:27:31 +0000
234@@ -52,7 +52,6 @@
235 private:
236 void reset();
237 void saveEvent(const QMouseEvent &event);
238- QPointF mapToSensingArea(const QPointF &point);
239 void asyncEmit(SignalType signal, bool isClick = false, bool wasHeld = false);
240 bool mousePress(QMouseEvent *event);
241 bool mouseRelease(QMouseEvent *event);

Subscribers

People subscribed via source and target branches

to status/vote changes: