[Tizen] Add FeedTouch api to GestureDetector.
[platform/core/uifw/dali-core.git] / dali / internal / event / events / pan-gesture / pan-gesture-processor.cpp
index b1909dc..3a471d3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 
 // INTERNAL INCLUDES
 #include <dali/integration-api/debug.h>
+#include <dali/integration-api/trace.h>
 #include <dali/internal/event/common/scene-impl.h>
 #include <dali/internal/event/events/gesture-requests.h>
 #include <dali/internal/event/events/multi-point-event-util.h>
@@ -47,6 +48,7 @@ namespace Internal
 {
 namespace // unnamed namespace
 {
+DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_PERFORMANCE_MARKER, false);
 #if defined(DEBUG_ENABLED)
 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_PAN_PROCESSOR");
 
@@ -128,6 +130,7 @@ PanGestureProcessor::PanGestureProcessor(SceneGraph::UpdateManager& updateManage
   mPossiblePanPosition(),
   mMinTouchesRequired(1),
   mMaxTouchesRequired(1),
+  mMaxMotionEventAge(std::numeric_limits<uint32_t>::max()),
   mCurrentPanEvent(nullptr),
   mSceneObject(SceneGraph::PanGesture::New()) // Create scene object to store pan information.
 {
@@ -140,7 +143,7 @@ PanGestureProcessor::~PanGestureProcessor()
   mSceneObject = nullptr; // mSceneObject is owned and destroyed by update manager (there is only one of these for now)
 }
 
-void PanGestureProcessor::Process(Scene& scene, const PanGestureEvent& panEvent)
+void PanGestureProcessor::Process(Scene& scene, const PanGestureEvent& panEvent, Actor* actor)
 {
 #if defined(DEBUG_ENABLED)
   DALI_LOG_TRACE_METHOD(gLogFilter);
@@ -150,6 +153,8 @@ void PanGestureProcessor::Process(Scene& scene, const PanGestureEvent& panEvent)
   DALI_LOG_INFO(gLogFilter, Debug::General, "      Positions: Current: (%.0f, %.0f), Previous: (%.0f, %.0f)\n", panEvent.currentPosition.x, panEvent.currentPosition.y, panEvent.previousPosition.x, panEvent.previousPosition.y);
 #endif
 
+  DALI_TRACE_SCOPE(gTraceFilter, "DALI_PROCESS_PAN_GESTURE");
+
   switch(panEvent.state)
   {
     case GestureState::POSSIBLE:
@@ -158,7 +163,12 @@ void PanGestureProcessor::Process(Scene& scene, const PanGestureEvent& panEvent)
       ResetActor();
 
       HitTestAlgorithm::Results hitTestResults;
-      if(HitTest(scene, panEvent.currentPosition, hitTestResults))
+      if(actor)
+      {
+        SetActor(actor);
+        mPossiblePanPosition = panEvent.currentPosition;
+      }
+      else if(HitTest(scene, panEvent.currentPosition, hitTestResults))
       {
         SetActor(&GetImplementation(hitTestResults.actor));
         mPossiblePanPosition = panEvent.currentPosition;
@@ -175,7 +185,19 @@ void PanGestureProcessor::Process(Scene& scene, const PanGestureEvent& panEvent)
       // it can be told when the gesture ends as well.
 
       HitTestAlgorithm::Results hitTestResults;
-      HitTest(scene, panEvent.previousPosition, hitTestResults); // Hit Test previous position
+      if(actor)
+      {
+        hitTestResults.actor = Dali::Actor(actor);
+        hitTestResults.renderTask = panEvent.renderTask;
+
+        Vector2 actorCoords;
+        actor->ScreenToLocal(*hitTestResults.renderTask.Get(), actorCoords.x, actorCoords.y, panEvent.currentPosition.x, panEvent.currentPosition.y);
+        hitTestResults.actorCoordinates = actorCoords;
+      }
+      else
+      {
+        HitTest(scene, panEvent.previousPosition, hitTestResults); // Hit Test previous position
+      }
 
       if(hitTestResults.actor)
       {
@@ -191,7 +213,14 @@ void PanGestureProcessor::Process(Scene& scene, const PanGestureEvent& panEvent)
 
         // Set mCurrentPanEvent to use inside overridden methods called in ProcessAndEmit()
         mCurrentPanEvent = &panEvent;
-        ProcessAndEmit(hitTestResults);
+        if(actor)
+        {
+          ProcessAndEmitActor(hitTestResults);
+        }
+        else
+        {
+          ProcessAndEmit(hitTestResults);
+        }
         mCurrentPanEvent = nullptr;
       }
       else
@@ -279,10 +308,12 @@ void PanGestureProcessor::AddGestureDetector(PanGestureDetector* gestureDetector
   {
     mMinTouchesRequired = gestureDetector->GetMinimumTouchesRequired();
     mMaxTouchesRequired = gestureDetector->GetMaximumTouchesRequired();
+    mMaxMotionEventAge  = gestureDetector->GetMaximumMotionEventAge();
 
     PanGestureRequest request;
-    request.minTouches = mMinTouchesRequired;
-    request.maxTouches = mMaxTouchesRequired;
+    request.minTouches        = mMinTouchesRequired;
+    request.maxTouches        = mMaxTouchesRequired;
+    request.maxMotionEventAge = mMaxMotionEventAge;
 
     Size size          = scene.GetSize();
     mGestureRecognizer = new PanGestureRecognizer(*this, Vector2(size.width, size.height), static_cast<const PanGestureRequest&>(request), minDistance, minPanEvents);
@@ -451,8 +482,9 @@ void PanGestureProcessor::UpdateDetection()
 {
   DALI_ASSERT_DEBUG(!mPanGestureDetectors.empty());
 
-  unsigned int minimumRequired = UINT_MAX;
-  unsigned int maximumRequired = 0;
+  uint32_t minimumRequired       = std::numeric_limits<uint32_t>::max();
+  uint32_t maximumRequired       = 0;
+  uint32_t maximumMotionEventAge = std::numeric_limits<uint32_t>::max();
 
   for(PanGestureDetectorContainer::iterator iter = mPanGestureDetectors.begin(), endIter = mPanGestureDetectors.end(); iter != endIter; ++iter)
   {
@@ -460,28 +492,36 @@ void PanGestureProcessor::UpdateDetection()
 
     if(detector)
     {
-      unsigned int minimum = detector->GetMinimumTouchesRequired();
+      uint32_t minimum = detector->GetMinimumTouchesRequired();
       if(minimum < minimumRequired)
       {
         minimumRequired = minimum;
       }
 
-      unsigned int maximum = detector->GetMaximumTouchesRequired();
+      uint32_t maximum = detector->GetMaximumTouchesRequired();
       if(maximum > maximumRequired)
       {
         maximumRequired = maximum;
       }
+
+      uint32_t maximumAge = detector->GetMaximumMotionEventAge();
+      if(maximumAge < maximumMotionEventAge)
+      {
+        maximumMotionEventAge = maximumAge;
+      }
     }
   }
 
-  if((minimumRequired != mMinTouchesRequired) || (maximumRequired != mMaxTouchesRequired))
+  if((minimumRequired != mMinTouchesRequired) || (maximumRequired != mMaxTouchesRequired) || (maximumMotionEventAge != mMaxMotionEventAge))
   {
     mMinTouchesRequired = minimumRequired;
     mMaxTouchesRequired = maximumRequired;
+    mMaxMotionEventAge  = maximumMotionEventAge;
 
     PanGestureRequest request;
-    request.minTouches = mMinTouchesRequired;
-    request.maxTouches = mMaxTouchesRequired;
+    request.minTouches        = mMinTouchesRequired;
+    request.maxTouches        = mMaxTouchesRequired;
+    request.maxMotionEventAge = mMaxMotionEventAge;
     mGestureRecognizer->Update(request);
   }
 }
@@ -502,6 +542,8 @@ void PanGestureProcessor::EmitPanSignal(Actor*                          actor,
     pan->SetNumberOfTouches(panEvent.numberOfTouches);
     pan->SetScreenPosition(panEvent.currentPosition);
     pan->SetPosition(localCurrent);
+    pan->SetSourceType(panEvent.sourceType);
+    pan->SetSourceData(panEvent.sourceData);
 
     RenderTask& renderTaskImpl(*renderTask.Get());
 
@@ -553,6 +595,10 @@ void PanGestureProcessor::EmitPanSignal(Actor*                          actor,
       mSceneObject->AddGesture(*pan.Get());
     }
 
+    DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EMIT_PAN_GESTURE_SIGNAL", [&](std::ostringstream& oss) {
+      oss << "[" << gestureDetectors.size() << "]";
+    });
+
     Dali::Actor actorHandle(actor);
 
     const GestureDetectorContainer::const_iterator endIter = gestureDetectors.end();
@@ -560,6 +606,10 @@ void PanGestureProcessor::EmitPanSignal(Actor*                          actor,
     {
       static_cast<PanGestureDetector*>(*iter)->EmitPanGestureSignal(actorHandle, Dali::PanGesture(pan.Get()));
     }
+
+    DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EMIT_PAN_GESTURE_SIGNAL", [&](std::ostringstream& oss) {
+      oss << "[" << gestureDetectors.size() << "]";
+    });
   }
 }