Update demos to not use deprecated Button API
[platform/core/uifw/dali-demo.git] / examples / video-view / video-view-example.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 #include <dali/dali.h>
19 #include <dali-toolkit/dali-toolkit.h>
20 #include <dali-toolkit/devel-api/controls/buttons/button-devel.h>
21
22 using namespace Dali;
23 using namespace Toolkit;
24
25 namespace
26 {
27   const int SEEK_POS( 5000 );
28   const int INIT_WIDTH( 600 );
29   const int INIT_HEIGHT( 400 );
30   const int BUTTON_SIZE( 80 );
31
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";
39
40 }  // namespace
41
42 class VideoViewController: public ConnectionTracker
43 {
44  public:
45
46   VideoViewController( Application& application )
47     : mApplication( application ),
48       mIsPlay( false ),
49       mIsStop( false ),
50       mIsFullScreen( false ),
51       mScale( 1.f ),
52       mPinchStartScale( 1.0f )
53   {
54     // Connect to the Application's Init signal
55     mApplication.InitSignal().Connect( this, &VideoViewController::Create );
56   }
57
58   ~VideoViewController()
59   {
60     mVideoView.Stop();
61   }
62
63   void Create( Application& application )
64   {
65     mStageSize = Stage::GetCurrent().GetSize();
66
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 );
76
77     mMenu = Layer::New();
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 );
83
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 );
92
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 );
101
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 );
110
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 );
119
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 );
128
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 );
137
138     mMenu.Add( mPlayButton );
139     mMenu.Add( mPauseButton );
140     mMenu.Add( mStopButton );
141     mMenu.Add( mResetButton );
142     mMenu.Add( mBackwardButton );
143     mMenu.Add( mForwardButton );
144
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 );
153
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 );
158
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 );
163
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 );
168
169     mPanGestureDetector = PanGestureDetector::New();
170     mPanGestureDetector.Attach( mVideoView );
171     mPanGestureDetector.DetectedSignal().Connect( this, &VideoViewController::OnPan );
172
173     mPinchGestureDetector = PinchGestureDetector::New();
174     mPinchGestureDetector.Attach( mVideoView );
175     mPinchGestureDetector.DetectedSignal().Connect( this, &VideoViewController::OnPinch );
176
177     mTapGestureDetector = TapGestureDetector::New();
178     mTapGestureDetector.Attach( mVideoView );
179     mTapGestureDetector.DetectedSignal().Connect( this, &VideoViewController::OnTap );
180
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);
184
185     Stage::GetCurrent().KeyEventSignal().Connect( this, &VideoViewController::OnKeyEvent );
186
187     mWindowSurfaceTarget.Insert( "RENDERING_TARGET", "windowSurfaceTarget" );
188     mNativeImageTarget.Insert( "RENDERING_TARGET", "nativeImageTarget" );
189
190     mVideoView.FinishedSignal().Connect( this, &VideoViewController::OnFinished );
191   }
192
193   bool OnButtonClicked( Button button )
194   {
195
196     if( mPauseButton.GetId() == button.GetId())
197     {
198        if( mIsPlay )
199       {
200         mPauseButton.SetVisible( false );
201         mPauseButton.SetProperty( Button::Property::DISABLED, true );
202         mPlayButton.SetVisible( true );
203         mPlayButton.SetProperty( Button::Property::DISABLED, false );
204
205         mIsPlay = false;
206         mVideoView.Pause();
207       }
208     }
209     else if( mPlayButton.GetId() == button.GetId())
210     {
211       if( mIsStop )
212       {
213         return false;
214       }
215
216       mPauseButton.SetVisible( true );
217       mPauseButton.SetProperty( Button::Property::DISABLED, false );
218       mPlayButton.SetVisible( false );
219       mPlayButton.SetProperty( Button::Property::DISABLED, true );
220
221       mIsPlay = true;
222       mVideoView.Play();
223     }
224     else if( mResetButton.GetId() == button.GetId())
225     {
226       if( mIsStop )
227       {
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 );
236
237         mIsStop = false;
238         mIsPlay = true;
239         mVideoView.SetProperty( VideoView::Property::VIDEO, PLAY_FILE );
240         mVideoView.Play();
241       }
242     }
243     else if( mStopButton.GetId() == button.GetId())
244     {
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 );
253
254       mIsStop = true;
255       mVideoView.Stop();
256     }
257     else if( mBackwardButton.GetId() == button.GetId())
258     {
259       mVideoView.Backward( SEEK_POS );
260     }
261     else if( mForwardButton.GetId() == button.GetId())
262     {
263       mVideoView.Forward( SEEK_POS );
264     }
265
266     return true;
267   }
268
269   void OnFinished( VideoView& view )
270   {
271     if( !mIsFullScreen )
272     {
273       mRotationAnimation.Play();
274       mIsStop = true;
275     }
276   }
277
278   void OnPan( Actor actor, const PanGesture& gesture )
279   {
280     if( !mIsFullScreen && gesture.state == Gesture::Continuing )
281     {
282       mVideoView.TranslateBy( Vector3( gesture.displacement ) );
283     }
284   }
285
286   void OnPinch( Actor actor, const PinchGesture& gesture )
287   {
288     if( gesture.state == Gesture::Started )
289     {
290       mPinchStartScale = mScale;
291     }
292
293     if( gesture.state == Gesture::Finished )
294     {
295       mScale = mPinchStartScale * gesture.scale;
296       if( mScale > 1.f )
297       {
298         mVideoView.SetSize( mStageSize.x, mStageSize.y );
299         mVideoView.SetProperty( VideoView::Property::VIDEO, mWindowSurfaceTarget );
300         mMenu.SetSize( mStageSize.x, 120 );
301         mIsFullScreen = true;
302       }
303       else
304       {
305         mVideoView.SetSize( INIT_WIDTH, INIT_HEIGHT );
306         mVideoView.SetProperty( VideoView::Property::VIDEO, mNativeImageTarget );
307         mMenu.SetSize( INIT_WIDTH, 120 );
308         mIsFullScreen = false;
309       }
310     }
311   }
312
313   void OnTap( Actor actor, const TapGesture& tapGesture )
314   {
315     if( !mIsFullScreen )
316     {
317       mRotationAnimation.Play();
318     }
319   }
320
321 private:
322
323   /**
324    * Main key event handler
325    */
326   void OnKeyEvent(const KeyEvent& event)
327   {
328     if(event.state == KeyEvent::Down)
329     {
330       if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
331       {
332         mApplication.Quit();
333       }
334     }
335   }
336
337 private:
338   Application&  mApplication;
339   VideoView mVideoView;
340   Layer mMenu;
341   Vector2 mStageSize;
342
343   bool mIsPlay;
344   bool mIsStop;
345   bool mIsFullScreen;
346
347   PushButton mPlayButton;
348   PushButton mPauseButton;
349   PushButton mStopButton;
350   PushButton mResetButton;
351   PushButton mBackwardButton;
352   PushButton mForwardButton;
353
354   PanGestureDetector mPanGestureDetector;
355   PinchGestureDetector mPinchGestureDetector;
356   TapGestureDetector mTapGestureDetector;
357   float mScale;
358   float mPinchStartScale;
359
360   Animation mRotationAnimation;
361   Property::Map mWindowSurfaceTarget;
362   Property::Map mNativeImageTarget;
363 };
364
365 void RunTest( Application& application )
366 {
367   VideoViewController test( application );
368
369   application.MainLoop();
370 }
371
372 // Entry point for Linux & Tizen applications
373 //
374 int DALI_EXPORT_API main( int argc, char **argv )
375 {
376   Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
377
378   RunTest( application );
379
380   return 0;
381 }