Updated demos to use DALi clang-format
[platform/core/uifw/dali-demo.git] / examples / page-turn-view / page-turn-view-example.cpp
index 33498cd..dc3315a 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 <assert.h>
-#include <cstdlib>
-#include <string.h>
-#include <iostream>
-
-#include "shared/view.h"
+#include <dali-toolkit/devel-api/controls/page-turn-view/page-factory.h>
+#include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-landscape-view.h>
+#include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-portrait-view.h>
+#include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-view.h>
+#include <dali/dali.h>
 
 using namespace Dali;
 using namespace Dali::Toolkit;
 
-// LOCAL STUFF
 namespace
 {
-// The content amount of one page between portrait and landscape view are different
-// set a ratio to modify the current page number when the rotation is changed
-const float PAGE_NUMBER_CORRESPONDING_RATIO(1.25f);
-
-const char* BOOK_COVER_PORTRAIT = ( DALI_IMAGE_DIR "book-portrait-cover.jpg" );
-const char* BOOK_COVER_LANDSCAPE = ( DALI_IMAGE_DIR "book-landscape-cover.jpg" );
-const char* BOOK_COVER_BACK_LANDSCAPE = ( DALI_IMAGE_DIR "book-landscape-cover-back.jpg" );
+const char* BOOK_COVER_PORTRAIT       = (DEMO_IMAGE_DIR "book-portrait-cover.jpg");
+const char* BOOK_COVER_LANDSCAPE      = (DEMO_IMAGE_DIR "book-landscape-cover.jpg");
+const char* BOOK_COVER_BACK_LANDSCAPE = (DEMO_IMAGE_DIR "book-landscape-cover-back.jpg");
 
 const char* PAGE_IMAGES_PORTRAIT[] =
-{
-  DALI_IMAGE_DIR "book-portrait-p1.jpg",
-  DALI_IMAGE_DIR "book-portrait-p2.jpg",
-  DALI_IMAGE_DIR "book-portrait-p3.jpg",
-  DALI_IMAGE_DIR "book-portrait-p4.jpg",
-  DALI_IMAGE_DIR "book-portrait-p5.jpg"
-};
-const unsigned int NUMBER_OF_PORTRAIT_IMAGE( sizeof(PAGE_IMAGES_PORTRAIT) / sizeof(PAGE_IMAGES_PORTRAIT[0]) );
+  {
+    DEMO_IMAGE_DIR "book-portrait-p1.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p2.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p3.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p4.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p5.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p6.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p7.jpg",
+    DEMO_IMAGE_DIR "book-portrait-p8.jpg"};
+const unsigned int NUMBER_OF_PORTRAIT_IMAGE(sizeof(PAGE_IMAGES_PORTRAIT) / sizeof(PAGE_IMAGES_PORTRAIT[0]));
 
 const char* PAGE_IMAGES_LANDSCAPE[] =
+  {
+    DEMO_IMAGE_DIR "book-landscape-p1.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p2.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p3.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p4.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p5.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p6.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p7.jpg",
+    DEMO_IMAGE_DIR "book-landscape-p8.jpg"};
+const unsigned int NUMBER_OF_LANDSCAPE_IMAGE(sizeof(PAGE_IMAGES_LANDSCAPE) / sizeof(PAGE_IMAGES_LANDSCAPE[0]));
+
+enum DemoOrientation
 {
-  DALI_IMAGE_DIR "book-landscape-p1.jpg",
-  DALI_IMAGE_DIR "book-landscape-p2.jpg",
-  DALI_IMAGE_DIR "book-landscape-p3.jpg",
-  DALI_IMAGE_DIR "book-landscape-p4.jpg",
-  DALI_IMAGE_DIR "book-landscape-p5.jpg",
-  DALI_IMAGE_DIR "book-landscape-p6.jpg",
-  DALI_IMAGE_DIR "book-landscape-p7.jpg",
-  DALI_IMAGE_DIR "book-landscape-p8.jpg"
+  PORTRAIT,
+  LANDSCAPE,
+  UNKNOWN
 };
-const unsigned int NUMBER_OF_LANDSCAPE_IMAGE( sizeof(PAGE_IMAGES_LANDSCAPE) / sizeof(PAGE_IMAGES_LANDSCAPE[0]) );
 
-}// end LOCAL STUFF
+} // namespace
 
 class PortraitPageFactory : public PageFactory
 {
@@ -71,29 +72,35 @@ class PortraitPageFactory : public PageFactory
    */
   virtual unsigned int GetNumberOfPages()
   {
-    return 5*NUMBER_OF_PORTRAIT_IMAGE + 1;
+    return 5 * NUMBER_OF_PORTRAIT_IMAGE + 1;
   }
+
   /**
-   * Create an image actor to represent a page.
+   * Create texture to represent a page.
    * @param[in] pageId The ID of the page to create.
-   * @return An image actor, or an uninitialized pointer if the ID is out of range.
+   * @return The texture.
    */
-  virtual Actor NewPage( unsigned int pageId )
+  virtual Texture NewPage(unsigned int pageId)
   {
-    ImageActor page;
+    Texture texture;
 
-    if( pageId == 0 )
+    PixelData pixels;
+    if(pageId == 0)
     {
-      page = ImageActor::New( ResourceImage::New( BOOK_COVER_PORTRAIT ) );
+      pixels = SyncImageLoader::Load(BOOK_COVER_PORTRAIT);
     }
     else
     {
-      page = ImageActor::New( ResourceImage::New( PAGE_IMAGES_PORTRAIT[ (pageId-1) % NUMBER_OF_PORTRAIT_IMAGE ] ) );
+      pixels = SyncImageLoader::Load(PAGE_IMAGES_PORTRAIT[(pageId - 1) % NUMBER_OF_PORTRAIT_IMAGE]);
     }
 
-    page.SetRelayoutEnabled( false );
+    if(pixels)
+    {
+      texture = Texture::New(TextureType::TEXTURE_2D, pixels.GetPixelFormat(), pixels.GetWidth(), pixels.GetHeight());
+      texture.Upload(pixels, 0, 0, 0, 0, pixels.GetWidth(), pixels.GetHeight());
+    }
 
-    return page;
+    return texture;
   }
 };
 
@@ -105,256 +112,170 @@ class LandscapePageFactory : public PageFactory
    */
   virtual unsigned int GetNumberOfPages()
   {
-    return 5*NUMBER_OF_LANDSCAPE_IMAGE / 2 + 1;
+    return 5 * NUMBER_OF_LANDSCAPE_IMAGE / 2 + 1;
   }
+
   /**
-   * Create an image actor to represent a page.
+   * Create texture to represent a page.
    * @param[in] pageId The ID of the page to create.
-   * @return An image actor, or an uninitialized pointer if the ID is out of range.
+   * @return The texture.
    */
-  virtual Actor NewPage( unsigned int pageId )
+  virtual Texture NewPage(unsigned int pageId)
   {
-    ImageActor pageFront;
-    ImageActor pageBack;
-    if( pageId == 0 )
+    Texture texture;
+
+    PixelData pixelsFront;
+    PixelData pixelsBack;
+
+    if(pageId == 0)
     {
-       pageFront = ImageActor::New( ResourceImage::New( BOOK_COVER_LANDSCAPE ) );
-       pageBack = ImageActor::New( ResourceImage::New( BOOK_COVER_BACK_LANDSCAPE ) );
+      pixelsFront = SyncImageLoader::Load(BOOK_COVER_LANDSCAPE);
+      pixelsBack  = SyncImageLoader::Load(BOOK_COVER_BACK_LANDSCAPE);
     }
     else
     {
-      unsigned int imageId = (pageId-1)*2;
-      pageFront = ImageActor::New( ResourceImage::New( PAGE_IMAGES_LANDSCAPE[ imageId % NUMBER_OF_LANDSCAPE_IMAGE ] ) );
-      pageBack = ImageActor::New( ResourceImage::New( PAGE_IMAGES_LANDSCAPE[ (imageId+1) % NUMBER_OF_LANDSCAPE_IMAGE ] ) );
+      unsigned int imageId = (pageId - 1) * 2;
+      pixelsFront          = SyncImageLoader::Load(PAGE_IMAGES_LANDSCAPE[imageId % NUMBER_OF_LANDSCAPE_IMAGE]);
+      pixelsBack           = SyncImageLoader::Load(PAGE_IMAGES_LANDSCAPE[(imageId + 1) % NUMBER_OF_LANDSCAPE_IMAGE]);
     }
-    pageFront.Add(pageBack);
 
-    pageFront.SetRelayoutEnabled( false );
-    pageBack.SetRelayoutEnabled( false );
+    if(pixelsFront && pixelsBack)
+    {
+      texture = Texture::New(TextureType::TEXTURE_2D, pixelsFront.GetPixelFormat(), pixelsFront.GetWidth() * 2, pixelsFront.GetHeight());
+      texture.Upload(pixelsFront, 0, 0, 0, 0, pixelsFront.GetWidth(), pixelsFront.GetHeight());
+      texture.Upload(pixelsBack, 0, 0, pixelsFront.GetWidth(), 0, pixelsBack.GetWidth(), pixelsBack.GetHeight());
+    }
 
-    return pageFront;
+    return texture;
   }
 };
 
 /**
- * This example shows how to use the page turn UI control to implement the page-turn demo
- * The effect follows the pan gesture to animate the page
- * Pan the image inwards, the page will bent,
- * Depends on the distance of the panning, the image might turn over or slide back
- * Also, in portrait view, the pan gesture outwards from position near the spine could turn the previous page back
- * Allows to turn multiple pages one by one quickly towards the same direction, multiple animations are launched in this case
-*/
-class PageTurnController : public ConnectionTracker
+ * This example shows how to use the PageTurnView UI control
+ */
+class PageTurnExample : public ConnectionTracker
 {
 public:
-  PageTurnController( Application &app );
-  ~PageTurnController();
+  PageTurnExample(Application& app);
+
+  ~PageTurnExample();
 
-  //This method gets called once the main loop of application is up and running
-  void OnInit( Application& app );
+  void OnInit(Application& app);
 
 private:
+  void OnWindowResized(Window window, Window::WindowSize size);
 
-  /**
-   * This method gets called when the screen is rotated, switch between portrait and landscape views
-   * param [in] view The view receiving the orientation change signal
-   * param [in] animation The Orientation Rotating animation
-   * param [in] orientation The current screen orientation
-   */
-  void OnOrientationAnimationStarted( View view, Animation& animation, const Orientation& orientation );
+  void Rotate(DemoOrientation orientation);
 
-  /**
-   * Main key event handler
-   */
   void OnKeyEvent(const KeyEvent& event);
 
-  /**
-   * Callback function of page turned signal
-   * @param[in] pageTurnView The handle of the PageTurnPortraitView or PageTurnLandscapeView
-   * @param[in] pageIndex The index of the page turned over
-   * @param[in] isTurningForward The turning direction, forwards or backwards
-   */
-  void OnPageStartedTurn( PageTurnView pageTurnView, unsigned int pageIndex, bool isTurningForward );
-
-  /**
-   * Callback function of page turned signal
-   * @param[in] pageTurnView The handle of the PageTurnPortraitView or PageTurnLandscapeView
-   * @param[in] pageIndex The index of the page turned over
-   * @param[in] isTurningForward The turning direction, forwards or backwards
-   */
-  void OnPageFinishedTurn( PageTurnView pageTurnView, unsigned int pageIndex, bool isTurningForward );
-
-  /**
-   * Callback function of page started pan signal
-   *
-   * @param[in] pageTurnView The calling page turn view
-   */
-  void OnPageStartedPan( PageTurnView pageTurnView );
-
-  /**
-   * Callback function of page finished pan signal
-   *
-   * @param[in] pageTurnView The calling page turn view
-   */
-  void OnPageFinishedPan( PageTurnView pageTurnView );
-
 private:
+  Application& mApplication;
 
-  Application&                mApplication;
-  View                        mView;
+  PageTurnView         mPageTurnPortraitView;
+  PageTurnView         mPageTurnLandscapeView;
+  PortraitPageFactory  mPortraitPageFactory;
+  LandscapePageFactory mLandscapePageFactory;
 
-  PageTurnView                mPageTurnPortraitView;
-  PageTurnView                mPageTurnLandscapeView;
-  PortraitPageFactory         mPortraitPageFactory;
-  LandscapePageFactory        mLandscapePageFactory;
-
-  bool                        mIsPortrait;
+  DemoOrientation mOrientation;
 };
 
