X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fevents%2Fgesture-detector-impl.cpp;h=b3b8981be79cfd7fa079b9d4a1d3961ffee62502;hb=0ed4ee4571aacaf595db0f5b4332fa14113f3d51;hp=58e4816a0fdf5bae5a4c25dedf39ca1d3eeecc9a;hpb=8b0b50bb14b39e34a119c573cad63fd03c96b09a;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/events/gesture-detector-impl.cpp b/dali/internal/event/events/gesture-detector-impl.cpp index 58e4816..b3b8981 100644 --- a/dali/internal/event/events/gesture-detector-impl.cpp +++ b/dali/internal/event/events/gesture-detector-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 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. @@ -23,80 +23,150 @@ // INTERNAL INCLUDES #include +#include +#include #include #include -#include -#include namespace Dali { - namespace Internal { - -GestureDetector::GestureDetector(Gesture::Type type) -: mType(type), +GestureDetector::GestureDetector(GestureType::Value type, const SceneGraph::PropertyOwner* sceneObject) +: Object(sceneObject), + mType(type), mGestureEventProcessor(ThreadLocalStorage::Get().GetGestureEventProcessor()) { } GestureDetector::~GestureDetector() { - if ( !mAttachedActors.empty() ) + if(!mPendingAttachActors.empty()) { - for ( GestureDetectorActorContainer::iterator iter = mAttachedActors.begin(), endIter = mAttachedActors.end(); iter != endIter; ++iter ) + for(GestureDetectorActorContainer::iterator iter = mPendingAttachActors.begin(), endIter = mPendingAttachActors.end(); iter != endIter; ++iter) { - Actor* actor( *iter ); - actor->RemoveObserver( *this ); - actor->GetGestureData().RemoveGestureDetector( *this ); + Actor* actor(*iter); + actor->RemoveObserver(*this); + actor->GetGestureData().RemoveGestureDetector(*this); + } + + mPendingAttachActors.clear(); + } + + if(!mAttachedActors.empty()) + { + for(GestureDetectorActorContainer::iterator iter = mAttachedActors.begin(), endIter = mAttachedActors.end(); iter != endIter; ++iter) + { + Actor* actor(*iter); + actor->RemoveObserver(*this); + actor->GetGestureData().RemoveGestureDetector(*this); } mAttachedActors.clear(); // Guard to allow handle destruction after Core has been destroyed - if ( Stage::IsInstalled() ) + if(Stage::IsInstalled()) { - mGestureEventProcessor.RemoveGestureDetector( this ); + mGestureEventProcessor.RemoveGestureDetector(this); } } } void GestureDetector::Attach(Actor& actor) { - if ( !IsAttached(actor) ) + if(!IsAttached(actor)) { - // Register with EventProcessor if first actor being added - if ( mAttachedActors.empty() ) + if(actor.OnScene()) { - mGestureEventProcessor.AddGestureDetector(this); + // Register with EventProcessor if first actor being added + if(mAttachedActors.empty()) + { + mGestureEventProcessor.AddGestureDetector(this, actor.GetScene()); + } + mAttachedActors.push_back(&actor); + // We need to observe the actor's destruction + actor.AddObserver(*this); + // Add the detector to the actor (so the actor knows it requires this gesture when going through hit-test algorithm) + actor.GetGestureData().AddGestureDetector(*this); + // Notification for derived classes + OnActorAttach(actor); } + else + { + actor.AddObserver(*this); + // Add the detector to the actor (so the actor knows it requires this gesture when going through hit-test algorithm) + actor.GetGestureData().AddGestureDetector(*this); + + mPendingAttachActors.push_back(&actor); + } + } +} + +void GestureDetector::SceneObjectAdded(Object& object) +{ + Actor& actor = dynamic_cast(object); - mAttachedActors.push_back(&actor); + // Make sure the actor has not already been attached. Can't use IsAttached() as that checks the pending list as well + if(find(mAttachedActors.begin(), mAttachedActors.end(), &actor) == mAttachedActors.end()) + { + GestureDetectorActorContainer::iterator match = find(mPendingAttachActors.begin(), mPendingAttachActors.end(), &actor); - // We need to observe the actor's destruction - actor.AddObserver(*this); + if(match != mPendingAttachActors.end()) + { + mPendingAttachActors.erase(match); - // Add the detector to the actor (so the actor knows it requires this gesture when going through hit-test algorithm) - actor.GetGestureData().AddGestureDetector( *this ); + // Register with EventProcessor if first actor being added + if(mAttachedActors.empty()) + { + mGestureEventProcessor.AddGestureDetector(this, actor.GetScene()); + } + mAttachedActors.push_back(&actor); - // Notification for derived classes - OnActorAttach(actor); + // Notification for derived classes + OnActorAttach(actor); + } + else + { + // Actor was not in the pending list + DALI_ASSERT_DEBUG(false); + } + } + else + { + // Check if actor has been attached and is still in the pending list - this would not be correct + DALI_ASSERT_DEBUG(find(mPendingAttachActors.begin(), mPendingAttachActors.end(), &actor) == mPendingAttachActors.end()); } } void GestureDetector::Detach(Actor& actor) { - if ( !mAttachedActors.empty() ) + if(!mPendingAttachActors.empty()) + { + GestureDetectorActorContainer::iterator match = find(mPendingAttachActors.begin(), mPendingAttachActors.end(), &actor); + + if(match != mPendingAttachActors.end()) + { + // We no longer need to observe the actor's destruction + actor.RemoveObserver(*this); + + // Remove detector from actor-gesture-data + actor.GetGestureData().RemoveGestureDetector(*this); + + mPendingAttachActors.erase(match); + } + } + + if(!mAttachedActors.empty()) { GestureDetectorActorContainer::iterator match = find(mAttachedActors.begin(), mAttachedActors.end(), &actor); - if ( match != mAttachedActors.end() ) + if(match != mAttachedActors.end()) { // We no longer need to observe the actor's destruction actor.RemoveObserver(*this); // Remove detector from actor-gesture-data - actor.GetGestureData().RemoveGestureDetector( *this ); + actor.GetGestureData().RemoveGestureDetector(*this); mAttachedActors.erase(match); @@ -104,10 +174,10 @@ void GestureDetector::Detach(Actor& actor) OnActorDetach(actor); // Unregister from gesture event processor if we do not have any actors - if ( mAttachedActors.empty() ) + if(mAttachedActors.empty()) { // Guard to allow handle destruction after Core has been destroyed - if( Stage::IsInstalled() ) + if(Stage::IsInstalled()) { mGestureEventProcessor.RemoveGestureDetector(this); } @@ -118,14 +188,32 @@ void GestureDetector::Detach(Actor& actor) void GestureDetector::DetachAll() { - if ( !mAttachedActors.empty() ) + if(!mPendingAttachActors.empty()) + { + GestureDetectorActorContainer pendingActors(mPendingAttachActors); + + mPendingAttachActors.clear(); + + for(GestureDetectorActorContainer::iterator iter = pendingActors.begin(), endIter = pendingActors.end(); iter != endIter; ++iter) + { + Actor* actor(*iter); + + // We no longer need to observe the actor's destruction + actor->RemoveObserver(*this); + + // Remove detector from actor-gesture-data + actor->GetGestureData().RemoveGestureDetector(*this); + } + } + + if(!mAttachedActors.empty()) { GestureDetectorActorContainer attachedActors(mAttachedActors); // Clear mAttachedActors before we call OnActorDetach in case derived classes call a method which manipulates mAttachedActors. mAttachedActors.clear(); - for ( GestureDetectorActorContainer::iterator iter = attachedActors.begin(), endIter = attachedActors.end(); iter != endIter; ++iter ) + for(GestureDetectorActorContainer::iterator iter = attachedActors.begin(), endIter = attachedActors.end(); iter != endIter; ++iter) { Actor* actor(*iter); @@ -133,14 +221,14 @@ void GestureDetector::DetachAll() actor->RemoveObserver(*this); // Remove detector from actor-gesture-data - actor->GetGestureData().RemoveGestureDetector( *this ); + actor->GetGestureData().RemoveGestureDetector(*this); // Notification for derived classes OnActorDetach(*actor); } // Guard to allow handle destruction after Core has been destroyed - if ( Stage::IsInstalled() ) + if(Stage::IsInstalled()) { // Unregister from gesture event processor mGestureEventProcessor.RemoveGestureDetector(this); @@ -150,16 +238,20 @@ void GestureDetector::DetachAll() size_t GestureDetector::GetAttachedActorCount() const { - return mAttachedActors.size(); + return mPendingAttachActors.size() + mAttachedActors.size(); } Dali::Actor GestureDetector::GetAttachedActor(size_t index) const { Dali::Actor actor; - if( index < mAttachedActors.size() ) + if(index < mPendingAttachActors.size()) { - actor = Dali::Actor( mAttachedActors[index] ); + actor = Dali::Actor(mPendingAttachActors[index]); + } + else if(index < mPendingAttachActors.size() + mAttachedActors.size()) + { + actor = Dali::Actor(mAttachedActors[index - mPendingAttachActors.size()]); } return actor; @@ -167,16 +259,27 @@ Dali::Actor GestureDetector::GetAttachedActor(size_t index) const bool GestureDetector::IsAttached(Actor& actor) const { - return find(mAttachedActors.begin(), mAttachedActors.end(), &actor) != mAttachedActors.end(); + return (find(mPendingAttachActors.begin(), mPendingAttachActors.end(), &actor) != mPendingAttachActors.end()) || + (find(mAttachedActors.begin(), mAttachedActors.end(), &actor) != mAttachedActors.end()); } void GestureDetector::ObjectDestroyed(Object& object) { - if ( !mAttachedActors.empty() ) + if(!mPendingAttachActors.empty()) + { + GestureDetectorActorContainer::iterator match = find(mPendingAttachActors.begin(), mPendingAttachActors.end(), &object); + + if(match != mPendingAttachActors.end()) + { + mPendingAttachActors.erase(match); + } + } + + if(!mAttachedActors.empty()) { GestureDetectorActorContainer::iterator match = find(mAttachedActors.begin(), mAttachedActors.end(), &object); - if ( match != mAttachedActors.end() ) + if(match != mAttachedActors.end()) { mAttachedActors.erase(match); @@ -184,10 +287,10 @@ void GestureDetector::ObjectDestroyed(Object& object) OnActorDestroyed(object); // Unregister from gesture event processor if we do not have any actors - if ( mAttachedActors.empty() ) + if(mAttachedActors.empty()) { // Guard to allow handle destruction after Core has been destroyed - if ( Stage::IsInstalled() ) + if(Stage::IsInstalled()) { mGestureEventProcessor.RemoveGestureDetector(this); } @@ -196,70 +299,6 @@ void GestureDetector::ObjectDestroyed(Object& object) } } -unsigned int GestureDetector::GetDefaultPropertyCount() const -{ - return 0; -} - -void GestureDetector::GetDefaultPropertyIndices( Property::IndexContainer& ) const -{ -} - -const char* GestureDetector::GetDefaultPropertyName( Property::Index index ) const -{ - return NULL; -} - -Property::Index GestureDetector::GetDefaultPropertyIndex(const std::string& name) const -{ - return 0; -} - -bool GestureDetector::IsDefaultPropertyWritable(Property::Index index) const -{ - return false; -} - -bool GestureDetector::IsDefaultPropertyAnimatable(Property::Index index) const -{ - return false; -} - -bool GestureDetector::IsDefaultPropertyAConstraintInput( Property::Index index ) const -{ - return false; -} - -Property::Type GestureDetector::GetDefaultPropertyType(Property::Index index) const -{ - return Property::NONE; -} - -void GestureDetector::SetDefaultProperty( Property::Index index, const Property::Value& property ) -{ - // None of our properties should be settable from Public API -} - -Property::Value GestureDetector::GetDefaultProperty(Property::Index index) const -{ - return Property::Value(); -} - -const SceneGraph::PropertyOwner* GestureDetector::GetSceneObject() const -{ - return NULL; -} - -const SceneGraph::PropertyBase* GestureDetector::GetSceneObjectAnimatableProperty( Property::Index index ) const -{ - return NULL; -} - -const PropertyInputImpl* GestureDetector::GetSceneObjectInputProperty( Property::Index index ) const -{ - return NULL; -} - } // namespace Internal } // namespace Dali