X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fevents%2Ftap-gesture%2Ftap-gesture-detector-impl.cpp;h=6f3784f04d453d8d3bae0d72777c8a260980eaaf;hb=7476e111143c590a7945d0fd48721c3492b21542;hp=bdca9c6427fbbb7eed79c3a8725ced438afce033;hpb=34745e42eed50817085b2e4868d301f8d43f9003;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/events/tap-gesture/tap-gesture-detector-impl.cpp b/dali/internal/event/events/tap-gesture/tap-gesture-detector-impl.cpp index bdca9c6..6f3784f 100644 --- a/dali/internal/event/events/tap-gesture/tap-gesture-detector-impl.cpp +++ b/dali/internal/event/events/tap-gesture/tap-gesture-detector-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -22,22 +22,23 @@ #include // for strcmp // INTERNAL INCLUDES -#include -#include #include +#include +#include #include +#include +#include +#include namespace Dali { - namespace Internal { - namespace { - -const unsigned int DEFAULT_TAPS_REQUIRED = 1u; -const unsigned int DEFAULT_TOUCHES_REQUIRED = 1u; +constexpr uint32_t DEFAULT_TAPS_REQUIRED = 1u; +constexpr uint32_t DEFAULT_TOUCHES_REQUIRED = 1u; +constexpr uint32_t DEFAULT_TAP_WAIT_TIME = 330u; // Signals const char* const SIGNAL_TAP_DETECTED = "tapDetected"; @@ -47,49 +48,62 @@ BaseHandle Create() return Dali::TapGestureDetector::New(); } -TypeRegistration mType( typeid(Dali::TapGestureDetector), typeid(Dali::GestureDetector), Create ); +TypeRegistration mType(typeid(Dali::TapGestureDetector), typeid(Dali::GestureDetector), Create); -SignalConnectorType signalConnector1( mType, SIGNAL_TAP_DETECTED, &TapGestureDetector::DoConnectSignal ); +SignalConnectorType signalConnector1(mType, SIGNAL_TAP_DETECTED, &TapGestureDetector::DoConnectSignal); -} +} // namespace TapGestureDetectorPtr TapGestureDetector::New() { return new TapGestureDetector; } -TapGestureDetectorPtr TapGestureDetector::New( unsigned int tapsRequired ) +TapGestureDetectorPtr TapGestureDetector::New(unsigned int tapsRequired) { - return new TapGestureDetector( tapsRequired ); + return new TapGestureDetector(tapsRequired); } TapGestureDetector::TapGestureDetector() -: GestureDetector( GestureType::TAP ), - mMinimumTapsRequired( DEFAULT_TAPS_REQUIRED ), - mMaximumTapsRequired( DEFAULT_TAPS_REQUIRED ), - mTouchesRequired( DEFAULT_TOUCHES_REQUIRED ) +: GestureDetector(GestureType::TAP), + mMinimumTapsRequired(DEFAULT_TAPS_REQUIRED), + mMaximumTapsRequired(DEFAULT_TAPS_REQUIRED), + mTouchesRequired(DEFAULT_TOUCHES_REQUIRED), + mTimerId(0), + mTappedActor(), + mTap(), + mReceiveAllTapEvents(false) { } -TapGestureDetector::TapGestureDetector( unsigned int tapsRequired ) -: GestureDetector( GestureType::TAP ), - mMinimumTapsRequired( tapsRequired ), - mMaximumTapsRequired( tapsRequired ), - mTouchesRequired( DEFAULT_TOUCHES_REQUIRED ) +TapGestureDetector::TapGestureDetector(unsigned int tapsRequired) +: GestureDetector(GestureType::TAP), + mMinimumTapsRequired(tapsRequired), + mMaximumTapsRequired(tapsRequired), + mTouchesRequired(DEFAULT_TOUCHES_REQUIRED), + mTimerId(0), + mTappedActor(), + mTap(), + mReceiveAllTapEvents(false) { } TapGestureDetector::~TapGestureDetector() { + if(mTimerId != 0 && ThreadLocalStorage::Created()) + { + Dali::Integration::PlatformAbstraction& platformAbstraction = ThreadLocalStorage::Get().GetPlatformAbstraction(); + platformAbstraction.CancelTimer(mTimerId); + } } void TapGestureDetector::SetMinimumTapsRequired(unsigned int taps) { - if ( mMinimumTapsRequired != taps ) + if(mMinimumTapsRequired != taps) { mMinimumTapsRequired = taps; - if ( !mAttachedActors.empty() ) + if(!mAttachedActors.empty()) { mGestureEventProcessor.GestureDetectorUpdated(this); } @@ -98,11 +112,11 @@ void TapGestureDetector::SetMinimumTapsRequired(unsigned int taps) void TapGestureDetector::SetMaximumTapsRequired(unsigned int taps) { - if ( mMaximumTapsRequired != taps ) + if(mMaximumTapsRequired != taps) { mMaximumTapsRequired = taps; - if ( !mAttachedActors.empty() ) + if(!mAttachedActors.empty()) { mGestureEventProcessor.GestureDetectorUpdated(this); } @@ -111,11 +125,11 @@ void TapGestureDetector::SetMaximumTapsRequired(unsigned int taps) void TapGestureDetector::SetTouchesRequired(unsigned int touches) { - if (mTouchesRequired != touches) + if(mTouchesRequired != touches) { mTouchesRequired = touches; - if (!mAttachedActors.empty()) + if(!mAttachedActors.empty()) { mGestureEventProcessor.GestureDetectorUpdated(this); } @@ -137,22 +151,62 @@ unsigned int TapGestureDetector::GetTouchesRequired() const return mTouchesRequired; } +void TapGestureDetector::ReceiveAllTapEvents(bool receive) +{ + mReceiveAllTapEvents = receive; +} + void TapGestureDetector::EmitTapGestureSignal(Dali::Actor tappedActor, const Dali::TapGesture& tap) { + Dali::Integration::PlatformAbstraction& platformAbstraction = ThreadLocalStorage::Get().GetPlatformAbstraction(); + if(mTimerId != 0) + { + platformAbstraction.CancelTimer(mTimerId); + mTimerId = 0; + } + if(mMaximumTapsRequired > tap.GetNumberOfTaps() && !mReceiveAllTapEvents) + { + mTappedActor = tappedActor; + + Internal::TapGesturePtr internalTap(new Internal::TapGesture(tap.GetState())); + internalTap->SetTime(tap.GetTime()); + internalTap->SetNumberOfTaps(tap.GetNumberOfTaps()); + internalTap->SetNumberOfTouches(tap.GetNumberOfTouches()); + internalTap->SetScreenPoint(tap.GetScreenPoint()); + internalTap->SetLocalPoint(tap.GetLocalPoint()); + internalTap->SetGestureSourceType(tap.GetSourceType()); + mTap = Dali::TapGesture(internalTap.Get()); + + mTimerId = platformAbstraction.StartTimer(DEFAULT_TAP_WAIT_TIME, MakeCallback(this, &TapGestureDetector::TimerCallback)); + } + else + { + // Guard against destruction during signal emission + Dali::TapGestureDetector handle(this); + + mDetectedSignal.Emit(tappedActor, tap); + } +} + +bool TapGestureDetector::TimerCallback() +{ // Guard against destruction during signal emission - Dali::TapGestureDetector handle( this ); + Dali::TapGestureDetector handle(this); + + mDetectedSignal.Emit(mTappedActor, mTap); - mDetectedSignal.Emit( tappedActor, tap ); + mTimerId = 0; + return false; } -bool TapGestureDetector::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) +bool TapGestureDetector::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor) { - bool connected( true ); - TapGestureDetector* gesture = static_cast< TapGestureDetector* >(object); // TypeRegistry guarantees that this is the correct type. + bool connected(true); + TapGestureDetector* gesture = static_cast(object); // TypeRegistry guarantees that this is the correct type. - if ( 0 == strcmp( signalName.c_str(), SIGNAL_TAP_DETECTED ) ) + if(0 == strcmp(signalName.c_str(), SIGNAL_TAP_DETECTED)) { - gesture->DetectedSignal().Connect( tracker, functor ); + gesture->DetectedSignal().Connect(tracker, functor); } else {