Using migrated Public Visual API
[platform/core/uifw/dali-demo.git] / examples / visual-transitions / transition-application.cpp
1 /*
2  * Copyright (c) 2017 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  * @file transition-application.cpp
19  * @brief Application class for showing stylable transitions
20  */
21
22 // Class include
23 #include "transition-application.h"
24
25 // External includes
26 #include <dali-toolkit/dali-toolkit.h>
27 #include "beat-control.h"
28 #include <cstdio>
29 #include <sstream>
30
31 // Internal includes
32
33 using namespace Dali;
34 using namespace Dali::Toolkit;
35
36 namespace
37 {
38
39 void SetLabelText( Button button, const char* label )
40 {
41   button.SetProperty( Toolkit::Button::Property::LABEL, label );
42 }
43
44 }
45
46 namespace Demo
47 {
48
49 const char* TransitionApplication::DEMO_THEME_ONE_PATH( DEMO_STYLE_DIR "style-example-theme-one.json" );
50 const char* DALI_LOGO_PATH( DEMO_IMAGE_DIR "Logo-for-demo.png" );
51 const char* DALI_ROBOT_MODEL_PATH( DEMO_MODEL_DIR "ToyRobot-Metal.obj" );
52 const char* DALI_ROBOT_MATERIAL_PATH( DEMO_MODEL_DIR "ToyRobot-Metal.mtl" );
53
54 TransitionApplication::TransitionApplication( Application& application )
55 : mApplication( application ),
56   mTitle(),
57   mBeatControl(),
58   mActionButtons(),
59   mVisualIndex( Property::INVALID_INDEX ),
60   mActionIndex( Property::INVALID_INDEX )
61 {
62   application.InitSignal().Connect( this, &TransitionApplication::Create );
63 }
64
65 TransitionApplication::~TransitionApplication()
66 {
67 }
68
69 void TransitionApplication::Create( Application& application )
70 {
71   Stage stage = Stage::GetCurrent();
72   stage.KeyEventSignal().Connect(this, &TransitionApplication::OnKeyEvent);
73   stage.SetBackgroundColor( Vector4( 0.1f, 0.1f, 0.1f, 1.0f ) );
74
75   // Hide the indicator bar
76   application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
77
78   // Content panes:
79   TableView contentLayout = TableView::New( 4, 1 );
80   contentLayout.SetName("ContentLayout");
81   contentLayout.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
82   contentLayout.SetAnchorPoint( AnchorPoint::TOP_LEFT );
83   contentLayout.SetParentOrigin( ParentOrigin::TOP_LEFT );
84   contentLayout.SetCellPadding( Vector2( 0.0f, 5.0f ) );
85
86   // Assign all rows the size negotiation property of fitting to children
87
88   stage.Add( contentLayout );
89
90   mTitle = TextLabel::New( "Custom Control Transition Example" );
91   mTitle.SetName( "Title" );
92   mTitle.SetStyleName("Title");
93   mTitle.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
94   mTitle.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT );
95   mTitle.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
96   contentLayout.Add( mTitle );
97   contentLayout.SetFitHeight(0); // Fill width
98
99   mBeatControl = BeatControl::New();
100   mBeatControl.SetName("BeatControl");
101   mBeatControl.SetProperty( BeatControl::Property::BEAT_VISUAL, Property::Map()
102                             .Add( Visual::Property::TRANSFORM, Property::Map()
103                                   .Add( Visual::Transform::Property::SIZE, Vector2(0.5f, 0.5f) ) ) );
104
105   mBeatControl.SetAnchorPoint( AnchorPoint::CENTER );
106   mBeatControl.SetParentOrigin( ParentOrigin::CENTER );
107   mBeatControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
108   contentLayout.Add( mBeatControl );
109   // beat control should fill the tableview cell, so no change to default parameters
110
111   TableView visualTypeLayout = TableView::New( 1, NUMBER_OF_VISUAL_BUTTONS );
112   visualTypeLayout.SetName("VisualTypeLayout");
113   visualTypeLayout.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
114   visualTypeLayout.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::HEIGHT );
115   visualTypeLayout.SetFitHeight( 0 );
116
117   contentLayout.Add( visualTypeLayout );
118   contentLayout.SetFitHeight(2);
119
120   for( int i=0; i<NUMBER_OF_VISUAL_BUTTONS; ++i )
121   {
122     Property::Map map;
123     CreateVisualMap( i, map );
124     map.Add( Visual::Property::TRANSFORM, Property::Map()
125              .Add( Visual::Transform::Property::SIZE, Vector2(0.8f, 0.8f) )  );
126     mVisualButtons[i] = BeatControl::New();
127     mVisualButtons[i].SetProperty( BeatControl::Property::BEAT_VISUAL, map );
128     mVisualButtons[i].SetName("VisualButton");
129     mVisualButtons[i].SetStyleName("VisualButton");
130     mVisualButtons[i].SetSize(0, 50);
131     mVisualButtons[i].SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
132     mVisualButtons[i].SetResizePolicy( ResizePolicy::FIXED, Dimension::HEIGHT );
133     mVisualIndex = mVisualButtons[i].RegisterProperty( "visualId", i, Property::READ_WRITE );
134     mVisualButtons[i].TouchSignal().Connect( this, &TransitionApplication::OnVisualButtonClicked );
135     visualTypeLayout.AddChild( mVisualButtons[i], TableView::CellPosition( 0, i ) );
136   }
137
138   TableView actionButtonLayout = TableView::New( 1, NUMBER_OF_ACTION_BUTTONS+1 );
139   actionButtonLayout.SetName("ThemeButtonsLayout");
140   actionButtonLayout.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
141   actionButtonLayout.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::HEIGHT );
142   actionButtonLayout.SetFitHeight( 0 );
143
144   TextLabel label = TextLabel::New( "Action: ");
145   label.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
146   label.SetStyleName("ActionLabel");
147   actionButtonLayout.AddChild( label, TableView::CellPosition( 0, 0 ) );
148   actionButtonLayout.SetCellAlignment( TableView::CellPosition( 0, 0 ), HorizontalAlignment::LEFT, VerticalAlignment::CENTER );
149
150   for( int i=0; i<NUMBER_OF_ACTION_BUTTONS; ++i )
151   {
152     mActionButtons[i] = PushButton::New();
153     mActionButtons[i].SetName("ActionButton");
154     mActionButtons[i].SetStyleName("ActionButton");
155     mActionButtons[i].SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
156     mActionButtons[i].SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT );
157     mActionIndex = mActionButtons[i].RegisterProperty( "actionId", i, Property::READ_WRITE );
158     mActionButtons[i].ClickedSignal().Connect( this, &TransitionApplication::OnActionButtonClicked );
159     actionButtonLayout.AddChild( mActionButtons[i], TableView::CellPosition( 0, 1+i ) );
160   }
161
162   SetLabelText( mActionButtons[0], "Bounce" );
163   SetLabelText( mActionButtons[1], "X" );
164   SetLabelText( mActionButtons[2], "Y" );
165   SetLabelText( mActionButtons[3], "Fade" );
166
167   contentLayout.Add( actionButtonLayout );
168   contentLayout.SetFitHeight(3);
169 }
170
171 void TransitionApplication::CreateVisualMap( int index, Property::Map& map )
172 {
173   switch(index)
174   {
175     case 0:
176     {
177       map[ Toolkit::Visual::Property::TYPE ] = Visual::COLOR;
178       map[ ColorVisual::Property::MIX_COLOR ] = Color::YELLOW;
179       break;
180     }
181     case 1:
182     {
183       map[ Toolkit::Visual::Property::TYPE ] = Visual::BORDER;
184       map[ BorderVisual::Property::COLOR ] = Color::GREEN;
185       map[ BorderVisual::Property::SIZE ] = 5;
186       break;
187     }
188     case 2:
189     {
190       map[ Toolkit::Visual::Property::TYPE ] = Visual::GRADIENT;
191
192       Property::Array stopOffsets;
193       stopOffsets.PushBack( 0.0f );
194       stopOffsets.PushBack( 0.3f );
195       stopOffsets.PushBack( 0.6f );
196       stopOffsets.PushBack( 0.8f );
197       stopOffsets.PushBack( 1.0f );
198       map[ GradientVisual::Property::STOP_OFFSET ] = stopOffsets;
199
200       Property::Array stopColors;
201       stopColors.PushBack( Vector4( 129.f, 198.f, 193.f, 255.f )/255.f );
202       stopColors.PushBack( Vector4( 196.f, 198.f, 71.f, 122.f )/255.f );
203       stopColors.PushBack( Vector4( 214.f, 37.f, 139.f, 191.f )/255.f );
204       stopColors.PushBack( Vector4( 129.f, 198.f, 193.f, 150.f )/255.f );
205       stopColors.PushBack( Color::YELLOW );
206       map[ GradientVisual::Property::STOP_COLOR ] = stopColors;
207       map[ GradientVisual::Property::START_POSITION ] = Vector2(-0.5f, -0.5f );
208       map[ GradientVisual::Property::END_POSITION ] = Vector2( 0.5f,  0.5f );
209       break;
210     }
211     case 3:
212     {
213       map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
214       map[ ImageVisual::Property::URL ] = DALI_LOGO_PATH;
215       break;
216     }
217     case 4:
218     {
219       map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
220       map[ ImageVisual::Property::URL ] = DEMO_IMAGE_DIR "preMultAlpha.png";
221       map[ Visual::Property::PREMULTIPLIED_ALPHA ] = true;
222       break;
223     }
224
225     case 5:
226     {
227       map[ Toolkit::Visual::Property::TYPE ] = Visual::MESH;
228       map[ MeshVisual::Property::OBJECT_URL ] = DALI_ROBOT_MODEL_PATH;
229       map[ MeshVisual::Property::MATERIAL_URL ] = DALI_ROBOT_MATERIAL_PATH;
230       map[ MeshVisual::Property::TEXTURES_PATH ] = DEMO_IMAGE_DIR;
231       map[ MeshVisual::Property::SHADING_MODE ] = MeshVisual::ShadingMode::TEXTURED_WITH_DETAILED_SPECULAR_LIGHTING;
232       break;
233     }
234
235     case 6:
236     {
237       map[ Toolkit::Visual::Property::TYPE ] = Visual::PRIMITIVE;
238
239       map[ PrimitiveVisual::Property::SHAPE ] = PrimitiveVisual::Shape::BEVELLED_CUBE;
240       map[ PrimitiveVisual::Property::BEVEL_PERCENTAGE ] = 0.3f;
241       map[ PrimitiveVisual::Property::BEVEL_SMOOTHNESS ] = 0.0f;
242       map[ PrimitiveVisual::Property::SCALE_DIMENSIONS ] = Vector3(1.0f,1.0f,0.3f);
243       map[ PrimitiveVisual::Property::MIX_COLOR ]        = Vector4(0.7f, 0.5f, 0.05f, 1.0f);
244
245       break;
246     }
247
248     case 7:
249     {
250       // NPatch
251       map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
252       map[ ImageVisual::Property::URL ] = DEMO_IMAGE_DIR "button-up-16.9.png";
253       break;
254     }
255     case 8:
256     {
257       // SVG
258       map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
259       map[ ImageVisual::Property::URL ] = DEMO_IMAGE_DIR "Kid1.svg";
260       break;
261     }
262
263     case 9:
264     {
265       map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT;
266       map[ TextVisual::Property::TEXT ] = "Text";
267       map[ TextVisual::Property::TEXT_COLOR ] = Color::CYAN;
268       map[ TextVisual::Property::POINT_SIZE ] = 10;
269       break;
270     }
271
272     default:
273     {
274       map[ Toolkit::Visual::Property::TYPE ] = Visual::COLOR;
275       map[ ColorVisual::Property::MIX_COLOR ] = Color::MAGENTA;
276       break;
277     }
278   }
279 }
280
281 bool TransitionApplication::OnVisualButtonClicked( Actor actor, const TouchData& touchData )
282 {
283   if( touchData.GetState(0) == PointState::FINISHED )
284   {
285     int visual = actor.GetProperty<int>( mVisualIndex );
286     Property::Map map;
287     CreateVisualMap( visual, map );
288     map.Add( Visual::Property::TRANSFORM, Property::Map()
289              .Add( Visual::Transform::Property::SIZE, Vector2( 0.5f, 0.5f ) ) );
290     mBeatControl.SetProperty( BeatControl::Property::BEAT_VISUAL, map );
291   }
292   return true;
293 }
294
295 bool TransitionApplication::OnActionButtonClicked( Button button )
296 {
297   int action = button.GetProperty<int>( mActionIndex );
298   switch( action )
299   {
300     case 0:
301     {
302       mBeatControl.StartBounceAnimation();
303       break;
304     }
305     case 1:
306     {
307       mBeatControl.StartXAnimation();
308       break;
309     }
310     case 2:
311     {
312       mBeatControl.StartYAnimation();
313       break;
314     }
315     case 3:
316     {
317       mBeatControl.StartFadeAnimation();
318       break;
319     }
320   }
321
322   return true;
323 }
324
325 void TransitionApplication::OnKeyEvent( const KeyEvent& keyEvent )
326 {
327   static int keyPressed = 0;
328
329   if( keyEvent.state == KeyEvent::Down)
330   {
331     if( keyPressed == 0 ) // Is this the first down event?
332     {
333       printf("Key pressed: %s %d\n", keyEvent.keyPressedName.c_str(), keyEvent.keyCode );
334
335       if( IsKey( keyEvent, DALI_KEY_ESCAPE) || IsKey( keyEvent, DALI_KEY_BACK ) )
336       {
337         mApplication.Quit();
338       }
339       else if( keyEvent.keyPressedName.compare("Return") == 0 )
340       {
341       }
342     }
343     keyPressed = 1;
344   }
345   else if( keyEvent.state == KeyEvent::Up )
346   {
347     keyPressed = 0;
348   }
349 }
350
351 } // namespace Demo