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
=== modified file 'modules/Ubuntu/Components/plugin/inversemouseareatype.cpp'
--- modules/Ubuntu/Components/plugin/inversemouseareatype.cpp 2013-02-14 09:48:11 +0000
+++ modules/Ubuntu/Components/plugin/inversemouseareatype.cpp 2013-02-18 17:27:31 +0000
@@ -288,17 +288,7 @@
288 */288 */
289void InverseMouseAreaType::saveEvent(const QMouseEvent &event)289void InverseMouseAreaType::saveEvent(const QMouseEvent &event)
290{290{
291 QPointF pos = mapToSensingArea(event.windowPos());291 *m_event = event;
292 *m_event = QMouseEvent(event.type(), pos, event.button(), event.buttons(), event.modifiers());
293}
294
295/*!
296 \internal
297 Maps the mouse point to the sensing area.
298 */
299QPointF InverseMouseAreaType::mapToSensingArea(const QPointF &point)
300{
301 return (m_sensingArea) ? m_sensingArea->mapFromScene(point) : QPointF();
302}292}
303293
304/*!294/*!
@@ -323,7 +313,8 @@
323 */313 */
324bool InverseMouseAreaType::mousePress(QMouseEvent *event)314bool InverseMouseAreaType::mousePress(QMouseEvent *event)
325{315{
326 m_pressed = contains(event->windowPos());316 // events' positions are all in screen coordinates as we filter App events straight.
317 m_pressed = contains(mapFromScene(event->windowPos()));
327 if (m_pressed && !(event->button() & m_acceptedButtons))318 if (m_pressed && !(event->button() & m_acceptedButtons))
328 m_pressed = false;319 m_pressed = false;
329 if (m_pressed) {320 if (m_pressed) {
@@ -331,9 +322,8 @@
331 Q_EMIT pressedChanged();322 Q_EMIT pressedChanged();
332 Q_EMIT pressedButtonsChanged();323 Q_EMIT pressedButtonsChanged();
333 asyncEmit(&InverseMouseAreaType::pressed);324 asyncEmit(&InverseMouseAreaType::pressed);
334 if (!m_propagateEvents)325 event->setAccepted(!m_propagateEvents);
335 event->accept();326 return true;
336 return !m_propagateEvents;
337 }327 }
338 return false;328 return false;
339}329}
@@ -344,19 +334,12 @@
344 */334 */
345bool InverseMouseAreaType::touchPressed(QTouchEvent *event)335bool InverseMouseAreaType::touchPressed(QTouchEvent *event)
346{336{
347 QList<QTouchEvent::TouchPoint> points = event->touchPoints();337 // check only the first touch point
348 // check if any of the points fall into the area338 QTouchEvent::TouchPoint point = event->touchPoints()[0];
349 Q_FOREACH(const QTouchEvent::TouchPoint &point, points) {339 QMouseEvent mev(QEvent::MouseButtonPress, point.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
350 m_pressed = contains(point.scenePos());340 if (mousePress(&mev)) {
351 if (m_pressed) {341 event->setAccepted(mev.isAccepted());
352 saveEvent(QMouseEvent(QEvent::MouseButtonPress, point.scenePos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));342 return true;
353 Q_EMIT pressedChanged();
354 Q_EMIT pressedButtonsChanged();
355 asyncEmit(&InverseMouseAreaType::pressed);
356 if (!m_propagateEvents)
357 event->accept();
358 return !m_propagateEvents;
359 }
360 }343 }
361 return false;344 return false;
362}345}
@@ -368,8 +351,8 @@
368 */351 */
369bool InverseMouseAreaType::mouseRelease(QMouseEvent *event)352bool InverseMouseAreaType::mouseRelease(QMouseEvent *event)
370{353{
371 bool consume = !m_propagateEvents;354 bool consume = true;
372 if (m_pressed && contains(event->windowPos())) {355 if (m_pressed && contains(mapFromScene(event->windowPos()))) {
373 // released outside (inside the sensing area)356 // released outside (inside the sensing area)
374 saveEvent(*event);357 saveEvent(*event);
375 m_pressed = false;358 m_pressed = false;
@@ -383,8 +366,7 @@
383 reset();366 reset();
384 consume = false;367 consume = false;
385 }368 }
386 if (consume)369 event->setAccepted(!m_propagateEvents && consume);
387 event->accept();
388 return consume;370 return consume;
389}371}
390372
@@ -394,28 +376,14 @@
394 */376 */
395bool InverseMouseAreaType::touchReleased(QTouchEvent *event)377bool InverseMouseAreaType::touchReleased(QTouchEvent *event)
396{378{
397 bool consume = !m_propagateEvents;379 // check only the first touch point
398 QList<QTouchEvent::TouchPoint> points = event->touchPoints();380 QTouchEvent::TouchPoint point = event->touchPoints()[0];
399 // check if any of the points fall into the area381 QMouseEvent mev(QEvent::MouseButtonRelease, point.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
400 Q_FOREACH(const QTouchEvent::TouchPoint &point, points) {382 if (mouseRelease(&mev)) {
401 if (m_pressed && contains(point.scenePos())) {383 event->setAccepted(mev.isAccepted());
402 saveEvent(QMouseEvent(QEvent::MouseButtonRelease, point.scenePos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));384 return true;
403 m_pressed = false;
404 asyncEmit(&InverseMouseAreaType::released, !m_moved);
405 Q_EMIT pressedChanged();
406 if (!m_moved)
407 asyncEmit(&InverseMouseAreaType::clicked, true);
408 m_moved = false;
409 break;
410 } else {
411 // the release happened inside the area, which is outside of the active area
412 reset();
413 consume = false;
414 }
415 }385 }
416 if (consume)386 return false;
417 event->accept();
418 return consume;
419}387}
420388
421/*!389/*!
@@ -426,12 +394,10 @@
426 */394 */
427bool InverseMouseAreaType::mouseMove(QMouseEvent *event)395bool InverseMouseAreaType::mouseMove(QMouseEvent *event)
428{396{
429 QPointF mappedPos = mapToSensingArea(event->windowPos());
430 // use localPos as we saved the mapped position as397 // use localPos as we saved the mapped position as
431 if (m_pressed && (mappedPos != m_event->localPos())) {398 if (m_pressed && (event->windowPos() != m_event->localPos())) {
432 m_moved = true;399 m_moved = true;
433 if (!m_propagateEvents)400 event->setAccepted(!m_propagateEvents);
434 event->accept();
435 }401 }
436 return false;402 return false;
437}403}
@@ -443,31 +409,26 @@
443bool InverseMouseAreaType::touchMoved(QTouchEvent *event)409bool InverseMouseAreaType::touchMoved(QTouchEvent *event)
444{410{
445 if (m_pressed) {411 if (m_pressed) {
446 QList<QTouchEvent::TouchPoint> points = event->touchPoints();412 // check only the first touch point
447 // check if any of the points fall into the area413 QTouchEvent::TouchPoint point = event->touchPoints()[0];
448 Q_FOREACH(const QTouchEvent::TouchPoint &point, points) {414 // use localPos as we saved the mapped position as
449 QPointF mappedPos = mapToSensingArea(point.scenePos());415 QMouseEvent mev(QEvent::MouseMove, point.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
450 // use localPos as we saved the mapped position as416 mouseMove(&mev);
451 if (mappedPos != m_event->localPos()) {417 event->setAccepted(mev.isAccepted());
452 m_moved = true;
453 if (!m_propagateEvents)
454 event->accept();
455 break;
456 }
457 }
458 }418 }
459 return false;419 return false;
460}420}
461421
462/*422/*
463 * Overrides QQuickItem's contains method.423 * Overrides QQuickItem's contains method. Point is in local coordinates.
464 */424 */
465bool InverseMouseAreaType::contains(const QPointF &point) const425bool InverseMouseAreaType::contains(const QPointF &point) const
466{426{
427 QPointF scenePos = mapToScene(point);
467 QRectF oskRect = QGuiApplication::inputMethod()->keyboardRectangle();428 QRectF oskRect = QGuiApplication::inputMethod()->keyboardRectangle();
468 bool pointInArea = QQuickItem::contains(mapFromScene(point));429 bool pointInArea = QQuickItem::contains(point);
469 bool pointInOSK = oskRect.contains(QuickUtils::instance().rootObject()->mapFromScene(point));430 bool pointInOSK = oskRect.contains(scenePos);
470 bool pointOutArea = (m_sensingArea && m_sensingArea->contains(m_sensingArea->mapFromScene(point)));431 bool pointOutArea = (m_sensingArea && m_sensingArea->contains(m_sensingArea->mapFromScene(scenePos)));
471 return !pointInArea && !pointInOSK && pointOutArea;432 return !pointInArea && !pointInOSK && pointOutArea;
472}433}
473434
@@ -481,28 +442,36 @@
481442
482 if (!isEnabled() || !isVisible())443 if (!isEnabled() || !isVisible())
483 return false;444 return false;
445
446 bool handled = false;
484 switch (ev->type()) {447 switch (ev->type()) {
485 case QEvent::MouseButtonPress: {448 case QEvent::MouseButtonPress: {
486 return mousePress(static_cast<QMouseEvent*>(ev));449 handled = mousePress(static_cast<QMouseEvent*>(ev));
450 break;
487 }451 }
488 case QEvent::MouseButtonRelease: {452 case QEvent::MouseButtonRelease: {
489 return mouseRelease(static_cast<QMouseEvent*>(ev));453 handled = mouseRelease(static_cast<QMouseEvent*>(ev));
454 break;
490 }455 }
491 case QEvent::MouseMove: {456 case QEvent::MouseMove: {
492 return mouseMove(static_cast<QMouseEvent*>(ev));457 handled = mouseMove(static_cast<QMouseEvent*>(ev));
458 break;
493 }459 }
494 case QEvent::TouchBegin: {460 case QEvent::TouchBegin: {
495 return touchPressed(static_cast<QTouchEvent*>(ev));461 handled = touchPressed(static_cast<QTouchEvent*>(ev));
462 break;
496 }463 }
497 case QEvent::TouchUpdate: {464 case QEvent::TouchUpdate: {
498 return touchMoved(static_cast<QTouchEvent*>(ev));465 handled = touchMoved(static_cast<QTouchEvent*>(ev));
466 break;
499 }467 }
500 case QEvent::TouchEnd: {468 case QEvent::TouchEnd: {
501 return touchReleased(static_cast<QTouchEvent*>(ev));469 handled = touchReleased(static_cast<QTouchEvent*>(ev));
470 break;
502 }471 }
503 default:472 default:
504 break;473 break;
505 }474 }
506475
507 return false;476 return (handled) ? !m_propagateEvents : false;
508}477}
509478
=== modified file 'modules/Ubuntu/Components/plugin/inversemouseareatype.h'
--- modules/Ubuntu/Components/plugin/inversemouseareatype.h 2013-02-14 09:48:11 +0000
+++ modules/Ubuntu/Components/plugin/inversemouseareatype.h 2013-02-18 17:27:31 +0000
@@ -52,7 +52,6 @@
52private:52private:
53 void reset();53 void reset();
54 void saveEvent(const QMouseEvent &event);54 void saveEvent(const QMouseEvent &event);
55 QPointF mapToSensingArea(const QPointF &point);
56 void asyncEmit(SignalType signal, bool isClick = false, bool wasHeld = false);55 void asyncEmit(SignalType signal, bool isClick = false, bool wasHeld = false);
57 bool mousePress(QMouseEvent *event);56 bool mousePress(QMouseEvent *event);
58 bool mouseRelease(QMouseEvent *event);57 bool mouseRelease(QMouseEvent *event);

Subscribers

People subscribed via source and target branches

to status/vote changes: