Changes after TouchedSignal changes
[platform/core/uifw/dali-demo.git] / examples / bubble-effect / bubble-effect-example.cpp
index 4575ee2..a668384 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * 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.
 
 #include <dali/dali.h>
 #include <dali-toolkit/dali-toolkit.h>
+#include <dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h>
 #include "shared/view.h"
+#include "shared/utility.h"
 
 using namespace Dali;
 
 namespace
 {
-const char * const TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" );
+const char * const TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" );
 const char * const APPLICATION_TITLE( "Bubble Effect" );
-const char * const CHANGE_BACKGROUND_ICON( DALI_IMAGE_DIR "icon-change.png" );
-const char * const CHANGE_BUBBLE_SHAPE_ICON( DALI_IMAGE_DIR "icon-replace.png" );
+const char * const CHANGE_BACKGROUND_ICON( DEMO_IMAGE_DIR "icon-change.png" );
+const char * const CHANGE_BACKGROUND_ICON_SELECTED( DEMO_IMAGE_DIR "icon-change-selected.png" );
+const char * const CHANGE_BUBBLE_SHAPE_ICON( DEMO_IMAGE_DIR "icon-replace.png" );
+const char * const CHANGE_BUBBLE_SHAPE_ICON_SELECTED( DEMO_IMAGE_DIR "icon-replace-selected.png" );
 
 const char* BACKGROUND_IMAGES[]=
 {
-  DALI_IMAGE_DIR "background-1.jpg",
-  DALI_IMAGE_DIR "background-2.jpg",
-  DALI_IMAGE_DIR "background-3.jpg",
-  DALI_IMAGE_DIR "background-4.jpg",
-  DALI_IMAGE_DIR "background-5.jpg",
+  DEMO_IMAGE_DIR "background-1.jpg",
+  DEMO_IMAGE_DIR "background-2.jpg",
+  DEMO_IMAGE_DIR "background-3.jpg",
+  DEMO_IMAGE_DIR "background-4.jpg",
+  DEMO_IMAGE_DIR "background-5.jpg",
 };
 const unsigned int NUM_BACKGROUND_IMAGES( sizeof( BACKGROUND_IMAGES ) / sizeof( BACKGROUND_IMAGES[0] ) );
 
 const char* BUBBLE_SHAPE_IMAGES[] =
 {
-  DALI_IMAGE_DIR "bubble-ball.png",
-  DALI_IMAGE_DIR "icon-item-view-layout-spiral.png",
-  DALI_IMAGE_DIR "icon-replace.png",
-  DALI_IMAGE_DIR "icon-effect-cross.png"
+  DEMO_IMAGE_DIR "bubble-ball.png",
+  DEMO_IMAGE_DIR "icon-effect-cross.png",
+  DEMO_IMAGE_DIR "icon-item-view-layout-spiral.png",
+  DEMO_IMAGE_DIR "icon-replace.png"
 };
 const unsigned int NUM_BUBBLE_SHAPE_IMAGES( sizeof( BUBBLE_SHAPE_IMAGES ) / sizeof( BUBBLE_SHAPE_IMAGES[0] ) );
 
 const Vector2 DEFAULT_BUBBLE_SIZE( 10.f, 30.f );
 const unsigned int DEFAULT_NUMBER_OF_BUBBLES( 1000 );
 
-/**
- * @brief Load an image, scaled-down to no more than the stage dimensions.
- *
- * Uses image scaling mode FittingMode::SCALE_TO_FILL to resize the image at
- * load time to cover the entire stage with pixels with no borders,
- * and filter mode BOX_THEN_LINEAR to sample the image with
- * maximum quality.
- */
-ResourceImage LoadStageFillingImage( const char * const imagePath )
-{
-  Size stageSize = Stage::GetCurrent().GetSize();
-  return ResourceImage::New( imagePath, Dali::ImageDimensions( stageSize.x, stageSize.y ), Dali::FittingMode::SCALE_TO_FILL, Dali::SamplingMode::BOX_THEN_LINEAR );
-}
-
 }// end LOCAL_STUFF
 
