touch: add different pattern of multi-touch processing
authorGiWoong Kim <giwoong.kim@samsung.com>
Thu, 30 Apr 2015 04:04:10 +0000 (13:04 +0900)
committerGiWoong Kim <giwoong.kim@samsung.com>
Thu, 30 Apr 2015 09:53:44 +0000 (18:53 +0900)
parallel and symmetrical moving mode

Change-Id: I0d928641b6cb66984d3bc7795f71536f0570f203
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/ui/displaybase.cpp
tizen/src/ui/displaybase.h
tizen/src/ui/input/multitouchtracker.cpp
tizen/src/ui/input/multitouchtracker.h
tizen/src/ui/input/touchscreenhelper.cpp
tizen/src/ui/input/touchscreenhelper.h

index 54fbec7..e0185ce 100644 (file)
@@ -42,7 +42,7 @@ DisplayBase::DisplayBase(QRect rect, int angle, qreal scaleFactor,
     this->rotateAngle = angle;
     this->scaleFactor = scaleFactor;
     this->isDragging = false;
-    this->tsHelper = new TouchScreenHelper();
+    this->tsHelper = new TouchScreenHelper(this);
 
     updateGeometry();
 }
index 495a44d..dfb815a 100644 (file)
@@ -61,13 +61,13 @@ protected:
     void handleMouseRelease(QMouseEvent *event);
     void handleMouseMove(QMouseEvent *event);
 
-private:
-    QWidget *widget;
     QRect rect;
     int rotateAngle;
     qreal scaleFactor;
-
     bool isDragging;
+
+private:
+    QWidget *widget;
     TouchScreenHelper *tsHelper;
 };
 
index 1663fe5..099325b 100644 (file)
@@ -31,6 +31,7 @@
 #include <QDebug>
 
 #include "multitouchtracker.h"
+#include "displaybase.h"
 
 extern "C" {
 void virtio_touchscreen_event(int x, int y, int z, int buttons_state);
@@ -71,8 +72,10 @@ void TouchPoint::updatePos(QPoint hostPos, QPoint guestPos)
     this->guestPos = guestPos;
 }
 
-MultiTouchTracker::MultiTouchTracker(int maxTouchPoint)
+MultiTouchTracker::MultiTouchTracker(
+    TouchScreenHelper* parent, int maxTouchPoint)
 {
+    this->parent = parent;
     this->maxTouchPoint = maxTouchPoint;
     this->pointRadius = 16; // TODO:
     this->grabTouchPoint = NULL;
@@ -188,13 +191,135 @@ void MultiTouchTracker::touchProcessingSepa(QPoint hostPos, QPoint guestPos)
 /* parallel moving mode */
 void MultiTouchTracker::touchProcessingPara(QPoint hostPos, QPoint guestPos)
 {
-    //TODO:
+    TouchPoint *point = NULL;
+    const int touchCnt = touchPointList.count();
+
+    if (grabTouchPoint != NULL) {
+        const int hostPosDiffX = hostPos.x() - grabTouchPoint->getHostPos().x();
+        const int hostPosDiffY = hostPos.y() - grabTouchPoint->getHostPos().y();
+
+        /* bounds checking */
+        // TODO:
+
+        /* move whole touch points */
+        for (int i = 0; i < touchPointList.count(); i++) {
+            point = touchPointList.at(i);
+            if (point != NULL) {
+                QPoint hostMovedPos(
+                    point->getHostPos().x() + hostPosDiffX,
+                    point->getHostPos().y() + hostPosDiffY);
+                QPoint guestMovedPos =
+                    ((DisplayBase *)parent->getParent())->getGuestPos(hostMovedPos);
+                point->updatePos(hostMovedPos, guestMovedPos);
+
+                virtio_touchscreen_event(
+                    point->getGuestPos().x(), point->getGuestPos().y(),
+                    point->getID() - 1, 1);
+            }
+        }
+
+        return;
+    }
+
+    if (touchCnt == 0) { /* first touch input */
+        qDebug("mt para mode processing");
+
+        if (addTouchPoint(hostPos, guestPos) == -1) {
+            return;
+        }
+
+        virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 1);
+    } else if ((point = searchTouchPoint(hostPos)) != NULL) { /* grab a touch */
+        qDebug() << "ID" << point->getID() << "point is taken";
+        grabTouchPoint = point;
+    } else if (touchCnt == getMaxTouchPoint()) { /* last touch */
+        /* do nothing */
+        return;
+    } else { /* additional touch */
+        if (addTouchPoint(hostPos, guestPos) == -1) {
+            return;
+        }
+
+        point = touchPointList.last();
+        virtio_touchscreen_event(guestPos.x(), guestPos.y(),
+            point->getID() - 1, 1);
+    }
 }
 
 /* symmetrical moving mode */
 void MultiTouchTracker::touchProcessingSymm(QPoint hostPos, QPoint guestPos)
 {
-   //TODO:
+    TouchPoint *point = NULL;
+    const int touchCnt = touchPointList.count();
+
+    if (grabTouchPoint != NULL) {
+        const int hostPosDiffX = hostPos.x() - grabTouchPoint->getHostPos().x();
+        const int hostPosDiffY = hostPos.y() - grabTouchPoint->getHostPos().y();
+
+        /* move selected point */
+        grabTouchPoint->updatePos(hostPos, guestPos);
+        virtio_touchscreen_event(guestPos.x(), guestPos.y(),
+            grabTouchPoint->getID() - 1, 1);
+
+        /* bounds checking */
+        // TODO:
+
+        /* move other points */
+        for (int i = 0; i < touchPointList.count(); i++) {
+            point = touchPointList.at(i);
+            if (point != NULL && point != grabTouchPoint) {
+                QPoint hostMovedPos(
+                    point->getHostPos().x() - hostPosDiffX,
+                    point->getHostPos().y() - hostPosDiffY);
+                QPoint guestMovedPos =
+                    ((DisplayBase *)parent->getParent())->getGuestPos(hostMovedPos);
+                point->updatePos(hostMovedPos, guestMovedPos);
+
+                virtio_touchscreen_event(
+                    point->getGuestPos().x(), point->getGuestPos().y(),
+                    point->getID() - 1, 1);
+            }
+        }
+
+        return;
+    }
+
+    if (touchCnt == 0) { /* first touch input */
+        qDebug("mt symm mode processing");
+
+        if (addTouchPoint(hostPos, guestPos) == -1) {
+            return;
+        }
+
+        virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 1);
+    } else if ((point = searchTouchPoint(hostPos)) != NULL) { /* grab a touch */
+        qDebug() << "ID" << point->getID() << "point is taken";
+        grabTouchPoint = point;
+    } else if (touchCnt >= 2) { /* last touch */
+        /* supports up to 2 touch points */
+        point = touchPointList.last();
+        if (point != NULL) {
+            /* re-input */
+            qDebug() << "ID" << point->getID() << "point re-touching";
+
+            virtio_touchscreen_event(
+                point->getGuestPos().x(), point->getGuestPos().y(),
+                point->getID() - 1, 0);
+
+            point->updatePos(hostPos, guestPos);
+            virtio_touchscreen_event(
+                point->getGuestPos().x(), point->getGuestPos().y(),
+                point->getID() - 1, 1);
+        }
+    } else { /* additional touch */
+        if (addTouchPoint(hostPos, guestPos) == -1) {
+            return;
+        }
+
+        point = touchPointList.last();
+        virtio_touchscreen_event(guestPos.x(), guestPos.y(),
+            point->getID() - 1, 1);
+    }
 }
 
 void MultiTouchTracker::touchReleasing()
