/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 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.
namespace Internal
{
-namespace
+ActorGestureData::ActorGestureData()
+: gesturesRequired( GestureType::Value( 0 ) ),
+ panDetectors( nullptr ),
+ pinchDetectors( nullptr ),
+ longPressDetectors( nullptr ),
+ tapDetectors( nullptr ),
+ rotationDetectors( nullptr )
{
+}
-/**
- * Template to add a detector to the appropriate container. Dynamically allocates the container only if it is used.
- */
-template< typename DetectorType, typename ContainerType >
-inline void AddDetector( ContainerType*& containerPtr, GestureDetector* detector, Gesture::Type& gesturesRequired )
+ActorGestureData::~ActorGestureData()
+{
+ delete panDetectors;
+ delete pinchDetectors;
+ delete longPressDetectors;
+ delete tapDetectors;
+ delete rotationDetectors;
+}
+
+void ActorGestureData::AddGestureDetector( GestureDetector& detector )
{
+ const GestureType::Value type( detector.GetType() );
+
+ GestureDetectorContainer*& containerPtr( GetContainerPtr( type ) );
if ( NULL == containerPtr )
{
- containerPtr = new ContainerType;
+ containerPtr = new GestureDetectorContainer;
}
+ containerPtr->push_back( &detector );
- containerPtr->push_back( static_cast< DetectorType* >( detector ) );
- gesturesRequired = Gesture::Type( gesturesRequired | detector->GetType() );
+ gesturesRequired = GestureType::Value( gesturesRequired | type );
}
-/**
- * Template to remove a detector from the appropriate container. Deletes the container if it is no longer required.
- */
-template< typename ContainerType >
-inline void RemoveDetector( ContainerType*& containerPtr, GestureDetector* detector, Gesture::Type& gesturesRequired )
+void ActorGestureData::RemoveGestureDetector( GestureDetector& detector )
{
- if ( NULL != containerPtr )
- {
- ContainerType& container( *containerPtr );
- typename ContainerType::iterator match( std::remove( container.begin(), container.end(), detector ) );
- DALI_ASSERT_DEBUG( match != container.end() && "Actor does not have the detector" );
- container.erase( match, container.end() );
+ const GestureType::Value type( detector.GetType() );
- if ( container.empty() )
- {
- gesturesRequired = Gesture::Type( gesturesRequired & ~detector->GetType() );
- delete containerPtr;
- containerPtr = NULL;
- }
- }
-}
+ GestureDetectorContainer*& containerPtr( GetContainerPtr( type ) );
+ DALI_ASSERT_DEBUG( containerPtr && "Container had not been created" );
-} // unnamed namespace
+ GestureDetectorContainer& container( *containerPtr );
+ GestureDetectorContainer::iterator match( std::remove( container.begin(), container.end(), &detector ) );
+ DALI_ASSERT_DEBUG( match != container.end() && "Actor does not have the detector" );
+ container.erase( match, container.end() );
-ActorGestureData::ActorGestureData()
-: gesturesRequired( Gesture::Type( 0 ) ),
- panDetectors( NULL ),
- pinchDetectors( NULL ),
- longPressDetectors( NULL ),
- tapDetectors( NULL )
-{
+ if ( container.empty() )
+ {
+ gesturesRequired = GestureType::Value( gesturesRequired & ~type );
+ delete containerPtr;
+ containerPtr = NULL;
+ }
}
-ActorGestureData::~ActorGestureData()
+GestureDetectorContainer& ActorGestureData::GetGestureDetectorContainer( GestureType::Value type )
{
- delete panDetectors;
- delete pinchDetectors;
- delete longPressDetectors;
- delete tapDetectors;
+ return *GetContainerPtr( type );
}
-void ActorGestureData::AddGestureDetector( GestureDetector& detector )
+GestureDetectorContainer*& ActorGestureData::GetContainerPtr( GestureType::Value type )
{
- const Gesture::Type type( detector.GetType() );
switch ( type )
{
- case Gesture::Pan:
- {
- AddDetector< PanGestureDetector, PanGestureDetectorContainer >( panDetectors, &detector, gesturesRequired );
- break;
- }
-
- case Gesture::Pinch:
- {
- AddDetector< PinchGestureDetector, PinchGestureDetectorContainer >( pinchDetectors, &detector, gesturesRequired );
- break;
- }
-
- case Gesture::LongPress:
+ case GestureType::PAN:
{
- AddDetector< LongPressGestureDetector, LongPressGestureDetectorContainer >( longPressDetectors, &detector, gesturesRequired );
- break;
+ return panDetectors;
}
- case Gesture::Tap:
+ case GestureType::PINCH:
{
- AddDetector< TapGestureDetector, TapGestureDetectorContainer >( tapDetectors, &detector, gesturesRequired );
- break;
+ return pinchDetectors;
}
- }
-}
-void ActorGestureData::RemoveGestureDetector( GestureDetector& detector )
-{
- switch ( detector.GetType() )
- {
- case Gesture::Pan:
+ case GestureType::LONG_PRESS:
{
- RemoveDetector< PanGestureDetectorContainer >( panDetectors, &detector, gesturesRequired );
- break;
+ return longPressDetectors;
}
- case Gesture::Pinch:
+ case GestureType::TAP:
{
- RemoveDetector< PinchGestureDetectorContainer >( pinchDetectors, &detector, gesturesRequired );
- break;
+ return tapDetectors;
}
- case Gesture::LongPress:
+ case GestureType::ROTATION:
{
- RemoveDetector< LongPressGestureDetectorContainer >( longPressDetectors, &detector, gesturesRequired );
- break;
- }
-
- case Gesture::Tap:
- {
- RemoveDetector< TapGestureDetectorContainer >( tapDetectors, &detector, gesturesRequired );
- break;
+ return rotationDetectors;
}
}
+
+ DALI_ASSERT_DEBUG( ! "Invalid Type" );
+ static GestureDetectorContainer* invalidType( NULL );
+ return invalidType;
}
} // namespace Internal