-// This example shows the usage of BubbleEmitter which displays lots of moving bubbles on the stage.
+// This example shows the usage of BubbleEmitter which displays lots of moving bubbles on the window.
 class BubbleEffectExample : public ConnectionTracker
 {
 public:
   BubbleEffectExample(Application &app)
   : mApp(app),
+    mBackground(),
+    mBubbleEmitter(),
+    mEmitAnimation(),
+    mChangeBackgroundButton(),
+    mChangeBubbleShapeButton(),
+    mTimerForBubbleEmission(),
     mHSVDelta( Vector3( 0.f, 0.f, 0.5f ) ),
-    mNeedNewAnimation( true ),
+    mCurrentTouchPosition(),
+    mEmitPosition(),
+    mAnimateComponentCount( 0 ),
+    mNonMovementCount( 0 ),
     mTimerInterval( 16 ),
     mCurrentBackgroundImageId( 0 ),
-    mCurrentBubbleShapeImageId( 0 )
+    mCurrentBubbleShapeImageId( 0 ),
+    mNeedNewAnimation( true )
   {
     // Connect to the Application's Init signal
     app.InitSignal().Connect(this, &BubbleEffectExample::Create);
@@ -91,19 +91,16 @@ private:
   // The Init signal is received once (only) during the Application lifetime
   void Create(Application& app)
   {
-    DemoHelper::RequestThemeChange();
+    Window window = app.GetWindow();
+    Vector2 windowSize = window.GetSize();
 
-    Stage stage = Stage::GetCurrent();
-    Vector2 stageSize = stage.GetSize();
-
-    stage.KeyEventSignal().Connect(this, &BubbleEffectExample::OnKeyEvent);
+    window.KeyEventSignal().Connect(this, &BubbleEffectExample::OnKeyEvent);
 
     // Creates a default view with a default tool bar.
-    // The view is added to the stage.
+    // The view is added to the window.
     Toolkit::ToolBar toolBar;
-    Toolkit::Control    view;
     Layer content = DemoHelper::CreateView( app,
-                                            view,
+                                            mBackground,
                                             toolBar,
                                             "",
                                             TOOLBAR_IMAGE,
@@ -111,45 +108,46 @@ private:
 
     // Add a button to change background. (right of toolbar)
     mChangeBackgroundButton = Toolkit::PushButton::New();
-    mChangeBackgroundButton.SetBackgroundImage( ResourceImage::New( CHANGE_BACKGROUND_ICON ) );
+    mChangeBackgroundButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, CHANGE_BACKGROUND_ICON );
+    mChangeBackgroundButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, CHANGE_BACKGROUND_ICON_SELECTED );
     mChangeBackgroundButton.ClickedSignal().Connect( this, &BubbleEffectExample::OnChangeIconClicked );
     toolBar.AddControl( mChangeBackgroundButton,
                         DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage,
-                        Toolkit::Alignment::HorizontalRight,
+                        Toolkit::Alignment::HORIZONTAL_RIGHT,
                         DemoHelper::DEFAULT_MODE_SWITCH_PADDING  );
     // Add a button to change bubble shape. ( left of bar )
     mChangeBubbleShapeButton = Toolkit::PushButton::New();
-    mChangeBubbleShapeButton.SetBackgroundImage( ResourceImage::New( CHANGE_BUBBLE_SHAPE_ICON ) );
+    mChangeBubbleShapeButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, CHANGE_BUBBLE_SHAPE_ICON );
+    mChangeBubbleShapeButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, CHANGE_BUBBLE_SHAPE_ICON_SELECTED );
     mChangeBubbleShapeButton.ClickedSignal().Connect( this, &BubbleEffectExample::OnChangeIconClicked );
     toolBar.AddControl( mChangeBubbleShapeButton,
                         DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage,
-                        Toolkit::Alignment::HorizontalLeft,
+                        Toolkit::Alignment::HORIZONTAL_LEFT,
                         DemoHelper::DEFAULT_MODE_SWITCH_PADDING  );
 
     // Create and initialize the BubbleEmitter object