-PageTurnController::PageTurnController( Application &app )
-:mApplication( app ),
mIsPortrait( true )
+PageTurnExample::PageTurnExample(Application& app)
+: mApplication(app),
 mOrientation(UNKNOWN)
 {
-  // Connect to the Application's Init signal
-  app.InitSignal().Connect( this, &PageTurnController::OnInit );
+  app.InitSignal().Connect(this, &PageTurnExample::OnInit);
 }
 
-PageTurnController::~PageTurnController()
+PageTurnExample::~PageTurnExample()
 {
 }
 
+/**
+ * The Init signal is received once (only) during the Application lifetime
+ */
+void PageTurnExample::OnInit(Application& app)
+{
+  Window window = app.GetWindow();
+  window.KeyEventSignal().Connect(this, &PageTurnExample::OnKeyEvent);
+
+  window.AddAvailableOrientation(Window::PORTRAIT);
+  window.AddAvailableOrientation(Window::LANDSCAPE);
+  window.AddAvailableOrientation(Window::PORTRAIT_INVERSE);
+  window.AddAvailableOrientation(Window::LANDSCAPE_INVERSE);
+  window.ResizeSignal().Connect(this, &PageTurnExample::OnWindowResized);
+
+  Window::WindowSize size = window.GetSize();
+  Rotate(size.GetWidth() > size.GetHeight() ? LANDSCAPE : PORTRAIT);
+}
 
