DALi Version 2.1.31
[platform/core/uifw/dali-demo.git] / examples / scene-loader / scene-loader-extension.h
1 /*\r
2  * Copyright (c) 2022 Samsung Electronics Co., Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  *\r
16  */\r
17 \r
18 #include <dali-toolkit/dali-toolkit.h>\r
19 #include <dali/dali.h>\r
20 #include <cstring>\r
21 \r
22 class SceneLoaderExtension : public Dali::ConnectionTracker\r
23 {\r
24 public:\r
25   SceneLoaderExtension()\r
26   : mSceneLoader(nullptr),\r
27     mCurrentAnimationIndex(ANIMATION_IDLE)\r
28   {\r
29   }\r
30 \r
31   ~SceneLoaderExtension() = default; // Nothing to do in destructor\r
32 \r
33   void SetSceneLoader(SceneLoaderExample* sceneLoader)\r
34   {\r
35     mSceneLoader = sceneLoader;\r
36   }\r
37 \r
38   void ConnectTouchSignals()\r
39   {\r
40     // This is a temporary hack for now to manually connect these signals.\r
41     // We should connect these signals automatically when loading the scene.\r
42 \r
43     if(mSceneLoader)\r
44     {\r
45       ConnectTouchSignal(ICON_IDLE);\r
46       ConnectTouchSignal(ICON_SQUAT);\r
47       ConnectTouchSignal(ICON_JUMPING_JACK);\r
48       ConnectTouchSignal(ICON_LUNGE);\r
49     }\r
50   }\r
51 \r
52   void OnKey(const Dali::KeyEvent& e)\r
53   {\r
54     // This is a temporary hack for now to manually handle these key events.\r
55     // We should links them to the animations automatically when loading the scene.\r
56 \r
57     switch(e.GetKeyCode())\r
58     {\r
59       case KEY_ONE:\r
60       {\r
61         PlaySceneAnimation(ANIMATION_IDLE);\r
62         break;\r
63       }\r
64       case KEY_TWO:\r
65       {\r
66         PlaySceneAnimation(ANIMATION_IDLE_TO_SQUAT);\r
67         break;\r
68       }\r
69       case KEY_THREE:\r
70       {\r
71         PlaySceneAnimation(ANIMATION_IDLE_TO_JUMPING_JACK);\r
72         break;\r
73       }\r
74       case KEY_FOUR:\r
75       {\r
76         PlaySceneAnimation(ANIMATION_IDLE_TO_LUNGE);\r
77         break;\r
78       }\r
79       default:\r
80         break;\r
81     }\r
82   }\r
83 \r
84 private:\r
85   bool PlaySceneAnimation(unsigned int animationIndex)\r
86   {\r
87     if(mSceneLoader && mSceneLoader->mScene)\r
88     {\r
89       if(mSceneLoader->mCurrentAnimation &&\r
90          mCurrentAnimationIndex != ANIMATION_IDLE &&\r
91          mSceneLoader->mCurrentAnimation.GetState() != Dali::Animation::STOPPED)\r
92       {\r
93         return false;\r
94       }\r
95 \r
96       auto root     = mSceneLoader->mScene;\r
97       auto getActor = [&root](const std::string& name) {\r
98         return root.FindChildByName(name);\r
99       };\r
100 \r
101       if(mSceneLoader->mSceneAnimations.size() > animationIndex)\r
102       {\r
103         mCurrentAnimationIndex          = animationIndex;\r
104         mSceneLoader->mCurrentAnimation = mSceneLoader->mSceneAnimations[animationIndex].ReAnimate(getActor);\r
105         mSceneLoader->mCurrentAnimation.FinishedSignal().Connect(this, &SceneLoaderExtension::OnAnimationFinished);\r
106         mSceneLoader->mCurrentAnimation.Play();\r
107       }\r
108     }\r
109 \r
110     return true;\r
111   }\r
112 \r
113   void ConnectTouchSignal(const std::string actorName)\r
114   {\r
115     if(mSceneLoader && mSceneLoader->mScene)\r
116     {\r
117       auto actor = mSceneLoader->mScene.FindChildByName(actorName);\r
118       if(actor)\r
119       {\r
120         actor.TouchedSignal().Connect(this, &SceneLoaderExtension::OnTouch);\r
121       }\r
122     }\r
123   }\r
124 \r
125   void OnAnimationFinished(Dali::Animation& source)\r
126   {\r
127     switch(mCurrentAnimationIndex)\r
128     {\r
129       case ANIMATION_IDLE_TO_SQUAT:\r
130       {\r
131         PlaySceneAnimation(ANIMATION_SQUAT_TO_IDLE);\r
132         break;\r
133       }\r
134       case ANIMATION_IDLE_TO_JUMPING_JACK:\r
135       {\r
136         PlaySceneAnimation(ANIMATION_JUMPING_JACK);\r
137         break;\r
138       }\r
139       case ANIMATION_JUMPING_JACK:\r
140       {\r
141         PlaySceneAnimation(ANIMATION_JUMPING_JACK_TO_IDLE);\r
142         break;\r
143       }\r
144       case ANIMATION_IDLE_TO_LUNGE:\r
145       {\r
146         PlaySceneAnimation(ANIMATION_LUNGE);\r
147         break;\r
148       }\r
149       case ANIMATION_LUNGE:\r
150       {\r
151         PlaySceneAnimation(ANIMATION_LUNGE_TO_IDLE);\r
152         break;\r
153       }\r
154       default:\r
155       {\r
156         mCurrentAnimationIndex = ANIMATION_IDLE;\r
157         break;\r
158       }\r
159       break;\r
160     }\r
161   }\r
162 \r
163   bool OnTouch(Dali::Actor actor, const Dali::TouchEvent& touch)\r
164   {\r
165     bool processed = false;\r
166 \r
167     if(touch.GetPointCount() > 0)\r
168     {\r
169       if(touch.GetState(0) == Dali::PointState::DOWN)\r
170       {\r
171         auto actorName = actor.GetProperty<std::string>(Dali::Actor::Property::NAME);\r
172 \r
173         if(ICON_IDLE == actorName)\r
174         {\r
175           processed = PlaySceneAnimation(ANIMATION_IDLE);\r
176         }\r
177         else if(ICON_SQUAT == actorName)\r
178         {\r
179           processed = PlaySceneAnimation(ANIMATION_IDLE_TO_SQUAT);\r
180         }\r
181         else if(ICON_JUMPING_JACK == actorName)\r
182         {\r
183           processed = PlaySceneAnimation(ANIMATION_IDLE_TO_JUMPING_JACK);\r
184         }\r
185         else if(ICON_LUNGE == actorName)\r
186         {\r
187           processed = PlaySceneAnimation(ANIMATION_IDLE_TO_LUNGE);\r
188         }\r
189       }\r
190     }\r
191     return processed;\r
192   }\r
193 \r
194 private:\r
195   static constexpr unsigned int KEY_ONE   = 10;\r
196   static constexpr unsigned int KEY_TWO   = 11;\r
197   static constexpr unsigned int KEY_THREE = 12;\r
198   static constexpr unsigned int KEY_FOUR  = 13;\r
199 \r
200   // Idle animation\r
201   static constexpr unsigned int ANIMATION_IDLE = 0;\r
202   // Squat animation\r
203   static constexpr unsigned int ANIMATION_IDLE_TO_SQUAT = 3;\r
204   static constexpr unsigned int ANIMATION_SQUAT_TO_IDLE = 15;\r
205   // JumpingJack animation\r
206   static constexpr unsigned int ANIMATION_IDLE_TO_JUMPING_JACK = 1;\r
207   static constexpr unsigned int ANIMATION_JUMPING_JACK         = 5;\r
208   static constexpr unsigned int ANIMATION_JUMPING_JACK_TO_IDLE = 6;\r
209   // Lunge animation\r
210   static constexpr unsigned int ANIMATION_IDLE_TO_LUNGE = 2;\r
211   static constexpr unsigned int ANIMATION_LUNGE         = 9;\r
212   static constexpr unsigned int ANIMATION_LUNGE_TO_IDLE = 10;\r
213 \r
214   inline static const std::string ICON_IDLE         = "Idle";\r
215   inline static const std::string ICON_SQUAT        = "Squat";\r
216   inline static const std::string ICON_JUMPING_JACK = "JumpingJack";\r
217   inline static const std::string ICON_LUNGE        = "Lunge";\r
218 \r
219   SceneLoaderExample* mSceneLoader;\r
220   unsigned int        mCurrentAnimationIndex;\r
221 };\r