-    mBubbleEmitter = Toolkit::BubbleEmitter::New( stageSize,
-                                                  ResourceImage::New( BUBBLE_SHAPE_IMAGES[mCurrentBubbleShapeImageId] ),
+    mBubbleEmitter = Toolkit::BubbleEmitter::New( windowSize,
+                                                  DemoHelper::LoadTexture( BUBBLE_SHAPE_IMAGES[mCurrentBubbleShapeImageId] ),
                                                   DEFAULT_NUMBER_OF_BUBBLES,
                                                   DEFAULT_BUBBLE_SIZE);
-    mBackgroundImage = LoadStageFillingImage( BACKGROUND_IMAGES[mCurrentBackgroundImageId] );
-    mBubbleEmitter.SetBackground( mBackgroundImage, mHSVDelta );
 
-    // Get the root actor of all bubbles, and add it to stage.
+    mBubbleEmitter.SetBackground( DemoHelper::LoadWindowFillingTexture( window.GetSize(), BACKGROUND_IMAGES[mCurrentBackgroundImageId] ), mHSVDelta );
+
+    // Get the root actor of all bubbles, and add it to window.
     Actor bubbleRoot = mBubbleEmitter.GetRootActor();
-    bubbleRoot.SetParentOrigin(ParentOrigin::CENTER);
-    bubbleRoot.SetZ(0.1f); // Make sure the bubbles displayed on top og the background.
+    bubbleRoot.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
+    bubbleRoot.SetProperty( Actor::Property::POSITION_Z, 0.1f); // Make sure the bubbles displayed on top og the background.
     content.Add( bubbleRoot );
 
-    // Add the background image actor to stage
-    view.SetBackgroundImage( mBackgroundImage );
-    mBackgroundActor = ImageActor::DownCast( view.GetBackgroundActor() );
+    // Set the application background
+    mBackground.SetProperty( Toolkit::Control::Property::BACKGROUND, BACKGROUND_IMAGES[ mCurrentBackgroundImageId ] );
 
     // Set up the timer to emit bubble regularly when the finger is touched down but not moved
     mTimerForBubbleEmission = Timer::New( mTimerInterval );
     mTimerForBubbleEmission.TickSignal().Connect(this, &BubbleEffectExample::OnTimerTick);
 
     // Connect the callback to the touch signal on the background
-    mBackgroundActor.TouchedSignal().Connect( this, &BubbleEffectExample::OnTouch );
+    mBackground.TouchedSignal().Connect( this, &BubbleEffectExample::OnTouch );
   }
 
 
@@ -157,7 +155,7 @@ private:
  * Emit bubbles
  *****************/
 
