2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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
24 #include <dali-toolkit/dali-toolkit.h>
27 using namespace Dali::Toolkit;
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
48 * @brief The main class of the demo.
50 class TextScrollingExample : public ConnectionTracker
54 TextScrollingExample( Application& application )
55 : mApplication( application ),
56 mTargetActorPosition(),
59 // Connect to the Application's Init signal
60 mApplication.InitSignal().Connect( this, &TextScrollingExample::Create );
63 ~TextScrollingExample()
65 // Nothing to do here.
69 void CreateBox( const std::string& name, Actor& box, Actor parent, const Vector2& size )
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 );
79 Dali::Property::Map border;
80 border.Insert( Visual::Property::TYPE, Visual::BORDER );
81 border.Insert( BorderVisual::Property::COLOR, Color::WHITE );
82 border.Insert( BorderVisual::Property::SIZE, 1.f );
83 box.SetProperty( Control::Property::BACKGROUND, border );
86 void CreateLabel( Actor& label, const std::string text, Actor parent, bool scrollOnStart, PushButton button )
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 );
98 label.SetProperty(TextLabel::Property::ENABLE_AUTO_SCROLL, true);
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 );
110 * One-time setup in response to Application InitSignal.
112 void Create( Application& application )
114 Stage stage = Stage::GetCurrent();
115 mStageSize = stage.GetSize();
117 stage.KeyEventSignal().Connect(this, &TextScrollingExample::OnKeyEvent);
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 );
126 stage.Add( rootActor );
128 const Size mTargetActorSize( mStageSize.width, DESKTOP_SIZE.height );
131 ImageView desktop = ImageView::New();
132 Property::Map imageMap;
133 imageMap[ "url" ] = DESKTOP_IMAGE;
134 imageMap[ "synchronousLoading" ] = true;
135 desktop.SetProperty( ImageView::Property::IMAGE, imageMap );
136 desktop.SetName("desktopActor");
137 desktop.SetAnchorPoint( AnchorPoint::TOP_LEFT );
138 desktop.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
139 desktop.SetSize( mTargetActorSize );
141 rootActor.Add( desktop ); // Add desktop (content) to offscreen actor
144 Control boxA = Control::New();
145 Control boxB = Control::New();
146 Control boxC = Control::New();
147 Control boxD = Control::New();
148 Control boxE = Control::New();
150 CreateBox( "boxA", boxA, desktop, BOX_SIZE );
151 boxA.SetPosition( 0.0f, -500.0f, 1.0f );
154 TextField field = TextField::New();
155 field.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
156 field.SetPadding( Padding( 1.0f, 1.0f, 1.0f, 1.0f ) );
157 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
158 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Enter Folder Name" );
159 field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( SCREEN_BORDER, SCREEN_BORDER, mStageSize.width - SCREEN_BORDER*2, mStageSize.height - SCREEN_BORDER*2 ) );
161 boxA.SetSize(BOX_SIZE);
163 CreateBox( "boxB", boxB, desktop, SCROLLING_BOX_SIZE );
164 boxB.SetPosition( 0.0f, -400.0f, 1.0f );
165 Toolkit::PushButton scrollLargeButton = Toolkit::PushButton::New();
166 scrollLargeButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedLarge );
167 CreateLabel( mLargeLabel, "A Quick Brown Fox Jumps Over The Lazy Dog", boxB, false ,scrollLargeButton );
170 CreateBox( "boxC", boxC, desktop, SCROLLING_BOX_SIZE );
171 boxC.SetPosition( 0.0f, -300.0f, 1.0f );
172 Toolkit::PushButton scrollSmallButton = Toolkit::PushButton::New();
173 scrollSmallButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedSmall );
174 CreateLabel( mSmallLabel, "A Quick Brown Fox", boxC , true, scrollSmallButton );
175 mSmallLabel.SetProperty( TextLabel::Property::TEXT_COLOR, Color::WHITE );
176 mSmallLabel.SetProperty( TextLabel::Property::SHADOW_OFFSET, Vector2( 1.0f, 1.0f ) );
177 mSmallLabel.SetProperty( TextLabel::Property::SHADOW_COLOR, Color::BLACK );
179 CreateBox( "boxD", boxD, desktop, SCROLLING_BOX_SIZE );
180 boxD.SetPosition( 0.0f, -200.0f, 1.0f );
181 Toolkit::PushButton scrollRtlButton = Toolkit::PushButton::New();
182 scrollRtlButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedRtl );
183 CreateLabel( mRtlLabel, "مرحبا بالعالم", boxD , true, scrollRtlButton );
185 CreateBox( "boxE", boxE, desktop, SCROLLING_BOX_SIZE );
186 boxE.SetPosition( 0.0f, -100.0f, 1.0f );
187 Toolkit::PushButton scrollRtlLongButton = Toolkit::PushButton::New();
188 scrollRtlLongButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedRtlLong );
189 CreateLabel( mRtlLongLabel, " مرحبا بالعالم مرحبا بالعالم مرحبا بالعالم", boxE , false, scrollRtlLongButton );
192 mPanGestureDetector = PanGestureDetector::New();
193 mPanGestureDetector.DetectedSignal().Connect(this, &TextScrollingExample::OnPanGesture );
194 mPanGestureDetector.Attach( desktop );
197 void EnableScrolling( Labels labels )
219 label = mRtlLongLabel;
228 if ( labels != NONE )
230 Property::Value value = label.GetProperty( TextLabel::Property::ENABLE_AUTO_SCROLL);
231 if (value.Get< bool >())
233 label.SetProperty( TextLabel::Property::ENABLE_AUTO_SCROLL, false );
237 label.SetProperty( TextLabel::Property::ENABLE_AUTO_SCROLL, true );
242 bool OnButtonClickedSmall( Toolkit::Button button )
244 EnableScrolling( SMALL );
248 bool OnButtonClickedLarge( Toolkit::Button button )
250 EnableScrolling( LARGE );
254 bool OnButtonClickedRtl( Toolkit::Button button )
256 EnableScrolling( RTL );
260 bool OnButtonClickedRtlLong( Toolkit::Button button )
262 EnableScrolling( RTL_LONG );
267 * Main key event handler
269 void OnKeyEvent(const KeyEvent& event)
271 if(event.state == KeyEvent::Down)
273 if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
280 void OnPanGesture( Actor actor, const PanGesture& gesture )
282 if( gesture.state == Gesture::Continuing )
284 Vector2 position = Vector2( gesture.displacement );
285 mTargetActorPosition.y = mTargetActorPosition.y + position.y;
286 mTargetActorPosition.y = std::min( mTargetActorPosition.y, -mTargetActorSize.height );
287 mTargetActorPosition.y = std::max( mTargetActorPosition.y, ( mTargetActorSize.height - mStageSize.height*0.25f ) );
288 actor.SetPosition( 0.0f, mTargetActorPosition.y );
294 Application& mApplication;
295 PanGestureDetector mPanGestureDetector;
297 Vector2 mTargetActorPosition;
298 Vector2 mTargetActorSize;
301 TextLabel mLargeLabel;
302 TextLabel mSmallLabel;
304 TextLabel mRtlLongLabel;
307 void RunTest( Application& application )
309 TextScrollingExample test( application );
311 application.MainLoop();
314 /** Entry point for Linux & Tizen applications */
315 int DALI_EXPORT_API main( int argc, char **argv )
317 Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
319 RunTest( application );