/*
- * 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.
// 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>
{
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");
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.
{
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);
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:
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;
// 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)
{
// Set mCurrentPanEvent to use inside overridden methods called in ProcessAndEmit()
mCurrentPanEvent = &panEvent;
- ProcessAndEmit(hitTestResults);
+ if(actor)
+ {
+ ProcessAndEmitActor(hitTestResults);
+ }
+ else
+ {
+ ProcessAndEmit(hitTestResults);
+ }
mCurrentPanEvent = nullptr;
}
else
{
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);
{
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)
{
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);
}
}
pan->SetNumberOfTouches(panEvent.numberOfTouches);
pan->SetScreenPosition(panEvent.currentPosition);
pan->SetPosition(localCurrent);
+ pan->SetSourceType(panEvent.sourceType);
+ pan->SetSourceData(panEvent.sourceData);
RenderTask& renderTaskImpl(*renderTask.Get());
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();
{
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() << "]";
+ });
}
}