Text Message Field example changed to a Text Scrolling demo
[platform/core/uifw/dali-demo.git] / examples / text-scrolling / text-scrolling-example.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 /**
19  * @file text-scrolling-example.cpp
20  * @brief Shows text labels with scrolling text and allows a text label and text field control to be scrolled vertically
21  */
22
23 // EXTERNAL INCLUDES
24 #include <dali-toolkit/dali-toolkit.h>
25
26 using namespace Dali;
27 using namespace Dali::Toolkit;
28
29 namespace
30 {
31 const char* DESKTOP_IMAGE( DEMO_IMAGE_DIR "woodEffect.jpg" );
32 const Vector2 DESKTOP_SIZE( Vector2( 1440.f, 1600.f ) );
33 const Vector2 BOX_SIZE( Vector2(330.0f, 80.0f ) );
34 const Vector2 SCROLLING_BOX_SIZE( Vector2(330.0f, 40.0f ) );
35 const float MAX_OFFSCREEN_RENDERING_SIZE = 2048.f;
36 const float SCREEN_BORDER = 5.0f; // Border around screen that Popups and handles will not exceed
37
38 enum Labels
39 {
40   SMALL = 1u,
41   RTL = 1u << 1,
42   LARGE = 1u << 2,
43   RTL_LONG = 1u << 4,
44   NONE = 1u << 6,
45 };
46 }
47 /**
48  * @brief The main class of the demo.
49  */
50 class TextScrollingExample : public ConnectionTracker
51 {
52 public:
53
54   TextScrollingExample( Application& application )
55   : mApplication( application ),
56     mTargetActorPosition(),
57     mTargetActorSize()
58   {
59     // Connect to the Application's Init signal
60     mApplication.InitSignal().Connect( this, &TextScrollingExample::Create );
61   }
62
63   ~TextScrollingExample()
64   {
65     // Nothing to do here.
66   }
67
68
69   void CreateBox( const std::string& name, Actor& box, Actor parent, const Vector2& size )
70   {
71     box.SetName(name);
72     box.SetAnchorPoint( AnchorPoint::CENTER );
73     box.SetParentOrigin( ParentOrigin::CENTER );
74     box.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::HEIGHT );
75     box.SetResizePolicy( ResizePolicy::FIXED, Dimension::WIDTH );
76     box.SetSize( size.width, 0.f );
77     parent.Add( box );
78
79     Dali::Property::Map border;
80     border.Insert( "rendererType",  "border" );
81     border.Insert( "borderColor",  Color::WHITE );
82     border.Insert( "borderSize",  1.f );
83     box.SetProperty( Control::Property::BACKGROUND, border );
84   }
85
86   void CreateLabel( Actor& label, const std::string text, Actor parent, bool scrollOnStart, PushButton button )
87   {
88     label = TextLabel::New( text );
89     label.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
90     label.SetResizePolicy( ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT );
91     label.SetPadding( Padding( 1.0f, 1.0f, 1.0f, 1.0f ) );
92     label.SetAnchorPoint( AnchorPoint::CENTER );
93     label.SetParentOrigin( ParentOrigin::CENTER );
94     parent.Add( label );
95
96     if ( scrollOnStart )
97     {
98       label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
99     }
100
101     button.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
102     button.SetSize(BOX_SIZE.height,BOX_SIZE.height);
103     button.SetParentOrigin( ParentOrigin::TOP_RIGHT );
104     button.SetAnchorPoint( AnchorPoint::TOP_LEFT );
105     parent.Add(button);
106   }
107
108
109   /**
110    * One-time setup in response to Application InitSignal.
111    */
112   void Create( Application& application )
113   {
114     Stage stage = Stage::GetCurrent();
115     mStageSize = stage.GetSize();
116
117     stage.KeyEventSignal().Connect(this, &TextScrollingExample::OnKeyEvent);
118
119     // Create Root actor
120     Actor rootActor = Actor::New();
121     rootActor.SetName("rootActor");
122     rootActor.SetResizePolicy( ResizePolicy::FIXED,  Dimension::ALL_DIMENSIONS );
123     rootActor.SetSize( mStageSize );
124     rootActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
125
126     stage.Add( rootActor );
127
128     const Size mTargetActorSize( mStageSize.width, DESKTOP_SIZE.height );
129
130     // Create Desktop
131     ImageView desktop = ImageView::New( DESKTOP_IMAGE );
132     desktop.SetName("desktopActor");
133     desktop.SetAnchorPoint( AnchorPoint::TOP_LEFT );
134     desktop.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
135     desktop.SetSize( mTargetActorSize );
136
137     rootActor.Add( desktop ); // Add desktop (content) to offscreen actor
138
139     // Create Boxes
140     Control boxA = Control::New();
141     Control boxB = Control::New();
142     Control boxC = Control::New();
143     Control boxD = Control::New();
144     Control boxE = Control::New();
145
146     CreateBox( "boxA", boxA, desktop, BOX_SIZE );
147     boxA.SetPosition( 0.0f, -500.0f, 1.0f );
148
149     // Create TextField
150     TextField field = TextField::New();
151     field.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
152     field.SetPadding( Padding( 1.0f, 1.0f, 1.0f, 1.0f ) );
153     field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
154     field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Enter Folder Name" );
155     field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( SCREEN_BORDER, SCREEN_BORDER, mStageSize.width - SCREEN_BORDER*2, mStageSize.height - SCREEN_BORDER*2 ) );
156     boxA.Add( field );
157     boxA.SetSize(BOX_SIZE);
158
159     CreateBox( "boxB", boxB, desktop, SCROLLING_BOX_SIZE );
160     boxB.SetPosition( 0.0f, -400.0f, 1.0f );
161     Toolkit::PushButton scrollLargeButton = Toolkit::PushButton::New();
162     scrollLargeButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedLarge );
163     CreateLabel( mLargeLabel, "A Quick Brown Fox Jumps Over The Lazy Dog", boxB, false ,scrollLargeButton );
164
165
166     CreateBox( "boxC", boxC, desktop, SCROLLING_BOX_SIZE );
167     boxC.SetPosition( 0.0f, -300.0f, 1.0f );
168     Toolkit::PushButton scrollSmallButton = Toolkit::PushButton::New();
169     scrollSmallButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedSmall );
170     CreateLabel( mSmallLabel, "A Quick Brown Fox", boxC , true, scrollSmallButton );
171     mSmallLabel.SetProperty( TextLabel::Property::TEXT_COLOR, Color::WHITE );
172     mSmallLabel.SetProperty( TextLabel::Property::SHADOW_OFFSET, Vector2( 1.0f, 1.0f ) );
173     mSmallLabel.SetProperty( TextLabel::Property::SHADOW_COLOR, Color::BLACK );
174
175     CreateBox( "boxD", boxD, desktop, SCROLLING_BOX_SIZE );
176     boxD.SetPosition( 0.0f, -200.0f, 1.0f );
177     Toolkit::PushButton scrollRtlButton = Toolkit::PushButton::New();
178     scrollRtlButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedRtl );
179     CreateLabel( mRtlLabel, "مرحبا بالعالم", boxD , true, scrollRtlButton );
180
181     CreateBox( "boxE", boxE, desktop, SCROLLING_BOX_SIZE );
182     boxE.SetPosition( 0.0f, -100.0f, 1.0f );
183     Toolkit::PushButton scrollRtlLongButton = Toolkit::PushButton::New();
184     scrollRtlLongButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedRtlLong );
185     CreateLabel( mRtlLongLabel, " مرحبا بالعالم مرحبا بالعالم مرحبا بالعالم", boxE , false, scrollRtlLongButton );
186
187
188     mPanGestureDetector = PanGestureDetector::New();
189     mPanGestureDetector.DetectedSignal().Connect(this, &TextScrollingExample::OnPanGesture );
190     mPanGestureDetector.Attach( desktop );
191   }
192
193   void EnableScrolling( Labels labels )
194     {
195       Actor label;
196       switch( labels )
197       {
198         case LARGE:
199         {
200           label = mLargeLabel;
201           break;
202         }
203         case RTL:
204         {
205           label = mRtlLabel;
206           break;
207         }
208         case SMALL:
209         {
210           label = mSmallLabel;
211           break;
212         }
213         case RTL_LONG:
214         {
215           label = mRtlLongLabel;
216           break;
217         }
218         case NONE:
219         {
220           return;
221         }
222       }
223
224       if ( labels != NONE )
225       {
226         Property::Value value = label.GetProperty( TextLabel::Property::ENABLE_AUTO_SCROLL);
227         if (value.Get< bool >())
228         {
229           label.SetProperty( TextLabel::Property::ENABLE_AUTO_SCROLL, false  );
230         }
231         else
232         {
233           label.SetProperty( TextLabel::Property::ENABLE_AUTO_SCROLL, true  );
234         }
235       }
236     }
237
238   bool OnButtonClickedSmall( Toolkit::Button button )
239   {
240     EnableScrolling( SMALL );
241     return true;
242   }
243
244   bool OnButtonClickedLarge( Toolkit::Button button )
245   {
246     EnableScrolling( LARGE );
247     return true;
248   }
249
250   bool OnButtonClickedRtl( Toolkit::Button button )
251   {
252     EnableScrolling( RTL );
253     return true;
254   }
255
256   bool OnButtonClickedRtlLong( Toolkit::Button button )
257   {
258     EnableScrolling( RTL_LONG );
259     return true;
260   }
261
262   /**
263    * Main key event handler
264    */
265   void OnKeyEvent(const KeyEvent& event)
266   {
267     if(event.state == KeyEvent::Down)
268     {
269       if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
270       {
271         mApplication.Quit();
272       }
273     }
274   }
275
276   void OnPanGesture( Actor actor, const PanGesture& gesture )
277   {
278     if( gesture.state == Gesture::Continuing )
279     {
280       Vector2 position = Vector2( gesture.displacement );
281       mTargetActorPosition.y = mTargetActorPosition.y + position.y;
282       mTargetActorPosition.y = std::min( mTargetActorPosition.y, -mTargetActorSize.height );
283       mTargetActorPosition.y = std::max( mTargetActorPosition.y, ( mTargetActorSize.height - mStageSize.height*0.25f ) );
284       actor.SetPosition( 0.0f, mTargetActorPosition.y );
285     }
286   }
287
288 private:
289
290   Application& mApplication;
291   PanGestureDetector mPanGestureDetector;
292
293   Vector2 mTargetActorPosition;
294   Vector2 mTargetActorSize;
295   Vector2 mStageSize;
296
297   TextLabel mLargeLabel;
298   TextLabel mSmallLabel;
299   TextLabel mRtlLabel;
300   TextLabel mRtlLongLabel;
301 };
302
303 void RunTest( Application& application )
304 {
305   TextScrollingExample test( application );
306
307   application.MainLoop();
308 }
309
310 /** Entry point for Linux & Tizen applications */
311 int DALI_EXPORT_API main( int argc, char **argv )
312 {
313   Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
314
315   RunTest( application );
316
317   return 0;
318 }