Added support for Rotation Gestures
[platform/core/uifw/dali-core.git] / dali / internal / event / events / actor-gesture-data.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/event/events/actor-gesture-data.h>
20
21 namespace Dali
22 {
23
24 namespace Internal
25 {
26
27 ActorGestureData::ActorGestureData()
28 : gesturesRequired( DevelGesture::Type( 0 ) ),
29   panDetectors( nullptr ),
30   pinchDetectors( nullptr ),
31   longPressDetectors( nullptr ),
32   tapDetectors( nullptr ),
33   rotationDetectors( nullptr )
34 {
35 }
36
37 ActorGestureData::~ActorGestureData()
38 {
39   delete panDetectors;
40   delete pinchDetectors;
41   delete longPressDetectors;
42   delete tapDetectors;
43   delete rotationDetectors;
44 }
45
46 void ActorGestureData::AddGestureDetector( GestureDetector& detector )
47 {
48   const DevelGesture::Type type( detector.GetType() );
49
50   GestureDetectorContainer*& containerPtr( GetContainerPtr( type ) );
51   if ( NULL == containerPtr )
52   {
53     containerPtr = new GestureDetectorContainer;
54   }
55   containerPtr->push_back( &detector );
56
57   gesturesRequired = DevelGesture::Type( gesturesRequired | type );
58 }
59
60 void ActorGestureData::RemoveGestureDetector( GestureDetector& detector )
61 {
62   const DevelGesture::Type type( detector.GetType() );
63
64   GestureDetectorContainer*& containerPtr( GetContainerPtr( type ) );
65   DALI_ASSERT_DEBUG( containerPtr && "Container had not been created" );
66
67   GestureDetectorContainer& container( *containerPtr );
68   GestureDetectorContainer::iterator match( std::remove( container.begin(), container.end(), &detector ) );
69   DALI_ASSERT_DEBUG( match != container.end() && "Actor does not have the detector" );
70   container.erase( match, container.end() );
71
72   if ( container.empty() )
73   {
74     gesturesRequired = DevelGesture::Type( gesturesRequired & ~type );
75     delete containerPtr;
76     containerPtr = NULL;
77   }
78 }
79
80 GestureDetectorContainer& ActorGestureData::GetGestureDetectorContainer( DevelGesture::Type type )
81 {
82   return *GetContainerPtr( type );
83 }
84
85 GestureDetectorContainer*& ActorGestureData::GetContainerPtr( DevelGesture::Type type )
86 {
87   switch ( type )
88   {
89     case DevelGesture::Pan:
90     {
91       return panDetectors;
92     }
93
94     case DevelGesture::Pinch:
95     {
96       return pinchDetectors;
97     }
98
99     case DevelGesture::LongPress:
100     {
101       return longPressDetectors;
102     }
103
104     case DevelGesture::Tap:
105     {
106       return tapDetectors;
107     }
108
109     case DevelGesture::Rotation:
110     {
111       return rotationDetectors;
112     }
113   }
114
115   DALI_ASSERT_DEBUG( ! "Invalid Type" );
116   static GestureDetectorContainer* invalidType( NULL );
117   return invalidType;
118 }
119
120 } // namespace Internal
121
122 } // namespace Dali
123