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