-  // Set up the animation of emitting bubbles, to be efficient, every animation controls multiple bubbles ( 4 here )
+  // Set up the animation of emitting bubbles, to be efficient, every animation controls multiple emission ( 4 here )
   void SetUpAnimation( Vector2 emitPosition, Vector2 direction )
   {
     if( mNeedNewAnimation )
@@ -206,22 +204,20 @@ private:
   // Callback function of the touch signal on the background
   bool OnTouch(Dali::Actor actor, const Dali::TouchEvent& event)
   {
-    const TouchPoint &point = event.GetPoint(0);
-    switch(point.state)
+    switch( event.GetState( 0 ) )
     {
-      case TouchPoint::Down:
+      case PointState::DOWN:
       {
-        mCurrentTouchPosition = point.screen;
-        mEmitPosition = point.screen;
+        mCurrentTouchPosition = mEmitPosition = event.GetScreenPosition( 0 );
         mTimerForBubbleEmission.Start();
         mNonMovementCount = 0;
 
         break;
       }
-      case TouchPoint::Motion:
+      case PointState::MOTION:
       {
-        Vector2 displacement = point.screen - mCurrentTouchPosition;
-        mCurrentTouchPosition = point.screen;
+        Vector2 displacement = event.GetScreenPosition( 0 ) - mCurrentTouchPosition;
+        mCurrentTouchPosition = event.GetScreenPosition( 0 );
         //emit multiple bubbles along the moving direction when the finger moves quickly
         float step = std::min(5.f, displacement.Length());
         for( float i=0.25f; i<step; i=i+1.f)
@@ -230,15 +226,17 @@ private:
         }
         break;
       }
-      case TouchPoint::Up:
-      case TouchPoint::Leave:
-      case TouchPoint::Interrupted:
+      case PointState::UP:
+      case PointState::LEAVE:
+      case PointState::INTERRUPTED:
       {
         mTimerForBubbleEmission.Stop();
+        mEmitAnimation.Play();
+        mNeedNewAnimation = true;
+        mAnimateComponentCount = 0;
         break;
       }
-      case TouchPoint::Stationary:
-      case TouchPoint::Last:
+      case PointState::STATIONARY:
       default:
       {
         break;
@@ -252,15 +250,17 @@ private:
   {
     if(button == mChangeBackgroundButton)
     {
-      mBackgroundImage = LoadStageFillingImage( BACKGROUND_IMAGES[ ++mCurrentBackgroundImageId % NUM_BACKGROUND_IMAGES  ] );
+      mCurrentBackgroundImageId = (mCurrentBackgroundImageId+1) % NUM_BACKGROUND_IMAGES;
 
-      mBubbleEmitter.SetBackground( mBackgroundImage, mHSVDelta );
+      //Update bubble emitter background
+      mBubbleEmitter.SetBackground( DemoHelper::LoadWindowFillingTexture( mApp.GetWindow().GetSize(), BACKGROUND_IMAGES[ mCurrentBackgroundImageId  ] ), mHSVDelta );
 
-      mBackgroundActor.SetImage( mBackgroundImage );
+      // Set the application background
+      mBackground.SetProperty( Toolkit::Control::Property::BACKGROUND, BACKGROUND_IMAGES[ mCurrentBackgroundImageId ] );
     }
     else if( button == mChangeBubbleShapeButton )
     {
-      mBubbleEmitter.SetShapeImage( ResourceImage::New( BUBBLE_SHAPE_IMAGES[ ++mCurrentBubbleShapeImageId % NUM_BUBBLE_SHAPE_IMAGES ] ) );
+      mBubbleEmitter.SetBubbleShape( DemoHelper::LoadTexture( BUBBLE_SHAPE_IMAGES[ ++mCurrentBubbleShapeImageId % NUM_BUBBLE_SHAPE_IMAGES ] ) );
     }
     return true;
   }
@@ -270,7 +270,7 @@ private:
    */
   void OnKeyEvent(const KeyEvent& event)
   {
-    if(event.state == KeyEvent::Down)
+    if(event.GetState() == KeyEvent::DOWN)
     {
       if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
       {
@@ -282,49 +282,33 @@ private:
 private:
 
   Application&               mApp;
-  Image                      mBackgroundImage;
-  ImageActor                 mBackgroundActor;
+  Dali::Toolkit::Control     mBackground;
 
   Toolkit::BubbleEmitter     mBubbleEmitter;
-  Vector3                    mHSVDelta;
-
   Animation                  mEmitAnimation;
-  unsigned int               mAnimateComponentCount;
-  bool                       mNeedNewAnimation;
-
+  Toolkit::PushButton        mChangeBackgroundButton;
+  Toolkit::PushButton        mChangeBubbleShapeButton;
   Timer                      mTimerForBubbleEmission;
-  unsigned int               mNonMovementCount;
-  unsigned int               mTimerInterval;
 
+  Vector3                    mHSVDelta;
   Vector2                    mCurrentTouchPosition;
   Vector2                    mEmitPosition;
 
-  Toolkit::PushButton        mChangeBackgroundButton;
-  Toolkit::PushButton        mChangeBubbleShapeButton;
+  unsigned int               mAnimateComponentCount;
+  unsigned int               mNonMovementCount;
+  unsigned int               mTimerInterval;
   unsigned int               mCurrentBackgroundImageId;
   unsigned int               mCurrentBubbleShapeImageId;
+
+  bool                       mNeedNewAnimation;
 };
 
 /*****************************************************************************/
 
-static void
-RunTest(Application& app)
+int DALI_EXPORT_API main(int argc, char **argv)
 {
+  Application app = Application::New(&argc, &argv, DEMO_THEME_PATH);
   BubbleEffectExample theApp(app);
   app.MainLoop();
-}
-
-/*****************************************************************************/
-
-int
-main(int argc, char **argv)
-{
-  Application app = Application::New(&argc, &argv);
-
-  RunTest(app);
-
   return 0;
 }
-
-
-