-void PageTurnController::OnInit( Application& app )
+void PageTurnExample::OnWindowResized(Window window, Window::WindowSize size)
 {
-  // The Init signal is received once ( only ) during the Application lifetime
-
-  DemoHelper::RequestThemeChange();
-
-  Stage::GetCurrent().KeyEventSignal().Connect(this, &PageTurnController::OnKeyEvent);
-
-  Stage stage = Stage::GetCurrent();
-  Vector2 stageSize =  stage.GetSize();
-
-  // Create default View.
-  mView = View::New();
-  mView.SetRelayoutEnabled( false );
-  stage.Add( mView );
-
-  Dali::Window winHandle = app.GetWindow();
-  winHandle.AddAvailableOrientation( Dali::Window::PORTRAIT );
-  winHandle.AddAvailableOrientation( Dali::Window::LANDSCAPE );
-  winHandle.AddAvailableOrientation( Dali::Window::PORTRAIT_INVERSE  );
-  winHandle.AddAvailableOrientation( Dali::Window::LANDSCAPE_INVERSE );
-  // FIXME
-  //app.GetOrientation().ChangedSignal().Connect( &mView, &View::OrientationChanged );
-  // view will response to orientation change to display portrait or landscape views
-  mView.OrientationAnimationStartedSignal().Connect( this, &PageTurnController::OnOrientationAnimationStarted );
-
-  mPageTurnPortraitView = PageTurnPortraitView::New( mPortraitPageFactory, stageSize );
-  mPageTurnPortraitView.SetRelayoutEnabled( false );
-  mPageTurnPortraitView.SetSpineShadowParameter( Vector2(70.f, 30.f) );
-  mPageTurnPortraitView.PageTurnStartedSignal().Connect( this, &PageTurnController::OnPageStartedTurn );
-  mPageTurnPortraitView.PageTurnFinishedSignal().Connect( this, &PageTurnController::OnPageFinishedTurn );
-  mPageTurnPortraitView.PagePanStartedSignal().Connect( this, &PageTurnController::OnPageStartedPan );
-  mPageTurnPortraitView.PagePanFinishedSignal().Connect( this, &PageTurnController::OnPageFinishedPan );
-  mPageTurnPortraitView.SetPositionInheritanceMode( USE_PARENT_POSITION );
-
-  mPageTurnLandscapeView = PageTurnLandscapeView::New( mLandscapePageFactory, Vector2(stageSize.y*0.5f, stageSize.x) );
-  mPageTurnLandscapeView.SetRelayoutEnabled( false );
-  mPageTurnLandscapeView.PageTurnStartedSignal().Connect( this, &PageTurnController::OnPageStartedTurn );
-  mPageTurnLandscapeView.PageTurnFinishedSignal().Connect( this, &PageTurnController::OnPageFinishedTurn );
-  mPageTurnLandscapeView.PagePanStartedSignal().Connect( this, &PageTurnController::OnPageStartedPan );
-  mPageTurnLandscapeView.PagePanFinishedSignal().Connect( this, &PageTurnController::OnPageFinishedPan );
-  mPageTurnLandscapeView.SetPositionInheritanceMode( USE_PARENT_POSITION );
-
-  mView.Add(mPageTurnPortraitView);
+  Rotate(size.GetWidth() > size.GetHeight() ? LANDSCAPE : PORTRAIT);
 }
 
