2 * Copyright (c) 2017 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.
18 #include <dali/dali.h>
19 #include <dali-toolkit/dali-toolkit.h>
20 #include <dali-toolkit/devel-api/controls/buttons/button-devel.h>
23 using namespace Toolkit;
27 const int SEEK_POS( 5000 );
28 const int INIT_WIDTH( 600 );
29 const int INIT_HEIGHT( 400 );
30 const int BUTTON_SIZE( 80 );
32 const char* const PLAY_FILE = DEMO_VIDEO_DIR "demoVideo.mp4";
33 const char* const PLAY_IMAGE = DEMO_IMAGE_DIR "icon-play.png";
34 const char* const PAUSE_IMAGE = DEMO_IMAGE_DIR "Pause.png";
35 const char* const STOP_IMAGE = DEMO_IMAGE_DIR "icon-stop.png";
36 const char* const RESET_IMAGE = DEMO_IMAGE_DIR "icon-reset.png";
37 const char* const FORWARD_IMAGE = DEMO_IMAGE_DIR "Forward.png";
38 const char* const BACKWARD_IMAGE = DEMO_IMAGE_DIR "Backward.png";
42 class VideoViewController: public ConnectionTracker
46 VideoViewController( Application& application )
47 : mApplication( application ),
50 mIsFullScreen( false ),
52 mPinchStartScale( 1.0f )
54 // Connect to the Application's Init signal
55 mApplication.InitSignal().Connect( this, &VideoViewController::Create );
58 ~VideoViewController()
63 void Create( Application& application )
65 mStageSize = Stage::GetCurrent().GetSize();
67 mVideoView = Toolkit::VideoView::New();
68 Stage::GetCurrent().Add( mVideoView );
69 mVideoView.SetParentOrigin( ParentOrigin::CENTER );
70 mVideoView.SetAnchorPoint( AnchorPoint::CENTER );
71 mVideoView.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
72 mVideoView.SetSize( INIT_WIDTH, INIT_HEIGHT );
73 mVideoView.SetProperty( VideoView::Property::LOOPING, true );
74 mVideoView.SetProperty( VideoView::Property::MUTED, false );
75 mVideoView.SetProperty( VideoView::Property::VIDEO, PLAY_FILE );
78 mMenu.SetParentOrigin( ParentOrigin::BOTTOM_LEFT );
79 mMenu.SetAnchorPoint( AnchorPoint::BOTTOM_LEFT );
80 mMenu.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
81 mMenu.SetSize( INIT_WIDTH, 120 );
82 mVideoView.Add( mMenu );
84 mPlayButton = PushButton::New();
85 mPlayButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
86 mPlayButton.SetAnchorPoint( AnchorPoint::TOP_LEFT );
87 mPlayButton.SetName( "Play" );
88 mPlayButton.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
89 mPlayButton.SetSize( BUTTON_SIZE, BUTTON_SIZE );
90 mPlayButton.SetPosition( 40, 10 );
91 mPlayButton.ClickedSignal().Connect( this, &VideoViewController::OnButtonClicked );
93 mPauseButton = PushButton::New();
94 mPauseButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
95 mPauseButton.SetAnchorPoint( AnchorPoint::TOP_LEFT );
96 mPauseButton.SetName( "Pause" );
97 mPauseButton.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
98 mPauseButton.SetSize( BUTTON_SIZE, BUTTON_SIZE );
99 mPauseButton.SetPosition( 40, 10 );
100 mPauseButton.ClickedSignal().Connect( this, &VideoViewController::OnButtonClicked );
102 mStopButton = PushButton::New();
103 mStopButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
104 mStopButton.SetAnchorPoint( AnchorPoint::TOP_LEFT );
105 mStopButton.SetName( "Stop" );
106 mStopButton.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
107 mStopButton.SetSize( BUTTON_SIZE, BUTTON_SIZE );
108 mStopButton.SetPosition( 140, 10 );
109 mStopButton.ClickedSignal().Connect( this, &VideoViewController::OnButtonClicked );
111 mResetButton = PushButton::New();
112 mResetButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
113 mResetButton.SetAnchorPoint( AnchorPoint::TOP_LEFT );
114 mResetButton.SetName( "Reset" );
115 mResetButton.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
116 mResetButton.SetSize( BUTTON_SIZE, BUTTON_SIZE );
117 mResetButton.SetPosition( 140, 10 );
118 mResetButton.ClickedSignal().Connect( this, &VideoViewController::OnButtonClicked );
120 mBackwardButton = PushButton::New();
121 mBackwardButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
122 mBackwardButton.SetAnchorPoint( AnchorPoint::TOP_LEFT );
123 mBackwardButton.SetName( "Backward" );
124 mBackwardButton.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
125 mBackwardButton.SetSize( BUTTON_SIZE, BUTTON_SIZE );
126 mBackwardButton.SetPosition( 240, 10 );
127 mBackwardButton.ClickedSignal().Connect( this, &VideoViewController::OnButtonClicked );
129 mForwardButton = PushButton::New();
130 mForwardButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
131 mForwardButton.SetAnchorPoint( AnchorPoint::TOP_LEFT );
132 mForwardButton.SetName( "Forward" );
133 mForwardButton.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
134 mForwardButton.SetSize( BUTTON_SIZE, BUTTON_SIZE );
135 mForwardButton.SetPosition( 340, 10 );
136 mForwardButton.ClickedSignal().Connect( this, &VideoViewController::OnButtonClicked );
138 mMenu.Add( mPlayButton );
139 mMenu.Add( mPauseButton );
140 mMenu.Add( mStopButton );
141 mMenu.Add( mResetButton );
142 mMenu.Add( mBackwardButton );
143 mMenu.Add( mForwardButton );
145 mPauseButton.SetVisible( false );
146 mPauseButton.SetProperty( Button::Property::DISABLED, true );
147 mPlayButton.SetVisible( true );
148 mPlayButton.SetProperty( Button::Property::DISABLED, false );
149 mStopButton.SetVisible( true );
150 mStopButton.SetProperty( Button::Property::DISABLED, false );
151 mResetButton.SetVisible( false );
152 mResetButton.SetProperty( Button::Property::DISABLED, true );
154 mPlayButton.SetProperty( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, PLAY_IMAGE );
155 mPlayButton.SetProperty( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, PLAY_IMAGE );
156 mPauseButton.SetProperty( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, PAUSE_IMAGE );
157 mPauseButton.SetProperty( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, PAUSE_IMAGE );
159 mStopButton.SetProperty( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, STOP_IMAGE );
160 mStopButton.SetProperty( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, STOP_IMAGE );
161 mResetButton.SetProperty( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, RESET_IMAGE );
162 mResetButton.SetProperty( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, RESET_IMAGE );
164 mBackwardButton.SetProperty( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, BACKWARD_IMAGE );
165 mBackwardButton.SetProperty( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, BACKWARD_IMAGE );
166 mForwardButton.SetProperty( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, FORWARD_IMAGE );
167 mForwardButton.SetProperty( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, FORWARD_IMAGE );
169 mPanGestureDetector = PanGestureDetector::New();
170 mPanGestureDetector.Attach( mVideoView );
171 mPanGestureDetector.DetectedSignal().Connect( this, &VideoViewController::OnPan );
173 mPinchGestureDetector = PinchGestureDetector::New();
174 mPinchGestureDetector.Attach( mVideoView );
175 mPinchGestureDetector.DetectedSignal().Connect( this, &VideoViewController::OnPinch );
177 mTapGestureDetector = TapGestureDetector::New();
178 mTapGestureDetector.Attach( mVideoView );
179 mTapGestureDetector.DetectedSignal().Connect( this, &VideoViewController::OnTap );
181 mRotationAnimation = Animation::New(2.f);
182 mRotationAnimation.AnimateBy( Property(mVideoView, Actor::Property::ORIENTATION), Quaternion(Degree(0.f), Degree(360.f), Degree(0.f)) );
183 mRotationAnimation.SetLooping(false);
185 Stage::GetCurrent().KeyEventSignal().Connect( this, &VideoViewController::OnKeyEvent );
187 mWindowSurfaceTarget.Insert( "RENDERING_TARGET", "windowSurfaceTarget" );
188 mNativeImageTarget.Insert( "RENDERING_TARGET", "nativeImageTarget" );
190 mVideoView.FinishedSignal().Connect( this, &VideoViewController::OnFinished );
193 bool OnButtonClicked( Button button )
196 if( mPauseButton.GetId() == button.GetId())
200 mPauseButton.SetVisible( false );
201 mPauseButton.SetProperty( Button::Property::DISABLED, true );
202 mPlayButton.SetVisible( true );
203 mPlayButton.SetProperty( Button::Property::DISABLED, false );
209 else if( mPlayButton.GetId() == button.GetId())
216 mPauseButton.SetVisible( true );
217 mPauseButton.SetProperty( Button::Property::DISABLED, false );
218 mPlayButton.SetVisible( false );
219 mPlayButton.SetProperty( Button::Property::DISABLED, true );
224 else if( mResetButton.GetId() == button.GetId())
228 mPauseButton.SetVisible( true );
229 mPauseButton.SetProperty( Button::Property::DISABLED, false );
230 mPlayButton.SetVisible( false );
231 mPlayButton.SetProperty( Button::Property::DISABLED, true );
232 mResetButton.SetVisible( false );
233 mResetButton.SetProperty( Button::Property::DISABLED, true );
234 mStopButton.SetVisible( true );
235 mStopButton.SetProperty( Button::Property::DISABLED, false );
239 mVideoView.SetProperty( VideoView::Property::VIDEO, PLAY_FILE );
243 else if( mStopButton.GetId() == button.GetId())
245 mPauseButton.SetVisible( false );
246 mPauseButton.SetProperty( Button::Property::DISABLED, true );
247 mPlayButton.SetVisible( true );
248 mPlayButton.SetProperty( Button::Property::DISABLED, false );
249 mResetButton.SetVisible( true );
250 mPlayButton.SetProperty( Button::Property::DISABLED, false );
251 mStopButton.SetVisible( false );
252 mStopButton.SetProperty( Button::Property::DISABLED, true );
257 else if( mBackwardButton.GetId() == button.GetId())
259 mVideoView.Backward( SEEK_POS );
261 else if( mForwardButton.GetId() == button.GetId())
263 mVideoView.Forward( SEEK_POS );
269 void OnFinished( VideoView& view )
273 mRotationAnimation.Play();
278 void OnPan( Actor actor, const PanGesture& gesture )
280 if( !mIsFullScreen && gesture.state == Gesture::Continuing )
282 mVideoView.TranslateBy( Vector3( gesture.displacement ) );
286 void OnPinch( Actor actor, const PinchGesture& gesture )
288 if( gesture.state == Gesture::Started )
290 mPinchStartScale = mScale;
293 if( gesture.state == Gesture::Finished )
295 mScale = mPinchStartScale * gesture.scale;
298 mVideoView.SetSize( mStageSize.x, mStageSize.y );
299 mVideoView.SetProperty( VideoView::Property::VIDEO, mWindowSurfaceTarget );
300 mMenu.SetSize( mStageSize.x, 120 );
301 mIsFullScreen = true;
305 mVideoView.SetSize( INIT_WIDTH, INIT_HEIGHT );
306 mVideoView.SetProperty( VideoView::Property::VIDEO, mNativeImageTarget );
307 mMenu.SetSize( INIT_WIDTH, 120 );
308 mIsFullScreen = false;
313 void OnTap( Actor actor, const TapGesture& tapGesture )
317 mRotationAnimation.Play();
324 * Main key event handler
326 void OnKeyEvent(const KeyEvent& event)
328 if(event.state == KeyEvent::Down)
330 if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
338 Application& mApplication;
339 VideoView mVideoView;
347 PushButton mPlayButton;
348 PushButton mPauseButton;
349 PushButton mStopButton;
350 PushButton mResetButton;
351 PushButton mBackwardButton;
352 PushButton mForwardButton;
354 PanGestureDetector mPanGestureDetector;
355 PinchGestureDetector mPinchGestureDetector;
356 TapGestureDetector mTapGestureDetector;
358 float mPinchStartScale;
360 Animation mRotationAnimation;
361 Property::Map mWindowSurfaceTarget;
362 Property::Map mNativeImageTarget;
365 void RunTest( Application& application )
367 VideoViewController test( application );
369 application.MainLoop();
372 // Entry point for Linux & Tizen applications
374 int DALI_EXPORT_API main( int argc, char **argv )
376 Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
378 RunTest( application );