/* * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // EXTERNAL INCLUDES #include #include // INTERNAL INCLUDES #include "frame-callback.h" using namespace Dali; using namespace Dali::Toolkit; namespace { const char * IMAGE_NAME = DEMO_IMAGE_DIR "application-icon-1.png"; const char * TEXT_ENABLED( "FrameCallback: ON" ); const char * TEXT_DISABLED( "FrameCallback: OFF" ); Vector4 TEXT_COLOR_ENABLED( Color::BLACK ); Vector4 TEXT_COLOR_DISABLED( Color::RED ); float ANIMATION_TIME( 4.0f ); float ANIMATION_PROGRESS_MULTIPLIER( 0.02f ); } // unnamed namespace /** * @brief An example of how to set/unset the FrameCallbackInterface in DALi. * * Creates a scene with several image-views which are animated from side-to-side. * With the frame-callback enabled, the image-views' sizes expand as they hits the sides and the opacity * changes to transparent as they go to the middle. */ class FrameCallbackController : public ConnectionTracker { public: /** * @brief Constructor. * @param[in] application The application. */ FrameCallbackController( Application& application ) : mApplication( application ), mFrameCallback(), mTextLabel(), mTapDetector(), mFrameCallbackEnabled( false ) { // Connect to the Application's Init signal mApplication.InitSignal().Connect( this, &FrameCallbackController::Create ); } private: /** * @brief Creates the scene. * * Creates several image-views and places them appropriately. * Animate all image-views. * Set the FrameCallbackInterface on the window. * Tapping on the window enables/disables the FrameCallback. */ void Create( Application& application ) { // Set the window background color and connect to the window's key signal to allow Back and Escape to exit. Window window = application.GetWindow(); window.SetBackgroundColor( Color::WHITE ); window.KeyEventSignal().Connect( this, &FrameCallbackController::OnKeyEvent ); // Notify mFrameCallback about the window width. // Can call methods in mFrameCallback directly as we have not set it on the window yet. Vector2 windowSize = window.GetSize(); mFrameCallback.SetWindowWidth( windowSize.width ); // Detect taps on the root layer. mTapDetector = TapGestureDetector::New(); mTapDetector.Attach( window.GetRootLayer() ); mTapDetector.DetectedSignal().Connect( this, &FrameCallbackController::OnTap ); // Create some key-frames to be used by all animations. KeyFrames keyFrames = KeyFrames::New(); keyFrames.Add( 0.0f, 0.0f ); keyFrames.Add( 0.25f, windowSize.width * 0.5f ); keyFrames.Add( 0.75f, -windowSize.width * 0.5f ); keyFrames.Add( 1.0f, 0.0f ); float yPos = 0.0f; for( int i = 0; yPos < windowSize.height; ++i ) { ImageView imageView = ImageView::New( IMAGE_NAME ); imageView.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER ); imageView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER ); imageView.SetProperty( Actor::Property::POSITION_Y, yPos ); yPos += imageView.GetNaturalSize().height; // Add the ID of the created ImageView to mFrameCallback. // Again, can call methods in mFrameCallback directly as we have not set it on the window yet. mFrameCallback.AddId( imageView.GetProperty< int >( Actor::Property::ID ) ); window.Add( imageView ); // Create an animation and set the progress so that each image starts at a different point. Animation animation = Animation::New( ANIMATION_TIME ); animation.SetLooping( true ); animation.AnimateBetween( Property( imageView, Actor::Property::POSITION_X ), keyFrames ); animation.SetCurrentProgress( std::min( 1.0f, ANIMATION_PROGRESS_MULTIPLIER * i ) ); animation.Play(); } // Create a text-label to display whether the FrameCallback is enabled/disabled. mTextLabel = TextLabel::New( TEXT_ENABLED ); mTextLabel.SetProperty( TextLabel::Property::TEXT_COLOR, TEXT_COLOR_ENABLED ); mTextLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); mTextLabel.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); mTextLabel.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); window.Add( mTextLabel ); // Set the FrameCallbackInterface on the root layer. DevelStage::AddFrameCallback( Stage::GetCurrent(), mFrameCallback, window.GetRootLayer() ); mFrameCallbackEnabled = true; } /** * @brief Called when a tap on the window occurs. * * Toggle enabling/disabling of the FrameCallbackInterface */ void OnTap( Actor actor, const TapGesture& /* tap */ ) { if( mFrameCallbackEnabled ) { DevelStage::RemoveFrameCallback( Stage::GetCurrent(), mFrameCallback ); mTextLabel.SetProperty( TextLabel::Property::TEXT, TEXT_DISABLED ); mTextLabel.SetProperty( TextLabel::Property::TEXT_COLOR, TEXT_COLOR_DISABLED ); } else { DevelStage::AddFrameCallback( Stage::GetCurrent(), mFrameCallback, actor ); mTextLabel.SetProperty( TextLabel::Property::TEXT, TEXT_ENABLED ); mTextLabel.SetProperty( TextLabel::Property::TEXT_COLOR, TEXT_COLOR_ENABLED ); } mFrameCallbackEnabled = !mFrameCallbackEnabled; } /** * @brief Called when any key event is received * * Will use this to quit the application if Back or the Escape key is received * @param[in] event The key event information */ void OnKeyEvent( const KeyEvent& event ) { if( event.GetState() == KeyEvent::Down ) { if ( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) ) { mApplication.Quit(); } } } private: Application& mApplication; ///< A reference to the application instance. FrameCallback mFrameCallback; ///< An instance of our implementation of the FrameCallbackInterface. TextLabel mTextLabel; ///< Text label which shows whether the frame-callback is enabled/disabled. TapGestureDetector mTapDetector; ///< Tap detector to enable/disable the FrameCallbackInterface. bool mFrameCallbackEnabled; ///< Stores whether the FrameCallbackInterface is enabled/disabled. }; int DALI_EXPORT_API main( int argc, char **argv ) { Application application = Application::New( &argc, &argv ); FrameCallbackController controller( application ); application.MainLoop(); return 0; }