-void PageTurnController::OnOrientationAnimationStarted( View view, Animation& animation, const Orientation& orientation )
+void PageTurnExample::Rotate(DemoOrientation orientation)
 {
-  switch( orientation.GetDegrees() )
+  Window  window     = mApplication.GetWindow();
+  Vector2 windowSize = window.GetSize();
+
+  if(mOrientation != orientation)
   {
-    // portrait view, display page in the right side only
-    case 0:
-    case 180:
+    mOrientation = orientation;
+
+    if(PORTRAIT == orientation)
     {
-      if( !mIsPortrait )
+      if(!mPageTurnPortraitView)
+      {
+        mPageTurnPortraitView = PageTurnPortraitView::New(mPortraitPageFactory, windowSize);
+        mPageTurnPortraitView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+      }
+
+      if(mPageTurnLandscapeView)
       {
-        mView.Remove( mPageTurnLandscapeView );
-        mView.Add( mPageTurnPortraitView );
-        int currentPage = floor( static_cast<float>(mPageTurnLandscapeView.GetCurrentPage()) * PAGE_NUMBER_CORRESPONDING_RATIO );
-        mPageTurnPortraitView.GoToPage( currentPage );
-        mIsPortrait = true;
+        window.Remove(mPageTurnLandscapeView);
       }
-      break;
+      window.Add(mPageTurnPortraitView);
     }
-    // display pages in both sides
-    case 90:
-    case 270:
+    else if(LANDSCAPE == orientation)
     {
-      if( mIsPortrait )
+      if(!mPageTurnLandscapeView)
       {
-        mView.Remove( mPageTurnPortraitView );
-        mView.Add( mPageTurnLandscapeView );
-        int currentPage = ceil( static_cast<float>(mPageTurnPortraitView.GetCurrentPage()) / PAGE_NUMBER_CORRESPONDING_RATIO );
-        mPageTurnLandscapeView.GoToPage( currentPage );
-        mIsPortrait = false;
+        mPageTurnLandscapeView = PageTurnLandscapeView::New(mLandscapePageFactory, Vector2(windowSize.x * 0.5f, windowSize.y));
+        mPageTurnLandscapeView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
       }
-      break;
+
+      if(mPageTurnPortraitView)
+      {
+        window.Remove(mPageTurnPortraitView);
+      }
+
+      window.Add(mPageTurnLandscapeView);
     }
-    default:
-    break;
   }
 }
 
 /**
  * Main key event handler
  */
-void PageTurnController::OnKeyEvent(const KeyEvent& event)
+void PageTurnExample::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();
     }
   }
 }
 
-void PageTurnController::OnPageStartedTurn( PageTurnView pageTurnView, unsigned int pageIndex, bool isTurningForward )
-{
-  std::cout<< ( ( pageTurnView == mPageTurnPortraitView ) ? " portrait: " : " Landscape: " )
-           << " page " << pageIndex
-           << ( isTurningForward ? " is starting to turn forward" : " is starting to turn backward" )
-           << std::endl;
-}
-
-void PageTurnController::OnPageFinishedTurn( PageTurnView pageTurnView, unsigned int pageIndex, bool isTurningForward )
-{
-  std::cout<< ( ( pageTurnView == mPageTurnPortraitView ) ? " portrait: " : " Landscape: " )
-           << " page " << pageIndex
-           << ( isTurningForward ? " has finished turning forward" : " has finished turning backward" )
-           << std::endl;
-}
-
-void PageTurnController::OnPageStartedPan( PageTurnView pageTurnView )
-{
-  std::cout<< "Starting to pan" << std::endl;
-}
-
-void PageTurnController::OnPageFinishedPan( PageTurnView pageTurnView )
-{
-  std::cout<< "Finished panning" << std::endl;
-}
-
 // Entry point for applications
-int main( int argc, char **argv )
+int DALI_EXPORT_API main(int argc, char** argv)
 {
-  Application app = Application::New(&argc, &argv);
-  PageTurnController test ( app );
+  Application     app = Application::New(&argc, &argv);
+  PageTurnExample test(app);
 
   app.MainLoop();
 
   return 0;
 }
-