index 1032dac..2707cfd 100644 (file)
@@ -30,6 +30,8 @@
 #ifndef MULTITOUCHTRACKER_H
 #define MULTITOUCHTRACKER_H
 
+class TouchScreenHelper;
+
 class TouchPoint
 {
 public:
@@ -50,7 +52,7 @@ private:
 class MultiTouchTracker
 {
 public:
-    MultiTouchTracker(int maxTouchPoint);
+    MultiTouchTracker(TouchScreenHelper* parent, int maxTouchPoint);
     ~MultiTouchTracker();
 
     int getMaxTouchPoint();
@@ -64,6 +66,7 @@ public:
     void finishTracking();
 
 private:
+    TouchScreenHelper *parent;
     int maxTouchPoint;
     int pointRadius;
     TouchPoint *grabTouchPoint;
index 3649eaf..9350459 100644 (file)
@@ -38,9 +38,16 @@ extern "C" {
 void virtio_touchscreen_event(int x, int y, int z, int buttons_state);
 }
 
-TouchScreenHelper::TouchScreenHelper()
+TouchScreenHelper::TouchScreenHelper(void *parent)
 {
-    this->mtTracker = new MultiTouchTracker(get_emul_max_touch_point());
+    this->parent = parent;
+    this->mtTracker =
+        new MultiTouchTracker(this, get_emul_max_touch_point());
+}
+
+void *TouchScreenHelper::getParent()
+{
+    return parent;
 }
 
 void TouchScreenHelper::mousePressed(QMouseEvent *event, QPoint guestPos)
index ff62907..286dfd7 100644 (file)
 class TouchScreenHelper
 {
 public:
-    TouchScreenHelper();
+    TouchScreenHelper(void *parent);
     ~TouchScreenHelper();
 
+    void *getParent();
     void mousePressed(QMouseEvent *event, QPoint guestPos);
     void mouseReleased(QMouseEvent *event, QPoint guestPos);
     void mouseMoved(QMouseEvent *event, QPoint guestPos);
@@ -45,6 +46,7 @@ public:
     void finishMtTracking();
 
 private:
+    void *parent;
     MultiTouchTracker *mtTracker;
 };