Updated demos to use DALi clang-format
[platform/core/uifw/dali-demo.git] / examples / magnifier / magnifier-example.cpp
index 4186e8a..7802769 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 "shared/view.h"
 
 #include <dali-toolkit/dali-toolkit.h>
-
+#include <dali-toolkit/devel-api/controls/magnifier/magnifier.h>
 using namespace Dali;
 
 namespace
 {
-const char* BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-magnifier.jpg" );
-const char* TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" );
-const char* APPLICATION_TITLE( "Magnifier Example" );
-const Vector3 MAGNIFIER_SIZE(0.25f, 0.25f, 0.0f);       ///< Magnifier sides should be 25% of the width of the stage
-const float ANIMATION_DURATION(60.0f);                  ///< Run animation for a minute before repeating.
-const float MAGNIFIER_DISPLAY_DURATION(0.125f);         ///< Duration in seconds for show/hide manual magnifier animation
+const char*   BACKGROUND_IMAGE(DEMO_IMAGE_DIR "background-magnifier.jpg");
+const char*   TOOLBAR_IMAGE(DEMO_IMAGE_DIR "top-bar.png");
+const char*   APPLICATION_TITLE("Magnifier Example");
+const Vector3 MAGNIFIER_SIZE(0.25f, 0.25f, 0.0f); ///< Magnifier sides should be 25% of the width of the window
+const float   ANIMATION_DURATION(60.0f);          ///< Run animation for a minute before repeating.
+const float   MAGNIFIER_DISPLAY_DURATION(0.125f); ///< Duration in seconds for show/hide manual magnifier animation
 
-const float MAGNIFICATION_FACTOR(2.0f);                 ///< Amount to magnify by.
-const float MAGNIFIER_INDENT(10.0f);                    ///< Indentation around edge of stage to define where magnifiers may move.
-const float FINGER_RADIUS_INCHES(0.25f);                ///< Average finger radius in inches from the center of index finger to edge.
+const float MAGNIFICATION_FACTOR(2.0f);  ///< Amount to magnify by.
+const float MAGNIFIER_INDENT(10.0f);     ///< Indentation around edge of window to define where magnifiers may move.
+const float FINGER_RADIUS_INCHES(0.25f); ///< Average finger radius in inches from the center of index finger to edge.
 
 /**
  * MagnifierPathConstraint
  * This constraint governs the position of the
  * animating magnifier in a swirly pattern around
- * the stage.
+ * the window.
  */
 struct MagnifierPathConstraint
 {
   /**
    * Constraint constructor
-   * @param[in] stageSize The stage size so that the constraint can create a path
-   * within stage bounds.
+   * @param[in] windowSize The window size so that the constraint can create a path
+   * within window bounds.
    */
-  MagnifierPathConstraint(const Vector3& stageSize,
-                          Vector3 offset = Vector3::ZERO)
-  : mStageSize(stageSize),
+  MagnifierPathConstraint(const Vector3& windowSize,
+                          Vector3        offset = Vector3::ZERO)
+  : mWindowSize(windowSize),
     mOffset(offset)
   {
   }
 
-  Vector3 operator()(const Vector3&    current,
-                     const PropertyInput& sizeProperty,
-                     const PropertyInput& animationTimeProperty)
+  void operator()(Vector3& current, const PropertyInputContainer& inputs)
   {
-    float time = animationTimeProperty.GetFloat();
-    const Vector3& size = sizeProperty.GetVector3();
-
-    Vector3 range(mStageSize - size - Vector3::ONE * MAGNIFIER_INDENT * 2.0f);
-    Vector3 position(mOffset);
+    float          time = inputs[1]->GetFloat();
+    const Vector3& size = inputs[0]->GetVector3();
 
-    position.x += 0.5f * sinf(time * 0.471f) * range.width;
-    position.y += 0.5f * sinf(time * 0.8739f) * range.height;
+    current = mOffset;
 
-    return position;
+    Vector3 range(mWindowSize - size - Vector3::ONE * MAGNIFIER_INDENT * 2.0f);
+    current.x += 0.5f * sinf(time * 0.471f) * range.width;
+    current.y += 0.5f * sinf(time * 0.8739f) * range.height;
   }
 
-  Vector3 mStageSize;     ///< Keep track of the stage size for determining path within stage bounds
-  Vector3 mOffset;        ///< Amount to offset magnifier path
+  Vector3 mWindowSize; ///< Keep track of the window size for determining path within window bounds
+  Vector3 mOffset;     ///< Amount to offset magnifier path
 };
 
 /**
@@ -103,23 +99,19 @@ struct ConfinementConstraint
   {
   }
 
-  Vector3 operator()(const Vector3&    constPosition,
-                     const PropertyInput& sizeProperty,
-                     const PropertyInput& parentOriginProperty,
-                     const PropertyInput& anchorPointProperty,
-                     const PropertyInput& referenceSizeProperty)
+  void operator()(Vector3& current, const PropertyInputContainer& inputs)
   {
-    const Vector3& size = sizeProperty.GetVector3();
-    const Vector3 origin = parentOriginProperty.GetVector3();
-    const Vector3& anchor = anchorPointProperty.GetVector3();
-    const Vector3& referenceSize = referenceSizeProperty.GetVector3();
+    const Vector3& size          = inputs[0]->GetVector3();
+    const Vector3  origin        = inputs[1]->GetVector3();
+    const Vector3& anchor        = inputs[2]->GetVector3();
+    const Vector3& referenceSize = inputs[3]->GetVector3();
 
     Vector3 offset(mOffsetOrigin * referenceSize);
 
-    Vector3 newPosition( constPosition + offset );
-
     // Get actual position of Actor relative to parent's Top-Left.
-    Vector3 position(constPosition + offset + origin * referenceSize);
+    Vector3 position(current + offset + origin * referenceSize);
+
+    current += offset;
 
     // if top-left corner is outside of Top-Left bounds, then push back in screen.
     Vector3 corner(position - size * anchor - mMinIndent);
@@ -127,17 +119,17 @@ struct ConfinementConstraint
     if(mFlipHorizontal && corner.x < 0.0f)
     {
       corner.x = 0.0f;
-      newPosition.x += size.width;
+      current.x += size.width;
     }
 
     if(mFlipVertical && corner.y < 0.0f)
     {
       corner.y = 0.0f;
-      newPosition.y += size.height;
+      current.y += size.height;
     }
 
-    newPosition.x -= std::min(corner.x, 0.0f);
-    newPosition.y -= std::min(corner.y, 0.0f);
+    current.x -= std::min(corner.x, 0.0f);
+    current.y -= std::min(corner.y, 0.0f);
 
     // if bottom-right corner is outside of Bottom-Right bounds, then push back in screen.
     corner += size - referenceSize + mMinIndent + mMaxIndent;
@@ -145,48 +137,46 @@ struct ConfinementConstraint
     if(mFlipHorizontal && corner.x > 0.0f)
     {
       corner.x = 0.0f;
-      newPosition.x -= size.width;
+      current.x -= size.width;
     }
 
     if(mFlipVertical && corner.y > 0.0f)
     {
       corner.y = 0.0f;
-      newPosition.y -= size.height;
+      current.y -= size.height;
     }
 
-    newPosition.x -= std::max(corner.x, 0.0f);
-    newPosition.y -= std::max(corner.y, 0.0f);
-
-    return newPosition;
+    current.x -= std::max(corner.x, 0.0f);
+    current.y -= std::max(corner.y, 0.0f);
   }
 
-  Vector3 mOffsetOrigin;                                ///< Manual Parent Offset Origin.
-  Vector3 mMinIndent;                                   ///< Top-Left Margin
-  Vector3 mMaxIndent;                                   ///< Bottom-Right Margin.
-  bool mFlipHorizontal;                                 ///< Whether to flip actor's position if exceeds horizontal screen bounds
-  bool mFlipVertical;                                   ///< Whether to flip actor's position if exceeds vertical screen bounds
+  Vector3 mOffsetOrigin;   ///< Manual Parent Offset Origin.
+  Vector3 mMinIndent;      ///< Top-Left Margin
+  Vector3 mMaxIndent;      ///< Bottom-Right Margin.
+  bool    mFlipHorizontal; ///< Whether to flip actor's position if exceeds horizontal screen bounds
+  bool    mFlipVertical;   ///< Whether to flip actor's position if exceeds vertical screen bounds
 };
 
-}
+} // namespace
 
 // This example shows how to use the Magnifier component.
 //
 class ExampleController : public ConnectionTracker
 {
 public:
-
   /**
    * The example controller constructor.
    * @param[in] application The application instance
    */
-  ExampleController( Application& application )
-  : mApplication( application ),
+  ExampleController(Application& application)
+  : mApplication(application),
     mView(),
     mAnimationTime(0.0f),
+    mAnimationTimeProperty(Property::INVALID_INDEX),
     mMagnifierShown(false)
   {
     // Connect to the Application's Init signal
-    mApplication.InitSignal().Connect( this, &ExampleController::Create );
+    mApplication.InitSignal().Connect(this, &ExampleController::Create);
   }
 
   /**
@@ -201,84 +191,78 @@ public:
    * Invoked upon creation of application
    * @param[in] application The application instance
    */
-  void Create( Application& application )
+  void Create(Application& application)
   {
-    Stage::GetCurrent().KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
-
-    mStageSize = Stage::GetCurrent().GetSize();
+    Window window = application.GetWindow();
+    window.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
+    mWindowSize = window.GetSize();
 
     // The Init signal is received once (only) during the Application lifetime
 
-    // Hide the indicator bar
-    application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
-
     // 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;
-    mContent = DemoHelper::CreateView( application,
-                                       mView,
-                                       toolBar,
-                                       BACKGROUND_IMAGE,
-                                       TOOLBAR_IMAGE,
-                                       APPLICATION_TITLE );
+    mContent = DemoHelper::CreateView(application,
+                                      mView,
+                                      toolBar,
+                                      BACKGROUND_IMAGE,
+                                      TOOLBAR_IMAGE,
+                                      APPLICATION_TITLE);
 
-    mContent.SetLeaveRequired(true);
-    mContent.TouchedSignal().Connect( this, &ExampleController::OnTouched );
+    mContent.SetProperty(Actor::Property::LEAVE_REQUIRED, true);
+    mContent.TouchedSignal().Connect(this, &ExampleController::OnTouched);
 
     // Create magnifier (controlled by human touch)
     Layer overlay = Layer::New();
-    overlay.SetSensitive(false);
-    overlay.SetParentOrigin( ParentOrigin::CENTER );
-    overlay.SetSize(mStageSize);
-    Stage::GetCurrent().Add(overlay);
+    overlay.SetProperty(Actor::Property::SENSITIVE, false);
+    overlay.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+    overlay.SetProperty(Actor::Property::SIZE, mWindowSize);
+    window.Add(overlay);
 
     mMagnifier = Toolkit::Magnifier::New();
-    mMagnifier.SetSourceActor( mView.GetBackgroundLayer() );
-    mMagnifier.SetSize( MAGNIFIER_SIZE * mStageSize.width );  // Size of magnifier is in relation to stage width
-    mMagnifier.SetMagnificationFactor( MAGNIFICATION_FACTOR );
-    mMagnifier.SetScale(Vector3::ZERO);
-    overlay.Add( mMagnifier );
+    mMagnifier.SetSourceActor(mView);
+    mMagnifier.SetProperty(Actor::Property::SIZE, MAGNIFIER_SIZE * mWindowSize.width); // Size of magnifier is in relation to window width
+    mMagnifier.SetProperty(Toolkit::Magnifier::Property::MAGNIFICATION_FACTOR, MAGNIFICATION_FACTOR);
+    mMagnifier.SetProperty(Actor::Property::SCALE, Vector3::ZERO);
+    overlay.Add(mMagnifier);
 
     // Apply constraint to animate the position of the magnifier.
-    Constraint constraint = Constraint::New<Vector3>(Actor::Property::Position,
-                                                     LocalSource(Actor::Property::Size),
-                                                     LocalSource(Actor::Property::ParentOrigin),
-                                                     LocalSource(Actor::Property::AnchorPoint),
-                                                     ParentSource(Actor::Property::Size),
-                                                     ConfinementConstraint(ParentOrigin::CENTER, Vector2::ONE * MAGNIFIER_INDENT, Vector2::ONE * MAGNIFIER_INDENT));
-    constraint.SetRemoveAction(Constraint::Discard);
-    mMagnifier.ApplyConstraint( constraint );
+    Constraint constraint = Constraint::New<Vector3>(mMagnifier, Actor::Property::POSITION, ConfinementConstraint(Vector3(0.5f, 0.5f, 0.0f), Vector2::ONE * MAGNIFIER_INDENT, Vector2::ONE * MAGNIFIER_INDENT));
+    constraint.AddSource(LocalSource(Actor::Property::SIZE));
+    constraint.AddSource(LocalSource(Actor::Property::PARENT_ORIGIN));
+    constraint.AddSource(LocalSource(Actor::Property::ANCHOR_POINT));
+    constraint.AddSource(ParentSource(Actor::Property::SIZE));
+    constraint.SetRemoveAction(Constraint::DISCARD);
+    constraint.Apply();
 
     // Create bouncing magnifier automatically bounces around screen.
     mBouncingMagnifier = Toolkit::Magnifier::New();
-    mBouncingMagnifier.SetSourceActor( mView.GetBackgroundLayer() );
-    mBouncingMagnifier.SetSize( MAGNIFIER_SIZE * mStageSize.width ); // Size of magnifier is in relation to stage width
-    mBouncingMagnifier.SetMagnificationFactor( MAGNIFICATION_FACTOR );
-    overlay.Add( mBouncingMagnifier );
+    mBouncingMagnifier.SetSourceActor(mView);
+    mBouncingMagnifier.SetProperty(Actor::Property::SIZE, MAGNIFIER_SIZE * mWindowSize.width); // Size of magnifier is in relation to window width
+    mBouncingMagnifier.SetProperty(Toolkit::Magnifier::Property::MAGNIFICATION_FACTOR, MAGNIFICATION_FACTOR);
+    overlay.Add(mBouncingMagnifier);
 
-    mAnimationTimeProperty = mBouncingMagnifier.RegisterProperty("animation-time", 0.0f);
+    mAnimationTimeProperty = mBouncingMagnifier.RegisterProperty("animationTime", 0.0f);
     ContinueAnimation();
 
     // Apply constraint to animate the position of the magnifier.
-    constraint = Constraint::New<Vector3>(Actor::Property::Position,
-                                          LocalSource(Actor::Property::Size),
-                                          LocalSource(mAnimationTimeProperty),
-                                          MagnifierPathConstraint(mStageSize, mStageSize * 0.5f));
-    mBouncingMagnifier.ApplyConstraint( constraint );
+    constraint = Constraint::New<Vector3>(mBouncingMagnifier, Actor::Property::POSITION, MagnifierPathConstraint(mWindowSize, mWindowSize * 0.5f));
+    constraint.AddSource(LocalSource(Actor::Property::SIZE));
+    constraint.AddSource(LocalSource(mAnimationTimeProperty));
+    constraint.Apply();
 
     // Apply constraint to animate the source of the magnifier.
-    constraint = Constraint::New<Vector3>(mBouncingMagnifier.GetPropertyIndex( Toolkit::Magnifier::SOURCE_POSITION_PROPERTY_NAME ),
-                                          LocalSource(Actor::Property::Size),
-                                          LocalSource(mAnimationTimeProperty),
-                                          MagnifierPathConstraint(mStageSize));
-    mBouncingMagnifier.ApplyConstraint( constraint );
+    constraint = Constraint::New<Vector3>(mBouncingMagnifier, Toolkit::Magnifier::Property::SOURCE_POSITION, MagnifierPathConstraint(mWindowSize));
+    constraint.AddSource(LocalSource(Actor::Property::SIZE));
+    constraint.AddSource(LocalSource(mAnimationTimeProperty));
+    constraint.Apply();
   }
 
   /**
    * Invoked whenever the animation finishes (every 60 seconds)
    * @param[in] animation The animation
    */
-  void OnAnimationFinished( Animation& animation )
+  void OnAnimationFinished(Animation& animation)
   {
     animation.FinishedSignal().Disconnect(this, &ExampleController::OnAnimationFinished);
     animation.Clear();
@@ -292,7 +276,7 @@ public:
   {
     Animation animation = Animation::New(ANIMATION_DURATION);
     mAnimationTime += ANIMATION_DURATION;
-    animation.AnimateTo( Property(mBouncingMagnifier, mAnimationTimeProperty), mAnimationTime );
+    animation.AnimateTo(Property(mBouncingMagnifier, mAnimationTimeProperty), mAnimationTime);
     animation.Play();
     animation.FinishedSignal().Connect(this, &ExampleController::OnAnimationFinished);
   }
@@ -301,7 +285,7 @@ public:
    * Invoked whenever the quit button is clicked
    * @param[in] button the quit button
    */
-  bool OnQuitButtonClicked( Toolkit::Button button )
+  bool OnQuitButtonClicked(Toolkit::Button button)
   {
     // quit the application
     mApplication.Quit();
@@ -313,35 +297,34 @@ public:
    * @param[in] actor The actor that received the touch
    * @param[in] event The touch-event information
    */
-  bool OnTouched( Actor actor, const TouchEvent& event )
+  bool OnTouched(Actor actor, const TouchEvent& event)
   {
     if(event.GetPointCount() > 0)
     {
-      const TouchPoint& point = event.GetPoint(0);
-      switch(point.state)
+      switch(event.GetState(0))
       {
-        case TouchPoint::Down:
-        case TouchPoint::Motion:
+        case PointState::DOWN:
+        case PointState::MOTION:
         {
           ShowMagnifier();
           break;
         }
-        case TouchPoint::Up:
-        case TouchPoint::Leave:
-        case TouchPoint::Interrupted:
+        case PointState::UP:
+        case PointState::LEAVE:
+        case PointState::INTERRUPTED:
         {
           HideMagnifier();
           break;
         }
-        default:
+        case PointState::STATIONARY:
         {
           break;
         }
       } // end switch
 
-      Vector3 touchPoint(point.screen);
+      Vector3 touchPoint(event.GetScreenPosition(0));
 
-      SetMagnifierPosition(touchPoint - mStageSize * 0.5f);
+      SetMagnifierPosition(touchPoint - mWindowSize * 0.5f);
     }
 
     return false;
@@ -355,7 +338,7 @@ public:
     if(!mMagnifierShown)
     {
       Animation animation = Animation::New(MAGNIFIER_DISPLAY_DURATION);
-      animation.AnimateTo(Property(mMagnifier, Actor::Property::Scale), Vector3::ONE, AlphaFunctions::EaseIn);
+      animation.AnimateTo(Property(mMagnifier, Actor::Property::SCALE), Vector3::ONE, AlphaFunction::EASE_IN);
       animation.Play();
       mMagnifierShown = true;
     }
@@ -369,7 +352,7 @@ public:
     if(mMagnifierShown)
     {
       Animation animation = Animation::New(MAGNIFIER_DISPLAY_DURATION);
-      animation.AnimateTo(Property(mMagnifier, Actor::Property::Scale), Vector3::ZERO, AlphaFunctions::EaseOut);
+      animation.AnimateTo(Property(mMagnifier, Actor::Property::SCALE), Vector3::ZERO, AlphaFunction::EASE_OUT);
       animation.Play();
       mMagnifierShown = false;
     }
@@ -377,24 +360,24 @@ public:
 
   /**
    * Manually sets the magnifier position
-   * @param[in] position The magnifier's position relative to center of stage
+   * @param[in] position The magnifier's position relative to center of window
    */
   void SetMagnifierPosition(const Vector3 position)
   {
-    mMagnifier.SetSourcePosition( position );
+    mMagnifier.SetProperty(Toolkit::Magnifier::Property::SOURCE_POSITION, position);
 
     // position magnifier glass such that bottom edge is touching/near top of finger.
     Vector3 glassPosition(position);
-    glassPosition.y -= mStageSize.width * MAGNIFIER_SIZE.height * 0.5f + Stage::GetCurrent().GetDpi().height * FINGER_RADIUS_INCHES;
+    glassPosition.y -= mWindowSize.width * MAGNIFIER_SIZE.height * 0.5f + mApplication.GetWindow().GetDpi().GetHeight() * FINGER_RADIUS_INCHES;
 
-    mMagnifier.SetPosition( glassPosition );
+    mMagnifier.SetProperty(Actor::Property::POSITION, glassPosition);
   }
 
   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) )
+      if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
       {
         mApplication.Quit();
       }
@@ -402,33 +385,21 @@ public:
   }
 
 private:
-
-  Application&  mApplication;                             ///< Application instance
-  Toolkit::View mView;                                    ///< The view
-  Layer mContent;                                         ///< The content layer
-  Toolkit::Magnifier mMagnifier;                          ///< The manually controlled magnifier
-  Toolkit::Magnifier mBouncingMagnifier;                  ///< The animating magnifier (swirly animation)
-  Vector3 mStageSize;                                     ///< The size of the stage
-  float mAnimationTime;                                   ///< Keep track of start animation time.
-  Property::Index mAnimationTimeProperty;                 ///< Animation time property (responsible for swirly animation)
-  bool mMagnifierShown;                                   ///< Flag indicating whether the magnifier is being shown or not.
-
+  Application&       mApplication;           ///< Application instance
+  Toolkit::Control   mView;                  ///< The view
+  Layer              mContent;               ///< The content layer
+  Toolkit::Magnifier mMagnifier;             ///< The manually controlled magnifier
+  Toolkit::Magnifier mBouncingMagnifier;     ///< The animating magnifier (swirly animation)
+  Vector3            mWindowSize;            ///< The size of the window
+  float              mAnimationTime;         ///< Keep track of start animation time.
+  Property::Index    mAnimationTimeProperty; ///< Animation time property (responsible for swirly animation)
+  bool               mMagnifierShown;        ///< Flag indicating whether the magnifier is being shown or not.
 };
 
-void RunTest( Application& application )
+int DALI_EXPORT_API main(int argc, char** argv)
 {
-  ExampleController test( application );
-
+  Application       application = Application::New(&argc, &argv, DEMO_THEME_PATH);
+  ExampleController test(application);
   application.MainLoop();
-}
-
-// Entry point for Linux & SLP applications
-//
-int main( int argc, char **argv )
-{
-  Application application = Application::New( &argc, &argv );
-
-  RunTest( application );
-
   return 0;
 }