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